c++ - ObReferenceObjectByHandle 错误检查,内存访问冲突

标签 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
    )
{

}

我意识到这可能不是实现此目的的最佳方式(甚至可能是最糟糕的方式),但我所知道的仅有的另外两种方式是拔下键盘或安装过滤驱动程序,这需要重新启动。如果有另一种方法可以做到这一点,通知我会很棒。在此先感谢您的帮助!

最佳答案

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

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

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

关于c++ - ObReferenceObjectByHandle 错误检查,内存访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2264585/

相关文章:

c++ - TCLAP : how to check whether an optional command line argument has been specified?

c++ - 旋转的关节位置

c++ - 如何使用文件系统库获取 "true"文件大小? (C++17)

c++ - C - 将扫描码集 1 转换为 ASCII

c++ - Delphi:从外部 DLL (C++) 调用函数后发生访问冲突

java - 从 C++ 到 java 的 Android JNI 回调

linux - 并口驱动安装失败(Debian)

linux - linux 内核中的 b/w __raw_readl/__raw_writel 和 readl/writel 有什么区别?

C# Image.Save AccessViolationException

c++ - 每当我更改 QTableWidget.item(row, col) 时发生访问冲突