В user mode устанавливаю VEH и оттуда вызываю DeviceIoControl для своего драйвера. При попытке писать в системный буфер получаю BSOD BAD_POOL_HEADER (19) после вызова IoCompleteRequest. Если посылать ctrl code не из обработчика прерывания, то всё нормально. если убрать запись в буфер, то тоже всё OK. CTL_CODE(FILE_DEVICE_UNKNOWN, 0x809, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) Код (Text): BAD_POOL_HEADER (19) STACK_TEXT: f03fba4c 80544b06 00000019 00000020 813e2cb8 nt!KeBugCheckEx+0x1b f03fba9c 804f3bd8 813e2cc0 00000000 8136acd0 nt!ExFreePoolWithTag+0x2a0 f03fbaf0 804fdaf1 8136acd0 f03fbb3c f03fbb30 nt!IopCompleteRequest+0xf4 f03fbb40 806d2c35 00000000 00000000 f03fbb58 nt!KiDeliverApc+0xb3 f03fbb40 806d2861 00000000 00000000 f03fbb58 hal!HalpApcInterrupt+0xc5 f03fbbc8 804fab03 8136acd0 8136ac90 00000000 hal!KeReleaseInStackQueuedSpinLock+0x11 f03fbbe8 804f07e4 8136acd0 818853c0 00000000 nt!KeInsertQueueApc+0x4b f03fbc1c f024b2b8 f03fbc6c 81802670 00000000 nt!IopfCompleteRequest+0x1d8 f03fbc34 804ee129 818025b8 8136ac90 806d22d0 kutil!kutilDispatchIoctl+0xe8 <- мой драйвер f03fbc44 80574dd0 8136ad00 818853c0 8136ac90 nt!IopfCallDriver+0x31 f03fbc58 80575c71 818025b8 8136ac90 818853c0 nt!IopSynchronousServiceTail+0x70 f03fbd00 8056e4de 000000b8 00000000 00000000 nt!IopXxxControlFile+0x5e7 f03fbd34 8053d668 000000b8 00000000 00000000 nt!NtDeviceIoControlFile+0x2a f03fbd34 7c90e514 000000b8 00000000 00000000 nt!KiFastCallEntry+0xf8 0012dfc0 7c90d28a 7c801675 000000b8 00000000 ntdll!KiFastSystemCallRet 0012dfc4 7c801675 000000b8 00000000 00000000 ntdll!ZwDeviceIoControlFile+0xc 0012e024 62243f7b 000000b8 0022e024 0012e0c4 kernel32!DeviceIoControl+0xdd ........ ....... 0012f230 7c92a989 0012f2c0 0012f2d4 005b5020 ntdll!RtlCallVectoredExceptionHandlers+0x48 0012f2a8 7c90e48a 0012f2c0 0012f2d4 0012f2c0 ntdll!RtlDispatchException+0x19 0012f2a8 00578718 0012f2c0 0012f2d4 0012f2c0 ntdll!KiUserExceptionDispatcher+0xe ....... ....... STACK_COMMAND: kb FOLLOWUP_IP: kutil!kutilDispatchIoctl+e8 f024b2b8 8b45f8 mov eax,dword ptr [ebp-8] FAULTING_SOURCE_CODE: 185: pIrpStack->Parameters.DeviceIoControl.OutputBufferLength, 186: Drv::OsrNTStatusToString(status)); 187: 188: ::IoCompleteRequest(Irp, IO_NO_INCREMENT); > 189: return status; 190: } Подскажите направление поиска. Ещё неприятность - не повторяется под дебаггером, это нормально?
Судя по ошибке и стеку, происходит выход за границы SystemBuffer. Думаю, стоит покопаться вокруг записи в него. Странно, что ошибка происходит только при вызове из VEH обработчика.
Проверить, как происходит запись в него. Если есть запись в массив или RtlCopyMemory или что-то в этом роде, надо проверить границы в первую очередь. А вообще, без кода трудно что-то посоветовать. Только что-то общее.
Аналогичный бсод высвечивался BAD_POOL_HEADER бывает один глаз не может увидеть ошибку, так что Mika0x65
там действительно была порча буфера из-за разных размеров enum-ов на разных компиляторах. всем спасибо