fchwfchw
驱动牛犊
驱动牛犊
  • 注册日期2002-01-21
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1501回复:1

下面驱动中的一段代码模拟键盘输入一个字符,为什么会出错呢

楼主#
更多 发布于:2003-11-12 16:38
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;
孤独的人是可耻的
fchwfchw
驱动牛犊
驱动牛犊
  • 注册日期2002-01-21
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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);
孤独的人是可耻的
游客

返回顶部