我是驱动程序编程的新手,我找不到一个可能很简单的问题的解决方案。我正在编辑来自wdk示例的ndis_prot示例驱动程序。目前,数据包以Irp的形式到达驱动程序中,并存储在pNdisBuffer中。我需要将缓冲区分成两部分-- pNdisBuffer1和pNdisBuffer2 --第一部分填充头部,第二部分填充数据,并将它们都链接到pNdisPacket。关于这方面的文章很少,但我找不到这样的例子。就像这里描述的那样,这应该是可能的
http://blogs.msdn.com/b/ntdebugging/archive/2008/09/19/ndis-part-1.aspx
但我希望看到wdk (代码)的例子。
附言:请不要问我为什么需要这样做,也不要试图将它改变成不同的东西。它只是必须这样做。你能帮帮我吗?
发布于 2012-05-02 08:00:51
伪代码(错误处理&省略了一些声明等)
// initial code
PNDIS_PACKET sourcePack;
...
PNDIS_PACKET packet1, packet2, current;
NdisAllocatePacket(&status, &packet1, handle);
NdisAllocatePacket(&status, &packet2, handle);
current = packet1;
PNDIS_BUFFER sourceBuf, newBuf;
NdisGetFirstBufferFromPacket(sourcePack,&sourceBuf,&va,&len,&totalLen);
while(sourceBuf != NULL)
{
NdisQueryBuffer(sourceBuf,&va,&len);
if( .. (PUCHAR)va+x is a split point ..)
{
if(x != 0)
{
newBuf = NewBuf(va, x);
NdisCahinBufferAtBack(current,newBuf);
}
current = packet2;
newBuf = NewBuf(va+x, len-x);
}
else
{
newBuf = NewBuf(va,len);
}
NdisChainBufferAtBack(current,newBuf);
NdisGetNextBuffer(sourceBuf,&sourceBuf);
}
...
PNDIS_BUFFER NewBuf(PVOID va, ULONG len)
{
PNDIS_BUFFER newBuffer;
NdisAllocateBuffer(&Status, &newBuffer, handle, va, len);
return newBuffer;
}
// response to comment
newBuf = NewBuf(va, x);
NdisCahinBufferAtBack(current,newBuf);
newBuf = NewBuf(va+x, len-x);
NdisCahinBufferAtBack(current,newBuf);https://stackoverflow.com/questions/10399099
复制相似问题