//Copy the packet into a buffer
while (CurrentMdl && DataLength > 0)
{
NdisQueryMdl(CurrentMdl, &pSrc, &CurrLength, NormalPagePriority);
if (pSrc == NULL)
{
bytesCopied = 0;
break;
}
//
// Current buffer length is greater than the offset to the buffer
//
if (CurrLength > Offset)
{
pSrc += Offset;
CurrLength -= Offset;
if (CurrLength > DataLength)
{
CurrLength = DataLength;
}
DataLength -= CurrLength;
NdisMoveMemory(pDest, pSrc, CurrLength);
bytesCopied += CurrLength;
pDest += CurrLength;
Offset = 0;
}
else
{
Offset -= CurrLength;
}
NdisGetNextMdl(CurrentMdl, &CurrentMdl);
}
?
這段代碼就是拷貝數(shù)據(jù)到緩沖區(qū)。其中CurrMDL,offset和dataLength來自Net_Buffer:
pNetBuffer = NET_BUFFER_LIST_FIRST_NB(pNetBufferList);
//
// Try to get the 1p data from OOB data
//
if(NET_BUFFER_LIST_INFO(pNetBufferList, Ieee8021QNetBufferListInfo) != 0)
{
Ndis8021QInfo.Value = NET_BUFFER_LIST_INFO(pNetBufferList, Ieee8021QNetBufferListInfo);
UserPriority = (UCHAR)Ndis8021QInfo.TagHeader.UserPriority;
}
//copy the packet into a buffer
pDest = packetBuffer;
CurrentMdl = pNetBuffer->MdlChain;
Offset = pNetBuffer->DataOffset;
DataLength = pNetBuffer->DataLength;
?其中NET_BUFFER_LIST_FIRST_NB返回的是第一個(gè)Net_Buffer.? CurrentMDL指向MDL的list.現(xiàn)在來看看如何拷貝數(shù)據(jù)的。其中NdisQueryMdl返回MDL虛擬地址的基地址Psrc,和對應(yīng)的緩沖區(qū)長度CurrLength
?
?1、如果CurrLenght >?offset,那么把Psrc+offset,指向used data.同樣,CurrLength-offset,表示當(dāng)前的MDL中有用的數(shù)據(jù)長度。然后執(zhí)行NdisMoveMemory的拷貝操作.緊接著把,dataLength-CurrLength,因?yàn)橐呀?jīng)拷貝好了一部分,然后再把offset置零,因?yàn)楝F(xiàn)在指針已經(jīng)到了可用數(shù)據(jù)區(qū)。
2、當(dāng)再次得到下一個(gè)MDL的Psrc,和CurrLength時(shí),因?yàn)閛ffset已經(jīng)=0,所以CurrLength肯定大于0,所以即使執(zhí)行PSrc+=offset, CurrLength-=offset.最后拷貝整個(gè)長度的空間(以圖為例,不都是這樣!!),dataLength-CurrLength.
3、最后第三次得到pSrc,和CurrLength,但是CurrLength,已經(jīng)大于dataLength,所以只拷貝dataLength的長度數(shù)據(jù)。就完成了所有數(shù)據(jù)拷貝。
4、但是如果第一次的時(shí)候offset>CurrLength,那么就是比如圖中第一個(gè)MDL為unused data區(qū),執(zhí)行offset-=CurrLength.如下圖:
?
?這樣之后又回到了前面所說的CurrLength>offset了。
這就是拷貝數(shù)據(jù)到緩沖區(qū)的過程。不知有何疏漏,或者錯(cuò)誤,見諒~
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

