レジストリ キー オブジェクトのハンドルを開く
レジストリ キー オブジェクトのハンドルを開くには、次の 2 つの手順を実行します。
OBJECT_ATTRIBUTES 構造体を作成し、InitializeObjectAttributes を呼び出してこの構造体を初期化します。 操作するキーの名前を ObjectName パラメーターとして InitializeObjectAttributes に指定します。
InitializeObjectAttributes に RootDirectory パラメーターとして NULL を渡す場合、ObjectName には、\Registry を先頭とするレジストリ キーの完全なパスを指定する必要があります。 それ以外の場合、RootDirectory には、レジストリ キーの開いているハンドルを指定する必要があります。ObjectName は、そのキーを基準とする相対パスになります。
ZwCreateKey または ZwOpenKey を呼び出してキー オブジェクトのハンドルを開き、そのハンドルに OBJECT_ATTRIBUTES 構造体を渡します。 このキーが存在しない場合、ZwCreateKey の場合はそのキーが作成され、ZwOpenKey の場合は STATUS_OBJECT_NAME_NOT_FOUND が返されます。
要求しているアクセス権が記述された ZwCreateKey または ZwOpenKey に DesiredAccess パラメーターを渡します。 ドライバーで実行する操作を許可するアクセス権を指定する必要があります。 実行できる操作およびそのために要求する該当のアクセス権を次の表に示します。
操作 | 必要なアクセス権 |
---|---|
レジストリキーの値を取得します。 |
KEY_QUERY_VALUE または KEY_READ |
レジストリキーの値を設定します。 |
KEY_SET_VALUE または KEY_WRITE |
キーのすべてのサブキーをループ処理します。 |
KEY_ENUMERATE_SUB_KEYS または KEY_READ |
サブキーを作成します。 |
KEY_CREATE_SUB_KEY または KEY_WRITE |
キーを削除します。 |
DELETE |
DesiredAccess パラメーターに指定できる値の詳細については「ZwCreateKey 関数」を参照してください。
IoOpenDeviceRegistryKey と IoOpenDeviceInterfaceRegistryKey を呼び出して、それぞれデバイス固有のレジストリ キーとデバイス インターフェイス固有のレジストリ キーのハンドルを開くこともできます。 詳細については「プラグ アンド プレイ レジストリ ルーチン」を参照してください。
注: ZwCreateKey、ZwOpenKey、IoOpenDeviceRegistryKey、IoOpenDeviceInterfaceRegistryKey の呼び出しの場合、汎用アクセス権である GENERIC_READ および GENERIC_WRITE は、それぞれキー固有のアクセス権である KEY_READ および KEY_WRITEと同等であり、これらのキー固有のアクセス権の代わりに使用できます。