Вызов DeviceIoControl из обработчика прерывания

Тема в разделе "WASM.NT.KERNEL", создана пользователем sergegers, 26 апр 2011.

  1. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    В 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):
    1. BAD_POOL_HEADER (19)
    2.  
    3. STACK_TEXT:  
    4. f03fba4c 80544b06 00000019 00000020 813e2cb8 nt!KeBugCheckEx+0x1b
    5. f03fba9c 804f3bd8 813e2cc0 00000000 8136acd0 nt!ExFreePoolWithTag+0x2a0
    6. f03fbaf0 804fdaf1 8136acd0 f03fbb3c f03fbb30 nt!IopCompleteRequest+0xf4
    7. f03fbb40 806d2c35 00000000 00000000 f03fbb58 nt!KiDeliverApc+0xb3
    8. f03fbb40 806d2861 00000000 00000000 f03fbb58 hal!HalpApcInterrupt+0xc5
    9. f03fbbc8 804fab03 8136acd0 8136ac90 00000000 hal!KeReleaseInStackQueuedSpinLock+0x11
    10. f03fbbe8 804f07e4 8136acd0 818853c0 00000000 nt!KeInsertQueueApc+0x4b
    11. f03fbc1c f024b2b8 f03fbc6c 81802670 00000000 nt!IopfCompleteRequest+0x1d8
    12. f03fbc34 804ee129 818025b8 8136ac90 806d22d0 kutil!kutilDispatchIoctl+0xe8 <- мой драйвер
    13. f03fbc44 80574dd0 8136ad00 818853c0 8136ac90 nt!IopfCallDriver+0x31
    14. f03fbc58 80575c71 818025b8 8136ac90 818853c0 nt!IopSynchronousServiceTail+0x70
    15. f03fbd00 8056e4de 000000b8 00000000 00000000 nt!IopXxxControlFile+0x5e7
    16. f03fbd34 8053d668 000000b8 00000000 00000000 nt!NtDeviceIoControlFile+0x2a
    17. f03fbd34 7c90e514 000000b8 00000000 00000000 nt!KiFastCallEntry+0xf8
    18. 0012dfc0 7c90d28a 7c801675 000000b8 00000000 ntdll!KiFastSystemCallRet
    19. 0012dfc4 7c801675 000000b8 00000000 00000000 ntdll!ZwDeviceIoControlFile+0xc
    20. 0012e024 62243f7b 000000b8 0022e024 0012e0c4 kernel32!DeviceIoControl+0xdd
    21.  
    22. ........
    23. .......
    24.  
    25. 0012f230 7c92a989 0012f2c0 0012f2d4 005b5020 ntdll!RtlCallVectoredExceptionHandlers+0x48
    26. 0012f2a8 7c90e48a 0012f2c0 0012f2d4 0012f2c0 ntdll!RtlDispatchException+0x19
    27. 0012f2a8 00578718 0012f2c0 0012f2d4 0012f2c0 ntdll!KiUserExceptionDispatcher+0xe
    28.  
    29. .......
    30. .......
    31.  
    32. STACK_COMMAND:  kb
    33.  
    34. FOLLOWUP_IP:
    35. kutil!kutilDispatchIoctl+e8
    36. f024b2b8 8b45f8          mov     eax,dword ptr [ebp-8]
    37.  
    38. FAULTING_SOURCE_CODE:  
    39.    185:         pIrpStack->Parameters.DeviceIoControl.OutputBufferLength,
    40.    186:         Drv::OsrNTStatusToString(status));
    41.    187:
    42.    188:     ::IoCompleteRequest(Irp, IO_NO_INCREMENT);
    43. >  189:     return status;
    44.    190: }
    Подскажите направление поиска.
    Ещё неприятность - не повторяется под дебаггером, это нормально?
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Судя по ошибке и стеку, происходит выход за границы SystemBuffer. Думаю, стоит покопаться вокруг записи в него. Странно, что ошибка происходит только при вызове из VEH обработчика.
     
  3. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    если туда не писать, то всё вроде в порядке. а как ещё покопаться?
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Проверить, как происходит запись в него. Если есть запись в массив или RtlCopyMemory или что-то в этом роде, надо проверить границы в первую очередь. А вообще, без кода трудно что-то посоветовать. Только что-то общее.
     
  5. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Аналогичный бсод высвечивался BAD_POOL_HEADER бывает один глаз не может увидеть ошибку, так что

    Mika0x65
     
  6. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    там действительно была порча буфера из-за разных размеров enum-ов на разных компиляторах. всем спасибо