69,369
社区成员
发帖
与我相关
我的任务
分享
#include <ntddk.h>
NTSTATUS IN_Dispatch(IN PDRIVER_OBJECT mydriver,IN PIRP irp);
void UnloadIN(IN PDRIVER_OBJECT mydriver);
#define FILE_DEVICE_IN 0x00008010
#define CONTROL_MOUSE 0x815
#define CONTROL_KEYBOARD 0x820
#define IOCTL_IN_MOUSE CTL_CODE(FILE_DEVICE_IN,\
CONTROL_MOUSE,\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
#define IOCTL_IN_KEYBOARD CTL_CODE(FILE_DEVICE_IN,\
CONTROL_KEYBOARD,\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
void SetDate(char scancode)
{
__asm
{
s:
in al, 0x64
and al, 10
jnz s
mov al, 0xD2
out 0x64, al
x:
in al, 0x64
and al, 10
jnz x
mov al, scancode
out 0x60, al
}
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
{
UNICODE_STRING DeviceNameUnicodeString;
UNICODE_STRING DeviceLinkUnicodeString;
NTSTATUS state = 0;
PDEVICE_OBJECT DeviceObject = 0;
RtlInitUnicodeString (&DeviceNameUnicodeString, L"\\Device\\IN_Mouse_Keyboard");
state= IoCreateDevice(DriverObject,0,&DeviceNameUnicodeString,FILE_DEVICE_IN,0,TRUE,&DeviceObject);
if(STATUS_SUCCESS == state)
{
size_t i;
for(i = 0;i<IRP_MJ_MAXIMUM_FUNCTION;++i)
{
DriverObject->MajorFunction[i] = IN_Dispatch;//在该行出错
}
DriverObject->DriverUnload= UnloadIN;
state = IoCreateSymbolicLink (&DeviceLinkUnicodeString,&DeviceNameUnicodeString);
if(!(STATUS_SUCCESS == state))
{
IoDeleteDevice(DeviceObject);
}
RtlInitUnicodeString (&DeviceLinkUnicodeString, L"\\DosDevices\\IN_Mouse_Keyboard");
}
else
return state;
}
NTSTATUS IN_Dispatch(IN PDRIVER_OBJECT mydriver,IN PIRP irp)
{
PIO_STACK_LOCATION IrpStack;
ULONG dwInputBufferLength;
ULONG dwOutputBufferLength;
ULONG dwIoControlCode;
PVOID pvIOBuffer;
NTSTATUS ntStatus;
UCHAR* InputBuffer;
// Init to default settings
irp->IoStatus.Status = STATUS_SUCCESS;
irp->IoStatus.Information = 0;
IrpStack = IoGetCurrentIrpStackLocation(irp);
pvIOBuffer = irp->AssociatedIrp.SystemBuffer;
dwInputBufferLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
dwOutputBufferLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
switch (IrpStack->MajorFunction)
{
case IRP_MJ_DEVICE_CONTROL:
dwIoControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;
switch (dwIoControlCode)
{
case IOCTL_IN_MOUSE:
break;
case IOCTL_IN_KEYBOARD:
InputBuffer = (UCHAR*)irp->AssociatedIrp.SystemBuffer;
SetDate(InputBuffer[0]);
SetDate(InputBuffer[1]);
break;
default:
irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
break;
}
break;
}
ntStatus = irp->IoStatus.Status;
IoCompleteRequest (irp, IO_NO_INCREMENT);
return ntStatus;
}
void UnloadIN(IN PDRIVER_OBJECT mydriver)
{
UNICODE_STRING DeviceLinkUnicodeString;
NTSTATUS ntStatus;
RtlInitUnicodeString (&DeviceLinkUnicodeString, L"\\DosDevices\\IN_Mouse_Keyboard");
ntStatus = IoDeleteSymbolicLink (&DeviceLinkUnicodeString);
if (NT_SUCCESS(ntStatus))
{
IoDeleteDevice (mydriver->DeviceObject);
}
}