Первый драйвер режима ядра

Тема в разделе "WASM.NT.KERNEL", создана пользователем _s_a_t_a_n_, 15 апр 2009.

  1. _s_a_t_a_n_

    _s_a_t_a_n_ New Member

    Публикаций:
    0
    Регистрация:
    5 май 2008
    Сообщения:
    13
    Мой первый эксперимент в написании драйверов не удался. Как говорится, первый блин комом. Проблема в том, что не выполняется функция DriverUnload или выполняется неправильно. Драйвер после запуска остается в памяти и его нельзя ни остановить ни удалить. Хотел поставить айс - да не пошел он что-то :dntknw: Возможности отладить нет, но я над этим упорно работаю.
    Посмотрите пожалуйста исходники (прикрепленный файл), может ошибка явно видна. Я буду очень признателен всем кто поможет.
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Мне просто интересно: а что сподвигло тебя написать этот драйвер на ассемблере?
     
  3. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    _s_a_t_a_n_
    раз это озземблер, то я бы понавтыкал везде align 4 и в прологе\эпилоге функций сделал pushad/popad (с сохранением статуса ошибки в аккумуляторе ес-но).
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Неправильно определена структура DRIVER_OBJECT (в ее названии кстати нет P в начале) - пропущен DriverStartio между DriverInit и DriverUnload, поэтому ты пишешь свой адрес не в то поле, поэтому и драйвер не выгружается.
     
  5. _s_a_t_a_n_

    _s_a_t_a_n_ New Member

    Публикаций:
    0
    Регистрация:
    5 май 2008
    Сообщения:
    13
    Я удалил в драйвере код создания устройств и симлинка, удалил вообще на мой взгляд лишнее, оставил только скелет. И в результате BSOD при запуске. Plz help.

    Вот код который я в данный момент мучаю:


    format PE native 4.0 at 10000h
    use32
    align 4
    entry DriverEntry

    include '%fasminc%\win32a.inc'

    section '.code' code readable writeable executable notpageable


    STATUS_DEVICE_CONFIGURATION_ERROR equ 0xC0000182
    STATUS_SUCCESS equ 0x00000000
    IRP_MJ_MAXIMUM_FUNCTION equ 0x1b

    struct UNICODE_STRING
    Length dw ?
    MaximumLength dw ?
    Buffer dd ?
    ends ; UNICODE_STRING

    macro PUNICODE_STRING name,string
    {
    _us_#name du #string
    _us_#name_len = ($-_us_#name)
    dw 0
    #name UNICODE_STRING _us_#name_len,(_us_#name_len+2),_us_#name
    } ; PUNICODE_STRING

    struct DRIVER_OBJECT
    Type dw ?
    Size dw ?
    DeviceObject dd ?
    Flags dd ?
    DriverStart dd ?
    DriverSize dd ?
    DriverSection dd ?
    DriverExtension dd ?
    DriverName UNICODE_STRING
    HardwareDatabase dd ?
    FastIoDispatch dd ?
    DriverInit dd ?
    DriverStartIo dd ?
    DriverUnload dd ?
    MajorFunction dd (IRP_MJ_MAXIMUM_FUNCTION + 1) dup (?)
    ends ; PDRIVER_OBJECT



    proc DriverEntry stdcall, pDriverObject, usRegistryPath
    ; mov [eax+DRIVER_OBJECT.DriverInit],DriverEntry
    mov [eax+DRIVER_OBJECT.DriverStartIo], DriverStartIo
    mov [eax+DRIVER_OBJECT.DriverUnload],DriverUnload
    mov eax,STATUS_SUCCESS
    ret

    endp

    proc DriverStartIo stdcall, pDeviceObject, _Irp
    ret
    endp

    proc DriverUnload stdcall, pDevice_Object,_Irp
    ret
    endp

    section '.reloc' data fixups readable discardable
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1. format PE DLL native 4.0 at 10000h
    2. entry DriverEntry
    3.  
    4. include 'macro/struct.inc'
    5. include 'macro/proc32.inc'
    6. include 'KMD/KMD.inc'
    7.  
    8. section '.text' code readable executable notpageable
    9.  
    10. proc DriverEntry lpDriverObject, lpusRegistryPath
    11.     cinvoke DbgPrint, sHello
    12.     mov eax, [lpDriverObject] ; [eax + DRIVER_OBJECT.DriverStart] - ImageBase
    13.     mov [eax + DRIVER_OBJECT.DriverUnload], DriverUnload
    14.     xor eax, eax
    15.     ret
    16. endp
    17.  
    18. proc DriverUnload lpDriverObject
    19.     cinvoke DbgPrint, sBye
    20.     ret
    21. endp
    22.  
    23. section '.data' data readable writeable notpageable
    24.  
    25. sHello  db  'Hello!', 0
    26. sBye    db  'Bye!', 0
    27.  
    28. section '.rdata' data readable notpageable
    29.  
    30. data 12
    31.  
    32. IAT ntoskrnl,\
    33.     DbgPrint
    34.  
    35.     dd 0
    36.  
    37. end data
    38.  
    39. section 'INIT' import code discardable executable readable writeable
    40.  
    41. library ntoskrnl,'ntoskrnl.exe'
    42.  
    43. import  ntoskrnl,\
    44.     DbgPrint,'DbgPrint'
    45.  
    46. section '.reloc' fixups data readable discardable
    Примерно так.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А кто eax заполнять будет?
     
  8. _s_a_t_a_n_

    _s_a_t_a_n_ New Member

    Публикаций:
    0
    Регистрация:
    5 май 2008
    Сообщения:
    13
    Проблема решена. Вопрос снят
     
  9. _s_a_t_a_n_

    _s_a_t_a_n_ New Member

    Публикаций:
    0
    Регистрация:
    5 май 2008
    Сообщения:
    13
    Всем большое спасибо за помощь