阅读:1501回复:1
下面驱动中的一段代码模拟键盘输入一个字符,为什么会出错呢
PDEVICE_OBJECT pKbdDeviceObject = NULL;
KEYBOARD_INPUT_DATA KeyboardData[2]; PFILE_OBJECT fileObject = NULL; UNICODE_STRING uszDeviceName; NTSTATUS nStatus; KEVENT event; IO_STATUS_BLOCK iostatus; KeInitializeEvent(&event, NotificationEvent, FALSE); RtlInitUnicodeString(&uszDeviceName, L\"\\\\Device\\\\KeyboardClass0\"); nStatus = IoGetDeviceObjectPointer( &uszDeviceName, FILE_ALL_ACCESS, &fileObject, &pKbdDeviceObject); PIRP pirp; RtlZeroMemory(KeyboardData, 2*sizeof(KEYBOARD_INPUT_DATA)); KeyboardData[0].Flags = 0; //down KeyboardData[1].Flags = 1; //up KeyboardData[0].MakeCode = 0x45; //Num Lock KeyboardData[1].MakeCode = 0x45; //Num Lock pirp = IoBuildDeviceIoControlRequest( IOCTL_INTERNAL_I8042_KEYBOARD_WRITE_BUFFER, pKbdDeviceObject, &KeyboardData[0], sizeof(KEYBOARD_INPUT_DATA)*2, &KeyboardData[0], sizeof (KEYBOARD_INPUT_DATA)*2, FALSE, &event, &iostatus); PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(pirp); IrpStack->Parameters.DeviceIoControl.InputBufferLength = 2*sizeof(KEYBOARD_INPUT_DATA); IrpStack->Parameters.DeviceIoControl.Type3InputBuffer = &KeyboardData[0]; nStatus = IoCallDriver(pKbdDeviceObject, pirp); if (nStatus == STATUS_PENDING) { KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL); nStatus = iostatus.Status; } ObDereferenceObject(fileObject); return nStatus; |
|
|
沙发#
发布于:2003-11-12 16:41
有人知道答案的,重谢
怀疑IoBuildDeviceIoControlRequest的参数有错误,但是不知道如何改 pirp = IoBuildDeviceIoControlRequest( IOCTL_INTERNAL_I8042_KEYBOARD_WRITE_BUFFER, pKbdDeviceObject, &KeyboardData[0], sizeof(KEYBOARD_INPUT_DATA)*2, &KeyboardData[0], sizeof (KEYBOARD_INPUT_DATA)*2, FALSE, &event, &iostatus); PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(pirp); IrpStack->Parameters.DeviceIoControl.InputBufferLength = 2*sizeof(KEYBOARD_INPUT_DATA); IrpStack->Parameters.DeviceIoControl.Type3InputBuffer = &KeyboardData[0]; nStatus = IoCallDriver(pKbdDeviceObject, pirp); |
|
|