18,356
社区成员
发帖
与我相关
我的任务
分享
// 遍历封包中的缓冲区描述表,将数据复制到用户缓冲区
pBufferDes = pPacket->Private.Head;
while(pBufferDes != NULL && pBufferDes != pPacket->Private.Tail )
{
// 获取此缓冲区描述表的缓冲区信息
NdisQueryBufferSafe(pBufferDes, &pBuf, &nBufferSize, NormalPagePriority);
if(pBuf == NULL)
return;
if(nNumberToRead > nBufferSize) // 复制整个缓冲区
{
NdisMoveMemory(lpBufferIn + *lpNumberOfRead, pBuf, nBufferSize);
nNumberToRead -= nBufferSize;
*lpNumberOfRead += nBufferSize;
}
else // 仅复制剩下的部分
{
NdisMoveMemory(lpBufferIn + *lpNumberOfRead, pBuf, nNumberToRead);
*lpNumberOfRead += nNumberToRead;
return;
}
// 下一个缓冲区描述表
pBufferDes = pBufferDes->Next;
}
int packetSize=0;
PUCHAR pBuf=NULL;
UINT bufLength=0;
MDL *pNext=NULL;
UINT i=0;
NdisQueryPacket(pPacket,NULL,NULL,NULL,&packetSize);
NdisQueryBufferSafe(pPacket->Private.Head,
&pBuf,
&bufLength,
32);
NdisMoveMemory(lpBufferIn,pBuf,bufLength);
*lpNumberOfRead = bufLength;
i=bufLength;
pNext=pPacket->Private.Head;
for(;;)
{
if(pNext == pPacket->Private.Tail)
break;
pNext=pNext->Next;
if(pNext == NULL)
break;
NdisQueryBufferSafe(pNext,&pBuf,&bufLength,32);
NdisMoveMemory(lpBufferIn + i,pBuf,bufLength);
*lpNumberOfRead += bufLength;
i+=bufLength;
}