robin112233
驱动牛犊
驱动牛犊
  • 注册日期2007-05-02
  • 最后登录2008-03-20
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望8点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
阅读:1975回复:5

ptreceive中封包重组蓝屏问题

楼主#
更多 发布于:2007-05-25 18:40
大家好,小弟在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的内部工作原理也不清楚,希望各位能指点一下,先谢过了
wshmouse2003
驱动牛犊
驱动牛犊
  • 注册日期2007-03-30
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望16点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-05-27 21:26
同问些问题,加上另一个问题,那就是怎样才能在ptrecive中得到一个完整packet
jackiefzj
驱动牛犊
驱动牛犊
  • 注册日期2004-10-28
  • 最后登录2024-03-01
  • 粉丝0
  • 关注0
  • 积分495分
  • 威望135点
  • 贡献值0点
  • 好评度58点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2007-05-28 09:50
在驱动栈上使用这么大的局部数组变量,肯定要出错的
UCHAR buffer[MAX_PACKET_HEADER_LEN];
自己用ExAllocatePool动态分配,使用NonPagedPool内存,应该好了

另外,我没做过IMD,但你直接
NdisMoveMemory(buffer,HeaderBuffer,HeaderBufferSize);
把内存移走了?如果你不是想把这个包直接丢掉的话,应该也会出问题吧?
robin112233
驱动牛犊
驱动牛犊
  • 注册日期2007-05-02
  • 最后登录2008-03-20
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望8点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地板#
发布于: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;

就不会蓝屏了,但我不知道原因,为什么这么做了就不蓝屏
继续等待,求详细解释
wshmouse2003
驱动牛犊
驱动牛犊
  • 注册日期2007-03-30
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望16点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-06-13 17:19
问题描述的不清楚呀,能再说一下吗?我的问题还没有解决呀?
shenhui
驱动小牛
驱动小牛
  • 注册日期2006-05-11
  • 最后登录2023-02-10
  • 粉丝14
  • 关注11
  • 积分142分
  • 威望1314点
  • 贡献值1点
  • 好评度146点
  • 原创分0分
  • 专家分1分
  • 社区居民
5楼#
发布于:2007-07-05 20:10
PtReceive运行在DISPATCH_LEVEL,你分配的数组是Paged Memory,所以可能会产生缺页而蓝屏
作一名真实,诚实,优秀的科技工作者!
游客

返回顶部