【问题标题】:Split NDIS_BUFFER (WDK)拆分 NDIS_BUFFER (WDK)
【发布时间】:2012-05-11 01:30:13
【问题描述】:

我是驱动程序编程的新手,我无法为一个可能很简单的问题找到解决方案。我正在编辑 wdk 示例中的 ndis_prot 示例驱动程序。目前,数据包作为 Irp 到达驱动程序并存储到 pNdisBuffer 中。我需要将该缓冲区分成两部分 - pNdisBuffer1 和 pNdisBuffer2 - 首先填充标头,然后填充数据并将它们都链接到 pNdisPacket。关于这方面的文章很少,但我找不到这方面的例子。应该是可能的,就像这里描述的那样

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

但我想看看 wdk 中的示例(代码)。

PS:请不要问我为什么需要这样做,也不要尝试将其更改为不同的东西。它只需要那样做。你能帮帮我吗?

【问题讨论】:

    标签: split buffer driver wdk ndis


    【解决方案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);
    

    【讨论】:

    • 感谢您的回复。但是现在我有 2 个数据包,每个数据包都有 1 个缓冲区?是否可以只有 1 个数据包和 2 个缓冲区? NDIS_BUFFER 结构中有一个名为 Next 的变量,因此类似于 pNdisBuffer1->Next = pNdisBuffer2; pNdisBuffer2->下一个 = NULL; NdisChainBufferAtFront(pNdisPacket, pNdisBuffer1);我理解对了吗?有可能吗?
    • 您可能是对的,但 MS 不建议直接触摸 NDIS_BUFFER 字段。请参阅代码末尾的“回复评论”。
    • 实际上,感谢您的帖子,我刚刚解决了我的问题。我使用 NdisCopyBuffer 创建了 2 个新缓冲区,其中设置了偏移量和长度。但是后来我遇到了链接问题。问题实际上出在 -> Next 变量上。无需设置,只需将两个缓冲区的 Next 设置为 NULL,然后将它们链接到数据包并发送。我在你的帖子中看到了它并且它有效。谢谢你:)
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多