2012-05-01 53 views
0

我是新來的驅動程序編程,我找不到解決方案可能是一個簡單的問題。我正在編輯wdk示例中的ndis_prot示例驅動程序。確實,數據包作爲Irp發送到驅動程序,並存儲到pNdisBuffer中。我需要將該緩衝區分成兩部分 - pNdisBuffer1和pNdisBuffer2 - 首先填充標頭,然後填充數據並將它們鏈接到pNdisPacket。關於這方面的文章很少,但我找不到這方面的例子。就像是這裏描述拆分NDIS_BUFFER(WDK)

http://blogs.msdn.com/b/ntdebugging/archive/2008/09/19/ndis-part-1.aspx

,但我希望看到例如WDK(代碼),它應該是可能的。 PS:請不要問爲什麼我需要這樣做,也不要試圖將其改變成不同的東西。它只需要這樣做。你能幫我嗎?

回答

1

僞代碼(錯誤處理&一些聲明中省略等)

// 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); 
+0

謝謝您的答覆。但現在我有2個數據包,每個數據包都有1個緩衝區?它可能只有1個數據包和2個緩衝區嗎? NDIS_BUFFER結構中有一個稱爲Next的變量,如pNdisBuffer1-> Next = pNdisBuffer2; pNdisBuffer2-> Next = NULL; NdisChainBufferAtFront(pNdisPacket,pNdisBuffer1);我理解對嗎?可能嗎? – Miroslav

+0

您可能是對的,但MS不建議直接觸摸NDIS_BUFFER字段。請參閱代碼末尾的「回覆評論」。 – glagolig

+0

其實我已經解決了我的問題,這要歸功於你的帖子。我已經用NdisCopyBuffer創建了2個新的緩衝區,我已經設置了偏移量和長度。但後來我有鏈接問題。問題實際上是 - >下一個變量。沒有必要設置它,只需設置兩個緩衝區旁邊的NULL,然後將它們鏈接到數據包併發送它。我在你的文章中看到它,它工作。謝謝 :) – Miroslav