Ввод с клавиатуры с помощью NativeApi

Тема в разделе "WASM.NT.KERNEL", создана пользователем SysProger, 8 фев 2009.

  1. SysProger

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127
    подскажите, как сделать.
     
  2. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Открыть (NtCreateFile) device(s) \\Device\\KeyboardClass[0..n] и читать (NtReadFile) из него(них).
    Количество девайсов можно узнать здесь HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\KeyboardClass
     
  3. SysProger

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127
    А почему их там несколько и как узнать, с какого именно устройства нужно читать?
     
  4. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Обычно KeyboardClass0 - это встроенный PS/2 порт. А KeyboardClass1 - это USB клавиатура(если подключена)
    Так что если нужна гарантия читать лучше со всех.
     
  5. SysProger

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127
    Нет, не работает программа: она запускается и сразу же завершается, не ожидает ввод с клавиатуры. Ввод пробовал реализовать 2 способами:
    Код (Text):
    1. WCHAR buffer[20];
    2. RtlInitUnicodeString(&pathname, L"\\Device\\KeyboardClass0");
    3. InitializeObjectAttributes(&oa, &pathname, OBJ_CASE_INSENSITIVE, NULL, NULL);  
    4.  
    5. status = NtCreateFile(&hFile, GENERIC_READ, &oa, &iostatus, NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN, 0, NULL, 0);
    6.  
    7. NtReadFile(hFile, NULL, NULL, NULL, &iostatus, (PVOID) buffer, sizeof(buffer), 0, NULL);
    Код (Text):
    1. WCHAR buffer[20];
    2. LARGE_INTEGER wait_time = {0};
    3.  
    4. RtlInitUnicodeString(&pathname, L"\\Device\\KeyboardClass0");
    5. InitializeObjectAttributes(&oa, &pathname, OBJ_CASE_INSENSITIVE, NULL, NULL);  
    6.  
    7. status = NtCreateFile(&hFile, GENERIC_READ, &oa, &iostatus, NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);
    8.  
    9. NtCreateEvent(&event, EVENT_ALL_ACCESS, NULL, NotificationEvent, FALSE);
    10.  
    11. wait_time = RtlConvertLongToLargeInteger(-900000000000);
    12.  
    13. NtReadFile(hFile, event, NULL, NULL, &iostatus, (PVOID) buffer, sizeof(buffer), 0, NULL);
    14.  
    15. NtWaitForSingleObject(event, FALSE, &wait_time);
     
  6. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Попробуй
    Код (Text):
    1. status = NtCreateFile(&hFile, GENERIC_READ |  FILE_READ_ATTRIBUTES, &oa, &iostatus, NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN, FILE_DIRECTORY_FILE, NULL, 0);
     
  7. SysProger

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127
    результат тот же
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    посмотри как сделано в autochk.exe
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    SysProger
    Прав n0name.
    Там есть:
    Код (Text):
    1. 010015FC    dd autochk.?IsKeyPressed@AUTOCHECK_MESSAGE@@UAEEKK@Z
    2. 01001600    dd autochk.?WaitForUserSignal@AUTOCHECK_MESSAGE@@UAEEXZ
    WaitForUserSignal@AUTOCHECK_MESSAGE@@UAEEXZ() кстати олей хорошо так дебажется :)
    Вобщем тоже юзоется, открывает "\Device\KeyboardClass#", создаёт эвент, юзоет NtReadFile.
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    >wait_time = RtlConvertLongToLargeInteger(-900000000000);
    зря так делаешь.
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Код (Text):
    1. InitializeTimeout proc WaitTime:ULONG, Timeout:PLARGE_INTEGER
    2.     mov eax,WaitTime
    3.     mov ecx,2710h
    4.     mul ecx
    5.     mov ecx,Timeout
    6.     neg eax
    7.     adc edx,0
    8.     neg edx
    9.     mov dword ptr [ecx],eax
    10.     mov dword ptr [ecx+4],edx
    11.     xor eax,eax
    12.     ret
    13. InitializeTimeout endp
    WaitTime в ms.
     
  12. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Чтобы была возможность ждать, надо открывать "клаву" с флагом SYNCHRONIZE:
    Код (Text):
    1. //вспомогательная функция
    2. NTSTATUS NTAPI BootPrint(IN PWSTR szMessage)
    3. {
    4.     UNICODE_STRING us;
    5.     RtlInitUnicodeString(&us,szMessage);
    6.     return ZwDisplayString(&us);
    7. }
    8.  
    9. ULONG Counter; //число циклов ожидания
    10. LARGE_INTEGER WaitTimeout; //время одного ожидания
    11.  
    12. HANDLE hFile;
    13. UNICODE_STRING us;
    14. IO_STATUS_BLOCK iosb;
    15. BOOLEAN bAborted = FALSE;
    16.  
    17. RtlInitUnicodeString(&us, L"\\Device\\KeyboardClass0");
    18. OBJECT_ATTRIBUTES oa = {sizeof(OBJECT_ATTRIBUTES), NULL, &us, OBJ_CASE_INSENSITIVE};
    19.  
    20. BootPrint(L"Press any key to abort\n");
    21.  
    22. NTSTATUS ns = ZwCreateFile(&hFile, GENERIC_READ | SYNCHRONIZE | FILE_READ_ATTRIBUTES, &oa, &iosb, 0, 0x80, 0, 1, 1, 0, 0);
    23. if (ns >= 0)
    24. {
    25.     UCHAR buf[12];
    26.     LARGE_INTEGER f;
    27.  
    28.     while ((Counter--) && (!bAborted))
    29.     {
    30.         ns = ZwReadFile(hFile, 0, 0, 0, &iosb, buf, 12, &f, 0);
    31.  
    32.         if (ns != STATUS_PENDING)
    33.             bAborted = TRUE;
    34.         else
    35.         {
    36.             BootPrint(L".");
    37.  
    38.             ns = ZwWaitForSingleObject(hFile, FALSE, &WaitTimeout);
    39.  
    40.             if (ns != STATUS_TIMEOUT)
    41.                 bAborted = TRUE;
    42.         }
    43.     }
    44.  
    45.     ZwClose(hFile);
    46. }
    47.  
    48. if (bAborted)
    49.     BootPrint(L"Aborted\n");
     
  13. ares

    ares New Member

    Публикаций:
    0
    Регистрация:
    22 ноя 2008
    Сообщения:
    20
    MSDN:
    Access right Description
    GENERIC_READ FILE_READ_ATTRIBUTES
    FILE_READ_DATA
    FILE_READ_EA
    STANDARD_RIGHTS_READ
    SYNCHRONIZE


    :derisive:
     
  14. SysProger

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127
    Twister
    всё равно не работает. Флаг bAborted сразу становится равным TRUE ещё до нажатия каких-либо клавиш.
     
  15. SysProger

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127
    а вообще существуют какие-либо функции NativeAPI, работающие со скан-кодами клавиш, например, преобразование скан-кода в ascii?
     
  16. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    NtUserGetKeyState etc.
     
  17. SysProger

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127
    где можно более подробную информацию получить? гугл ничего особенного не выдаёт.
     
  18. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Windows.2000.Source.Code
    А вобще это теневые сервисы, это из win32k.sys, но если csrss запущен, то можно из под него юзоть, там функционал побольше.
     
  19. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    https://www.wasm.ru/forum/viewtopic.php?id=31253 тут есть пример
     
  20. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Натив апи - вряд ли. Если только в win32k