BSOD при CloseHandle

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

  1. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    468
    Сначала я написал драйвер не pnp и проблем с закрытием хендла не было. Я его переделал в верхний фильтр устройства и теперь при закрытии приложения, которое управляет этим драйвером, получается экран смерти. Я уж пробовал и так:
    Код (Text):
    1. DispatchClose  proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
    2.      mov eax, pIrp
    3.      assume eax:ptr _IRP
    4.      mov [eax].IoStatus.Status, STATUS_SUCCESS
    5.      and [eax].IoStatus.Information, 0
    6.      assume eax:nothing
    7.      fastcall IofCompleteRequest, pIrp, IO_NO_INCREMENT
    8.      mov eax, STATUS_SUCCESS
    9. ret
    10.  DispatchClose  endp
    и так:
    Код (Text):
    1. DispatchClose  proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
    2.  
    3.     IoSkipCurrentIrpStackLocation pIrp
    4.  
    5.     mov eax, pDeviceObject
    6.     mov eax, (DEVICE_OBJECT ptr [eax]).DeviceExtension
    7.     mov eax, (FiDO_DEVICE_EXTENSION ptr [eax]).TopOfStack
    8.  
    9.     invoke IoCallDriver, eax, pIrp
    10.     mov eax, STATUS_SUCCESS
    11. ret
    12.  
    13.  DispatchClose  endp
    но результат тот же( Ошибка: Компьютер был перезагружен после критической ошибки: 0x1000008e (0xc0000005, 0xbaf292b3, 0xaa726bec, 0x00000000).
     
  2. 0x6b65

    0x6b65 Забанен

    Публикаций:
    0
    Регистрация:
    8 окт 2009
    Сообщения:
    92
    В драйвере создаются устройства с DeviceExtensionSize = 0 при вызове IoCreateDevice? Если да (например, это управляющее устройство), то у него нет никакого DeviceExtension и, соответственно, TopOfStack.
    Отладчик для кого придумали?
     
  3. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    468
    Благодарю за ответ, но ковыряние в моём исходнике породило ещё больше вопросов.
    1) Почему я обязательно должен создавать управляющее устройство?
    2) Почему DeviceName остальных устройств должно быть точно таким же как и у управляющего?
    Код (Text):
    1. KbFilter_AddDevice proc  pDriverObject:PDRIVER_OBJECT, pDeviceObject:PDEVICE_OBJECT
    2. local pTargetFileObject:PFILE_OBJECT
    3. local KeyeviceObject:PDEVICE_OBJECT
    4. local devext:PFiDO_DEVICE_EXTENSION
    5.  local status:NTSTATUS
    6. invoke IoCreateDevice, pDriverObject, sizeof FiDO_DEVICE_EXTENSION, addr gk_usDeviceName, FILE_DEVICE_KEYBOARD, \
    7.                                               0, FALSE, addr KeyeviceObject
    8.          .if eax == STATUS_SUCCESS
    9. ;;:inc gr
    10. ;;         invoke IoCreateSymbolicLink, addr g_usSymbolicLinkName, addr g_usDeviceName
    11. ;         .if eax == STATUS_SUCCESS
    12. ;;;;;;;inc sgr
    13. mov eax, KeyeviceObject
    14. assume eax:ptr DEVICE_OBJECT
    15. mov ebx, [eax].DeviceExtension
    16. assume eax:nothing
    17. invoke RtlZeroMemory, ebx, sizeof FiDO_DEVICE_EXTENSION
    18. mov devext,ebx
    19. invoke IoAttachDeviceToDeviceStack, KeyeviceObject, pDeviceObject
    20. .if eax != NULL
    21.  
    22.     mov (FiDO_DEVICE_EXTENSION ptr [devext]).TopOfStack, eax
    23.     push KeyeviceObject
    24.     pop (FiDO_DEVICE_EXTENSION ptr [devext]).Self
    25.     push pDeviceObject
    26.     pop (FiDO_DEVICE_EXTENSION ptr [devext]).PDO
    27.     ;mov (FiDO_DEVICE_EXTENSION ptr [devext]).DeviceState, PowerDeviceD0;
    28.     and (FiDO_DEVICE_EXTENSION ptr [devext]).SurpriseRemoved, FALSE;
    29.     and (FiDO_DEVICE_EXTENSION ptr [devext]).Removed, FALSE;
    30.     and (FiDO_DEVICE_EXTENSION ptr [devext]).Started, FALSE;
    31.  
    32. mov edx, devext
    33. assume edx:ptr DRIVER_OBJECT
    34. or [edx].Flags, DO_BUFFERED_IO or DO_POWER_PAGABLE
    35. and [edx].Flags, not DO_DEVICE_INITIALIZING
    36. assume edx:nothing
    37.  
    38.                     mov status, STATUS_SUCCESS
    39.          .else
    40.             mov status, STATUS_DEVICE_NOT_CONNECTED
    41.              invoke IoDeleteDevice, KeyeviceObject
    42.      .endif
    43. ;         .else
    44. ;            mov status, STATUS_DEVICE_NOT_CONNECTED
    45. ;;             invoke IoDeleteDevice, KeyDeviceObject
    46. ;     .endif
    47.     .else
    48.             mov status, STATUS_DEVICE_NOT_CONNECTED
    49.      .endif
    50.      mov eax, status
    51.  
    52. ret
    53.  
    54. KbFilter_AddDevice endp
    55.  
    56.  
    57. .code INIT
    58. DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
    59.  local status:NTSTATUS
    60.      mov status, STATUS_DEVICE_CONFIGURATION_ERROR
    61.  
    62. invoke IoCreateDevice, pDriverObject, sizeof FiDO_DEVICE_EXTENSION, addr g_usDeviceName, FILE_DEVICE_UNKNOWN, \
    63.                                               0, TRUE, addr KeyDeviceObject
    64. .if eax == STATUS_SUCCESS
    65.          invoke IoCreateSymbolicLink, addr g_usSymbolicLinkName, addr g_usDeviceName
    66.          .if eax == STATUS_SUCCESS
    67.  
    68.             mov eax, pDriverObject
    69.              assume eax:PTR DRIVER_OBJECT
    70.     mov ecx, IRP_MJ_MAXIMUM_FUNCTION + 1
    71.     .while ecx
    72.     dec ecx
    73.     mov [eax].MajorFunction[ecx*(sizeof PVOID)], offset FiDO_DispatchPassThrough
    74.     .endw
    75.     mov [eax].MajorFunction[IRP_MJ_DEVICE_CONTROL*(sizeof PVOID)], offset CDO_DispatchDeviceControl
    76.     mov [eax].MajorFunction[IRP_MJ_CREATE*(sizeof PVOID)], offset DispatchCreate
    77.     mov [eax].MajorFunction[IRP_MJ_READ*(sizeof PVOID)], offset FiDO_DispatchRead
    78.     mov [eax].MajorFunction[IRP_MJ_PNP*(sizeof PVOID)], offset KbFilter_PnP
    79.     mov [eax].MajorFunction[IRP_MJ_CLOSE*(sizeof PVOID)], offset DispatchClose
    80.     mov [eax].MajorFunction[IRP_MJ_POWER*(sizeof PVOID)], offset FiDO_DispatchPower
    81.     mov ecx, [eax].DriverExtension
    82.              assume ecx:PTR DRIVER_EXTENSION
    83.     mov [ecx].AddDevice, offset KbFilter_AddDevice;
    84.         mov [eax].DriverUnload, offset DriverUnload
    85.              assume eax:nothing
    86.              assume ecx:nothing
    87.  
    88.             mov status, STATUS_SUCCESS
    89.          .else
    90.              invoke IoDeleteDevice, KeyDeviceObject
    91.          .endif
    92.     .endif
    93.  
    94.      mov eax, status
    95.  
    96.  
    97. ret
    98.  
    99. DriverEntry endp
    100.  
    101.  
    102.  end DriverEntry
    Иначе винда просто перестаёт загружаться. А по поводу отладчиков я уже говорил http://www.wasm.ru/forum/viewtopic.php?id=38357
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ну надо то и то и другое, первое для CDO, второе для FiDO
     
  5. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    468
    А в фильтре из ddk kbdfiltr управляющее устройство не создаётся.
    Почему DeviceName должно быть одинаковым?
     
  6. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    468
    Как мне быть то? Оставить всё как есть? Тогда BSOD при CloseHandle
     
  7. 0x6b65

    0x6b65 Забанен

    Публикаций:
    0
    Регистрация:
    8 окт 2009
    Сообщения:
    92
    Llirik
    Нужно воспользоваться отладчиком, например используя VM. В дампе четко видно, что:
    Код (Text):
    1. kd> dt nt!_DEVICE_OBJECT -b 8a53a1b8
    2. ...
    3.    +0x028 DeviceExtension  : (null)
    4. ...
    От этого и падение, нужно искать откуда берется устройство без extension'а

    Описание - просто блеск. 2-а устройства с одинаковым именем в системе не может быть. Перестает загружаться, видимо, из-за ошибки. Какой? Может не будем гадать на кофейной гуще (на кусках кода), а воспользуемся отладчиком?
     
  8. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    468
    Каким?? Ollydbg`ом чтоли?)
     
  9. 0x6b65

    0x6b65 Забанен

    Публикаций:
    0
    Регистрация:
    8 окт 2009
    Сообщения:
    92
  10. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    468
    Второй, точнее первый, комп у меня как раз таки и есть и Softice там пашет, ОС не по линии NT, а своей собственной сборки, по линии Win98. и я что-то пока не рискую тестировать мой драйвер, да еще нужно подумать, как вообще его туда прикруть-то)
     
  11. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    468
    Кажется, я не правильно написал функцию KbFilter_AddDevice, но как её правильно написать я не знаю( может подскажите?
     
  12. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    468
    Пожалуйста, приведите пример кода на асме после IoAttachDeviceToDeviceStack. Из статьи Four-F`а не походит
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Примеров в ддк полно, чем не подходят?
     
  14. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    468
    Они все на С, а С я НЕ ЗНАЮ, поэтому и прошу вас дать хотя бы один пример на MASM32
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Нужно срочно учить Си, чтобы писать под ядро.)
     
  16. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    468
    Извините, а причём здесь Си? Когда я регистрировался на этом форуме, я думал, что здесь обсуждается ассемблер. Вам следовало бы назвать сайт не "WASM", а "Всё о си", тогда никаких вопрос и притензий не было бы.
     
  17. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Llirik
    он уже 1000 лет не о программирование на ассемблере, а о низкоуровневом программировании в целом, как раз для него лучше подходит си ( возможно с асм вставками), так что все вам верно говорит Great, да и вообще си вам еще много раз пригодится!
     
  18. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    468
    spa
    О низкоуровневом программировании?)) Мне всегда казалось, что ассемблер более низкого уровня чем Си. Что на асме напишешь, то в IDA и получишь, а с Си это далеко не так
     
  19. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    а зачем это? Только не говорите про 0x0 в коде, эта задача без проблем решается и на си. А то что действительно нельзя написать на си, заменяется __asm{ } так что ничего сильно крутого в ассемблере нету, только добавляет неудобства, но это мое имхо конечно, но си в ЛЮБОМ случае необходим, как минимум потому что он является языком ддк.
     
  20. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    468
    в IDA можно сравнить коды двух похожих приложений и понять, что в одном не так. Чем Си круче? Средой разработки? Так по моему мнению она лучше в Дельфи. Синтаксисом? Так асм чётче и нагляднее, в отладчиках не надо ломать голову пытаясь выяснить что было написано в том или ином месте)