#include <ntddk.h>PDEVICE_OBJECT myKeyBoard;typedef struct { PDEVICE_OBJECT LowKbdDevice;}DEVICE_EXTION,*PDEVICE_EXTENTION;typedef struct _MOUSE_INPUT_DATA { USHORT UnitId; USHORT Flags; union { ULONG Buttons; struct { USHORT ButtonFlags; USHORT ButtonData; }; }; ULONG RawButtons; LONG LastX; LONG LastY; ULONG ExtraInformation;} MOUSE_INPUT_DATA, * PMOUSE_INPUT_DATA;int pendingkey = 0;VOID Unload(PDRIVER_OBJECT DriverObject) { LARGE_INTEGER interval = { 0 }; PDEVICE_OBJECT DeviceObject = DriverObject->DeviceObject; interval.QuadPart = -10 * 1000 * 1000; IoDetachDevice(((PDEVICE_EXTENTION)DeviceObject->DeviceExtension)->LowKbdDevice); if (pendingkey) { KeDelayExecutionThread(KernelMode,FALSE,&interval); } IoDeleteDevice(myKeyBoard); KdPrint(("driver unloaded\r\n"));}NTSTATUS MyattachDevice(PDRIVER_OBJECT DriverObject) { NTSTATUS status; UNICODE_STRING TargatDevice = RTL_CONSTANT_STRING(L"\\Device\\PointerClass0"); status = IoCreateDevice(DriverObject,sizeof(DEVICE_EXTION),NULL,FILE_DEVICE_MOUSE,0,FALSE,&myKeyBoard); if (!NT_SUCCESS(status)) { return status; } myKeyBoard->Flags |= DO_BUFFERED_IO; myKeyBoard->Flags &= ~DO_DEVICE_INITIALIZING; RtlZeroMemory(myKeyBoard->DeviceExtension,sizeof(DEVICE_EXTION)); status = IoAttachDevice(myKeyBoard,&TargatDevice,&((PDEVICE_EXTENTION)myKeyBoard->DeviceExtension)->LowKbdDevice); if (!NT_SUCCESS(status)) { IoDeleteDevice(myKeyBoard); return status; } return status;}NTSTATUS ReadComplete(PDEVICE_OBJECT DeviceObject,PIRP Irp,PVOID Context){ CHAR* KeyFlag[4] = {"keydown","keyup","e0","e1"}; PMOUSE_INPUT_DATA Keys = (PMOUSE_INPUT_DATA)Irp->AssociatedIrp.SystemBuffer; int structnum = Irp->IoStatus.Information / sizeof(MOUSE_INPUT_DATA); if (Irp->IoStatus.Status == STATUS_SUCCESS) { for (int i = 0; i < structnum; i++) { KdPrint(("the button scan code is %x \n", Keys->ButtonFlags)); } } if (Irp->PendingReturned) { IoMarkIrpPending(Irp); } pendingkey--; return Irp->IoStatus.Status;}NTSTATUS DispatchRead(IN PDEVICE_OBJECT DeviceObject,PIRP Irp) { IoCopyCurrentIrpStackLocationToNext(Irp); IoSetCompletionRoutine(Irp, ReadComplete, NULL, TRUE, TRUE, TRUE); return IoCallDriver(((PDEVICE_EXTENTION)DeviceObject->DeviceExtension)->LowKbdDevice, Irp);}NTSTATUS DispatchPass(IN PDEVICE_OBJECT DeviceObject, PIRP Irp) { IoCopyCurrentIrpStackLocationToNext(Irp); pendingkey++; return IoCallDriver(((PDEVICE_EXTENTION)DeviceObject->DeviceExtension)->LowKbdDevice,Irp);}NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegisteryPath) { NTSTATUS status; DriverObject->DriverUnload = Unload; int i; for (int i = 0; i <=IRP_MJ_MAXIMUM_FUNCTION; i++) { DriverObject->MajorFunction[i] = DispatchPass; } DriverObject->MajorFunction[IRP_MJ_READ] = DispatchRead; KdPrint(("driver loaded\r\n")); status = MyattachDevice(DriverObject); if (!NT_SUCCESS(status)) { KdPrint(("attach device fault\r\n")); }else { KdPrint(("attach device success\r\n")); } return STATUS_SUCCESS;}
use pointer attach to usb drive