Отправка ввода с клавиатуры через DeviceIoControl

В течение последних 3 часов или около того я пытался отправить ввод с клавиатуры, написав на клавиатуре. Я успешно нашел и открыл клавиатуру, но застрял на последнем шаге. Я точно не знаю, как отформатировать параметры DeviceIoControl, и я действительно не знаю, с чего начать получение значений.

В настоящее время у меня есть следующее, частично взятое из библиотеки Interception, опубликованной в другом ответе здесь. Я пропустил все, что открывает устройство, чтобы сэкономить место.

#define IOCTL_WRITE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x820, METHOD_BUFFERED, FILE_ANY_ACCESS)

if(device != INVALID_HANDLE_VALUE) {
    DWORD dwReturned;
    KEYBOARD_INPUT_DATA kbinput;
    kbinput.UnitId = 0;
    kbinput.MakeCode = 0x2D;
    kbinput.Flags = KEY_MAKE;
    kbinput.Reserved = 0;
    kbinput.ExtraInformation = 0;

    DeviceIoControl(device, IOCTL_WRITE, &kbinput, sizeof(KEYBOARD_INPUT_DATA), NULL, 0, &dwReturned, NULL);
    kbinput.Flags = KEY_BREAK;
    DeviceIoControl(device, IOCTL_WRITE, &kbinput, sizeof(KEYBOARD_INPUT_DATA), NULL, 0, &dwReturned, NULL);
}

Если я вызываю GetLastError после вызова DeviceIoControl, я получаю возвращаемое значение ERROR_INVALID_FUNCTION(1). Я предполагаю, что это означает, что IOCTL_WRITE не является правильным значением, но я не имею ни малейшего представления о том, как найти правильное значение, и никакие поиски не помогли мне продвинуться дальше.


person ozdrgnaDiies    schedule 27.10.2013    source источник
comment
Вы абсолютно что использовать DeviceIoControl() ? Потому что в противном случае вы могли бы просто использовать SendInput() (msdn .microsoft.com/en-us/library/ms646310%28v=vs.85%29.aspx)   -  person Benoit Blanchon    schedule 27.10.2013
comment
Я пытаюсь взаимодействовать с устройством напрямую, потому что SendInput/keybd_event и другие производные не работают во многих случаях.   -  person ozdrgnaDiies    schedule 27.10.2013
comment
IOCTL_INTERNAL_I8042_KEYBOARD_WRITE_BUFFER может быть кодом, который вы ищете   -  person o_weisman    schedule 27.10.2013
comment
@o_weisman это звучит многообещающе, но примерно через 20 минут осмотра и тестирования я не могу продвинуться дальше. Я не могу ничего скомпилировать в Visual Studio, так как ntdd8042.h недоступен, и при компиляции в MinGW я все равно получаю ту же ошибку. У вас есть пример его правильного использования?   -  person ozdrgnaDiies    schedule 27.10.2013
comment
@ozdrgnaDiies Возможно, я ввел вас в заблуждение. Кажется, вам понадобится DDK (комплект для разработки драйверов), чтобы это работало. Вы можете попробовать это так:   -  person o_weisman    schedule 27.10.2013
comment
Не используйте этот IOCTL, он используется для отправки данных на контроллер клавиатуры. Глядя на исходный код WDK для драйвера класса и драйвера i8042, я не вижу IOCTL, который позволяет вам нажимать клавиши. Для этого наверняка потребуется драйвер фильтра, посмотрите, например, пример Joyflt.exe.   -  person Hans Passant    schedule 27.10.2013