Доброго времени суток! Есть драйвер перехватывающий MajorFunction некоторых драйверов в системе в том числе драйвер usbhub. Периодически получаю BSOD (редко), причем воспроизвести эту ошибку не могу. Код (Text): IRQL_NOT_LESS_OR_EQUAL (a) An attempt was made to access a pageable (or completely invalid) address at an interrupt request level (IRQL) that is too high. This is usually caused by drivers using improper addresses. If a kernel debugger is available get the stack backtrace. Arguments: Arg1: 00000119, memory referenced Arg2: 0000001c, IRQL Arg3: 00000000, bitfield : bit 0 : value 0 = read operation, 1 = write operation bit 3 : value 0 = not an execute operation, 1 = execute operation (only on chips which support this level of status) Arg4: 804fa224, address which referenced memory Debugging Details: ------------------ READ_ADDRESS: 00000119 CURRENT_IRQL: 1c FAULTING_IP: nt!KeSetEvent+32 804fa224 66394616 cmp word ptr [esi+16h],ax DEFAULT_BUCKET_ID: DRIVER_FAULT BUGCHECK_STR: 0xA PROCESS_NAME: System IRP_ADDRESS: 899eccb8 DEVICE_OBJECT: 899ebba0 DRIVER_OBJECT: 8a71f030 IMAGE_NAME: usbhub.sys DEBUG_FLR_IMAGE_TIMESTAMP: 46d842f3 MODULE_NAME: usbhub FAULTING_MODULE: ba9c8000 usbhub TRAP_FRAME: baceba1c -- (.trap 0xffffffffbaceba1c) ErrCode = 00000000 eax=00000001 ebx=899ecc01 ecx=baceb3c8 edx=00000000 esi=00000103 edi=3c627255 eip=804fa224 esp=baceba90 ebp=baceba9c iopl=0 nv up ei pl nz na pe nc cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00010206 nt!KeSetEvent+0x32: 804fa224 66394616 cmp word ptr [esi+16h],ax ds:0023:00000119=???? Resetting default scope LAST_CONTROL_TRANSFER: from 804fa224 to 80544440 STACK_TEXT: baceba1c 804fa224 badb0d00 00000000 bace9000 nt!KiTrap0E+0x238 baceba9c 804f4d58 baceb3c8 00000000 00000000 nt!KeSetEvent+0x32 bacebaf8 804ff813 899eccf8 bacebb44 bacebb38 nt!IopCompleteRequest+0x232 bacebb48 806e4ef2 00000000 00000000 bacebb60 nt!KiDeliverApc+0xb3 bacebb48 806e4427 00000000 00000000 bacebb60 hal!HalpApcInterrupt+0xc6 bacebbd0 805200c2 c06ce100 e4a25700 007ffff8 hal!KfLowerIrql+0x17 bacebc24 8051ae7d 00000000 d9c20000 00000000 nt!MmAccessFault+0x934 bacebc84 804e1aa9 d9c20000 00000000 80558698 nt!MmCheckCachedPageState+0x601 bacebd34 804e70d6 8a9b6290 805637a0 8a9b7020 nt!CcPerformReadAhead+0x20b bacebd7c 805384c5 8a9b6290 00000000 8a9b7020 nt!CcWorkerThread+0x150 bacebdac 805cec4e 8a9b6290 00000000 00000000 nt!ExpWorkerThread+0xef bacebddc 80545e3e 805383d6 00000000 00000000 nt!PspSystemThreadStartup+0x34 00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16 STACK_COMMAND: kb FOLLOWUP_NAME: MachineOwner FAILURE_BUCKET_ID: 0xA_IMAGE_usbhub.sys_DATE_2007_08_31 BUCKET_ID: 0xA_IMAGE_usbhub.sys_DATE_2007_08_31 Followup: MachineOwner --------- В стеке вызовов драйверов моего драйвера нет. Буду очень благодарен за помощь в поиске корня проблемы.
Marik >корень проблемы Аллоцирование KEVENT для irp->UserEvent на стеке. Призыв к действию для всех начинающих: показывайте vertarget, используйте verifier.
Господа, подскажите по теории, почему код ниже в Win7 выдает BSOD при запущеном verifier invoke KeInitializeMutex, addr g_Mutex, 0 invoke KeWaitForMutexObject, addr g_Mutex, Executive, KernelMode, FALSE, NULL invoke KeReleaseMutex, addr g_Mutex, FALSE DRIVER_VERIFIER_DETECTED_VIOLATION (c4) Arguments: Arg1: 00001007, Releasing lock that is not owned by the current thread. Arg2: 9152b9fe, Lock address. Arg3: 892accc0, Verifier internal data. Arg4: 889f6118, Verifier internal data. При этом в WinXP подобной ошибки нет.
1. Что вернула KeWaitForMutexObject()? 2. Уверен, что всё это происходит в одном и том же потоке и в правильной последовательности?
Marik >почему код ниже в Win7 выдает BSOD при запущеном verifier Инициализация мьютекса из потока1 — Захват мьютекса из потока1 — Инициализация того же мьютекса из потока2 — Захват мьютекса из потока2 — Освобождение мьютекса, занятого потоком2, из потока1. И как насчёт KEVENT – мы были правы?
STATUS_SUCCESS Для точности скопировал эти 3 строчки в DriverEntry в результате BSOD уже при загрузке драйвера. Т.е. один поток, сам создал, сам занял, сам освободил мьютекс Уточню еще раз что ОС Win7, на WinXP verifier не ругается.
отсюда (http://wasm.ru/article.php?article=drvw2k05) в skeleton вставил строчки в DriverEntry g_Mutex KMUTEX <> invoke KeInitializeMutex, addr g_Mutex, 0 invoke KeWaitForMutexObject, addr g_Mutex, Executive, KernelMode, FALSE, NULL .if !eax invoke KeReleaseMutex, addr g_Mutex, FALSE .endif BSOD!!!