2012-05-01 5 views
0

私はドライバプログラミングの初心者で、おそらく単純な問題の解決策を見つけることができません。私はwdkサンプルからndis_protサンプルドライバを編集しています。確かに、パケットはIrpとしてドライバに送られ、pNdisBufferに格納されます。そのバッファを2つの部分、すなわちpNdisBuffer1とpNdisBuffer2に分割する必要があります。最初はヘッダーで埋め、2番目はデータで連結し、両方をpNdisPacketに連結します。それについての記事はほとんどありませんが、私はこの事例を見つけることができません。それがここにスプリットNDIS_BUFFER(WDK)

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

に記載されているが、私はWDK(コード)の例を見たいようです可能なはずです。

PS:どうして私はこれを行う必要がありますか、それを別のものに変更しようとしないでください。そのようにしなければなりません。私を助けてくれますか?

答えて

1

擬似コードは、(エラーが&いくつかの宣言がされているなどommited取扱い)

// 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構造体に変数があるので、pNdisBuffer1-> Next = pNdisBuffer2のようになります。 pNdisBuffer2->次へ= NULL; NdisChainBufferAtFront(pNdisPacket、pNdisBuffer1);私はそれを正しく理解していますか?出来ますか? – Miroslav

+0

おそらく正しいですが、MSはNDIS_BUFFERフィールドに直接触れることはお勧めしません。コードの最後にある「コメントに対する応答」を参照してください。 – glagolig

+0

実際に私はあなたの記事のおかげで問題を解決しました。私はオフセットと長さを設定したNdisCopyBufferで2つの新しいバッファを作成しました。しかし、私は連鎖に問題があります。そして、問題は実際には - >次の変数でした。それを設定する必要はありません。両方のバッファをNULLに設定してから、両方をパケットにして送信してください。私はあなたのポストでそれを見て、それは働いた。ありがとうございました :) – Miroslav