打开\\driver\\kbdclass,把所有分发函数替换为下面这个函数NTSTATUS HookedDispatch(DEVICE_OBJECT *DeviceObject, IRP *Irp)
{
NTSTATUS status = STATUS_SUCCESS;
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
if(stack->MajorFunction == IRP_MJ_READ)
{
if(Irp->UserBuffer)
{
KEYBOARD_INPUT_DATA *data = (KEYBOARD_INPUT_DATA *)Irp->UserBuffer;
DbgPrint("ID: KBD%d\tCODE: 0x%x\tPUSH: %d\n", data->UnitId, data->MakeCode, data->Flags);
Irp->IoStatus.Status = status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);//直接完成,不让irp下发
return status;
}
}
else
status = pOldDispatch[stack->MajorFunction](DeviceObject, Irp);//保存下来的原来的分发函数
return status;
}问题是,这个Irp完成不掉,函数返回后,马上来一个相同的Irp,data里的数据也一样,无限执行下去....调用原分发函数当然没有问题。