http://hi.baidu.com/pushad/item/0a78c3ba0812e6afeaba9399[寒江独钓]IRPHOOK键盘过滤之替换原键盘分发函数MajorFunction.h#ifndef_MAJORFUNCTION_HEADERS_#define_MAJORFUNCTION_HEADERS_#include#defineDELAY_ONE_MILLISECOND1000000externPOBJECT_TYPE*IoDriverObjectType;externNTSTATUSObReferenceObjectByName(INPUNICODE_STRINGObjectPath,INULONGAttributes,INPACCESS_STATEPassedAccessStateOPTIONAL,INACCESS_MASKDesiredAccessOPTIONAL,INPOBJECT_TYPEObjectType,INKPROCESSOR_MODEAccessMode,INOUTPVOIDParseContextOPTIONAL,OUTPVOID*ObjectPtr);PDRIVER_DISPATCHOldMajorFunction[IRP_MJ_MAXIMUM_FUNCTION+1];#endif#include"MajorFunction.h"//原键盘驱动分发统一处理NTSTATUSOldKeyBoardDispath(PDEVICE_OBJECTDeviceObject,PIRPpIrp){NTSTATUSStatus=STATUS_UNSUCCESSFUL;PIO_STACK_LOCATIONirpStack=NULL;irpStack=IoGetCurrentIrpStackLocation(pIrp);Status=OldMajorFunction[irpStack->MajorFunction](DeviceObject,pIrp);DbgPrint("IRP_MJ_FUNCTIOINcompletesuccessful!\n");returnStatus;}//HOOK函数,替换键盘原来的MajorFunctionNTSTATUSMajorFunctionHook(PDRIVER_OBJECTDriverObject){NTSTATUSStatus=STATUS_UNSUCCESSFUL;PDRIVER_OBJECTKeyBoardDriverObject=NULL;UNICODE_STRINGKeyBoardDriverName;PFILE_OBJECTpFileObject=NULL;intnIndex=0;RtlInitUnicodeString(&KeyBoardDriverName,L"\\Driver\\Kbdclass");Status=ObReferenceObjectByName(&KeyBoardDriverName,OBJ_CASE_INSENSITIVE,\NULL,0,IoDriverObjectType,KernelMode,NULL,&KeyBoardDriverObject);if(!NT_SUCCESS(Status)){DbgPrint("inMajorFunctionHookGetObReferenceObjectByNamebyKeyBoardDriverObjectError\n");gotoExit0;}//保存及设置新键盘的MajorFunctionfor(nIndex=0;nIndexMajorFunction[nIndex];InterlockedExchangePointer(&KeyBoardDriverObject->MajorFunction[nIndex],DriverObject->MajorFunction[nIndex]);}DbgPrint("IRP_MJ_FUNCTIONHookSuccessful!\n");//解除引用ObDereferenceObject(KeyBoardDriverObject);Exit0:returnStatus;}//卸载函数NTSTATUSUnLoadDriver(PDRIVER_OBJECTDriverObject){NTSTATUSStatus=STATUS_UNSUCCESSFUL;intnIndex=0;PDRIVER_OBJECTKeyBoardDriverObject=NULL;UNICODE_STRINGKeyBoardName;LARGE_INTEGERDelay;RtlInitUnicodeString(&KeyBoardName,L"\\Driver\\Kbdclass");Status=ObReferenceObjectByName(&KeyBoardName,OBJ_CASE_INSENSITIVE,NULL,0,*IoDriverObjectType,\KernelMode,NULL,&KeyBoardDriverObject);if(!NT_SUCCESS(Status)){DbgPrint("UnloadDriverGetKeyboardDriverObjectError\n");gotoExit0;}//交换原来的分发函数for(nIndex;nIndexMajorFunction[nIndex],OldMajorFunction[nIndex]);}DbgPrint("ChangeMajorFunctionSuccessful!\n");Delay=RtlConvertLongToLargeInteger(5*DELAY_ONE_MILLISECOND);//延时等待完成KeDelayExecutionThread(KernelMode,FALSE,&Delay);ObReferenceObject(KeyBoardDriverObject);Exit0:returnStatus;}NTSTATUSDriverEntry(PDRIVER_OBJECTDriverObject,PUNICODE_STRINGRegisterPath){NTSTATUSStatus=STATUS_UNSUCCESSFUL;intnIndex=0;//设置新的键盘分发函数for(nIndex;nIndexMajorFunction[nIndex]=OldKeyBoardDispath;}DriverObject->DriverUnload=UnLoadDriver;Status=MajorFunctionHook(DriverObject);returnStatus;}