阅读:3957回复:10
NDIS 6.0 Filter 克隆缓冲包列表
在发送例程中将所的缓冲表都克隆一份,将克隆后的缓冲表发送到下层驱动中,在发送完成例程中将克隆的缓冲表释放掉将原始的缓冲表完成,但是在window7虚拟机中出现以下情况:ICMP包可以正常收发,但是通过IE访问网页不行,请教一下这是什么情况?,代码如下:
VOID FilterSend(NDIS_HANDLE Context, PNET_BUFFER_LIST Buffers, NDIS_PORT_NUMBER Port, ULONG Flags) { NDIS_HANDLE Handle = NULL; PNET_BUFFER_LIST Current = Buffers; PNET_BUFFER_LIST Next = NULL; PMODULE Module = (PMODULE)Context; KdPrint(("FilterSend.\n")); GetModuleHandle(Module, &Handle); do { PNET_BUFFER_LIST Clone = NULL; Next = NET_BUFFER_LIST_NEXT_NBL(Current); NET_BUFFER_LIST_NEXT_NBL(Current) = NULL; Clone = NdisAllocateCloneNetBufferList(Current, Filter.Buffers, Filter.Buffer, NDIS_CLONE_FLAGS_USE_ORIGINAL_MDLS); if (NULL != Clone) { Clone->ParentNetBufferList = Current; /*Clone->Context = Current->Context;*/ if (NULL != Current->Context) { Clone->Context = Current->Context; KdPrint(("Context is not NULL.\n")); } NdisFSendNetBufferLists(Handle, Clone, Port, Flags); } else { KdPrint(("NdisAllocateCloneNetBufferList.\n")); } Current = Next; } while (NULL != Current); } VOID FilterSendComplete(NDIS_HANDLE Context, PNET_BUFFER_LIST Buffers, ULONG Flags) { NDIS_HANDLE Handle = NULL; PNET_BUFFER_LIST Current = Buffers; PNET_BUFFER_LIST Next = NULL; PMODULE Module = (PMODULE)Context; KdPrint(("FilterSendComplete.\n")); GetModuleHandle(Module, &Handle); do { Next = NET_BUFFER_LIST_NEXT_NBL(Current); NET_BUFFER_LIST_NEXT_NBL(Current) = NULL; if (NULL != Current->ParentNetBufferList) { PNET_BUFFER_LIST Original = Current->ParentNetBufferList; NET_BUFFER_LIST_STATUS(Original) = NET_BUFFER_LIST_STATUS(Current); if (NDIS_STATUS_SUCCESS != NET_BUFFER_LIST_STATUS(Original)) { KdPrint(("Send packet failed.\n")); } Current->ParentNetBufferList = NULL; NdisFreeCloneNetBufferList(Current, NDIS_CLONE_FLAGS_USE_ORIGINAL_MDLS); NdisFSendNetBufferListsComplete(Handle, Original, Flags); } else { NdisFSendNetBufferListsComplete(Handle, Current, Flags); } Current = Next; } while (NULL != Current); } |
|
沙发#
发布于:2012-09-18 18:43
有谁处理过缓冲表克隆的情况,可以QQ(215989681)联系我。
|
|
板凳#
发布于:2012-09-18 22:13
兄弟,你是想改发送内容吧?TCP的话,你改内容后,如果数据长度发生了变化了,那就要维护序列号了,相当麻烦。由于ICMP协议不需要维护,所以ICMP就行。
|
|
地板#
发布于:2012-09-18 22:50
我不修改包的内容,我只是想测试将原始缓冲表复制一份,将其发下去,等完成后再将其释放掉,主要是想使用一下NdisAllocateCloneNetBufferList这个函数,在WDK中对于克隆这个操作的说明太少了,看看具体的怎么操作,但是出现这个问题,关于发送的代码就这些了,没有对缓冲表内容进行任何的修改
|
|
地下室#
发布于:2012-09-21 17:36
没有人处理过吗,帮忙分析一下是可能的原因也行呀
|
|
5楼#
发布于:2012-09-24 04:02
没有人处理过吗,帮忙分析一下是可能的原因也行
|
|
6楼#
发布于:2012-09-27 17:38
NetBufferList有个成员指针还会指向下一个NetBufferList
你可能只是克隆了第一个NetBufferList,查查二者的一个成员,好像是nextNetBufferList是不是一样。 |
|
7楼#
发布于:2012-09-27 17:44
不对。刚才没有仔细看你的代码
跟原来的发送方式相比,你把n个NetBufferList分n次下发了,这个好像也没有问题。 在虚拟机里面采用NAT上网的方式,在代外面主机抓包下,看看http请求是否发出 |
|
8楼#
发布于:2012-09-28 18:57
终于有回复了,我按你说的试一下哈
|
|
9楼#
发布于:2012-10-10 13:04
带外信息 ?
|
|
|
10楼#
发布于:2014-05-13 15:46
我试过自己COPY BNL, 没试过克隆, 不过COPY发送没有问题,克隆应该也没问题才对。
克隆的好像NBL中的DATA和之前的NBL的DATA是同一个缓冲区,如果要修改数据最好用COPY方式。 |
|
|