Всем доброго! В очередной раз вылетила система, явно из-за моих действий, точнее драйвера. Присходит, это при работе с отложенными IRP пакетами, алгоритм следующий: - в диспечире, маркеруется IRP как отложенный; - в подзадаче, обрабатываю отложенный пакет и завершаю его но через какой-то промежуток времени система валиться(см. листинг ниже), скорей всего я что-то не доделываю с пакетом, но вот что? такое ощущение, что после IoCompleteRequest (irp, IO_NO_INCREMENT); Irp продолжает жить, но "полуразрушенным" работа драйвера проходит под verifier'ом. Код (Text): ********************************************************************** ********* * * * Bugcheck Analysis * * * ********************************************************************** ********* DRIVER_VERIFIER_IOMANAGER_VIOLATION (c9) The IO manager has caught a misbehaving driver. Arguments: Arg1: 0000000c, Invalid IOSB in IRP at APC IopCompleteRequest (appears to be on stack that was unwound) Arg2: f144773c, the IOSB pointer , 3/4 - 0 Arg3: 00000000 Arg4: 00000000 Debugging Details: ------------------ OVERLAPPED_MODULE: vpc_s3_ee959000 DRIVER_VERIFIER_IO_VIOLATION_TYPE: c DEFAULT_BUCKET_ID: INTEL_CPU_MICROCODE_ZERO BUGCHECK_STR: 0xC9 LAST_CONTROL_TRANSFER: from 804255df to 804262a3 IRP_ADDRESS: fae80e48 STACK_TEXT: f1447c7c 804255df fae80e88 f1447d20 f1447d24 nt!IovpCompleteRequest+0x2f f1447cf0 804310fc fae80e88 f1447d28 f1447d1c nt!IopCompleteRequest+0x55 f1447d2c 80404280 00000000 00000000 00000000 nt!KiDeliverApc+0x7c f1447d4c 8042f1a7 814152a8 8046dc20 814143a0 nt!KiSwapThread+0xfc f1447d70 80419165 00000000 00000200 00000000 nt!KeRemoveQueue+0x195 f1447da8 80455a16 814152a8 00000000 00000000 nt!ExpWorkerThread+0x73 f1447ddc 80469bb2 804190f0 00000000 00000000 nt!PspSystemThreadStartup+0x69 00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16 FOLLOWUP_IP: nt!IovpCompleteRequest+2f 804262a3 8b4eec mov ecx,[esi-0x14] SYMBOL_STACK_INDEX: 0 FOLLOWUP_NAME: MachineOwner SYMBOL_NAME: nt!IovpCompleteRequest+2f MODULE_NAME: nt IMAGE_NAME: ntoskrnl.exe DEBUG_FLR_IMAGE_TIMESTAMP: 3ee6c002 STACK_COMMAND: kb FAILURE_BUCKET_ID: 0xC9_nt!IovpCompleteRequest+2f BUCKET_ID: 0xC9_nt!IovpCompleteRequest+2f Followup: MachineOwner ---------
DRIVER_VERIFIER_IOMANAGER_VIOLATION (c9) The IO manager has caught a misbehaving driver. Arguments: Arg1: 0000000c, Invalid IOSB in IRP at APC IopCompleteRequest (appears to be on stack that was unwound) Arg2: f144773c, the IOSB pointer , 3/4 - 0 Arg3: 00000000 Arg4: 00000000 I/O Status Block правильно заполняешь? Код в студию.
Код (Text): IovpCompleteRequest( IN PKAPC Apc, IN PVOID *SystemArgument1, IN PVOID *SystemArgument2 ) { PIRP irp; PUCHAR addr; ULONG BestStackOffset; irp = CONTAINING_RECORD( Apc, IRP, Tail.Apc ); addr = (PUCHAR)irp->UserIosb; if ((addr > (PUCHAR)KeGetCurrentThread()->StackLimit) && (addr <= (PUCHAR)&BestStackOffset)) { KeBugCheckEx(DRIVER_VERIFIER_IOMANAGER_VIOLATION, IO_INVALID_STACK_IOSB, (ULONG_PTR)addr, 0, 0); } Адрес irp->UserIosb указывает на недействительную область стека потока. f144773c < f1447c7c. Ищи где ты делаешь irp->UserIosb = &ioStatus;
Four-F, да я уже глянул в исходники, только проблема была как раз в том, что я чучуть не верно работал с очередями, я думал, что IoCompleteRequest нужно делать мне, как показывает практика это не так.