鼠标过滤驱动

打印 上一主题 下一主题

主题 1047|帖子 1047|积分 3145

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
概述

其编写过程大体与键盘过滤驱动相似,只需要切换一下附加的目的设备以及创建的设备范例等。但在该操作后依然无法捕获到Vmware创建的win7操作体系的鼠标irp信息,于是通过在获取鼠标驱动,遍历其全部的设备进而附加,如许便可以获取到鼠标的irp信息。
代码

  1. #include<ntifs.h>
  2. typedef struct
  3. {
  4.         PDEVICE_OBJECT LowerKbdDevice;
  5. }DEVICE_EXTENTION,*PDEVICE_EXTENTION;
  6. extern POBJECT_TYPE* IoDriverObjectType;
  7. typedef struct _MOUSE_INPUT_DATA {
  8.         USHORT UnitId;
  9.         USHORT Flags;
  10.         union {
  11.                 ULONG Buttons;
  12.                 struct {
  13.                         USHORT ButtonFlags;
  14.                         USHORT ButtonData;
  15.                 };
  16.         };
  17.         ULONG  RawButtons;
  18.         LONG   LastX;
  19.         LONG   LastY;
  20.         ULONG  ExtraInformation;
  21. } MOUSE_INPUT_DATA, * PMOUSE_INPUT_DATA;
  22. ULONG pendingkey = 0;
  23. NTSTATUS NTAPI ObReferenceObjectByName(PUNICODE_STRING ObjectName,
  24.         ULONG Attributes,
  25.         PACCESS_STATE AccessState,
  26.         ACCESS_MASK DesiredAccess,
  27.         POBJECT_TYPE ObjectType,
  28.         KPROCESSOR_MODE AccessMode,
  29.         PVOID ParseContext OPTIONAL,
  30.         PVOID* Object);
  31. VOID DriverUnload(PDRIVER_OBJECT DriverObject)
  32. {
  33.         LARGE_INTEGER interval = { 0 };
  34.         PDEVICE_OBJECT DeviceObject = DriverObject->DeviceObject;
  35.        
  36.         interval.QuadPart = -10 * 1000 * 1000;
  37.         while (DeviceObject)
  38.         {
  39.                 IoDetachDevice(((PDEVICE_EXTENTION)DeviceObject->DeviceExtension)->LowerKbdDevice);
  40.                 DeviceObject = DeviceObject->NextDevice;
  41.         }
  42.        
  43.         //判断是否还有未处理的IRP
  44.         while (pendingkey)
  45.         {
  46.                 KeDelayExecutionThread(KernelMode, FALSE, &interval);
  47.         }
  48.         DeviceObject = DriverObject->DeviceObject;
  49.         while (DeviceObject)
  50.         {
  51.                 IoDeleteDevice(DeviceObject);
  52.                 DeviceObject = DeviceObject->NextDevice;
  53.         }
  54.        
  55.         KdPrint(("驱动卸载结束!\n"));
  56. }
  57. NTSTATUS ReadComplete(PDEVICE_OBJECT DeviceObject, PIRP irp, PVOID Context)
  58. {
  59.         PMOUSE_INPUT_DATA KeyBuffer = (PMOUSE_INPUT_DATA)irp->AssociatedIrp.SystemBuffer;
  60.        
  61.         int structnum = irp->IoStatus.Information / sizeof(MOUSE_INPUT_DATA);
  62.         if (irp->IoStatus.Status == STATUS_SUCCESS)
  63.         {
  64.                 for (int i = 0; i < structnum; i++)
  65.                 {
  66.                         KdPrint(("ButtonFlags = %x\n", KeyBuffer->ButtonFlags));
  67.                 }
  68.         }
  69.         //处理完成需要将标志位设置,以声明以完成此irp的返回处理
  70.         if (irp->PendingReturned)
  71.         {
  72.                 IoMarkIrpPending(irp);
  73.         }
  74.         pendingkey--;
  75.         return irp->IoStatus.Status;
  76. }
  77. NTSTATUS DispatchPass(PDEVICE_OBJECT pDeviceObject,PIRP irp)
  78. {
  79.         IoCopyCurrentIrpStackLocationToNext(irp);
  80.         return IoCallDriver(((PDEVICE_EXTENTION)pDeviceObject->DeviceExtension)->LowerKbdDevice, irp);
  81. }
  82. NTSTATUS DispatchRead(PDEVICE_OBJECT pDeviceObject, PIRP irp)
  83. {
  84.         IoCopyCurrentIrpStackLocationToNext(irp);
  85.         IoSetCompletionRoutine(irp,ReadComplete,NULL,TRUE,TRUE,TRUE,TRUE);
  86.         pendingkey++;
  87.         return IoCallDriver(((PDEVICE_EXTENTION)pDeviceObject->DeviceExtension)->LowerKbdDevice, irp);
  88. }
  89. NTSTATUS MyAttachDevice(PDRIVER_OBJECT pDriverObject)
  90. {
  91.         UNICODE_STRING kbdName = RTL_CONSTANT_STRING(L"\\Driver\\MouClass");
  92.         PDRIVER_OBJECT TargetDriverObject = NULL;
  93.         PDEVICE_OBJECT CurrentDeviceObject = NULL;
  94.         PDEVICE_OBJECT myKbdDevice = NULL;
  95.         PDEVICE_OBJECT lowDevice = NULL;
  96.         NTSTATUS status = ObReferenceObjectByName(&kbdName,OBJ_CASE_INSENSITIVE,NULL,0,*IoDriverObjectType,KernelMode,NULL,&TargetDriverObject);
  97.         if (!NT_SUCCESS(status))
  98.         {
  99.                 DbgPrint("Open Mouse Driver Failed\n");
  100.                 return status;
  101.         }
  102.         else
  103.         {
  104.                 // 解引用
  105.                 ObDereferenceObject(TargetDriverObject);
  106.         }
  107.        
  108.         CurrentDeviceObject = TargetDriverObject->DeviceObject;
  109.         //循环附加到目标驱动上的所有设备栈上
  110.         while (CurrentDeviceObject)
  111.         {
  112.                 NTSTATUS status = IoCreateDevice(pDriverObject, sizeof(DEVICE_EXTENTION), NULL, 0, FILE_DEVICE_MOUSE, FALSE, &myKbdDevice);
  113.                 if (!NT_SUCCESS(status))
  114.                 {
  115.                         myKbdDevice = CurrentDeviceObject = NULL;
  116.                         return status;
  117.                 }
  118.                 RtlZeroMemory(myKbdDevice->DeviceExtension, sizeof(DEVICE_EXTENTION));
  119.                 lowDevice = IoAttachDeviceToDeviceStack(myKbdDevice, CurrentDeviceObject);
  120.                 if (!lowDevice)
  121.                 {
  122.                         IoDeleteDevice(myKbdDevice);
  123.                         myKbdDevice = NULL;
  124.                         return status;
  125.                 }
  126.                 ((PDEVICE_EXTENTION)myKbdDevice->DeviceExtension)->LowerKbdDevice = lowDevice;
  127.                 myKbdDevice->Flags |= DO_BUFFERED_IO;
  128.                 myKbdDevice->Flags &= ~DO_DEVICE_INITIALIZING;
  129.                 CurrentDeviceObject = CurrentDeviceObject->NextDevice;
  130.         }
  131.        
  132.         return STATUS_SUCCESS;
  133. }
  134. NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath)
  135. {
  136.         int i = 0;
  137.         NTSTATUS Status = STATUS_SUCCESS;
  138.        
  139.         for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
  140.         {
  141.                 pDriverObject->MajorFunction[i] = DispatchPass;
  142.         }
  143.         pDriverObject->MajorFunction[IRP_MJ_READ] = DispatchRead;
  144.         Status = MyAttachDevice(pDriverObject);
  145.         if (!NT_SUCCESS(Status))
  146.         {
  147.                 KdPrint(("AttachDevice ERROR!\n"));
  148.         }
  149.         else
  150.         {
  151.                 KdPrint(("AttachDevice SUCCESS!\n"));
  152.         }
  153.         pDriverObject->DriverUnload = DriverUnload;
  154.         return Status;
  155. }
复制代码
参考资料

Revised Mouse and Keyboard Filter Driver

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王國慶

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表