DRIVER_IRQL_NOT_LESS_OR_EQUAL при открытии устройства

Тема в разделе "WASM.NT.KERNEL", создана пользователем Sholar, 11 фев 2012.

  1. Sholar

    Sholar New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2011
    Сообщения:
    189
    Читал похожие темы на форуме, но ничего полезного для себя не извлек. Драйвер прекрасно загружается и выгружается, БСОДит при попытке открыть его устройство из другой программы. Происходит обращение к подкачиваемой памяти при слишком высоком IRQL, но странно то, что делает это не мой код. Медитация над крэш дампом мне ничего не прояснила :dntknw:
    Код (Text):
    1.  .386
    2.  .model flat, stdcall
    3.  option casemap:none
    4.  
    5.  ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    6.  ;                              В К Л Ю Ч А Е М Ы Е    Ф А Й Л Ы                                    
    7.  ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    8.  
    9.     include Driver.inc
    10.  
    11.  
    12.  ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    13.  ;                                              К О Д                                                
    14.  ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    15.  .code
    16.  
    17.  
    18.  
    19.  
    20.  ;----------------------------------------------------------------------------------------------------
    21.  ;DriverEntry           Главная точка входа в драйвер
    22.  ;pDriverObject         Указатель на объект драйвер
    23.  ;pusRegistryPath       Раздел реестра (driver service key) в UNICODE
    24.  ;Return Value          NTSTATUS_xxx
    25.  ;----------------------------------------------------------------------------------------------------
    26.     DriverEntry proc uses ebx  pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
    27.        
    28.         LOCAL Status:NTSTATUS
    29.         LOCAL pDeviceObject:PDEVICE_OBJECT
    30.         LOCAL usDeviceName:UNICODE_STRING
    31.         LOCAL pDeviceExtension:PDRIVER_DEVICE_EXTENSION
    32.        
    33.         IFDEF DBG
    34.             DbgTrap                                             ; Отладочное прерывание
    35.         ENDIF
    36.        
    37.         assume eax:PDRIVER_OBJECT                                                   ;
    38.                                                                                     ;
    39.         mov  eax, pDriverObject                                                     ; Регистрация функций:
    40.         mov [eax].DriverUnload, offset UnloadRoutine                                ; Выгрузка драйвера
    41.         mov [eax].MajorFunction[IRP_MJ_DEVICE_CONTROL], offset DeviceControlRoutine ; Обработчик IRP_MJ_DEVICE_CONTROL
    42.         mov [eax].MajorFunction[IRP_MJ_CREATE], offset CREATE_IrpHandler            ; Обработчик IRP_MJ_CREATE
    43.         mov [eax].MajorFunction[IRP_MJ_CLOSE], offset CLOSE_IrpHandler              ; Обработчик IRP_MJ_CLOSE
    44.         mov [eax].MajorFunction[IRP_MJ_READ], offset RW_IrpHandler                  ; Обработчик IRP_MJ_READ
    45.         mov [eax].MajorFunction[IRP_MJ_WRITE], offset RW_IrpHandler                 ; Обработчик IRP_MJ_WRITE
    46.        
    47.        
    48.        
    49.         fnc RtlInitUnicodeString, addr usDeviceName, $CTW0("\\Device\\MyDDevice")
    50.        
    51.        
    52.        
    53.         .IF rv(IoCreateDevice, pDriverObject, SIZEOF DRIVER_DEVICE_EXTENSION,addr usDeviceName, FILE_DEVICE_UNKNOWN,0, FALSE, addr pDeviceObject) != STATUS_SUCCESS
    54.                     mov eax, STATUS_ERROR
    55.                     jmp @f
    56.         .ENDIF
    57.  
    58.        
    59.        
    60.         mov eax, pDeviceObject                                              ;
    61.         mov ebx, (DEVICE_OBJECT PTR [eax]).DeviceExtension                  ; pDeviceExtension = pDeviceObject->DeviceExtension
    62.         mov pDeviceExtension, ebx                                           ; pDeviceExtension->pDeviceObject = pDeviceObject
    63.         mov (DRIVER_DEVICE_EXTENSION PTR [ebx]).pDeviceObject, eax          ;
    64.        
    65.        
    66.        
    67.        
    68.         lea eax, (DRIVER_DEVICE_EXTENSION PTR [ebx]).usSymLinkName  ;
    69.         fnc RtlInitUnicodeString, eax, $CTW0("\\??\\MyDevice")      ; RtlRtlInitUnicodeString(pDeviceExtension,"\\??\\MyDevice")
    70.        
    71.         mov ebx, pDeviceExtension
    72.         lea ebx, (DRIVER_DEVICE_EXTENSION PTR [ebx]).usSymLinkName                              ; IF IoCreateSymbolicLink(                 
    73.         .IF rv(IoCreateSymbolicLink, ebx, addr usDeviceName) != STATUS_SUCCESS                  ;       &pDeviceExtension->usSymLinkName,
    74.             mov eax, STATUS_ERROR                                                               ;       &usDeviceName) != success
    75.             jmp @f                                                                              ;      
    76.         .ENDIF                                                                                  ;       RETURN ERROR
    77.        
    78.        
    79.        
    80.         mov eax, STATUS_SUCCESS
    81.         @@:
    82.         ret
    83.     DriverEntry endp
    84.  
    85.  
    86.  
    87.  
    88.  
    89.  
    90.   ;---------------------------------------------------------------------------------------------------
    91.   ;UnloadRoutine                Функция выгрузки драйвера
    92.   ;pDriverObject                Указатель на объект драйвер
    93.   ;Return Value                 NTSTATUS_xxx
    94.   ;---------------------------------------------------------------------------------------------------
    95.     UnloadRoutine proc pDriverObject:PDRIVER_OBJECT
    96.        
    97.         LOCAL pDeviceExtension:PTR DRIVER_DEVICE_EXTENSION
    98.                
    99.         IFDEF DBG
    100.             DbgTrap                                                 ; Отладочное прерывание
    101.         ENDIF
    102.        
    103.         mov eax, pDriverObject
    104.         mov eax, (DRIVER_OBJECT PTR [eax]).DeviceObject
    105.         mov eax, (DEVICE_OBJECT PTR [eax]).DeviceExtension
    106.         mov pDeviceExtension, eax
    107.        
    108.         mov eax, pDeviceExtension                   ;
    109.         assume eax:PTR DRIVER_DEVICE_EXTENSION      ; IoDeleteSymbolLink(
    110.         lea eax, [eax].usSymLinkName                ;       pDriverObject->DeviceExtension->usSymLinkName)                                     
    111.         fnc IoDeleteSymbolicLink, eax               ;
    112.    
    113.    
    114.         mov eax, pDeviceExtension                   ;
    115.         assume eax:PTR DRIVER_DEVICE_EXTENSION      ; IoDeleteDevice(
    116.         mov eax, [eax].pDeviceObject                ;       pDriverObject->DeviceExtension->pDeviceObject)
    117.         fnc IoDeleteDevice, eax                     ;
    118.    
    119.        
    120.         mov eax, STATUS_SUCCESS
    121.         ret
    122.    
    123.     UnloadRoutine endp
    124.    
    125.    
    126.    
    127.    
    128.    
    129.    
    130.  ;----------------------------------------------------------------------------------------------------
    131.  ;DeviceControlRoutine                  Обработчик IRP_MJ_DEVICE_CONTROL запросов
    132.  ;pDeviceObject                         Указатель на объект устройство
    133.  ;pIrp                                  Указатель на объект IRP полученного запроса
    134.  ;Return Value                          NTSTATUS_xxx
    135.  ;----------------------------------------------------------------------------------------------------
    136.     DeviceControlRoutine proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
    137.        
    138.         LOCAL IoControlCode:ULONG                          
    139.         LOCAL IrpStack:PIO_STACK_LOCATION
    140.        
    141.         IFDEF DBG
    142.             DbgTrap                                             ; Отладочное прерывание
    143.         ENDIF
    144.        
    145.         IoGetCurrentIrpStackLocation pIrp                   ;
    146.         mov IrpStack, eax                                   ; IrpStack =  IoGetCurrentIrpStackLocation(pIrp)
    147.        
    148.         assume eax:PIO_STACK_LOCATION                                       ;
    149.         push [eax].Parameters.DeviceIoControl.IoControlCode                 ;
    150.         pop IoControlCode                                                   ; IoControlCode = current IOCTL code
    151.        
    152.         .IF IoControlCode == IOCTL_CRASH_SYSTEM                        
    153.             xor eax, eax
    154.             mov eax, dword ptr [eax]                                        ; Crash!!!
    155.         .ENDIF
    156.        
    157.         invoke  CompleteIrp, pIrp, STATUS_SUCCESS, 0
    158.         mov eax, STATUS_SUCCESS
    159.         ret
    160.     DeviceControlRoutine endp  
    161.  
    162.  
    163.  
    164.  
    165.   ;-------------------------------------------------------------------------------------------------
    166.   ;CREATE_IrpHandler                            Обработчик запроса IRP_MJ_CREATE
    167.   ;pDeviceObject                                Указатель на открытое устройство
    168.   ;pIrp                                         Указатель на пришедший IRP
    169.   ;Return Value                                 NTSTATUS_xxx
    170.   ;-------------------------------------------------------------------------------------------------
    171.     CREATE_IrpHandler proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
    172.        
    173.         IFDEF DBG
    174.             DbgTrap                                         ; Отладочное прерывание
    175.         ENDIF      
    176.        
    177.         invoke CompleteIrp, pIrp, STATUS_SUCCESS, 0
    178.         ret STATUS_SUCCESS
    179.  
    180.     CREATE_IrpHandler endp
    181.    
    182.    
    183.   ;-------------------------------------------------------------------------------------------------
    184.   ;CLOSE_IrpHandler                             Обработчик запроса IRP_MJ_CLOSE
    185.   ;pDeviceObject                                Указатель на закрываемое устройство
    186.   ;pIrp                                         Указатель на пришедший IRP
    187.   ;Return Value                                 NTSTATUS_xxx
    188.   ;-------------------------------------------------------------------------------------------------
    189.     CLOSE_IrpHandler proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
    190.        
    191.         IFDEF DBG
    192.             DbgTrap                                         ; Отладочное прерывание
    193.         ENDIF      
    194.        
    195.         invoke CompleteIrp, pIrp, STATUS_SUCCESS, 0
    196.         ret STATUS_SUCCESS
    197.  
    198.     CLOSE_IrpHandler endp
    199.  
    200.    
    201.    
    202.    
    203.  ;-----------------------------------------------------------------------------------------------------
    204.  ;RW_IrpHandler                                 Обработчик запросов IRP_MJ_READ/IRP_MJ_WRITE
    205.  ;pDeviceObject                                 Указатель на используемое устройство
    206.  ;pIrp                                          Указатель на пришедший IRP
    207.  ;Return Value                                  NTSTATUS_xxx
    208.  ;-----------------------------------------------------------------------------------------------------
    209.     RW_IrpHandler   proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
    210.        
    211.         IFDEF DBG
    212.             DbgTrap
    213.         ENDIF
    214.        
    215.         invoke CompleteIrp, pIrp, STATUS_SUCCESS, 0
    216.         ret
    217.     RW_IrpHandler   endp
    218.    
    219.    
    220.    
    221.  ;--------------------------------------------------------------------------------------------------
    222.  ;CompleteIrp                   Функция завершение Irp запросов
    223.  ;pIrp                          Указатель на завершаемый Irp
    224.  ;NTStatus                      Статус завершения
    225.  ;ulInfo                        Доп. информация о запросе(обычно длина переданных/полученных данных)                                                 
    226.  ;Return Value                  NTStatus
    227.  ;--------------------------------------------------------------------------------------------------       
    228.     CompleteIrp proc pIrp:PIRP, NTStatus:NTSTATUS, ulInfo:ULONG
    229.  
    230.         IFDEF DBG
    231.             DbgTrap                                         ; Отладочное прерывание
    232.         ENDIF
    233.            
    234.         assume eax:PIRP                                     ;
    235.         mov eax, pIrp                                       ;
    236.         push NTStatus                                       ; pIrp->IoStatus.Status = NTStatus
    237.         pop [eax].IoStatus.Status                           ; pIrp->IoStatus.Information = ulInfo
    238.         push ulInfo                                         ;
    239.         pop [eax].IoStatus.Information                      ;
    240.        
    241.         mov ecx, pIrp                          ;
    242.         mov edx, IO_NO_INCREMENT            ; FASTCALL
    243.         call IofCompleteRequest             ;
    244.    
    245.         mov eax, NTStatus
    246.         ret
    247.    
    248.     CompleteIrp endp
    249.    
    250.  
    251.  end DriverEntry
    При открытии устройства должен был выполниться CREATE_IrpHandler, но отладчик не всплывает, то есть бсодит до передачи управление драйверу. Сурсы( кода почти нет, все закомментировано) и минидамп в аттаче.
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    Sholar
    Посмотрел быстро крешдамп...
    Странно конечно.
    Оке, такой вопрос. У вас Syser установлен?
    Смотрел, в модулях он есть. Попробуйте без него.
     
  3. Sholar

    Sholar New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2011
    Сообщения:
    189
    Почти тоже самое. Только на этот раз PAGE_FAULT_IN_NONPAGED_AREA
     
  4. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    Sholar
    А где крешдамп.
     
  5. Sholar

    Sholar New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2011
    Сообщения:
    189
  6. LightMoon

    LightMoon New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2012
    Сообщения:
    73
    Sholar
    ntoskrnl в студию.
     
  7. Sholar

    Sholar New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2011
    Сообщения:
    189
  8. LightMoon

    LightMoon New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2012
    Сообщения:
    73
    Sholar
    Этот дамп не от этого модуля.
     
  9. Sholar

    Sholar New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2011
    Сообщения:
    189
    Хмм, как это? Драйвер запускался на виртуалке под VMWare, ntoskrnl оттуда же.
    Дамп, разумеется, тоже.
     
  10. LightMoon

    LightMoon New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2012
    Сообщения:
    73
    Sholar
    Имя модуля то, но адреса в дампе не соответствуют ему(ссылки валидны, но все они указывают абы куда, на середины инструкций, что не возможно).
     
  11. LightMoon

    LightMoon New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2012
    Сообщения:
    73
    Странно, тут http://pastebin.com/NCMeHphH дамп норм, хотя почему модуль уже другой не понятно.

    Тоесть дров дёргается(IopfCallDriver()), но бьётся SFC, обычно из за не корректной очистки стека или кривых локалей. Впрочем не удивительно:
    Код (Text):
    1. CREATE_IrpHandler proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
    2. IFDEF DBG
    3.     DbgTrap ; Отладочное прерывание
    4. ENDIF
    5.     invoke CompleteIrp, pIrp, STATUS_SUCCESS, 0
    6.     ret STATUS_SUCCESS
    7. CREATE_IrpHandler endp
    Это асм, а не си =)
     
  12. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    Так, в общем драйвер кривой. Очень много всего надо изменять. Курите мат часть.
    А так на вскидку:
    Код (Text):
    1. mov [eax].MajorFunction[IRP_MJ_CREATE*(sizeof PVOID)], offset CREATE_IrpHandler
    2. mov [eax].MajorFunction[IRP_MJ_CLOSE*(sizeof PVOID)], offset CLOSE_IrpHandler
    3. mov [eax].MajorFunction[IRP_MJ_DEVICE_CONTROL*(sizeof PVOID)], offset DeviceControlRoutine
    4. mov [eax].MajorFunction[IRP_MJ_READ*(sizeof PVOID)], offset RW_IrpHandler
    5. mov [eax].MajorFunction[IRP_MJ_WRITE*(sizeof PVOID)], offset RW_IrpHandler
    Так же не правильно обрабатывается завершение IRP (не вижу у вас IoGetCurrentIrpStackLocation и вообще код неправильный) . В общем изучайте.
     
  13. Sholar

    Sholar New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2011
    Сообщения:
    189
    Да, действительно, привычка :)
    Исправил это и тот кошмар со стеком, заработало. Ни у Four-F ни у Солдатова при завершении IRP не заметил IoGetCurrentIrpStackLocation.

    LightMoon,TermoSINteZ
    Огромное вам спасибо.