我使用线程的初始化部分:
KeInitializeSpinLock( &pdx->lkIrpQueue );
InitializeListHead( &pdx->IrpQueueListHead );
KeInitializeSemaphore( &pdx->semIrpQueue, 0, MAXLONG);
KeInitializeEvent( &pdx->evDeviceOperationComplete, SynchronizationEvent, FALSE );
status = PsCreateSystemThread( &hThread, (ACCESS_MASK)0, NULL,
(HANDLE)0, NULL, WorkerThreadMain, pdx );
ObReferenceObjectByHandle( hThread, THREAD_ALL_ACCESS,
NULL, KernelMode, (PVOID*)&pdx-pThreadObj, NULL );
ZwClose( hThread );
我加上这段,在进行usb配置的时候调用IoCallDriver就蓝屏,提示IRQ_NOT_LESS_OR_EQUAL,不加则一切正常。
在论坛上看了几个帖子,说驱动程序在DISPATCH_LEVEL_IRQ或之上接触分页内存后就这样。
我在调用IoCallDriver之前KeGetCurrentIrql(),都是passive_level,再就不知道了,大家给指点一下,或者察看什么资料?
有时候访问无效的地址也会导致 IRQ_NOT_LESS_OR_EQUAL,你应该检查一下你的代码有没有无效指针