Помогите определить причину BSOD

Тема в разделе "WASM.NT.KERNEL", создана пользователем Marik, 21 апр 2010.

  1. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Доброго времени суток!
    Есть драйвер перехватывающий MajorFunction некоторых драйверов в системе в том числе драйвер usbhub. Периодически получаю BSOD (редко), причем воспроизвести эту ошибку не могу.

    Код (Text):
    1. IRQL_NOT_LESS_OR_EQUAL (a)
    2. An attempt was made to access a pageable (or completely invalid) address at an
    3. interrupt request level (IRQL) that is too high.  This is usually
    4. caused by drivers using improper addresses.
    5. If a kernel debugger is available get the stack backtrace.
    6. Arguments:
    7. Arg1: 00000119, memory referenced
    8. Arg2: 0000001c, IRQL
    9. Arg3: 00000000, bitfield :
    10.     bit 0 : value 0 = read operation, 1 = write operation
    11.     bit 3 : value 0 = not an execute operation, 1 = execute operation (only on chips which support this level of status)
    12. Arg4: 804fa224, address which referenced memory
    13.  
    14. Debugging Details:
    15. ------------------
    16.  
    17.  
    18. READ_ADDRESS:  00000119
    19.  
    20. CURRENT_IRQL:  1c
    21.  
    22. FAULTING_IP:
    23. nt!KeSetEvent+32
    24. 804fa224 66394616        cmp     word ptr [esi+16h],ax
    25.  
    26. DEFAULT_BUCKET_ID:  DRIVER_FAULT
    27.  
    28. BUGCHECK_STR:  0xA
    29.  
    30. PROCESS_NAME:  System
    31.  
    32. IRP_ADDRESS:  899eccb8
    33.  
    34. DEVICE_OBJECT: 899ebba0
    35.  
    36. DRIVER_OBJECT: 8a71f030
    37.  
    38. IMAGE_NAME:  usbhub.sys
    39.  
    40. DEBUG_FLR_IMAGE_TIMESTAMP:  46d842f3
    41.  
    42. MODULE_NAME: usbhub
    43.  
    44. FAULTING_MODULE: ba9c8000 usbhub
    45.  
    46. TRAP_FRAME:  baceba1c -- (.trap 0xffffffffbaceba1c)
    47. ErrCode = 00000000
    48. eax=00000001 ebx=899ecc01 ecx=baceb3c8 edx=00000000 esi=00000103 edi=3c627255
    49. eip=804fa224 esp=baceba90 ebp=baceba9c iopl=0         nv up ei pl nz na pe nc
    50. cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00010206
    51. nt!KeSetEvent+0x32:
    52. 804fa224 66394616        cmp     word ptr [esi+16h],ax    ds:0023:00000119=????
    53. Resetting default scope
    54.  
    55. LAST_CONTROL_TRANSFER:  from 804fa224 to 80544440
    56.  
    57. STACK_TEXT:  
    58. baceba1c 804fa224 badb0d00 00000000 bace9000 nt!KiTrap0E+0x238
    59. baceba9c 804f4d58 baceb3c8 00000000 00000000 nt!KeSetEvent+0x32
    60. bacebaf8 804ff813 899eccf8 bacebb44 bacebb38 nt!IopCompleteRequest+0x232
    61. bacebb48 806e4ef2 00000000 00000000 bacebb60 nt!KiDeliverApc+0xb3
    62. bacebb48 806e4427 00000000 00000000 bacebb60 hal!HalpApcInterrupt+0xc6
    63. bacebbd0 805200c2 c06ce100 e4a25700 007ffff8 hal!KfLowerIrql+0x17
    64. bacebc24 8051ae7d 00000000 d9c20000 00000000 nt!MmAccessFault+0x934
    65. bacebc84 804e1aa9 d9c20000 00000000 80558698 nt!MmCheckCachedPageState+0x601
    66. bacebd34 804e70d6 8a9b6290 805637a0 8a9b7020 nt!CcPerformReadAhead+0x20b
    67. bacebd7c 805384c5 8a9b6290 00000000 8a9b7020 nt!CcWorkerThread+0x150
    68. bacebdac 805cec4e 8a9b6290 00000000 00000000 nt!ExpWorkerThread+0xef
    69. bacebddc 80545e3e 805383d6 00000000 00000000 nt!PspSystemThreadStartup+0x34
    70. 00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16
    71.  
    72.  
    73. STACK_COMMAND:  kb
    74.  
    75. FOLLOWUP_NAME:  MachineOwner
    76.  
    77. FAILURE_BUCKET_ID:  0xA_IMAGE_usbhub.sys_DATE_2007_08_31
    78.  
    79. BUCKET_ID:  0xA_IMAGE_usbhub.sys_DATE_2007_08_31
    80.  
    81. Followup: MachineOwner
    82. ---------
    В стеке вызовов драйверов моего драйвера нет. Буду очень благодарен за помощь в поиске корня проблемы.
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Память испортил, наверное. Включи Verifier прежде всего, и давай новый дамп.
     
  3. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Marik
    >корень проблемы
    Аллоцирование KEVENT для irp->UserEvent на стеке.

    Призыв к действию для всех начинающих: показывайте vertarget, используйте verifier.
     
  4. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Господа, подскажите по теории, почему код ниже в 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 подобной ошибки нет.
     
  5. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    PS Ошибка возникает при освобождении мьютекса (KeReleaseMutex)
     
  6. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    1. Что вернула KeWaitForMutexObject()?
    2. Уверен, что всё это происходит в одном и том же потоке и в правильной последовательности?
     
  7. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Marik
    >почему код ниже в Win7 выдает BSOD при запущеном verifier
    Инициализация мьютекса из потока1 — Захват мьютекса из потока1 — Инициализация того же мьютекса из потока2 — Захват мьютекса из потока2 — Освобождение мьютекса, занятого потоком2, из потока1.

    И как насчёт KEVENT – мы были правы?
     
  8. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    STATUS_SUCCESS

    Для точности скопировал эти 3 строчки в DriverEntry в результате BSOD уже при загрузке драйвера. Т.е. один поток, сам создал, сам занял, сам освободил мьютекс

    Уточню еще раз что ОС Win7, на WinXP verifier не ругается.
     
  9. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    отсюда (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!!!