Непонятный BSOD

Тема в разделе "WASM.NT.KERNEL", создана пользователем steelfactor, 16 дек 2007.

  1. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Вот простенький код -
    Код (Text):
    1. #include <ntddk.h>
    2.  
    3. typedef NTSTATUS __stdcall _NtQueryPerformanceCounter(PLARGE_INTEGER, PLARGE_INTEGER);
    4. _NtQueryPerformanceCounter *pNtQueryPerformanceCounter = NULL;
    5.  
    6. VOID OnUnload(IN PDRIVER_OBJECT pDriverObject)
    7. {
    8.     DbgPrint("Driver unloaded...");
    9. }
    10.  
    11. NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING RegPath)
    12. {
    13.     LARGE_INTEGER freq, count;
    14.     pNtQueryPerformanceCounter = (_NtQueryPerformanceCounter *)0x7c90e102; //хардкорнутый адрес NtQueryPerformanceCounter
    15.     pNtQueryPerformanceCounter(&count, &freq);
    16.     DbgPrint("freq - %x, count - %x\n", freq.LowPart, count.LowPart);
    17.     pDriverObject->DriverUnload = OnUnload;
    18.     return STATUS_SUCCESS;
    19. }
    При старте дрова получаю BSOD 0x000000E9, то бишь, как понял, прекращение рабочего потока без его надлежащего завершения :dntknw:
    вот анализ крашдампа
    Код (Text):
    1. 0: kd> !analyzebugcheck -v
    2.  
    3. ACTIVE_EX_WORKER_THREAD_TERMINATION (e9)
    4. An executive worker thread is being terminated without having gone through
    5. the worker thread rundown code.  A stack trace should indicate the cause.
    6. Arguments:
    7. Arg1: 823c6b30, The exiting ETHREAD.
    8. Arg2: 00000000
    9. Arg3: 00000000
    10. Arg4: 00000000
    11.  
    12. Debugging Details:
    13. ------------------
    14. DEFAULT_BUCKET_ID:  DRIVER_FAULT
    15. BUGCHECK_STR:  E9
    16. LAST_CONTROL_TRANSFER:  from 805d0f13 to 804f9c37
    17. STACK_TEXT:  
    18. f88c47d4 805d0f13 000000e9 823c6b30 00000000 nt!PspReaper+0x25
    19. f88c486c 805d109a c0000005 823c6b30 00000000 nt!ObCreateObjectType+0x6cc
    20. f88c488c 805d1275 823c6b30 c0000005 f88c48c8 nt!ArbBootAllocation+0x87
    21. f88c48b8 8054060c 00000000 c0000005 f88c4cf4 nt!PiProcessAddBootDevices+0x26
    22. f88c48c8 805004c5 badb0d00 f88c4940 ffff0000 nt!RtlIpv4StringToAddressA+0xfd
    23. f88c4cf4 80541075 f88c4d10 00000000 f88c4d64 nt!MiLockCode+0xa
    24. f88c4d64 7c90eb94 badb0d00 7c90eb94 823c6b30 nt!RtlRandomEx+0x2a
    25. f88c4d54 f88c4c78 00000001 80541026 f88c4d54 0x7c90eb94
    26. f88c4d54 f88c4c78 00000001 80541026 f88c4d54 0xf88c4c78
    27. 00000000 00000000 00000000 00000000 00000000 0xf88c4c78
    28.  
    29. FOLLOWUP_IP:
    30. nt!PspReaper+25
    31. 804f9c37 5d               pop     ebp
    32. FOLLOWUP_NAME:  MachineOwner
    33. SYMBOL_NAME:  nt!PspReaper+25
    34. MODULE_NAME:  nt
    35. IMAGE_NAME:  ntoskrnl
    36. STACK_COMMAND:  kb
    37. BUCKET_ID:  0xE9_nt!PspReaper+25
    38. Followup: MachineOwner
    Что не так?
     
  2. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    steelfactor
    адрес 0x7c90e102 точно правильный?
     
  3. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    rei3er
    вроде да, выдирал его парсингом из таблицы экспорта ntdll.dll. Хотя... надо проверить
     
  4. halyavin

    halyavin New Member

    Публикаций:
    0
    Регистрация:
    13 май 2005
    Сообщения:
    252
    Адрес:
    Russia
    у KeQueryPerformanceCounter другие параметры - число тиков возвращается в качестве результата, а не через параметр.
     
  5. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    DriverEntry и OnUnload обязаны быть __stdcall.
     
  6. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    diamond
    была такая мысля, с этим все верно...
     
  7. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    7c90e102 - адрес юзермодного пространства, нехер туда из дрова прыгать... более того это адрес нтдллной заглушки, которайа должна занести разных пораметров и вызвать sysenter... даже есле до этого сисэнтора дойдед (что врятле), то все равно буит GP, патаму что сисентор расчитон для перехода из ринг3 в ринг0... и даж есле сисентор пройдет нормально, то сисекзет вернет управление на код, адрес которого указон в мср регистрог
     
  8. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    sysenter не проверяет CPL
    не в MSR, а в EDX
     
  9. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    rei3er, согласен, накосячел, бываед :)
    а селектор ставет ринг3
     
  10. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Freemanвообще речь идет о вызове тех функций, которых нет в эскпортах ядра. За основу вязл код Нэббета, когда речь идет о динамической привязке ntdll.dll к ядру и вызову оттуда необходимых функций. Что я сделал:
    1) нахожу base ntdll.dll через ZwQuerySystemInformation(SystemModuleInformation, ...)
    2) анализирую таблицу экспорта ntdll.dll на предмет поиска адреса необходимой мне функции, которую нужно вызвать.
    3) вышеуказанным путем (как в первом посту) через хардкорнутый адрес вызываю фукнцию.
    На форуме уже проскакивали подобные примеры - http://wasm.ru/forum/viewtopic.php?id=16630