Я работаю над проектом, чтобы динамически отключить клавиатуру. Я написал драйвер, который пытается получить объект физического устройства клавиатуры, а затем вызывает его с помощью IoInvalidateDeviceState, но у меня возникла проблема с получением его физического объекта устройства. Всякий раз, когда я пытаюсь вызвать ObReferenceObjectByHandle с дескриптором объекта устройства, возникает ошибка, и ошибка является нарушением доступа к памяти. Вот мой исходный код:ObReferenceObjectByHandle Bugcheck, нарушение доступа к памяти
#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
)
{
}
Я понимаю, что это, вероятно, не самый лучший способ для достижения этой цели (может быть, даже самое худшее), но только два способа я не знаю будут отсоединив клавиатуру или установить драйвер фильтра , для чего потребуется перезагрузка. Если есть еще один способ сделать это, сообщить мне об этом было бы здорово. Заранее спасибо за помощь!
Вы пробовали отладчик ядра? Он должен показать вам, какой адрес памяти вызвал нарушение доступа и какая инструкция пыталась получить доступ к этому адресу. – bk1e