1. #include <ntddk.h>
  2. PDEVICE_OBJECT myKeyBoard;
  3. typedef struct {
  4. PDEVICE_OBJECT LowKbdDevice;
  5. }DEVICE_EXTION,*PDEVICE_EXTENTION;
  6. typedef struct _MOUSE_INPUT_DATA {
  7. USHORT UnitId;
  8. USHORT Flags;
  9. union {
  10. ULONG Buttons;
  11. struct {
  12. USHORT ButtonFlags;
  13. USHORT ButtonData;
  14. };
  15. };
  16. ULONG RawButtons;
  17. LONG LastX;
  18. LONG LastY;
  19. ULONG ExtraInformation;
  20. } MOUSE_INPUT_DATA, * PMOUSE_INPUT_DATA;
  21. int pendingkey = 0;
  22. VOID Unload(PDRIVER_OBJECT DriverObject) {
  23. LARGE_INTEGER interval = { 0 };
  24. PDEVICE_OBJECT DeviceObject = DriverObject->DeviceObject;
  25. interval.QuadPart = -10 * 1000 * 1000;
  26. IoDetachDevice(((PDEVICE_EXTENTION)DeviceObject->DeviceExtension)->LowKbdDevice);
  27. if (pendingkey)
  28. {
  29. KeDelayExecutionThread(KernelMode,FALSE,&interval);
  30. }
  31. IoDeleteDevice(myKeyBoard);
  32. KdPrint(("driver unloaded\r\n"));
  33. }
  34. NTSTATUS MyattachDevice(PDRIVER_OBJECT DriverObject) {
  35. NTSTATUS status;
  36. UNICODE_STRING TargatDevice = RTL_CONSTANT_STRING(L"\\Device\\PointerClass0");
  37. status = IoCreateDevice(DriverObject,sizeof(DEVICE_EXTION),NULL,FILE_DEVICE_MOUSE,0,FALSE,&myKeyBoard);
  38. if (!NT_SUCCESS(status))
  39. {
  40. return status;
  41. }
  42. myKeyBoard->Flags |= DO_BUFFERED_IO;
  43. myKeyBoard->Flags &= ~DO_DEVICE_INITIALIZING;
  44. RtlZeroMemory(myKeyBoard->DeviceExtension,sizeof(DEVICE_EXTION));
  45. status = IoAttachDevice(myKeyBoard,&TargatDevice,&((PDEVICE_EXTENTION)myKeyBoard->DeviceExtension)->LowKbdDevice);
  46. if (!NT_SUCCESS(status))
  47. {
  48. IoDeleteDevice(myKeyBoard);
  49. return status;
  50. }
  51. return status;
  52. }
  53. NTSTATUS ReadComplete(PDEVICE_OBJECT DeviceObject,PIRP Irp,PVOID Context){
  54. CHAR* KeyFlag[4] = {"keydown","keyup","e0","e1"};
  55. PMOUSE_INPUT_DATA Keys = (PMOUSE_INPUT_DATA)Irp->AssociatedIrp.SystemBuffer;
  56. int structnum = Irp->IoStatus.Information / sizeof(MOUSE_INPUT_DATA);
  57. if (Irp->IoStatus.Status == STATUS_SUCCESS)
  58. {
  59. for (int i = 0; i < structnum; i++)
  60. {
  61. KdPrint(("the button scan code is %x \n", Keys->ButtonFlags));
  62. }
  63. }
  64. if (Irp->PendingReturned)
  65. {
  66. IoMarkIrpPending(Irp);
  67. }
  68. pendingkey--;
  69. return Irp->IoStatus.Status;
  70. }
  71. NTSTATUS DispatchRead(IN PDEVICE_OBJECT DeviceObject,PIRP Irp) {
  72. IoCopyCurrentIrpStackLocationToNext(Irp);
  73. IoSetCompletionRoutine(Irp, ReadComplete, NULL, TRUE, TRUE, TRUE);
  74. return IoCallDriver(((PDEVICE_EXTENTION)DeviceObject->DeviceExtension)->LowKbdDevice, Irp);
  75. }
  76. NTSTATUS DispatchPass(IN PDEVICE_OBJECT DeviceObject, PIRP Irp) {
  77. IoCopyCurrentIrpStackLocationToNext(Irp);
  78. pendingkey++;
  79. return IoCallDriver(((PDEVICE_EXTENTION)DeviceObject->DeviceExtension)->LowKbdDevice,Irp);
  80. }
  81. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegisteryPath) {
  82. NTSTATUS status;
  83. DriverObject->DriverUnload = Unload;
  84. int i;
  85. for (int i = 0; i <=IRP_MJ_MAXIMUM_FUNCTION; i++)
  86. {
  87. DriverObject->MajorFunction[i] = DispatchPass;
  88. }
  89. DriverObject->MajorFunction[IRP_MJ_READ] = DispatchRead;
  90. KdPrint(("driver loaded\r\n"));
  91. status = MyattachDevice(DriverObject);
  92. if (!NT_SUCCESS(status))
  93. {
  94. KdPrint(("attach device fault\r\n"));
  95. }else {
  96. KdPrint(("attach device success\r\n"));
  97. }
  98. return STATUS_SUCCESS;
  99. }

use pointer attach to usb drive