Световые индикаторы клавиатуры

Тема в разделе "WASM.NT.KERNEL", создана пользователем Llirik, 19 авг 2010.

  1. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Я уже задавал этот вопрос в предыдущей теме, но ответа я так и не получил
    Код:
    Код (Text):
    1.     .386p
    2. option casemap:none
    3. .model flat, stdcall
    4.  
    5. include \masm32\include\ntstatus.inc
    6. include \masm32\include\ntddk.inc
    7. include \masm32\include\ntoskrnl.inc
    8. include \masm32\include\ntddkbd.inc
    9. include \masm32\include\hal.inc
    10.  
    11. includelib \masm32\lib\ntoskrnl.lib
    12. includelib \masm32\lib\hal.lib
    13.  
    14. include \masm32\Macros\Strings.mac
    15.  
    16. include common.inc
    17.  
    18. .data
    19. CCOUNTED_UNICODE_STRING    "\\Device\\KeyMouse", g_usDeviceName, 4
    20.  CCOUNTED_UNICODE_STRING    "\\??\\KeyMouse", g_usSymbolicLinkName, 4
    21. CCOUNTED_UNICODE_STRING "\\Device\\KeyboardClass0", g_usTargetDeviceName, 4
    22. FALSE       equ 0
    23. TRUE        equ 1
    24. ScanCode dd ?
    25. KeyFlags dd ?
    26. x dw ?
    27. y dw ?
    28. buttons dw ?
    29. KeyDeviceObject   PDEVICE_OBJECT ?
    30. ;;;pTargetFileObject   PFILE_OBJECT  ?
    31. ;;g_pEventObject                    PKEVENT         ?
    32. ;;g_EventSpinLock                   KSPIN_LOCK      ?   ; locks key data list
    33. g_dwPendingRequests             DWORD           ?
    34.  
    35. FiDO_DEVICE_EXTENSION STRUCT
    36.     pNextLowerDeviceObject  PDEVICE_OBJECT  ?
    37.     pTargetFileObject   PFILE_OBJECT    ?
    38. FiDO_DEVICE_EXTENSION ENDS
    39. PFiDO_DEVICE_EXTENSION typedef ptr FiDO_DEVICE_EXTENSION
    40.  
    41. .code
    42.  
    43. ReadComplete proc uses esi edi ebx pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP, pContext:PVOID
    44.  
    45.     mov esi, pIrp
    46.     assume esi:ptr _IRP
    47.  
    48.     .if [esi].IoStatus.Status == STATUS_SUCCESS
    49.    
    50.         mov edi, [esi].AssociatedIrp.SystemBuffer
    51.         assume edi:ptr KEYBOARD_INPUT_DATA
    52.        
    53.         mov ebx, [esi].IoStatus.Information
    54.  
    55.         .while sdword ptr ebx >= sizeof KEYBOARD_INPUT_DATA
    56.            
    57.             movzx eax, [edi].MakeCode
    58.             mov ScanCode, eax
    59.  
    60.             movzx eax, [edi].Flags
    61.             mov KeyFlags, eax
    62.            
    63.             add edi, sizeof KEYBOARD_INPUT_DATA
    64.             sub ebx, sizeof KEYBOARD_INPUT_DATA
    65.         .endw
    66.  
    67.         assume edi:nothing     
    68.    
    69.     .endif
    70.  
    71.     .if [esi].PendingReturned
    72.         IoMarkIrpPending esi
    73.     .endif
    74.  
    75.     assume esi:nothing
    76.  
    77.     lock dec g_dwPendingRequests
    78.  
    79.     mov eax, STATUS_SUCCESS
    80.     ret
    81.  
    82. ReadComplete endp
    83.  
    84. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    85. FiDO_DispatchRead proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
    86.  
    87.         lock inc g_dwPendingRequests
    88.  
    89.         IoCopyCurrentIrpStackLocationToNext pIrp
    90.     IoSetCompletionRoutine pIrp, ReadComplete, NULL, TRUE, TRUE, TRUE
    91.  
    92.     mov eax, pDeviceObject
    93.     mov eax, (DEVICE_OBJECT ptr [eax]).DeviceExtension
    94.     mov eax, (FiDO_DEVICE_EXTENSION ptr [eax]).pNextLowerDeviceObject
    95.  
    96.     invoke IoCallDriver, eax, pIrp
    97.  
    98.     ; We must return exactly the same value IoCallDriver has returned.
    99.  
    100.     ret
    101.  
    102. FiDO_DispatchRead endp
    103.  
    104. FiDO_DispatchPower proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
    105.  
    106.     invoke PoStartNextPowerIrp, pIrp
    107.  
    108.     IoSkipCurrentIrpStackLocation pIrp
    109.    
    110.     mov eax, pDeviceObject
    111.     mov eax, (DEVICE_OBJECT ptr [eax]).DeviceExtension
    112.     mov eax, (FiDO_DEVICE_EXTENSION ptr [eax]).pNextLowerDeviceObject
    113.  
    114.     invoke PoCallDriver, eax, pIrp
    115.  
    116.     ; We must return exactly the same value PoCallDriver has returned.
    117.  
    118.     ret
    119.  
    120. FiDO_DispatchPower endp
    121.  
    122. FiDO_DispatchPassThrough proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
    123.  
    124.     IoSkipCurrentIrpStackLocation pIrp
    125.  
    126.     mov eax, pDeviceObject
    127.     mov eax, (DEVICE_OBJECT ptr [eax]).DeviceExtension
    128.     mov eax, (FiDO_DEVICE_EXTENSION ptr [eax]).pNextLowerDeviceObject
    129.  
    130.     invoke IoCallDriver, eax, pIrp
    131.     ret
    132.  
    133. FiDO_DispatchPassThrough endp
    134.  
    135.  
    136.  DispatchCreateClose proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
    137.  
    138.      mov eax, pIrp
    139.      assume eax:ptr _IRP
    140.      mov [eax].IoStatus.Status, STATUS_SUCCESS
    141.      and [eax].IoStatus.Information, 0
    142.      assume eax:nothing
    143.  
    144.      fastcall IofCompleteRequest, pIrp, IO_NO_INCREMENT
    145.  
    146.      mov eax, STATUS_SUCCESS
    147.      ret
    148.  
    149.  DispatchCreateClose endp
    150.  
    151. CDO_DispatchDeviceControl proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
    152.  
    153.      mov eax, pIrp
    154.      assume eax:ptr _IRP
    155.      mov [eax].IoStatus.Status, STATUS_SUCCESS
    156.      and [eax].IoStatus.Information, 0
    157.      assume eax:nothing
    158.  
    159.      fastcall IofCompleteRequest, pIrp, IO_NO_INCREMENT
    160.  
    161.      mov eax, STATUS_SUCCESS
    162.      ret
    163.  
    164. CDO_DispatchDeviceControl endp
    165.  
    166.  
    167. DriverUnload proc pDriverObject:PDRIVER_OBJECT
    168.  
    169. ;local KeyData:KEY_DATA
    170.  
    171.     invoke IoDeleteSymbolicLink, addr g_usSymbolicLinkName
    172.  
    173.     mov eax, pDriverObject
    174.     invoke IoDeleteDevice, (DRIVER_OBJECT PTR [eax]).DeviceObject
    175.  
    176.     ret
    177.  
    178. DriverUnload endp
    179.  
    180. DriverDispatch proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
    181.  
    182. local status:NTSTATUS
    183. local dwMajorFunction:DWORD
    184.  
    185.     IoGetCurrentIrpStackLocation pIrp
    186.  
    187.     movzx eax, (IO_STACK_LOCATION PTR [eax]).MajorFunction
    188.     mov dwMajorFunction, eax
    189.  
    190.     mov eax, pDeviceObject
    191.     .if eax == KeyDeviceObject
    192.  
    193. ;       mov eax, dwMajorFunction
    194.  
    195. ;   .elseif eax == g_pControlDeviceObject
    196.  
    197.         ; Request is to our CDO. Let' see what our client want us do
    198.    
    199.         mov eax, dwMajorFunction
    200.         .if eax == IRP_MJ_CREATE
    201.             invoke DispatchCreateClose, pDeviceObject, pIrp
    202.             mov status, eax
    203.         .elseif eax == IRP_MJ_CLOSE
    204.             invoke DispatchCreateClose, pDeviceObject, pIrp
    205.             mov status, eax
    206.         .elseif eax == IRP_MJ_DEVICE_CONTROL
    207.             invoke CDO_DispatchDeviceControl, pDeviceObject, pIrp
    208.             mov status, eax
    209.         .elseif eax == IRP_MJ_READ
    210.             invoke FiDO_DispatchRead, pDeviceObject, pIrp
    211.             mov status, eax
    212.         .elseif eax == IRP_MJ_POWER
    213.             invoke FiDO_DispatchPower, pDeviceObject, pIrp
    214.             mov status, eax
    215.         .else
    216.             invoke FiDO_DispatchPassThrough, pDeviceObject, pIrp
    217.             mov status, eax
    218.  
    219.             .endif
    220.  
    221.     .else
    222.  
    223.         mov ecx, pIrp
    224.         mov (_IRP PTR [ecx]).IoStatus.Status, STATUS_INVALID_DEVICE_REQUEST
    225.         and (_IRP PTR [ecx]).IoStatus.Information, 0
    226.  
    227.         fastcall IofCompleteRequest, ecx, IO_NO_INCREMENT
    228.  
    229.         mov status, STATUS_INVALID_DEVICE_REQUEST
    230.  
    231.     .endif
    232.  
    233.     mov eax, status
    234.     ret
    235.  
    236. DriverDispatch endp
    237.  
    238. .code INIT
    239.  
    240.  
    241. DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
    242.  local status:NTSTATUS
    243.  
    244. local pTargetDeviceObject:PDEVICE_OBJECT
    245.  local pTargetFileObject:PFILE_OBJECT
    246.  
    247.      mov status, STATUS_DEVICE_CONFIGURATION_ERROR
    248.  
    249. invoke IoCreateDevice, pDriverObject, sizeof FiDO_DEVICE_EXTENSION, addr g_usDeviceName, FILE_DEVICE_UNKNOWN, \
    250.                                               0, FALSE, addr KeyDeviceObject
    251. .if eax == STATUS_SUCCESS
    252.          invoke IoCreateSymbolicLink, addr g_usSymbolicLinkName, addr g_usDeviceName
    253.          .if eax == STATUS_SUCCESS
    254.  
    255.      invoke IoGetDeviceObjectPointer, addr g_usTargetDeviceName, FILE_READ_DATA, \
    256.                                       addr pTargetFileObject, addr pTargetDeviceObject
    257.  
    258.             mov eax, pDriverObject
    259.              assume eax:PTR DRIVER_OBJECT
    260.     mov ecx, IRP_MJ_MAXIMUM_FUNCTION + 1
    261.     .while ecx
    262.     dec ecx
    263.     mov [eax].MajorFunction[ecx*(sizeof PVOID)], offset DriverDispatch
    264.     .endw
    265.              mov [eax].DriverUnload, offset DriverUnload
    266.              assume eax:nothing
    267.         invoke IoAttachDeviceToDeviceStack, KeyDeviceObject, pTargetDeviceObject   
    268.                 .if eax != NULL
    269.  
    270.                     mov edx, eax
    271.  
    272.                     ; Fill filter device object extension
    273.  
    274.                     mov ecx, KeyDeviceObject
    275.                     mov eax, (DEVICE_OBJECT ptr [ecx]).DeviceExtension
    276.                     assume eax:ptr FiDO_DEVICE_EXTENSION
    277.                     mov [eax].pNextLowerDeviceObject, edx
    278.                     push pTargetFileObject
    279.                     pop [eax].pTargetFileObject
    280.                     assume eax:nothing
    281.  
    282.                     assume edx:ptr DEVICE_OBJECT
    283.                     assume ecx:ptr DEVICE_OBJECT
    284.  
    285.                     mov eax, [edx].DeviceType
    286.                     mov [ecx].DeviceType, eax
    287.  
    288.                     mov eax, [edx].Flags
    289.                     and eax, DO_DIRECT_IO + DO_BUFFERED_IO + DO_POWER_PAGABLE
    290.                     or [ecx].Flags, eax
    291.  
    292.                     assume edx:nothing
    293.                     assume ecx:nothing
    294.  
    295.                     mov status, STATUS_SUCCESS
    296.  
    297.                 .else       ; IoAttachDeviceToDeviceStack failed
    298.  
    299.                     ; We have failed to attach
    300.  
    301.                     invoke ObDereferenceObject, pTargetFileObject
    302.                
    303.                     invoke IoDeleteDevice, KeyDeviceObject
    304.                     and KeyDeviceObject, NULL
    305.  
    306.                     ; Let the driver to be unloaded
    307.        
    308.                     mov eax, pDriverObject
    309.                     mov (DRIVER_OBJECT PTR [eax]).DriverUnload, offset DriverUnload
    310.  
    311.                     invoke DbgPrint, $CTA0("KbdSpy: Couldn't attach to target device\n")
    312.  
    313.                     mov status, STATUS_NO_SUCH_DEVICE
    314.  
    315.                 .endif
    316.              mov status, STATUS_SUCCESS
    317.          .else
    318.              invoke IoDeleteDevice, KeyDeviceObject
    319.          .endif
    320.      .endif
    321.  
    322.      mov eax, status
    323.  
    324. ret
    325.  
    326. DriverEntry endp
    327.  
    328.  
    329.  end DriverEntry
    Что не хватает в этом коде, чтоб индикаторы работали??
     
  2. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Фильтр на KeyboardClass0 просто разгребает ирпы которыми бомбардирует этот драйвер RIT поток, созданный window station, другими словами чтобы включить выключить индикаторы нужно выкинуть этот код в топку, и написать новый, который будет слать команду 0xED ( если не ошибаюсь, уточните это в соот-й литературе ) контроллеру.
     
  3. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    А почему тогда в фильтре Four-F`а индикаторы работают??
     
  4. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Возможно я неправильно понял вопрос, мне почему-то показалось, что нужно включить индикаторы.
     
  5. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    ну да. при загрузке моего фильтра индикаторы перестают переключаться, а при загрузке фильтра Four-F`а индикаторы работают в обычном режиме. почему??
     
  6. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Не видел кода Four-F, но если есть правильно работающий драйвер, то непроблема наверно сравнить свой с эталоном не так ли?
    Я для интереса написал драйвер, все работает, клавиши ловяться, индикаторы моргают(да и куда им деться они же есть в таблице сканкодов).
     
  7. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Llirik
    Никогда не пишите драйвера без отладочных выводов. Логгируйте все приходящие IPR и смотрите в чем дело.
     
  8. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Я внимательно сравнил свой код с кодом Four-F`а http://www.wasm.ru/article.php?article=drvw2k16 вроде бы всё правильно, ничего не забыл, но индикаторы не работают.
    А с отладчиками я пока на вы) Есть Ollydbg, но в нём драйверы не отладишь, а SoftIce вообще почему-то не пашет. Да и причем тут отладчики? В коде явно чего-то не хватает, только я не могу понять чего именно
     
  9. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Llirik
    ничего удивительного
    Syser, но если система 32битка и не больше 2ух ядер
     
  10. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Я сейчас спрашиваю не про Softice, а про индикаторы!!!
     
  11. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Llirik
    так я Вам про инструмент выявления вашей аномалии и толкую
    раз не наблюдается лес желающих разгребать ваши деяния наверно придется самому и не без помощи отладчкика
    есть ещё платный саппорт https://wasm.ru/forum/viewforum.php?id=26 ( там всё быстро и чётко)
    и там в постах своими любыми восклицательными знаками хоть обделайтесь
     
  12. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Задашь простой вопрос - высмеиваете, задашь трудный - шлёте куда подальше. Так на какие вопросы вы тут отвечаете?
     
  13. ams007

    ams007 New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2007
    Сообщения:
    86
    DriverDispatch proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP

    local status:NTSTATUS
    local dwMajorFunction:lol: WORD

    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


    Ваша ошибка жирным. Или я разучился воспринимать код на асме, или вы не шлете урпавляющие запросы устройству клавы, а тупо завершаете их сами.
     
  14. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    ams007 большое Вам спасибо!!!! Функцию CDO_DispatchDeviceControl я вставил в свой код просто так, для будущего, особенно пока не задумываясь об её предназначении)