2010-02-15 3 views
0

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

} 

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

+0

Вы пробовали отладчик ядра? Он должен показать вам, какой адрес памяти вызвал нарушение доступа и какая инструкция пыталась получить доступ к этому адресу. – bk1e

ответ

2

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

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

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