동적으로 키보드를 사용하지 않도록 설정하는 프로젝트 작업 중입니다. 필자는 키보드 물리적 장치 개체를 얻으려고 시도한 드라이버를 작성한 후 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
)
{
}
나는 이것이 아마 내가 키보드를 뽑거나 필터 드라이버를 설치 알고 이러한 목표를 달성하는 가장 좋은 방법은 (어쩌면 최악의)하지만, 두 개의 다른 방법으로하지 않습니다 실현 재부팅이 필요합니다. 이것을 할 수있는 또 다른 방법이 있다면, 그것에 대해 알려주는 것이 좋을 것입니다. 도움에 미리 감사드립니다!
커널 디버거를 사용해 보셨습니까? 어떤 메모리 주소가 액세스 위반을 일으켰으며 어떤 명령이 해당 주소에 액세스하려고했는지 정확하게 표시해야합니다. – bk1e