ObReferenceObjectByHandle Ошибка, нарушение доступа к памяти - PullRequest
0 голосов
/ 15 февраля 2010

Я работаю над проектом по динамическому отключению клавиатуры. Я написал драйвер, который пытается получить объект физического устройства клавиатуры, а затем вызывает 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
    )
{

}

Я понимаю, что это, вероятно, не лучший способ сделать это (возможно, даже худший), но есть только два других известных мне способа: отсоединить клавиатуру или установить драйвер фильтра, что потребует перезагрузки. Если есть другой способ сделать это, было бы здорово сообщить мне об этом. Заранее спасибо за помощь!

1 Ответ

2 голосов
/ 15 февраля 2010

Я полагаю, что одна из ваших функций, которые вы вызываете, возвращает значение ошибки и не заполняет соответствующую структуру.

Я бы хотел отключить клавиатуру, посмотрев функции SetupApi или CfgMgr32.

Пример wdk "devcon" должен содержать код для отключения устройства из пользовательского режима.

...