буфер клавиш kbdclass

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

  1. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    468
    IRP беру от i8042prt.sys, потому что пока тестирую PS/2 клаву.
    А что в моей процедуре завершения не так?
     
  2. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    468
    l_inc, так что же мне делать? может что почитать??
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Llirik
    Извиняюсь. У меня сейчас нет времени отвечать. Но я не помню, чтобы i8042prt кому-то под собой слал IRP для получения KEYBOARD_INPUT_DATA, а глянуть в исходники нету времени. Он заполняет в собственном обработчике прерывания свою очередь, указатели на которую имеются в его device extension. А потом из этой очереди заполняет KEYBOARD_INPUT_DATA, когда дело дойдёт до его процедуры I8042KeyboardIsrDpc. Насколько я помню, под ним никого нет, кто предоставляет KEYBOARD_INPUT_DATA. Поэтому мне всё ещё непонятно, что Вы там перехватываете.

    А читать... статьи вполне достаточно, но Вы явно не хотите её читать (иначе знали бы, что перед установкой процедуры завершения нужно вызывать IoCopyCurrentIrpStackLocationToNext). Плюс WDK, разумеется. Исходник драйвера есть в версии WDK 6001.18002.
     
  4. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    468
    дак я английского и Си не знаю
     
  5. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    468
    а где перехватывать их тогда, если не из DispatchRead ?
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Llirik
    Хех... Это шутка такая? Если нет, тогда и разговаривать не о чем. Оба языка необходимы, иначе о драйверах можете забыть.
    Из DispatchRead только перехватывая сообщения, отправленные к kbdclass. А i8042prt, например, позволяет callback зарегистрировать. Но если Вы читать исходники и WDK не собираетесь, то это не важно. Целиком фильтр я писать за Вас не собираюсь, а одним пинком в нужную сторону здесь не обойтись.
     
  7. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    468
    Пожалуйста, переведите мне на ассемблер эти две строчки:
    Код (Text):
    1. connectData = ((PCONNECT_DATA)
    2.     (irpStack->Parameters.DeviceIoControl.Type3InputBuffer));
    3. DevExt->UpperConnectData = *connectData;
    во второй я просто не знаю что означает *
     
  8. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    бгг вся тема аля "у меня есть куча ржавого металлолома, помогите порше 911 собрать люди добрые!" =]
     
  9. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    468
    l_inc, я тут не много запутался. Пожалуйста, помогите разобраться. не хочет компилироваться такой код:
    Код (Text):
    1. FiDO_DEVICE_EXTENSION STRUCT
    2.     Self PDEVICE_OBJECT ?
    3.     PDO PDEVICE_OBJECT ?
    4.     TopOfStack PDEVICE_OBJECT ?
    5.     SurpriseRemoved BOOLEAN ?
    6.     Started BOOLEAN ?
    7.     Removed BOOLEAN ?
    8. struct CONNECT_DATA
    9.     ClassDeviceObject PDEVICE_OBJECT ?
    10.     ClassService DWORD ?
    11.  ENDS
    12. PCONNECT_DATA typedef ptr CONNECT_DATA
    13. FiDO_DEVICE_EXTENSION ENDS
    14. PFiDO_DEVICE_EXTENSION typedef ptr FiDO_DEVICE_EXTENSION
    15. ......................................
    16. mov ebx, pDeviceObject
    17. assume ebx:ptr DEVICE_OBJECT
    18. mov ecx, [ebx].DeviceExtension
    19. assume ebx:nothing
    20. assume ecx:ptr FiDO_DEVICE_EXTENSION
    21.         .if [ecx].CONNECT_DATA.ClassService != NULL
    22.            mov status, STATUS_SHARING_VIOLATION
    23.         .elseif [edi].Parameters.DeviceIoControl.InputBufferLength < sizeof PCONNECT_DATA
    24.     mov status, STATUS_INVALID_PARAMETER;
    25.     .else
    26.     mov eax, [edi].Parameters.DeviceIoControl.Type3InputBuffer
    27.     mov [ecx].CONNECT_DATA.ClassDeviceObject, eax
    28.     mov ebx, (PCONNECT_DATA ptr [eax]).ClassService
    29.     mov [ecx].CONNECT_DATA.ClassService, ebx
    30.     mov ebx, [ecx].Self
    31.     mov (PCONNECT_DATA ptr [eax]).ClassDeviceObject, ebx
    32.     mov (PCONNECT_DATA ptr [eax]).ClassService, offset KbFilter_ServiceCallback
    и воощбе он по смыслу хотя бы верный?
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Llirik
    Вообще я не этот callback имел в виду (а тот, который ставится вызовом IOCTL_INTERNAL_I8042_HOOK_KEYBOARD и вызывается из ISR драйвера i8042prt.sys), но если Ваш драйвер грузится до загрузки kbdclass.sys, то перехватывать IOCTL_INTERNAL_KEYBOARD_CONNECT тоже можно.
    Этот код:
    Код (Text):
    1. mov eax, [edi].Parameters.DeviceIoControl.Type3InputBuffer
    2. mov [ecx].CONNECT_DATA.ClassDeviceObject, eax
    сохранит указатель на стековый буфер драйвера kbdclass.sys, а не на его ClassDeviceObject, как ожидается.
    Должно быть так:
    Код (Text):
    1. mov eax, [edi].Parameters.DeviceIoControl.Type3InputBuffer
    2. mov ebx, (PCONNECT_DATA ptr [eax]).ClassDeviceObject
    3. mov [ecx].CONNECT_DATA.ClassDeviceObject, ebx
    В остальном похоже на правду. С компиляцией вряд ли помогу, т.к. masm не люблю и не пользуюсь.
     
  11. neutronion

    neutronion New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    1.100
    2Llirik вам нужно к мозгоправу, извините за грубость. Не будет вам счастья, если дрова будете писать только асмом, попомните мои слова. Если не можете освоить С, значит просто не хотите, по каким-то личным причинам. Вы упрямо прете в тоннель на кажущийся свет. Знайте, это не божественный свет, это приближается литерный.
     
  12. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    468
    Да. Я просто не хочу тратить своё драгоценное время на изучение Вашего С) Чем больше мне что-то навязывают, тем больше у меня к этому неприязнь. Да и поспешил я с предыдущим постом. сам с этим разобрался) Господа, кто не желает помочь мне , того прошу не беспокоиться и не тратить свое время зря, займитесь лучше чем нибудь полезным, а не написанием оскорблений!
     
  13. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    468
    Я написал Callback, но получить скан-код нажатой клавиши я так и не могу.
    Код (Text):
    1. KbFilter_ServiceCallback proc pDeviceObject:PDEVICE_OBJECT, InputDataStart:PKEYBOARD_INPUT_DATA, InputDataEnd:PKEYBOARD_INPUT_DATA, InputDataConsumed:PULONG
    2. push ebx
    3. mov ebx, InputDataConsumed
    4. mov ecx, InputDataStart
    5. assume ecx:ptr KEYBOARD_INPUT_DATA
    6.         .while sdword ptr ebx >= sizeof KEYBOARD_INPUT_DATA
    7.            
    8.             movzx eax, [ecx].MakeCode
    9.             mov ScanCode, eax
    10.  
    11.             movzx eax, [ecx].Flags
    12.             mov KeyFlags, eax
    13.            
    14.             add ecx, sizeof KEYBOARD_INPUT_DATA
    15.             sub ebx, sizeof KEYBOARD_INPUT_DATA
    16.         .endw
    17.  
    18. pop ebx
    19.  
    20.     push    InputDataConsumed
    21.     mov eax, pDeviceObject
    22.     push    InputDataEnd
    23.  
    24. assume eax:ptr DEVICE_OBJECT
    25. mov ecx, [eax].DeviceExtension
    26. assume eax:nothing
    27. assume ecx:ptr FiDO_DEVICE_EXTENSION
    28.     push    InputDataStart
    29.     push    [ecx].ClassDeviceObject
    30.     call    [ecx].ClassService
    31.  
    32. ret
    33. KbFilter_ServiceCallback endp
    Что я делаю не так?
     
  14. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    468
    l_inc, сообщение №35 относится не к Вам
     
  15. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    468
    l_inc, спасибо за пинок в нужную сторону) Я написал Callback и теперь получаю данные и от PS/2 и от USB-клавы. А Вы говорили:
    ) Только мне хотелось разобраться вовсем до конца. Скажите, пожалуйста, зачем две стуктуры KEYBOARD_INPUT_DATA (InputDataStart и InputDataEnd), а не одна? И что за InputDataConsumed?
     
  16. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Llirik
    Это не две структуры. Это два указателя: на начало массива структур и на конец. А InputDataConsumed указывает на то, сколько структур функция KeyboardClassServiceCallback обработала из буфера, полученного от нижележащего драйвера. В большинстве случаев InputDataConsumed будет равно количествую всех структур в массиве между InputDataStart и InputDataEnd. А в случае USB-клавиатуры в массиве вообще всегда ровно одна структура.
    Три месяца на один простой фильтр? Причём, когда уже всё разжёвано до такой степени, что необходимо от силы два дня? В общем, сейчас я от своих слов не отказываюсь.
     
  17. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Три месяца? =] http://wasm.ru/forum/viewtopic.php?id=37499
     
  18. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    468
    l_inc, я не знаю, что такое InputDataConsumed, но это явно не количесто получаемых структур)
     
  19. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Llirik
    Во-первых, я сказал, что это количество структур, которые обработает KeyboardClassServiceCallback, а не которые она получит.

    Во-вторых, само значение InputDataConsumed, разумеется, является указателем на количество структур, а не самим количеством. Это называется передачей параметра по указателю.

    И в-третьих, значение, на которое указывает указатель InputDataConsumed, (по мне, так проще было вместо сложноподчинённого предложения просто сказать InputDataConsumed, но Вы ведь опять придираться станете) заполняется самой процедурой KeyboardClassServiceCallback, а не вызывающим. Когда KeyboardClassServiceCallback отработает, вызвавший его драйвер на основе полученного от этого callback'а значения, на которое указывает указатель InputDataConsumed, будет решать, что делать с оставшимися необработанными структурами. Хотя в 99,9% случаев необработанных структур не будет.
     
  20. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    468
    Вопрос такой. Почему при подмене клавиши "8" на "7" на цифровой панели клавиатуры происходит и подмена клавиш "стрелка вверх" на "Home"? Ведь скан-коды у них разные.
    Код (Text):
    1. KKbFilter_ServiceCallback proc pDeviceObject:PDEVICE_OBJECT, InputDataStart:PKEYBOARD_INPUT_DATA, InputDataEnd:PKEYBOARD_INPUT_DATA, InputDataConsumed:PULONG
    2. mov eax, InputDataStart
    3. assume eax:ptr KEYBOARD_INPUT_DATA
    4. cmp [eax].MakeCode, 0048h
    5. jnz  lll
    6. mov [eax].MakeCode, 0047h
    7. lll:
    8. assume eax:nothing
    9.     push    InputDataConsumed
    10.     mov eax, pDeviceObject
    11.     push    InputDataEnd
    12. assume eax:ptr DEVICE_OBJECT
    13. mov ecx, [eax].DeviceExtension
    14. assume eax:nothing
    15. assume ecx:ptr FiDO_DEVICE_EXTENSION
    16.     push    InputDataStart
    17.     push    [ecx].ClassDeviceObject
    18.     call    [ecx].ClassService
    19. ret
    20. KKbFilter_ServiceCallback endp