我正在开发一个动态禁用键盘的项目。我已经编写了一个驱动程序,它试图获取键盘物理设备对象,然后用它调用 IoInvalidateDeviceState,但是我在获取它的物理设备对象时遇到了问题。每当我尝试使用设备对象的句柄调用 ObReferenceObjectByHandle 时,都会发生错误检查并且错误是内存访问冲突。这是我的源代码:
#include "ntifs.h"
#include "wdm.h"
#include "ntstrsafe.h"
#pragma comment(lib, "ntstrsafe.lib")
VOID DriverUnloadRoutine(__in PDRIVER_OBJECT DriverObject);
DRIVER_INITIALIZE DriverEntry;
NTSTATUS DriverEntry(
__in struct _DRIVER_OBJECT *DriverObject,
__in PUNICODE_STRING RegistryPath
)
{
UNICODE_STRING keybdname;
FILE_OBJECT * keybdfo;
DEVICE_OBJECT * keybddo;
HANDLE hpdo;
FILE_OBJECT * pdofo;
DEVICE_OBJECT * pdo;
DriverObject->DriverUnload = DriverUnloadRoutine;
RtlInitUnicodeString(&keybdname,L"\\Device\\KeyboardClass0");
IoGetDeviceObjectPointer(&keybdname,GENERIC_ALL,&keybdfo,&keybddo);
ObOpenObjectByPointer(&keybddo,OBJ_KERNEL_HANDLE,0,0,0,KernelMode,&hpdo);
ObReferenceObjectByHandle(hpdo,FILE_ALL_ACCESS,*IoFileObjectType,KernelMode,&pdofo,NULL);
pdo = IoGetRelatedDeviceObject(&pdofo);
IoInvalidateDeviceState(&pdo);
return 0;
}
VOID DriverUnloadRoutine(
__in PDRIVER_OBJECT DriverObject
)
{
}
我意识到这可能不是实现此目的的最佳方法(甚至可能是最坏的方法),但我所知道的仅有的另外两种方法是拔下键盘或安装过滤器驱动程序,这需要重新启动。如果有另一种方法可以做到这一点,告诉我它会很棒。在此先感谢您的帮助!