Сначала я написал драйвер не pnp и проблем с закрытием хендла не было. Я его переделал в верхний фильтр устройства и теперь при закрытии приложения, которое управляет этим драйвером, получается экран смерти. Я уж пробовал и так: Код (Text): DispatchClose proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP mov eax, pIrp assume eax:ptr _IRP mov [eax].IoStatus.Status, STATUS_SUCCESS and [eax].IoStatus.Information, 0 assume eax:nothing fastcall IofCompleteRequest, pIrp, IO_NO_INCREMENT mov eax, STATUS_SUCCESS ret DispatchClose endp и так: Код (Text): DispatchClose proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP IoSkipCurrentIrpStackLocation pIrp mov eax, pDeviceObject mov eax, (DEVICE_OBJECT ptr [eax]).DeviceExtension mov eax, (FiDO_DEVICE_EXTENSION ptr [eax]).TopOfStack invoke IoCallDriver, eax, pIrp mov eax, STATUS_SUCCESS ret DispatchClose endp но результат тот же( Ошибка: Компьютер был перезагружен после критической ошибки: 0x1000008e (0xc0000005, 0xbaf292b3, 0xaa726bec, 0x00000000).
В драйвере создаются устройства с DeviceExtensionSize = 0 при вызове IoCreateDevice? Если да (например, это управляющее устройство), то у него нет никакого DeviceExtension и, соответственно, TopOfStack. Отладчик для кого придумали?
Благодарю за ответ, но ковыряние в моём исходнике породило ещё больше вопросов. 1) Почему я обязательно должен создавать управляющее устройство? 2) Почему DeviceName остальных устройств должно быть точно таким же как и у управляющего? Код (Text): KbFilter_AddDevice proc pDriverObject:PDRIVER_OBJECT, pDeviceObject:PDEVICE_OBJECT local pTargetFileObject:PFILE_OBJECT local KeyeviceObject:PDEVICE_OBJECT local devext:PFiDO_DEVICE_EXTENSION local status:NTSTATUS invoke IoCreateDevice, pDriverObject, sizeof FiDO_DEVICE_EXTENSION, addr gk_usDeviceName, FILE_DEVICE_KEYBOARD, \ 0, FALSE, addr KeyeviceObject .if eax == STATUS_SUCCESS ;;:inc gr ;; invoke IoCreateSymbolicLink, addr g_usSymbolicLinkName, addr g_usDeviceName ; .if eax == STATUS_SUCCESS ;;;;;;;inc sgr mov eax, KeyeviceObject assume eax:ptr DEVICE_OBJECT mov ebx, [eax].DeviceExtension assume eax:nothing invoke RtlZeroMemory, ebx, sizeof FiDO_DEVICE_EXTENSION mov devext,ebx invoke IoAttachDeviceToDeviceStack, KeyeviceObject, pDeviceObject .if eax != NULL mov (FiDO_DEVICE_EXTENSION ptr [devext]).TopOfStack, eax push KeyeviceObject pop (FiDO_DEVICE_EXTENSION ptr [devext]).Self push pDeviceObject pop (FiDO_DEVICE_EXTENSION ptr [devext]).PDO ;mov (FiDO_DEVICE_EXTENSION ptr [devext]).DeviceState, PowerDeviceD0; and (FiDO_DEVICE_EXTENSION ptr [devext]).SurpriseRemoved, FALSE; and (FiDO_DEVICE_EXTENSION ptr [devext]).Removed, FALSE; and (FiDO_DEVICE_EXTENSION ptr [devext]).Started, FALSE; mov edx, devext assume edx:ptr DRIVER_OBJECT or [edx].Flags, DO_BUFFERED_IO or DO_POWER_PAGABLE and [edx].Flags, not DO_DEVICE_INITIALIZING assume edx:nothing mov status, STATUS_SUCCESS .else mov status, STATUS_DEVICE_NOT_CONNECTED invoke IoDeleteDevice, KeyeviceObject .endif ; .else ; mov status, STATUS_DEVICE_NOT_CONNECTED ;; invoke IoDeleteDevice, KeyDeviceObject ; .endif .else mov status, STATUS_DEVICE_NOT_CONNECTED .endif mov eax, status ret KbFilter_AddDevice endp .code INIT DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING local status:NTSTATUS mov status, STATUS_DEVICE_CONFIGURATION_ERROR invoke IoCreateDevice, pDriverObject, sizeof FiDO_DEVICE_EXTENSION, addr g_usDeviceName, FILE_DEVICE_UNKNOWN, \ 0, TRUE, addr KeyDeviceObject .if eax == STATUS_SUCCESS invoke IoCreateSymbolicLink, addr g_usSymbolicLinkName, addr g_usDeviceName .if eax == STATUS_SUCCESS mov eax, pDriverObject assume eax:PTR DRIVER_OBJECT mov ecx, IRP_MJ_MAXIMUM_FUNCTION + 1 .while ecx dec ecx mov [eax].MajorFunction[ecx*(sizeof PVOID)], offset FiDO_DispatchPassThrough .endw mov [eax].MajorFunction[IRP_MJ_DEVICE_CONTROL*(sizeof PVOID)], offset CDO_DispatchDeviceControl mov [eax].MajorFunction[IRP_MJ_CREATE*(sizeof PVOID)], offset DispatchCreate mov [eax].MajorFunction[IRP_MJ_READ*(sizeof PVOID)], offset FiDO_DispatchRead mov [eax].MajorFunction[IRP_MJ_PNP*(sizeof PVOID)], offset KbFilter_PnP mov [eax].MajorFunction[IRP_MJ_CLOSE*(sizeof PVOID)], offset DispatchClose mov [eax].MajorFunction[IRP_MJ_POWER*(sizeof PVOID)], offset FiDO_DispatchPower mov ecx, [eax].DriverExtension assume ecx:PTR DRIVER_EXTENSION mov [ecx].AddDevice, offset KbFilter_AddDevice; mov [eax].DriverUnload, offset DriverUnload assume eax:nothing assume ecx:nothing mov status, STATUS_SUCCESS .else invoke IoDeleteDevice, KeyDeviceObject .endif .endif mov eax, status ret DriverEntry endp end DriverEntry Иначе винда просто перестаёт загружаться. А по поводу отладчиков я уже говорил http://www.wasm.ru/forum/viewtopic.php?id=38357
А в фильтре из ddk kbdfiltr управляющее устройство не создаётся. Почему DeviceName должно быть одинаковым?
Llirik Нужно воспользоваться отладчиком, например используя VM. В дампе четко видно, что: Код (Text): kd> dt nt!_DEVICE_OBJECT -b 8a53a1b8 ... +0x028 DeviceExtension : (null) ... От этого и падение, нужно искать откуда берется устройство без extension'а Описание - просто блеск. 2-а устройства с одинаковым именем в системе не может быть. Перестает загружаться, видимо, из-за ошибки. Какой? Может не будем гадать на кофейной гуще (на кусках кода), а воспользуемся отладчиком?
Проблема в том, что нет второй машины а SoftIce/Syser не пашет? Решение: WinDbg:http://www.microsoft.com/whdc/devtools/debugging/default.mspx + VirtualBox:http://www.virtualbox.org/
Второй, точнее первый, комп у меня как раз таки и есть и Softice там пашет, ОС не по линии NT, а своей собственной сборки, по линии Win98. и я что-то пока не рискую тестировать мой драйвер, да еще нужно подумать, как вообще его туда прикруть-то)
Кажется, я не правильно написал функцию KbFilter_AddDevice, но как её правильно написать я не знаю( может подскажите?
Пожалуйста, приведите пример кода на асме после IoAttachDeviceToDeviceStack. Из статьи Four-F`а не походит
Извините, а причём здесь Си? Когда я регистрировался на этом форуме, я думал, что здесь обсуждается ассемблер. Вам следовало бы назвать сайт не "WASM", а "Всё о си", тогда никаких вопрос и притензий не было бы.
Llirik он уже 1000 лет не о программирование на ассемблере, а о низкоуровневом программировании в целом, как раз для него лучше подходит си ( возможно с асм вставками), так что все вам верно говорит Great, да и вообще си вам еще много раз пригодится!
spa О низкоуровневом программировании?)) Мне всегда казалось, что ассемблер более низкого уровня чем Си. Что на асме напишешь, то в IDA и получишь, а с Си это далеко не так
а зачем это? Только не говорите про 0x0 в коде, эта задача без проблем решается и на си. А то что действительно нельзя написать на си, заменяется __asm{ } так что ничего сильно крутого в ассемблере нету, только добавляет неудобства, но это мое имхо конечно, но си в ЛЮБОМ случае необходим, как минимум потому что он является языком ддк.
в IDA можно сравнить коды двух похожих приложений и понять, что в одном не так. Чем Си круче? Средой разработки? Так по моему мнению она лучше в Дельфи. Синтаксисом? Так асм чётче и нагляднее, в отладчиках не надо ломать голову пытаясь выяснить что было написано в том или ином месте)