Я уже задавал этот вопрос в предыдущей теме, но ответа я так и не получил Код: Код (Text): .386p option casemap:none .model flat, stdcall include \masm32\include\ntstatus.inc include \masm32\include\ntddk.inc include \masm32\include\ntoskrnl.inc include \masm32\include\ntddkbd.inc include \masm32\include\hal.inc includelib \masm32\lib\ntoskrnl.lib includelib \masm32\lib\hal.lib include \masm32\Macros\Strings.mac include common.inc .data CCOUNTED_UNICODE_STRING "\\Device\\KeyMouse", g_usDeviceName, 4 CCOUNTED_UNICODE_STRING "\\??\\KeyMouse", g_usSymbolicLinkName, 4 CCOUNTED_UNICODE_STRING "\\Device\\KeyboardClass0", g_usTargetDeviceName, 4 FALSE equ 0 TRUE equ 1 ScanCode dd ? KeyFlags dd ? x dw ? y dw ? buttons dw ? KeyDeviceObject PDEVICE_OBJECT ? ;;;pTargetFileObject PFILE_OBJECT ? ;;g_pEventObject PKEVENT ? ;;g_EventSpinLock KSPIN_LOCK ? ; locks key data list g_dwPendingRequests DWORD ? FiDO_DEVICE_EXTENSION STRUCT pNextLowerDeviceObject PDEVICE_OBJECT ? pTargetFileObject PFILE_OBJECT ? FiDO_DEVICE_EXTENSION ENDS PFiDO_DEVICE_EXTENSION typedef ptr FiDO_DEVICE_EXTENSION .code ReadComplete proc uses esi edi ebx pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP, pContext:PVOID mov esi, pIrp assume esi:ptr _IRP .if [esi].IoStatus.Status == STATUS_SUCCESS mov edi, [esi].AssociatedIrp.SystemBuffer assume edi:ptr KEYBOARD_INPUT_DATA mov ebx, [esi].IoStatus.Information .while sdword ptr ebx >= sizeof KEYBOARD_INPUT_DATA movzx eax, [edi].MakeCode mov ScanCode, eax movzx eax, [edi].Flags mov KeyFlags, eax add edi, sizeof KEYBOARD_INPUT_DATA sub ebx, sizeof KEYBOARD_INPUT_DATA .endw assume edi:nothing .endif .if [esi].PendingReturned IoMarkIrpPending esi .endif assume esi:nothing lock dec g_dwPendingRequests mov eax, STATUS_SUCCESS ret ReadComplete endp ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: FiDO_DispatchRead proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP lock inc g_dwPendingRequests IoCopyCurrentIrpStackLocationToNext pIrp IoSetCompletionRoutine pIrp, ReadComplete, NULL, TRUE, TRUE, TRUE mov eax, pDeviceObject mov eax, (DEVICE_OBJECT ptr [eax]).DeviceExtension mov eax, (FiDO_DEVICE_EXTENSION ptr [eax]).pNextLowerDeviceObject invoke IoCallDriver, eax, pIrp ; We must return exactly the same value IoCallDriver has returned. ret FiDO_DispatchRead endp FiDO_DispatchPower proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP invoke PoStartNextPowerIrp, pIrp IoSkipCurrentIrpStackLocation pIrp mov eax, pDeviceObject mov eax, (DEVICE_OBJECT ptr [eax]).DeviceExtension mov eax, (FiDO_DEVICE_EXTENSION ptr [eax]).pNextLowerDeviceObject invoke PoCallDriver, eax, pIrp ; We must return exactly the same value PoCallDriver has returned. ret FiDO_DispatchPower endp FiDO_DispatchPassThrough 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]).pNextLowerDeviceObject invoke IoCallDriver, eax, pIrp ret FiDO_DispatchPassThrough endp DispatchCreateClose 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 DispatchCreateClose endp CDO_DispatchDeviceControl 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 CDO_DispatchDeviceControl endp DriverUnload proc pDriverObject:PDRIVER_OBJECT ;local KeyData:KEY_DATA invoke IoDeleteSymbolicLink, addr g_usSymbolicLinkName mov eax, pDriverObject invoke IoDeleteDevice, (DRIVER_OBJECT PTR [eax]).DeviceObject ret DriverUnload endp DriverDispatch proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP local status:NTSTATUS local dwMajorFunction:DWORD IoGetCurrentIrpStackLocation pIrp movzx eax, (IO_STACK_LOCATION PTR [eax]).MajorFunction mov dwMajorFunction, eax mov eax, pDeviceObject .if eax == KeyDeviceObject ; mov eax, dwMajorFunction ; .elseif eax == g_pControlDeviceObject ; Request is to our CDO. Let' see what our client want us do mov eax, dwMajorFunction .if eax == IRP_MJ_CREATE invoke DispatchCreateClose, pDeviceObject, pIrp mov status, eax .elseif eax == IRP_MJ_CLOSE invoke DispatchCreateClose, pDeviceObject, pIrp mov status, eax .elseif eax == IRP_MJ_DEVICE_CONTROL invoke CDO_DispatchDeviceControl, pDeviceObject, pIrp mov status, eax .elseif eax == IRP_MJ_READ invoke FiDO_DispatchRead, pDeviceObject, pIrp mov status, eax .elseif eax == IRP_MJ_POWER invoke FiDO_DispatchPower, pDeviceObject, pIrp mov status, eax .else invoke FiDO_DispatchPassThrough, pDeviceObject, pIrp mov status, eax .endif .else mov ecx, pIrp mov (_IRP PTR [ecx]).IoStatus.Status, STATUS_INVALID_DEVICE_REQUEST and (_IRP PTR [ecx]).IoStatus.Information, 0 fastcall IofCompleteRequest, ecx, IO_NO_INCREMENT mov status, STATUS_INVALID_DEVICE_REQUEST .endif mov eax, status ret DriverDispatch endp .code INIT DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING local status:NTSTATUS local pTargetDeviceObject:PDEVICE_OBJECT local pTargetFileObject:PFILE_OBJECT mov status, STATUS_DEVICE_CONFIGURATION_ERROR invoke IoCreateDevice, pDriverObject, sizeof FiDO_DEVICE_EXTENSION, addr g_usDeviceName, FILE_DEVICE_UNKNOWN, \ 0, FALSE, addr KeyDeviceObject .if eax == STATUS_SUCCESS invoke IoCreateSymbolicLink, addr g_usSymbolicLinkName, addr g_usDeviceName .if eax == STATUS_SUCCESS invoke IoGetDeviceObjectPointer, addr g_usTargetDeviceName, FILE_READ_DATA, \ addr pTargetFileObject, addr pTargetDeviceObject 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 DriverDispatch .endw mov [eax].DriverUnload, offset DriverUnload assume eax:nothing invoke IoAttachDeviceToDeviceStack, KeyDeviceObject, pTargetDeviceObject .if eax != NULL mov edx, eax ; Fill filter device object extension mov ecx, KeyDeviceObject mov eax, (DEVICE_OBJECT ptr [ecx]).DeviceExtension assume eax:ptr FiDO_DEVICE_EXTENSION mov [eax].pNextLowerDeviceObject, edx push pTargetFileObject pop [eax].pTargetFileObject assume eax:nothing assume edx:ptr DEVICE_OBJECT assume ecx:ptr DEVICE_OBJECT mov eax, [edx].DeviceType mov [ecx].DeviceType, eax mov eax, [edx].Flags and eax, DO_DIRECT_IO + DO_BUFFERED_IO + DO_POWER_PAGABLE or [ecx].Flags, eax assume edx:nothing assume ecx:nothing mov status, STATUS_SUCCESS .else ; IoAttachDeviceToDeviceStack failed ; We have failed to attach invoke ObDereferenceObject, pTargetFileObject invoke IoDeleteDevice, KeyDeviceObject and KeyDeviceObject, NULL ; Let the driver to be unloaded mov eax, pDriverObject mov (DRIVER_OBJECT PTR [eax]).DriverUnload, offset DriverUnload invoke DbgPrint, $CTA0("KbdSpy: Couldn't attach to target device\n") mov status, STATUS_NO_SUCH_DEVICE .endif mov status, STATUS_SUCCESS .else invoke IoDeleteDevice, KeyDeviceObject .endif .endif mov eax, status ret DriverEntry endp end DriverEntry Что не хватает в этом коде, чтоб индикаторы работали??
Фильтр на KeyboardClass0 просто разгребает ирпы которыми бомбардирует этот драйвер RIT поток, созданный window station, другими словами чтобы включить выключить индикаторы нужно выкинуть этот код в топку, и написать новый, который будет слать команду 0xED ( если не ошибаюсь, уточните это в соот-й литературе ) контроллеру.
ну да. при загрузке моего фильтра индикаторы перестают переключаться, а при загрузке фильтра Four-F`а индикаторы работают в обычном режиме. почему??
Не видел кода Four-F, но если есть правильно работающий драйвер, то непроблема наверно сравнить свой с эталоном не так ли? Я для интереса написал драйвер, все работает, клавиши ловяться, индикаторы моргают(да и куда им деться они же есть в таблице сканкодов).
Llirik Никогда не пишите драйвера без отладочных выводов. Логгируйте все приходящие IPR и смотрите в чем дело.
Я внимательно сравнил свой код с кодом Four-F`а http://www.wasm.ru/article.php?article=drvw2k16 вроде бы всё правильно, ничего не забыл, но индикаторы не работают. А с отладчиками я пока на вы) Есть Ollydbg, но в нём драйверы не отладишь, а SoftIce вообще почему-то не пашет. Да и причем тут отладчики? В коде явно чего-то не хватает, только я не могу понять чего именно
Llirik так я Вам про инструмент выявления вашей аномалии и толкую раз не наблюдается лес желающих разгребать ваши деяния наверно придется самому и не без помощи отладчкика есть ещё платный саппорт https://wasm.ru/forum/viewforum.php?id=26 ( там всё быстро и чётко) и там в постах своими любыми восклицательными знаками хоть обделайтесь
Задашь простой вопрос - высмеиваете, задашь трудный - шлёте куда подальше. Так на какие вопросы вы тут отвечаете?
DriverDispatch proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP local status:NTSTATUS local dwMajorFunctionWORD IoGetCurrentIrpStackLocation pIrp movzx eax, (IO_STACK_LOCATION PTR [eax]).MajorFunction mov dwMajorFunction, eax mov eax, pDeviceObject .if eax == KeyDeviceObject ; mov eax, dwMajorFunction ; .elseif eax == g_pControlDeviceObject ; Request is to our CDO. Let' see what our client want us do mov eax, dwMajorFunction .if eax == IRP_MJ_CREATE invoke DispatchCreateClose, pDeviceObject, pIrp mov status, eax .elseif eax == IRP_MJ_CLOSE invoke DispatchCreateClose, pDeviceObject, pIrp mov status, eax .elseif eax == IRP_MJ_DEVICE_CONTROL invoke CDO_DispatchDeviceControl, pDeviceObject, pIrp mov status, eax .elseif eax == IRP_MJ_READ invoke FiDO_DispatchRead, pDeviceObject, pIrp mov status, eax .elseif eax == IRP_MJ_POWER invoke FiDO_DispatchPower, pDeviceObject, pIrp mov status, eax .else invoke FiDO_DispatchPassThrough, pDeviceObject, pIrp mov status, eax .endif Ваша ошибка жирным. Или я разучился воспринимать код на асме, или вы не шлете урпавляющие запросы устройству клавы, а тупо завершаете их сами.
ams007 большое Вам спасибо!!!! Функцию CDO_DispatchDeviceControl я вставил в свой код просто так, для будущего, особенно пока не задумываясь об её предназначении)