0

私はドライバープログラミングに不慣れで、おそらく単純な問題の解決策を見つけることができません。wdkの例からndis_protサンプルドライバーを編集しています。現在、パケットはIrpとしてドライバーに送られ、pNdisBufferに格納されます。そのバッファを2つの部分(pNdisBuffer1とpNdisBuffer2)に分割する必要があります。最初にヘッダーを入力し、次にデータを入力して、両方をpNdisPacketにチェーンします。それについての記事はほとんどありませんが、私はこれの例を見つけることができません。ここで説明されているように可能であるはずです

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

しかし、wdk(コード)の例を見たいと思います。

PS:なぜ私がこれをする必要があるのか​​、それを別のものに変えようとするのかと聞かないでください。それはそのように行われなければなりません。手伝ってくれませんか。

4

1 に答える 1

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);
于 2012-05-02T00:00:50.907 に答える