2010-02-15 1 views
0

동적으로 키보드를 사용하지 않도록 설정하는 프로젝트 작업 중입니다. 필자는 키보드 물리적 장치 개체를 얻으려고 시도한 드라이버를 작성한 후 IoInvalidateDeviceState를 호출하지만 물리적 장치 개체를 가져 오는 데 문제가 있습니다. 장치 객체에 대한 핸들을 사용하여 ObReferenceObjectByHandle을 호출하려고하면 버그 검사가 발생하고 오류는 메모리 액세스 위반입니다. 여기 내 소스 코드 :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 
    ) 
{ 

} 

나는 이것이 아마 내가 키보드를 뽑거나 필터 드라이버를 설치 알고 이러한 목표를 달성하는 가장 좋은 방법은 (어쩌면 최악의)하지만, 두 개의 다른 방법으로하지 않습니다 실현 재부팅이 필요합니다. 이것을 할 수있는 또 다른 방법이 있다면, 그것에 대해 알려주는 것이 좋을 것입니다. 도움에 미리 감사드립니다!

+0

커널 디버거를 사용해 보셨습니까? 어떤 메모리 주소가 액세스 위반을 일으켰으며 어떤 명령이 해당 주소에 액세스하려고했는지 정확하게 표시해야합니다. – bk1e

답변

2

내 생각에, 호출중인 함수 중 하나가 오류 값을 반환하고 그에 따라 구조를 채우지 않을 것입니다.

SetupApi 또는 CfgMgr32 기능을 살펴보면 키보드를 비활성화 할 수 있습니다.

"devcon"wdk 샘플에는 장치를 사용자 모드에서 비활성화하는 코드가 포함되어야합니다.