阅读:1975回复:5
ptreceive中封包重组蓝屏问题
大家好,小弟在passthru中添加了部分过滤代码,其中有个地方需要在Pt Receive()中重组封包 ,并将封包头取出,通过Pt Receive()中加入Resource实现,其代码如下:
Resource( IN PADAPT pAdapt, IN NDIS_HANDLE MacReceiveContext, IN PVOID HeaderBuffer, IN UINT HeaderBufferSize, IN PVOID LookAheadBuffer, IN UINT LookAheadBufferSize, IN UINT PacketSize ) { UCHAR buffer[MAX_PACKET_HEADER_LEN]; NdisMoveMemory(buffer,HeaderBuffer,HeaderBufferSize); NdisMoveMemory(buffer+HeaderBufferSize,LookAheadBuffer,LookAheadBufferSize); //上面三行为出问题的地方 nReadBytes=HeaderBufferSize+LookAheadBufferSize; } 一运行上面几行,就会蓝屏,注掉就能正常运行 dmp提示为IRQL_NOT_LESS_OR_EQUAL 查了一下,好象是因为操作了分页内存的原因,但究竟应该怎样申请非分页内存,把HeaderBuffer和LookAheadBuffer拷到这块内存中,能不能用NdisMoveMemory? 小弟初学NDIS,对NT的内部工作原理也不清楚,希望各位能指点一下,先谢过了 |
|
沙发#
发布于:2007-05-27 21:26
同问些问题,加上另一个问题,那就是怎样才能在ptrecive中得到一个完整packet
|
|
板凳#
发布于:2007-05-28 09:50
在驱动栈上使用这么大的局部数组变量,肯定要出错的
UCHAR buffer[MAX_PACKET_HEADER_LEN]; 自己用ExAllocatePool动态分配,使用NonPagedPool内存,应该好了 另外,我没做过IMD,但你直接 NdisMoveMemory(buffer,HeaderBuffer,HeaderBufferSize); 把内存移走了?如果你不是想把这个包直接丢掉的话,应该也会出问题吧? |
|
地板#
发布于:2007-05-28 15:12
谢谢jackiefzj
MAX_PACKET_HEADER_LEN 我定义为100 NdisMoveMemory的作用应该是拷贝内存过去,buffer为目标指针 我再去试下ExAllocatePool分配NonPagedPool内存的方法 现在蓝屏的问题已经解决了,我在Resource()中新开一个子函数,然后把 buffer, HeaderBuffer, HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize 几个参数传进去,再在子函数中进行 NdisMoveMemory(buffer,HeaderBuffer,HeaderBufferSize); NdisMoveMemory(buffer+HeaderBufferSize,LookAheadBuffer,LookAheadBufferSize); nReadBytes=HeaderBufferSize+LookAheadBufferSize; 就不会蓝屏了,但我不知道原因,为什么这么做了就不蓝屏 继续等待,求详细解释 |
|
地下室#
发布于:2007-06-13 17:19
问题描述的不清楚呀,能再说一下吗?我的问题还没有解决呀?
|
|
5楼#
发布于:2007-07-05 20:10
PtReceive运行在DISPATCH_LEVEL,你分配的数组是Paged Memory,所以可能会产生缺页而蓝屏
|
|
|