学习下过滤驱动
错误之处请多多指教
代码:
////////////////////////////////////////////////////////////////////////// //作者:cxh // //功能:键盘过滤,监视 // //邮箱:cxh852456@163.com ////////////////////////////////////////////////////////////////////////// #include <ntddk.h> #include <ntddkbd.h> PDEVICE_OBJECT selfdevice,targetdevice;; PIRP pcancel; #define PAGEDCODE code_seg("PAGE") #define LOCKEDCODE code_seg() #define INITCODE code_seg("INIT") #pragma LOCKEDCODE NTSTATUS CompeleteRoutin(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ) { PKEYBOARD_INPUT_DATA key; if (Irp->PendingReturned==TRUE) { IoMarkIrpPending(Irp); } key = (PKEYBOARD_INPUT_DATA)Irp->AssociatedIrp.SystemBuffer; _try{ if (key->Flags==KEY_MAKE && key->MakeCode) { switch (key->MakeCode) { case 0x1: DbgPrint("ESC 键被按下"); break; case 0x2: DbgPrint("1 键被按下"); break; case 0x3: DbgPrint("2 键被按下"); break; case 0x4: DbgPrint("3 键被按下"); break; case 0x5: DbgPrint("4 键被按下"); break; case 0x6: DbgPrint("5 键被按下"); break; case 0x7: DbgPrint("6 键被按下"); break; case 0x8: DbgPrint("7 键被按下"); break; case 0x9: DbgPrint("8 键被按下"); break; case 0xA: DbgPrint("9 键被按下"); break; case 0xB: DbgPrint("0 键被按下"); break; case 0xC: DbgPrint("- 键被按下"); break; case 0xD: DbgPrint("= 键被按下"); break; case 0xE: DbgPrint("BACKSPACE 键被按下"); break; case 0xF: DbgPrint("TAB 键被按下"); break; case 0x10: DbgPrint("Q 键被按下"); break; case 0x11: DbgPrint("W 键被按下"); break; case 0x12: DbgPrint("E 键被按下"); break; case 0x13: DbgPrint("R 键被按下"); break; case 0x14: DbgPrint("T 键被按下"); break; case 0x15: DbgPrint("Y 键被按下"); break; case 0x16: DbgPrint("U 键被按下"); break; case 0x17: DbgPrint("I 键被按下"); break; case 0x18: DbgPrint("O 键被按下"); break; case 0x19: DbgPrint("P 键被按下"); break; case 0x1A: DbgPrint("[ 键被按下"); break; case 0x1B: DbgPrint("] 键被按下"); break; case 0x2B: DbgPrint("\\ 键被按下"); break; case 0x1D: DbgPrint("LEFT CTRL 键被按下"); break; case 0x1E: DbgPrint("A 键被按下"); break; case 0x1F: DbgPrint("S 键被按下"); break; case 0x20: DbgPrint("D 键被按下"); break; case 0x21: DbgPrint("F 键被按下"); break; case 0x22: DbgPrint("G 键被按下"); break; case 0x23: DbgPrint("H 键被按下"); break; case 0x24: DbgPrint("J 键被按下"); break; case 0x25: DbgPrint("K 键被按下"); break; case 0x26: DbgPrint("L 键被按下"); break; case 0x27: DbgPrint("; 键被按下"); break; case 0x28: DbgPrint("' 键被按下"); break; case 0x29: DbgPrint("` 键被按下"); break; case 0x2A: DbgPrint("LEFT SHIFT 键被按下"); break; case 0x1C: DbgPrint("ENTER 键被按下"); break; case 0x2C: DbgPrint("Z 键被按下"); break; case 0x2D: DbgPrint("X 键被按下"); break; case 0x2E: DbgPrint("C 键被按下"); break; case 0x2F: DbgPrint("V 键被按下"); break; case 0x30: DbgPrint("B 键被按下"); break; case 0x31: DbgPrint("N 键被按下"); break; case 0x32: DbgPrint("M 键被按下"); break; case 0x33: DbgPrint(", 键被按下"); break; case 0x34: DbgPrint(". 键被按下"); break; case 0x35: DbgPrint("/ 键被按下"); break; case 0x36: DbgPrint("RIGHT SHIFT 键被按下"); break; case 0x37: DbgPrint("* 键被按下"); break; case 0x38: DbgPrint("LEFT ALT 键被按下"); break; case 0x39: DbgPrint("SPACE 键被按下"); break; case 0x3A: DbgPrint("CAP LOCK 键被按下"); break; case 0x3B: DbgPrint("F1 键被按下"); break; case 0x3C: DbgPrint("F2 键被按下"); break; case 0x3D: DbgPrint("F3 键被按下"); break; case 0x3E: DbgPrint("F4 键被按下"); break; case 0x3F: DbgPrint("F5 键被按下"); break; case 0x40: DbgPrint("F6 键被按下"); break; case 0x41: DbgPrint("F7 键被按下"); break; case 0x42: DbgPrint("F8 键被按下"); break; case 0x43: DbgPrint("F9 键被按下"); break; case 0x44: DbgPrint("F10 键被按下"); break; case 0x45: DbgPrint("NumLock 键被按下"); break; case 0x46: DbgPrint("小键盘 / 键被按下"); break; case 0x47: DbgPrint("小键盘 7 键被按下"); break; case 0x48: DbgPrint("小键盘 8 键被按下"); break; case 0x49: DbgPrint("小键盘 9 键被按下"); break; case 0x4A: DbgPrint("小键盘 - 键被按下"); break; case 0x4B: DbgPrint("小键盘 4 键被按下"); break; case 0x4C: DbgPrint("小键盘 5 键被按下"); break; case 0x4D: DbgPrint("小键盘 6 键被按下"); break; case 0x4E: DbgPrint("小键盘 + 键被按下"); break; case 0x4F: DbgPrint("小键盘 1 键被按下"); break; case 0x50: DbgPrint("小键盘 2 键被按下"); break; case 0x51: DbgPrint("小键盘 3 键被按下"); break; case 0x52: DbgPrint("小键盘 0 键被按下"); break; case 0x53: DbgPrint("小键盘 . 键被按下"); break; case 0x57: DbgPrint("F11 键被按下"); break; case 0x58: DbgPrint("F12 键被按下"); break; default: DbgPrint("%X",key->MakeCode); break; } } }_except(EXCEPTION_CONTINUE_EXECUTION) { DbgPrint("%x",GetExceptionCode()); } return STATUS_CONTINUE_COMPLETION; } #pragma PAGEDCODE NTSTATUS Dispatch( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(targetdevice,Irp); } NTSTATUS DispatchRead( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { PIO_STACK_LOCATION irpsp; NTSTATUS s; PKEYBOARD_INPUT_DATA key; //DbgPrint("read"); pcancel = Irp; IoCopyCurrentIrpStackLocationToNext(Irp); // IoSkipCurrentIrpStackLocation(Irp); IoSetCompletionRoutine(Irp,CompeleteRoutin,NULL,TRUE,TRUE,TRUE); return IoCallDriver(targetdevice,Irp); } VOID Unload( IN PDRIVER_OBJECT DriverObject ) { IoCancelIrp(pcancel); IoDetachDevice(targetdevice); IoDeleteDevice(selfdevice); DbgPrint("Driver Unload!"); } NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { PDEVICE_OBJECT device; PFILE_OBJECT file; NTSTATUS s; UNICODE_STRING DeviceName; ULONG i; DbgPrint("Driver loaded!"); DriverObject->DriverUnload = Unload; for (i=0;i<=IRP_MJ_MAXIMUM_FUNCTION;i++) { DriverObject->MajorFunction[i] = Dispatch; } DriverObject->MajorFunction[IRP_MJ_READ]=DispatchRead; RtlInitUnicodeString(&DeviceName,L"\\Device\\KeyboardClass0"); s = IoGetDeviceObjectPointer(&DeviceName,FILE_ALL_ACCESS,&file,&device); if (!NT_SUCCESS(s)) { DbgPrint("Get Device error!"); return s; } s = IoCreateDevice(DriverObject, 0, NULL, device->Type, device->Characteristics, TRUE, &selfdevice ); if (!NT_SUCCESS(s)) { ObDereferenceObject(file); DbgPrint("Create Device Faile!!!"); return s; } targetdevice = IoAttachDeviceToDeviceStack(selfdevice,device); if (!targetdevice) { IoDeleteDevice(selfdevice); ObDereferenceObject(file); DbgPrint("attach faile"); return STATUS_INSUFFICIENT_RESOURCES; } selfdevice->DeviceType = targetdevice->DeviceType; selfdevice->Characteristics = targetdevice->Characteristics; selfdevice->Flags &=~DO_DEVICE_INITIALIZING; selfdevice->Flags |=(targetdevice->Flags & (DO_DIRECT_IO | DO_BUFFERED_IO)); ObDereferenceObject(file); DbgPrint("SUCCESS"); return STATUS_SUCCESS; }