在过去的 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);
}
如果在 DeviceIoControl 调用后调用 GetLastError,我会得到 ERROR_INVALID_FUNCTION(1) 的返回值。我认为这意味着 IOCTL_WRITE 不是正确的值,但我对如何找到正确的值一无所知,并且没有多少搜索让我更进一步。