Windows 如何使用NDIS筛选器驱动程序发送任意数据包?

Windows 如何使用NDIS筛选器驱动程序发送任意数据包?,windows,driver,wdk,windows-kernel,ndis,Windows,Driver,Wdk,Windows Kernel,Ndis,我目前正在尝试使用NDIS筛选器驱动程序从发送我自己的数据包 我想我必须用这个函数发送数据包。但我不知道如何创建这些数据包,也不知道应该将它们添加到现有的NetBufferList还是创建自己的数据包 我还需要修改函数吗 当驱动程序启动(DriverEntry)时,或当筛选器连接到微型端口(FilterAttach)时,使用NdisAllocateNetBufferListPool分配一个净缓冲区列表(NBL)池。对于典型的用法,您需要为每个NBL自动获取一个净缓冲区(NB),因此设置fAllo

我目前正在尝试使用NDIS筛选器驱动程序从发送我自己的数据包

我想我必须用这个函数发送数据包。但我不知道如何创建这些数据包,也不知道应该将它们添加到现有的NetBufferList还是创建自己的数据包

我还需要修改函数吗

  • 当驱动程序启动(DriverEntry)时,或当筛选器连接到微型端口(FilterAttach)时,使用
    NdisAllocateNetBufferListPool
    分配一个净缓冲区列表(NBL)池。对于典型的用法,您需要为每个NBL自动获取一个净缓冲区(NB),因此设置
    fAllocateNetBuffer=TRUE
    。如果希望NDIS为您分配数据有效负载缓冲区,请同时提供非零数据大小。如果您已经将数据包有效负载放在其他缓冲区中,则可以通过将NB指向现有MDL来加快传输速度,但这也需要更复杂的编码
  • 要发送数据包,请从
    NdisAllocateNetBufferAndNetBufferList
    分配一个新的NBL。将FilterModuleHandle放入NBL->SourceHandle。分配NB->DataLength并复制数据。在新的NBL上调用NDISFSendNetBufferList。请勿触摸NBL,直到它返回给您
  • 最终,NDIS将通过过滤器SendNetBufferListsComplete将NBL返回给您。请注意,所有的NBL都在一个混乱的链表中通过——既有您自己的NBL,也有您刚才从上面通过的任何NBL。因此,您必须根据NBL->SourceHandle对链接列表进行切片:如果SourceHandle是您的,则将NBL从流中取出,并通过NdisFreeNetBufferList释放它。否则,如果NBL不是您的,则通过调用ndisfsSendNetBufferListsComplete继续传播它
  • 在您创建的所有NBL返回给您之前,不要让FilterPause完成。您可以按任何方式执行此操作,但通常的方法是向send和sendcomplete路径添加一些refcounting。您不必担心您没有创建的任何NBL

  • 创建NBL时,可以使用
    !ndiskd.nbl
    再次检查您的工作。它可以检测各种错误。如果ndiskd以红色文本报告任何字段,则NBL可能存在问题。

    我已在函数
    filteratach
    中分配了一个NBL池(请参阅)
    myfilterthandle
    是NDIS_HANDLE类型的全局变量(因此我以后可以访问它)。1.现在我必须修改函数
    filtersendNetBufferList
    。您说过,因此我必须使用函数
    NdisAllocateNetBufferAndNetBufferList
    。我不确定要输入的参数。第一个参数是我保存在全局变量
    MyFilterHandle
    中的NDIS_句柄。但是
    PMDL
    类型的MdlChain呢?我还没有MDL链。如何创建一个。为什么我需要设置NDIS_句柄两次?我已经将
    MyFilterHandle
    传递到函数
    NdisAllocateNetBufferAndNetBufferList
    中。为什么需要设置返回的NBL的SourceHandle?2。明显的冗余是为了支持更高级的技巧,比如为一个微型端口堆栈分配NBL,但将它们重定向到另一个微型端口。1。如果你给NANBLP一个非零的数据大小,你将免费得到MDL,所以你不需要给Nanbabl一个。最后一个参数是0。谢谢你的回答。我已尝试按照您的说明进行操作,但不幸的是,我的代码()中仍然存在问题。当前,在安装驱动程序的过程中会出现一个蓝屏。你能帮我吗?正如您在代码中看到的,我想测试发送空包。这是个问题吗?软件包必须有内容吗?