过滤键盘驱动对象Kbdclass的所有设备对象

过滤键盘驱动对象Kbdclass的所有设备对象


  1. /* 
  2.  描述:过滤键盘驱动对象Kbdclass的所有设备对象 
  3.  */  
  4. #include <ntddk.h>  
  5. #include <ntddkbd.h>  
  6. // 外部变量声明  
  7. extern POBJECT_TYPE IoDriverObjectType;  
  8. // 通过驱动对象名称取得驱动对象的引用(未文档化)  
  9. NTSTATUS ObReferenceObjectByName(  
  10.     IN PUNICODE_STRING ObjectName,  
  11.     IN ULONG Attributes,  
  12.     IN PACCESS_STATE AccessState,  
  13.     IN ACCESS_MASK DesiredAccess,  
  14.     IN POBJECT_TYPE ObjectType,  
  15.     IN KPROCESSOR_MODE AccessMode,  
  16.     IN PVOID ParseContext,  
  17.     OUT PVOID *Object  
  18.     );  
  19. // 过滤设备扩展  
  20. typedef struct _FILTER_EXT  
  21. {  
  22.     PDEVICE_OBJECT LowerDeviceObject;  
  23. } FILTER_EXT, *PFILTER_EXT;  
  24. // 全局计数  
  25. ULONG gKeyCount;  
  26. // 驱动入口例程  
  27. NTSTATUS DriverEntry(  
  28.     IN PDRIVER_OBJECT DriverObject,  
  29.     IN PUNICODE_STRING RegistryPath  
  30.     );  
  31. // 驱动卸载例程  
  32. VOID DriverUnload(  
  33.     IN PDRIVER_OBJECT DriverObject  
  34.     );  
  35. // IRP处理例程  
  36. NTSTATUS Dispatch(  
  37.     IN PDEVICE_OBJECT DeviceObject,  
  38.     IN PIRP Irp  
  39.     );  
  40. // 挂载例程  
  41. VOID Attach(  
  42.     IN PDRIVER_OBJECT DriverObject  
  43.     );  
  44. // Read完成例程  
  45. NTSTATUS ReadCompletionRoutine(  
  46.     IN PDEVICE_OBJECT DeviceObject,  
  47.     IN PIRP Irp,  
  48.     IN PVOID Context  
  49.     );  
  50. #ifdef ALLOC_PRAGMA  
  51. #pragma alloc_text(INIT, DriverEntry)  
  52. #pragma alloc_text(PAGE, DriverUnload)  
  53. #pragma alloc_text(PAGE, Dispatch)  
  54. #pragma alloc_text(INIT, Attach)  
  55. #pragma alloc_text(PAGE, ReadCompletionRoutine)  
  56. #endif  
  57. /* 
  58.  描述:驱动入口例程 
  59.  */  
  60. NTSTATUS DriverEntry(  
  61.     IN PDRIVER_OBJECT DriverObject,  
  62.     IN PUNICODE_STRING RegistryPath  
  63.     )  
  64. {  
  65.     NTSTATUS status = STATUS_SUCCESS;  
  66.     USHORT idx;  
  67.     KdPrint(("DriverEntry invoke/n"));  
  68.     for (idx = 0; idx <= IRP_MJ_MAXIMUM_FUNCTION; ++idx) {  
  69.         DriverObject->MajorFunction[idx] = Dispatch;  
  70.     }  
  71.     DriverObject->DriverUnload = DriverUnload;  
  72.     gKeyCount = 0;  
  73.     Attach(DriverObject);  
  74.     return status;  
  75. }  
  76. /* 
  77.  描述:驱动卸载例程 
  78.  */  
  79. VOID DriverUnload(  
  80.     IN PDRIVER_OBJECT DriverObject  
  81.     )  
  82. {  
  83.     LARGE_INTEGER interval;  
  84.     PDEVICE_OBJECT curDeviceObject;  
  85.     KdPrint(("DriverUnload invoke/n"));  
  86.     // 降低当前线程的优先级,避免延时对系统的影响  
  87.     KeSetPriorityThread(KeGetCurrentThread(), LOW_REALTIME_PRIORITY);  
  88.     curDeviceObject = DriverObject->DeviceObject;  
  89.     while (curDeviceObject != NULL) {  
  90.         IoDetachDevice(((PFILTER_EXT)curDeviceObject->DeviceExtension)->LowerDeviceObject);  
  91.         IoDeleteDevice(curDeviceObject);  
  92.         curDeviceObject = curDeviceObject->NextDevice;  
  93.     }  
  94.     interval.QuadPart = (-1) * 100 * 1000;  
  95.     while (gKeyCount > 0) {  
  96.         KeDelayExecutionThread(KernelMode, FALSE, &interval);  
  97.     }  
  98.     KdPrint(("DriverUnload ok/n"));  
  99. }  
  100. /* 
  101.  描述:IRP处理例程 
  102.  */  
  103. NTSTATUS Dispatch(  
  104.     IN PDEVICE_OBJECT DeviceObject,  
  105.     IN PIRP Irp  
  106.     )  
  107. {  
  108.     PDEVICE_OBJECT lowerDeviceObject = ((PFILTER_EXT)DeviceObject->DeviceExtension)->LowerDeviceObject;  
  109.     PIO_STACK_LOCATION irpsp = IoGetCurrentIrpStackLocation(Irp);  
  110.     switch (irpsp->MajorFunction) {  
  111.         case IRP_MJ_POWER:  
  112.         {  
  113.             KdPrint(("IRP_MJ_POWER/n"));  
  114.             PoStartNextPowerIrp(Irp);  
  115.             IoSkipCurrentIrpStackLocation(Irp);  
  116.             return PoCallDriver(lowerDeviceObject, Irp);  
  117.             break;  
  118.         }  
  119.         case IRP_MJ_PNP:  
  120.         {  
  121.             KdPrint(("IRP_MJ_PNP/n"));  
  122.             switch (irpsp->MinorFunction) {  
  123.                 case IRP_MN_REMOVE_DEVICE:  
  124.                 {  
  125.                     KdPrint(("IRP_MN_REMOVE_DEVICE/n"));  
  126.                     IoDetachDevice(lowerDeviceObject);  
  127.                     IoDeleteDevice(DeviceObject);  
  128.                     IoSkipCurrentIrpStackLocation(Irp);  
  129.                     return IoCallDriver(lowerDeviceObject, Irp);  
  130.                 }  
  131.                 default:  
  132.                 {  
  133.                     KdPrint(("IRP_MJ_PNP -> Unknown MinorFunction : %x/n", irpsp->MinorFunction));  
  134.                     IoSkipCurrentIrpStackLocation(Irp);  
  135.                     return IoCallDriver(lowerDeviceObject, Irp);  
  136.                 }  
  137.             }  
  138.         }  
  139.         case IRP_MJ_READ:  
  140.         {  
  141.             KdPrint(("IRP_MJ_READ/n"));  
  142.             gKeyCount++;  
  143.             IoCopyCurrentIrpStackLocationToNext(Irp);  
  144.             IoSetCompletionRoutine(Irp, ReadCompletionRoutine, DeviceObject, TRUE, TRUE, TRUE);  
  145.             return IoCallDriver(lowerDeviceObject, Irp);  
  146.         }  
  147.         default:  
  148.         {  
  149.             KdPrint(("Unknown IRP : %x/n", irpsp->MajorFunction));  
  150.             IoSkipCurrentIrpStackLocation(Irp);  
  151.             return IoCallDriver(lowerDeviceObject, Irp);  
  152.         }  
  153.     }  
  154. }  
  155. /* 
  156.  描述:挂载例程 
  157.  */  
  158. VOID Attach(  
  159.     IN PDRIVER_OBJECT DriverObject  
  160.     )  
  161. {  
  162.     NTSTATUS status;  
  163.     PDRIVER_OBJECT targetDriverObject;  
  164.     PDEVICE_OBJECT curDeviceObject;  
  165.     PDEVICE_OBJECT lowerDeviceObject;  
  166.     PDEVICE_OBJECT filterDeviceObject;  
  167.     UNICODE_STRING kbdClassName;  
  168.     KdPrint(("Attach invoke/n"));  
  169.     RtlInitUnicodeString(&kbdClassName, L"//Driver//Kbdclass");  
  170.     status = ObReferenceObjectByName(&kbdClassName, OBJ_CASE_INSENSITIVE, NULL, 0,   
  171.                                      IoDriverObjectType, KernelMode, NULL, &targetDriverObject);  
  172.     if (!NT_SUCCESS(status)) {  
  173.         KdPrint(("ObReferenceObjectByName failed/n"));  
  174.         return ;  
  175.     }  
  176.     ObDereferenceObject(targetDriverObject);  
  177.     curDeviceObject = targetDriverObject->DeviceObject;  
  178.     while (curDeviceObject != NULL) {  
  179.         status = IoCreateDevice(DriverObject, sizeof(FILTER_EXT), NULL, curDeviceObject->DeviceType,   
  180.                                 curDeviceObject->Characteristics, FALSE, &filterDeviceObject);  
  181.         if (!NT_SUCCESS(status)) {  
  182.             KdPrint(("IoCreateDevice failed/n"));  
  183.         } else {  
  184.             lowerDeviceObject = IoAttachDeviceToDeviceStack(filterDeviceObject, curDeviceObject);  
  185.             if (lowerDeviceObject == NULL) {  
  186.                 KdPrint(("IoAttachDeviceToDeviceStack failed/n"));  
  187.                 IoDeleteDevice(filterDeviceObject);  
  188.             } else {  
  189.                 ((PFILTER_EXT)filterDeviceObject->DeviceExtension)->LowerDeviceObject = lowerDeviceObject;  
  190.                 filterDeviceObject->Flags |=   
  191.                            lowerDeviceObject->Flags & (DO_BUFFERED_IO | DO_DIRECT_IO | DO_POWER_PAGABLE);  
  192.                 filterDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;  
  193.             }  
  194.         }  
  195.         curDeviceObject = curDeviceObject->NextDevice;  
  196.     }  
  197. }  
  198. /* 
  199.  描述:Read完成例程 
  200.  */  
  201. NTSTATUS ReadCompletionRoutine(  
  202.     IN PDEVICE_OBJECT DeviceObject,  
  203.     IN PIRP Irp,  
  204.     IN PVOID Context  
  205.     )  
  206. {  
  207.     KdPrint(("ReadCompletionRoutine invoke/n"));  
  208.     if (NT_SUCCESS(Irp->IoStatus.Status)) {  
  209.         ULONG len, idx;  
  210.         PUCHAR buf;  
  211.         PKEYBOARD_INPUT_DATA inputData;  
  212.         len = Irp->IoStatus.Information;  
  213.         buf = (PUCHAR)Irp->AssociatedIrp.SystemBuffer;  
  214.         for (idx = 0; idx < len; idx += sizeof(KEYBOARD_INPUT_DATA)) {  
  215.             buf += idx;  
  216.             inputData = (PKEYBOARD_INPUT_DATA)buf;  
  217.             KdPrint(("ScanCode : %x  %s/n", inputData->MakeCode, inputData->Flags?"Up" : "Down"));  
  218.         }  
  219.     }  
  220.     gKeyCount--;  
  221.     if (Irp->PendingReturned) {  
  222.         IoMarkIrpPending(Irp);  
  223.     }  
  224.     return Irp->IoStatus.Status;  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值