阅读:5997回复:44
怎样解决DRIVE_IRQL_NOT_LESS_OR_EQUAL问题?哪位高手赶紧帮帮忙!!
我的程序(修改passthru例子)运行一段时间后系统出现蓝屏,系统提示为:
DRIVER_IRQL_NOT_LESS_OR_EQUAL 这是什么意思? 解决这问题有何对策? 望高手们指点!! [编辑 - 11/19/02 by freeshar] [编辑 - 11/19/02 by freeshar] [编辑 - 11/20/02 by freeshar] |
|
最新喜欢:![]()
|
沙发#
发布于:2002-11-19 16:27
原因:驱动程序在DISPATCH_LEVEL_IRQ或之上接触分页内存。
驱动程序可能使用了一个假的指针,可使用它的第四个错误检查参数可找到有问题的源代码行。 |
|
|
板凳#
发布于:2002-11-19 16:33
原因:驱动程序在DISPATCH_LEVEL_IRQ或之上接触分页内存。 是指 LESS 吗? 具体怎样做? 我在程序里引用了 my_Data=(PCHAR)ExAllocatePool(NonPagedPool,iTotal); 是不是这里有问题? |
|
|
地板#
发布于:2002-11-19 16:39
请在容易出错的地方用SEH,即:
__try { __try { } __except() { } __finally { } 可以捕获到而异常,从而进行精确的定位。 |
|
|
地下室#
发布于:2002-11-19 16:46
我在程序里引用了
my_Data=(PCHAR)ExAllocatePool(NonPagedPool,iTotal); 是不是这里有问题? [/quote] 应该是这儿! [编辑 - 11/19/02 by ydyuse] |
|
|
5楼#
发布于:2002-11-19 16:47
请在容易出错的地方用SEH,即: 我看了一些资料也提到此方法,但还没用过,能个例子吗? 比如我怀凝 my_Data=(PCHAR)ExAllocatePool(NonPagedPool,iTotal); . . . 出有问题,那怎样用上你给出的方法? 如用了会有那些提示信息? |
|
|
6楼#
发布于:2002-11-19 17:50
我在程序里引用了 应该是这儿! [编辑 - 11/19/02 by ydyuse] [/quote] 谢谢ydyuse和版主!! 我对程序做了修改 加了 ExFreePool((PVOID)my_Data); 但问题还是一样? 加自旋锁也没能解决? 我原本的程序是没有出现死机的,是后来加上了 ... my_Data=(PCHAR)ExAllocatePool(NonPagedPool,iTotal); ... 这一段之后才出现的。 怎么办?帮我想想办法呀? |
|
|
7楼#
发布于:2002-11-20 01:48
NonPagedPool好像只能在DISPATCH_LEVEL_IRQL或之上使用,但是我不知道程序代码什么是属于哪个层次?怎么判断呢?请指教!
|
|
8楼#
发布于:2002-11-20 08:36
NonPagedPool好像只能在DISPATCH_LEVEL_IRQL或之上使用,但是我不知道程序代码什么是属于哪个层次?怎么判断呢?请指教! 请参阅DDK的“Network Drivers Reference”,那里列出了每一个NdisXXX函数的IRQL。 |
|
|
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 等等 也可在运行时控制分页能力 别忘给分!! |
|
|
10楼#
发布于:2002-11-20 16:12
老兄,还未解决啊? 谢谢,书是看了,但还缺乏动手操作能力. 现在肯定是 my_Data=(PCHAR)ExAllocatePool(NonPagedPool,iTotal); 引发页故障倒致系统崩溃,但是我想不出用什么办法防止它引发面故障啊!! 老兄,你经验丰富能给出我解决的办法吗? [编辑 - 11/20/02 by freeshar] |
|
|
11楼#
发布于:2002-11-20 16:50
你象这样处理以下吗:
Msg = (char*)ExAllocatePool(NonPagedPool,max); if( Msg==NULL) { DebugPrintMsg(\"DebugPrint: Could not allocate buffer\"); return; } |
|
|
12楼#
发布于:2002-11-20 17:07
另外的可能是 my_data 指针值被改变了,导致my_data乱指(这种情况会引起各种各样的错误);
改变的原因可能是其它某个操作的时候内存覆盖了它; |
|
13楼#
发布于:2002-11-20 17:59
你象这样处理以下吗: 谢谢! 此方法我也曾用过,但由于出现死机的时间段很长(一般半个钟以上)才出现,所以也没能测出什么信息来. 回头我再试试看. |
|
|
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地址输出,但问题就是运行一段时间后出现系统蓝屏,提示如题。 不知小弟如此写是否清楚? 我自已试了很多种方法,但未能解决,还请各位高手指点出程序错误之处,或给予改进! 谢谢先了!! |
|
|
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; } |
|
|
16楼#
发布于:2002-11-21 08:46
这个例子的处理比较好: 谢谢ydyuse! 我先按照你给出的方法调试一下看看先。 |
|
|
17楼#
发布于:2002-11-21 08:57
不谢,调通了别忘给分!
|
|
|
18楼#
发布于:2002-11-21 09:01
不谢,调通了别忘给分! OK! |
|
|
19楼#
发布于:2002-11-21 09:05
这个例子的处理比较好: 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; |
|
|
上一页
下一页