paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:5997回复:44

怎样解决DRIVE_IRQL_NOT_LESS_OR_EQUAL问题?哪位高手赶紧帮帮忙!!

楼主#
更多 发布于:2002-11-19 16:13
我的程序(修改passthru例子)运行一段时间后系统出现蓝屏,系统提示为:
DRIVER_IRQL_NOT_LESS_OR_EQUAL
这是什么意思?
解决这问题有何对策?
望高手们指点!!


[编辑 -  11/19/02 by  freeshar]

[编辑 -  11/19/02 by  freeshar]

[编辑 -  11/20/02 by  freeshar]

最新喜欢:

leavepeaceleavep...
知之为知之,不知为不知 有错则改之
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-19 16:27
原因:驱动程序在DISPATCH_LEVEL_IRQ或之上接触分页内存。

驱动程序可能使用了一个假的指针,可使用它的第四个错误检查参数可找到有问题的源代码行。
生命驱动,活力无限!
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-19 16:33
原因:驱动程序在DISPATCH_LEVEL_IRQ或之上接触分页内存。

驱动程序可能使用了一个假的指针,可使用它的第四个错误检查参数可找到有问题的源代码行。
 

是指 LESS 吗?
具体怎样做?
我在程序里引用了
my_Data=(PCHAR)ExAllocatePool(NonPagedPool,iTotal);
是不是这里有问题?
知之为知之,不知为不知 有错则改之
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-19 16:39
请在容易出错的地方用SEH,即:
__try
{
__try
{
}
__except()
{
}
__finally
{
}
可以捕获到而异常,从而进行精确的定位。
Tom_lyd
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-19 16:46
我在程序里引用了
my_Data=(PCHAR)ExAllocatePool(NonPagedPool,iTotal);
是不是这里有问题? [/quote]

应该是这儿!


[编辑 -  11/19/02 by  ydyuse]
生命驱动,活力无限!
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-19 16:47
请在容易出错的地方用SEH,即:
__try
{
__try
{
}
__except()
{
}
__finally
{
}
可以捕获到而异常,从而进行精确的定位。


我看了一些资料也提到此方法,但还没用过,能个例子吗?
比如我怀凝
my_Data=(PCHAR)ExAllocatePool(NonPagedPool,iTotal);
.
.
.
出有问题,那怎样用上你给出的方法?
如用了会有那些提示信息?
知之为知之,不知为不知 有错则改之
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-11-19 17:50
我在程序里引用了
my_Data=(PCHAR)ExAllocatePool(NonPagedPool,iTotal);
是不是这里有问题?


应该是这儿!


[编辑 -  11/19/02 by  ydyuse] [/quote]
谢谢ydyuse和版主!!

我对程序做了修改
加了
 ExFreePool((PVOID)my_Data);
但问题还是一样?
加自旋锁也没能解决?
我原本的程序是没有出现死机的,是后来加上了
...
my_Data=(PCHAR)ExAllocatePool(NonPagedPool,iTotal);
...
这一段之后才出现的。
怎么办?帮我想想办法呀?
知之为知之,不知为不知 有错则改之
Coder
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2011-03-09
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望34点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-11-20 01:48
NonPagedPool好像只能在DISPATCH_LEVEL_IRQL或之上使用,但是我不知道程序代码什么是属于哪个层次?怎么判断呢?请指教!
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-20 08:36
NonPagedPool好像只能在DISPATCH_LEVEL_IRQL或之上使用,但是我不知道程序代码什么是属于哪个层次?怎么判断呢?请指教!

请参阅DDK的“Network Drivers Reference”,那里列出了每一个NdisXXX函数的IRQL。
知之为知之,不知为不知 有错则改之
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-11-20 15:59
老兄,还未解决啊?
最好去看Walter Oney书第三章的内存管理一节。

执行在高于或等于DISPATCH_LEVEL级的代码不可以引发页故障。

编译时控制分页能力
example:

#ifdef ALLOC_PRAGMA
  #pragma alloc_text(PAGE, AddDevice)
  #pragma alloc_text(PAGE, DispatchPnp)
  ...
#endif

#ifdef ALLOC_DATA_PRAGMA
  #pragma data_seg(\"PAGE\")
#endif

等等
也可在运行时控制分页能力

别忘给分!!
生命驱动,活力无限!
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-11-20 16:12
老兄,还未解决啊?
最好去看Walter Oney书第三章的内存管理一节。

执行在高于或等于DISPATCH_LEVEL级的代码不可以引发页故障。

编译时控制分页能力
example:

#ifdef ALLOC_PRAGMA
  #pragma alloc_text(PAGE, AddDevice)
  #pragma alloc_text(PAGE, DispatchPnp)
  ...
#endif

#ifdef ALLOC_DATA_PRAGMA
  #pragma data_seg(\"PAGE\")
#endif

等等
也可在运行时控制分页能力

别忘给分!!

谢谢,书是看了,但还缺乏动手操作能力.
现在肯定是
my_Data=(PCHAR)ExAllocatePool(NonPagedPool,iTotal);
引发页故障倒致系统崩溃,但是我想不出用什么办法防止它引发面故障啊!!
老兄,你经验丰富能给出我解决的办法吗?


[编辑 -  11/20/02 by  freeshar]
知之为知之,不知为不知 有错则改之
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-11-20 16:50
你象这样处理以下吗:

Msg = (char*)ExAllocatePool(NonPagedPool,max);
if( Msg==NULL)
{
DebugPrintMsg(\"DebugPrint: Could    not    allocate buffer\");
return;
}
生命驱动,活力无限!
emailxj
驱动牛犊
驱动牛犊
  • 注册日期2002-05-15
  • 最后登录2009-04-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-11-20 17:07
另外的可能是 my_data 指针值被改变了,导致my_data乱指(这种情况会引起各种各样的错误);

改变的原因可能是其它某个操作的时候内存覆盖了它;
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-11-20 17:59
你象这样处理以下吗:

Msg = (char*)ExAllocatePool(NonPagedPool,max);
if( Msg==NULL)
{
DebugPrintMsg(\"DebugPrint: Could    not    allocate buffer\");
return;
}


谢谢!
此方法我也曾用过,但由于出现死机的时间段很长(一般半个钟以上)才出现,所以也没能测出什么信息来.
回头我再试试看.
知之为知之,不知为不知 有错则改之
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-11-21 08:34
请大家继续关注,问题还没有解决!!
我再说详细些,是这样的:
首先,我的原意是自定义一个函数
unsigned long GetPacketIp_dest( PNDIS_PACKET pPacket )
从packet里返回目标IP地址,在这函数里定义了my_Data,并使用
my_Data=(PCHAR)ExAllocatePool(NonPagedPool,iTotal)
为其分配内存,随后:
CopyPacketData(pPacket, my_Data, max);
pEthHdr=( PEthHead )my_Data;
pIpHdr= ( PIpHead )( my_Data + sizeof
                   ( EthHead ) );

return pIpHdr->destIPAddress;
////////////////////////////////////////////////////////

//CopyPacketData()函数为:
UINT
CopyPacketData(
PNDIS_PACKET pPacket,
PCHAR pData,
UINT iSize)
{
UINT iLength;
UINT iPos;
PNDIS_BUFFER pNextBuffer;
PCHAR pBuffer;

iPos = 0;
NdisQueryPacket( pPacket,
NULL,
NULL,
&pNextBuffer,
&iLength );
if( iLength > iSize ) return iPos;
while( pNextBuffer ) {
NdisQueryBuffer( pNextBuffer,&pBuffer, &iLength );
if( iLength > iSize - iPos || !pBuffer ) break;
NdisMoveMemory( pData + iPos, pBuffer, iLength );
NdisGetNextBuffer( pNextBuffer, &pNextBuffer );
iPos += iLength;
}

return iPos;
}

最后我是在:
Miniport注册函数MPSendPackets()中在包转发之前调用GetPacketIp_dest()的,将返回的值DbgPrint()显示出来。
结果是能准确的将目标IP地址输出,但问题就是运行一段时间后出现系统蓝屏,提示如题。
不知小弟如此写是否清楚?
我自已试了很多种方法,但未能解决,还请各位高手指点出程序错误之处,或给予改进!
谢谢先了!!



知之为知之,不知为不知 有错则改之
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-11-21 08:35
这个例子的处理比较好:
NTSTATUS AddDevice(...)
{
  NTSTATUS status = STATUS_UNSUCCESSFUL;
  PDEVICE_OBJECT fdo;
  PDEVICE_EXTENSION pdx;
  status = IoCreateDevice(..., &fdo);
  if (!NT_SUCCESS(status))
    return status;
  __try
  {
    pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
    ...
    pdx->DeviceDescriptor = (PUSB_DEVICE_DESCRIPTOR)
      ExAllocatePool(NonPagedPool, sizeof(USB_DEVICE_DESCRIPTOR));
    if (!pdx->DeviceDescriptor)
      return STATUS_INSUFFICIENT_RESOURCES;
    IoInitializeRemoveLock(&pdx->RemoveLock, ...);
    status = IoRegisterDeviceInterface(..., &pdx->ifname);
    if (!NT_SUCCESS(status))
      return status;
    ...
  }
  __finally
  {
    if (!NT_SUCCESS(status))
    {
      ...
      if (pdx->ifname.Buffer)
        RtlFreeUnicodeString(&pdx->ifname);
      if (pdx->DeviceDescriptor)
        ExFreePool((PVOID) pdx->DeviceDescriptor);
      IoDeleteDevice(fdo);
    }
  }
  return status;
}
 

生命驱动,活力无限!
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-11-21 08:46
这个例子的处理比较好:
NTSTATUS AddDevice(...)
{
  NTSTATUS status = STATUS_UNSUCCESSFUL;
  PDEVICE_OBJECT fdo;
  PDEVICE_EXTENSION pdx;
  status = IoCreateDevice(..., &fdo);
  if (!NT_SUCCESS(status))
    return status;
  __try
  {
    pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
    ...
    pdx->DeviceDescriptor = (PUSB_DEVICE_DESCRIPTOR)
      ExAllocatePool(NonPagedPool, sizeof(USB_DEVICE_DESCRIPTOR));
    if (!pdx->DeviceDescriptor)
      return STATUS_INSUFFICIENT_RESOURCES;
    IoInitializeRemoveLock(&pdx->RemoveLock, ...);
    status = IoRegisterDeviceInterface(..., &pdx->ifname);
    if (!NT_SUCCESS(status))
      return status;
    ...
  }
  __finally
  {
    if (!NT_SUCCESS(status))
    {
      ...
      if (pdx->ifname.Buffer)
        RtlFreeUnicodeString(&pdx->ifname);
      if (pdx->DeviceDescriptor)
        ExFreePool((PVOID) pdx->DeviceDescriptor);
      IoDeleteDevice(fdo);
    }
  }
  return status;
}
 

 


谢谢ydyuse!
我先按照你给出的方法调试一下看看先。
知之为知之,不知为不知 有错则改之
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-11-21 08:57
不谢,调通了别忘给分!
生命驱动,活力无限!
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-11-21 09:01
不谢,调通了别忘给分!

OK!
知之为知之,不知为不知 有错则改之
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-11-21 09:05
这个例子的处理比较好:
NTSTATUS AddDevice(...)
{
  NTSTATUS status = STATUS_UNSUCCESSFUL;
  PDEVICE_OBJECT fdo;
  PDEVICE_EXTENSION pdx;
  status = IoCreateDevice(..., &fdo);
  if (!NT_SUCCESS(status))
    return status;
  __try
  {
    pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
    ...
    pdx->DeviceDescriptor = (PUSB_DEVICE_DESCRIPTOR)
      ExAllocatePool(NonPagedPool, sizeof(USB_DEVICE_DESCRIPTOR));
    if (!pdx->DeviceDescriptor)
      return STATUS_INSUFFICIENT_RESOURCES;
    IoInitializeRemoveLock(&pdx->RemoveLock, ...);
    status = IoRegisterDeviceInterface(..., &pdx->ifname);
    if (!NT_SUCCESS(status))
      return status;
    ...
  }
  __finally
  {
    if (!NT_SUCCESS(status))
    {
      ...
      if (pdx->ifname.Buffer)
        RtlFreeUnicodeString(&pdx->ifname);
      if (pdx->DeviceDescriptor)
        ExFreePool((PVOID) pdx->DeviceDescriptor);
      IoDeleteDevice(fdo);
    }
  }
  return status;
}
 

 


sorry!还要再请教,不知我这样改行不行?

.....
NTSTATUS status=STATUS_UNSUCCESSFUL;
  
.....
    
__try
{
 my_Data=(PCHAR)ExAllocatePool  (NonPagedPool,iTotal);
 if(!my_Data)
   return STATUS_INSUFFICIENT_RESOURCES;
   copyPacketData(pPacket, my_Data, iTotal);
   pEthHdr=( PEthHead )my_Data;
   pIpHdr= ( PIpHead )( my_Data + sizeof( EthHead ) );
}
__finally
{
if(my_Data)
ExFreePool((PVOID)my_Data);
}
return pIpHdr->destIPAddress;
知之为知之,不知为不知 有错则改之
上一页
游客

返回顶部