Создание виртуального контроллера

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

  1. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Llirik
    ПОтому что дров делает регистрацию устройства ..
     
  2. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Ты явно путаешь, как в том анектдоте, надпись на сарае и его реальное содержимое.
    Появляется не устройство, а записи в системе, создаваемые при взаимодействии системы и драйвера.
    Есть железка или нет системе наплевать.
    Тогда ищи исходники виртуальных мышей, например, для пультов ТВ тюнеров или мобил через блютус и WiFi. Но они все равно неудобные. По менюшкам приложений через клаву удобнее работать, а играть в игры даже мышеджойстиком - ОТСТОЙ. Я жалею что раньше джойстик не купил - получил массу новых ощущений, но увы уже поздно мне учится владеть им...
    ======================
    Пардон отвлекся на свое. Тебе всего-то надо зарегистрировать устройство типа мышь и разрулить куда направить коды клавиш - в винду или в имитатор мыши. Можно конечно просто вторую клаву юзать, но смысла в этой работе мало. А подсказывать тебе будут, когда будет реальный исходник, а не прожект. Кстати для прожектов тут отдельная тема, а в кернел ты явно не у дел.
     
  3. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    valterg, а для меня мышеджой лучше всяких там навороченных джоев! Я ими даже не могу пользоваться в силу физических причин, а мышку взял и погнал по трассе
     
  4. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Four-F, у меня Toaster почему-то не собирается( Вы бы не могли его собрать с флагами USER_C_FLAGS=/FAs и дать мне полученый asm для анализа?
     
  5. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Llirik
    1) Удачи в создании драйвера клавамыша :)
    2) Войди в профиль Four-F. Там и ПМ и другие контакты есть. Быстрее будет.
    По-моему опыту сборка DDK обламывается, когда не соблюдаешь ПРАВИЛ. Обычно у тебя в путях и системных переменных есть левые утилиты и инклюды, которые мешают. Сейчас ДДК у меня не установлен, т.ч. проверить не могу.
     
  6. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Ответил в ветке http://wasm.ru/forum/viewtopic.php?pid=434190

    Совет1: Время которое Вы потратите на изучение автосгенеренных асмов лучше потратить не изучение С.
    Совет1: Собрать бинарь без генерации асмов и залить в IDA. Листинг получится, ИМХО, более читебельный.
     
  7. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Вопрос такой: почему при вот таком коде
    Код (Text):
    1. .data
    2. .....................
    3. busguid  dd 0C05EAD84h
    4.  dw 0E34Ch, 04ee2h, 0BF6Ah
    5. db 05Dh, 04Bh, 0B7h, 0D2h, 0B1h, 022h
    6. .............................
    7. .code
    8. ................................
    9.  
    10. xKbFilter_AddDevice proc  pDriverObject:PDRIVER_OBJECT, pDeviceObject:PDEVICE_OBJECT
    11. local KeyeviceObject:PDEVICE_OBJECT
    12. local devext:PFiDO_DEVICE_EXTENSION
    13.  local status:NTSTATUS
    14. .if buss == 0
    15. invoke IoCreateDevice, pDriverObject, sizeof FiDO_DEVICE_EXTENSION, 0, FILE_DEVICE_MOUSE, \
    16.                                               0, FALSE, addr KeyeviceObject
    17. inc buss
    18. .else
    19. invoke IoCreateDevice, pDriverObject, sizeof FiDO_DEVICE_EXTENSION, addr gg_usDeviceName, FILE_DEVICE_KEYBOARD, \
    20.                                               0, FALSE, addr KeyeviceObject
    21. .endif
    22.          .if eax == STATUS_SUCCESS
    23. inc gr
    24. invoke IoAttachDeviceToDeviceStack, KeyeviceObject, pDeviceObject
    25. .if eax != NULL
    26. push ebx
    27. mov ebx, KeyeviceObject
    28. assume ebx:ptr DEVICE_OBJECT
    29. mov ecx, [ebx].DeviceExtension
    30. assume ebx:nothing
    31. assume ecx:ptr FiDO_DEVICE_EXTENSION
    32.     mov [ecx].TopOfStack, eax
    33.     push KeyeviceObject
    34.     pop [ecx].Self
    35.     push pDeviceObject
    36.     pop [ecx].PDO
    37.     and [ecx].SurpriseRemoved, FALSE;
    38.     and [ecx].Removed, FALSE;
    39.     and [ecx].Started, FALSE;
    40. assume ecx:nothing
    41.     mov ecx, KeyeviceObject
    42.  
    43.                     assume eax:ptr DEVICE_OBJECT
    44.                     assume ecx:ptr DEVICE_OBJECT
    45.  
    46.                     mov ebx, [eax].DeviceType
    47.                     mov [ecx].DeviceType, ebx
    48.                     mov ebx, [eax].Flags
    49.                     mov [ecx].Flags,ebx
    50. or [ecx].Flags, DO_BUFFERED_IO or DO_POWER_PAGABLE
    51. and [ecx].Flags, not DO_DEVICE_INITIALIZING
    52. assume eax:nothing
    53.                     assume ecx:nothing
    54.                     mov status, STATUS_SUCCESS
    55. pop ebx
    56.          .else
    57.             mov status, STATUS_DEVICE_NOT_CONNECTED
    58.              invoke IoDeleteDevice, KeyeviceObject
    59.  
    60.      .endif
    61.     .else
    62.             mov status, STATUS_DEVICE_NOT_CONNECTED
    63.      .endif
    64. ;;     .endif
    65.      mov eax, status
    66.  
    67. ret
    68.  
    69. xKbFilter_AddDevice endp
    70.  
    71.  
    72. .code INIT
    73. DriverEntry1 proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
    74. local SymbolicName:dword
    75.  local status:NTSTATUS
    76.      mov status, STATUS_DEVICE_CONFIGURATION_ERROR
    77. invoke IoCreateDevice, pDriverObject, sizeof FiDO_DEVICE_EXTENSION, addr Qg_usDeviceName, FILE_DEVICE_UNKNOWN, \
    78.                                               0, TRUE, addr KeyDeviceObject
    79.  .if eax == STATUS_SUCCESS
    80.         invoke IoCreateSymbolicLink, addr g_usSymbolicLinkName, addr Qg_usDeviceName
    81.          .if eax == STATUS_SUCCESS
    82.             mov eax, pDriverObject
    83.              assume eax:PTR DRIVER_OBJECT
    84.     mov ecx, IRP_MJ_MAXIMUM_FUNCTION + 1
    85.     .while ecx
    86.     dec ecx
    87.     mov [eax].MajorFunction[ecx*(sizeof PVOID)], offset FiDO_DispatchPassThrough
    88.     .endw
    89.     mov [eax].MajorFunction[IRP_MJ_DEVICE_CONTROL*(sizeof PVOID)], offset CDO_DispatchDeviceControl
    90.     mov [eax].MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL*(sizeof PVOID)], offset CDO_DispatchDeviceControl
    91.     mov [eax].MajorFunction[IRP_MJ_PNP*(sizeof PVOID)], offset KbFilter_PnP
    92.     mov [eax].MajorFunction[IRP_MJ_POWER*(sizeof PVOID)], offset FiDO_DispatchPower
    93.     mov ecx, [eax].DriverExtension
    94.              assume ecx:PTR DRIVER_EXTENSION
    95.     mov [ecx].AddDevice, offset xKbFilter_AddDevice;
    96.         mov [eax].DriverUnload, offset DriverUnload
    97.              assume eax:nothing
    98.              assume ecx:nothing
    99. invoke IoCreateDevice, pDriverObject, sizeof BFiDO_DEVICE_EXTENSION, NULL, FILE_DEVICE_BUS_EXTENDER, FILE_DEVICE_SECURE_OPEN, TRUE, addr BusDeviceObject
    100. mov eax, BusDeviceObject
    101. assume eax:ptr DEVICE_OBJECT
    102. mov ecx, [eax].DeviceExtension
    103. assume eax:nothing
    104. assume ecx:ptr BFiDO_DEVICE_EXTENSION
    105. lea eax, [ecx].InterfaceName
    106. mov SymbolicName, eax
    107. [b]invoke IoRegisterDeviceInterface, BusDeviceObject, addr busguid, 0, eax[/b]invoke IoSetDeviceInterfaceState, SymbolicName, TRUE
    108. invoke xKbFilter_AddDevice, pDriverObject, BusDeviceObject
    109.             mov status, STATUS_SUCCESS
    110.          .else
    111.             mov status, STATUS_DEVICE_NOT_CONNECTED
    112.              invoke IoDeleteDevice, KeyDeviceObject
    113.      .endif
    114. .endif
    115.     mov eax, status
    116. ret
    117. DriverEntry1 endp
    118.  end DriverEntry1
    Код ошибки:
    Причём не сразу, а только тогда, когда начинает грузиться графическая оболочка винды. Может чего-то в коде ещё не хватает?
    P.S. в архиве драйвер и CrashDump
     
  8. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Извините, пож)) Просто я забыл выкинуть кое-что из кода))
     
  9. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Llirik
    Во пырвых делать дамвы надо расширенные , во вторых в виндбг и analyze -v
     
  10. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Пожалуйста, приведите мне простенький обработки IRP_MN_QUERY_ID с функцией завершения PnPQueryComplete
     
  11. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Я имею ввиду пример вот этого:
    Код (Text):
    1. PAGE:0001280B loc_1280B:                              ; CODE XREF: HGM_PnP(x,x)+61j
    2. PAGE:0001280B                 push    9
    3. PAGE:0001280D                 mov     [ebx+1Ch], ecx
    4. PAGE:00012810                 mov     [ebx+18h], ecx
    5. PAGE:00012813                 lea     edi, [eax-24h]
    6. PAGE:00012816                 pop     ecx
    7. PAGE:00012817                 mov     esi, eax
    8. PAGE:00012819                 rep movsd
    9. PAGE:0001281B                 mov     eax, [ebx+60h]
    10. PAGE:0001281E                 mov     ecx, [ebp+var_4]
    11. PAGE:00012821                 sub     eax, 24h
    12. PAGE:00012824                 mov     edx, ebx
    13. PAGE:00012826                 mov     dword ptr [eax+1Ch], offset _HGM_PnPQueryComplete@12 ; HGM_PnPQueryComplete(x,x,x)
    14. PAGE:0001282D                 mov     [eax+20h], ecx
    15. PAGE:00012830                 mov     byte ptr [eax+3], 0E0h
    16. PAGE:00012834                 mov     eax, [ebx+60h]
    17. PAGE:00012837                 or      byte ptr [eax+3], 1
    18. PAGE:0001283B                 mov     eax, [ebp+arg_0]
    19. PAGE:0001283E                 mov     eax, [eax+28h]
    20. PAGE:00012841                 mov     ecx, [eax+4]
    21. PAGE:00012844                 call    ds:__imp_@IofCallDriver@8 ; IofCallDriver(x,x)
    22. PAGE:0001284A                 mov     edi, eax
    23. PAGE:0001284C                 jmp     loc_12990
    хотя бы на С