0

キーボードを動的に無効にするプロジェクトに取り組んでいます。キーボードの物理デバイス オブジェクトを取得して 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
    )
{

}

これはおそらくこれを達成するための最良の方法ではないことを認識しています (最悪の場合もあるかもしれません)が、私が知っている他の2つの方法は、キーボードのプラグを抜くか、再起動が必要なフィルタードライバーをインストールすることです. これを行う別の方法がある場合は、それをお知らせいただければ幸いです。助けてくれてありがとう!

4

1 に答える 1

2

私の推測では、あなたが呼び出している関数の 1 つがエラー値を返し、それに応じた構造を埋めていないと思います。

SetupApi または CfgMgr32 関数を調べて、キーボードを無効にします。

"devcon" wdk サンプルには、ユーザー モードからデバイスを無効にするコードが含まれている必要があります。

于 2010-02-15T10:14:16.997 に答える