ObReferenceObjectByHandle Bugcheck,内存访问冲突

时间:2010-02-15 07:56:17

标签: c++ driver access-violation

我正在开发一个动态禁用键盘的项目。我编写了一个驱动程序,试图获取键盘物理设备对象然后用它调用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 个答案:

答案 0 :(得分:2)

我的猜测是,你调用的函数之一确实返回了一个错误值,并没有填写相应的结构。

我会通过查看SetupApi或CfgMgr32函数来禁用键盘。

“devcon”wdk示例应包含从用户模式禁用设备的代码。