擬似コードは、(エラーが&いくつかの宣言がされているなど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);
はご回答いただきありがとうございます。しかし、今は2つのパケットがあり、それぞれに1つのバッファがありますか? 1パケットと2バッファしか持たないのですか?次のようにNDIS_BUFFER構造体に変数があるので、pNdisBuffer1-> Next = pNdisBuffer2のようになります。 pNdisBuffer2->次へ= NULL; NdisChainBufferAtFront(pNdisPacket、pNdisBuffer1);私はそれを正しく理解していますか?出来ますか? – Miroslav
おそらく正しいですが、MSはNDIS_BUFFERフィールドに直接触れることはお勧めしません。コードの最後にある「コメントに対する応答」を参照してください。 – glagolig
実際に私はあなたの記事のおかげで問題を解決しました。私はオフセットと長さを設定したNdisCopyBufferで2つの新しいバッファを作成しました。しかし、私は連鎖に問題があります。そして、問題は実際には - >次の変数でした。それを設定する必要はありません。両方のバッファをNULLに設定してから、両方をパケットにして送信してください。私はあなたのポストでそれを見て、それは働いた。ありがとうございました :) – Miroslav