通知の処理

RegistryCallback ルーチンは、発生しているレジストリ操作に関する情報を含む REG_XXX_KEY_INFORMATION 構造へのポインターを受け取ります。

RegistryCallback ルーチンは、レジストリ操作を監視、ブロック、または変更できます。

レジストリ呼び出しの監視

レジストリ フィルタリング ドライバーがレジストリ操作を監視している場合、その RegistryCallback ルーチンはカウンターを更新したり、他のブックキーピング操作を実行したりした後、STATUS_SUCCESS を返すことができます。 RegistryCallback ルーチンが STATUS_SUCCESSを 返すたびに、構成マネージャーはレジストリ操作の実行を続行します。

レジストリ呼び出しの監視は、Windows XP 以降のバージョンの Windows でサポートされています。

レジストリ呼び出しのブロック

レジストリ フィルタリング ドライバーは、その RegistryCallback ルーチンが、NT_SUCCESS(status) が FALSE (つまり、成功しない NTSTATUS 値) のステータス値を返す場合、レジストリ操作をブロックできます。 構成マネージャーは、成功以外の戻り値を受け取ると、ドライバー指定のステータス値を持つ呼び出し元のスレッドにすぐに戻ります。 そのため、レジストリ フィルタリング ドライバーは、レジストリ操作の処理を防ぐために事前通知を使用できます。

事前通知の NT_SUCCESS (status) が FALSE と等しいステータス値を RegistryCallback ルーチンが返す場合、操作の通知後コールバックは発生しません。

レジストリ呼び出しのブロックは、Windows XP 以降のバージョンの Windows でサポートされています。 Windows Vista 以降の場合、ドライバーは、レジストリ操作が呼び出し元のスレッドに返す値を変更できます。 これらの値は、Windows Vista 以降の REG_XXX_KEY_INFORMATION 構造に含まれています。

レジストリ呼び出しの変更

レジストリ フィルタリング ドライバーは、レジストリ操作の出力パラメーターまたは戻り値を変更できます。 加えて、ドライバーは、レジストリが操作を処理できるようにするのではなく、レジストリ操作を完全に処理できます。

レジストリ フィルタリング ドライバーの RegistryCallback ルーチンが通知後を受信すると、以下のことができます。

  • その REG_XXX_KEY_INFORMATION 構造に含まれる出力パラメーターを変更し、STATUS_SUCCESS を返します。 構成マネージャーは、変更された出力パラメーターを呼び出し元スレッドに返します。

    出力パラメーターの変更は、Windows Vista 以降でサポートされています。

  • REG_POST_OPERATION_INFORMATION 構造の ReturnStatus メンバーのステータス値を指定し、STATUS_CALLBACK_BYPASS を返すことによって、レジストリ操作の戻り値を変更します。 構成マネージャーは、指定した戻り値を呼び出し元スレッドに返します。

    ドライバーが成功から失敗にステータス コードを変更した場合、割り当てられたオブジェクトの割り当てを構成マネージャーが解除する必要があります。 または、ドライバーがステータス コードを失敗から成功に変更した場合、適切な出力パラメーターを指定する必要があります。

戻り値の変更は、Windows Vista 以降でサポートされています。

レジストリ フィルタリング ドライバーの RegistryCallback ルーチンが事前通知を受け取ると、ルーチンはレジストリ操作自体を処理した後、STATUS_CALLBACK_BYPASS を返すことができます。 レジストリは、ドライバーから STATUS_CALLBACK_BYPASS を受け取ると、STATUS_SUCCESS を呼び出し元スレッドに返すだけで、操作を処理しません。 ドライバーはレジストリ操作を優先させ、完全に処理する必要があります。ドライバーは、REG_XXX_KEY_INFORMATION 構造で有効な出力値を返すよう注意する必要があります。

ドライバーは、Windows Vista 以降でレジストリ操作を優先させることができます。

RegistryCallback ルーチンが事前通知の STATUS_CALLBACK_BYPASS を返した場合、操作の通知後コールバックは発生しません。

いくつかのレジストリ システム呼び出しは、ほとんど使用されないためドキュメント化されていません。使用される場合は通常、レジストリで何らかの従来とは違う結果が得られます。 これらの呼び出しによって実行される操作の変更は困難であり、エラーが発生しやすくなります。 ドライバー開発者が以下のレジストリ システム呼び出しの変更を試みることはお勧めしません。

  • NtRestoreKey
  • NtSaveKey
  • NtSaveKeyEx
  • NtLoadKeyEx
  • NtUnloadKey2
  • NtUnloadKeyEx
  • NtReplaceKey
  • NtRenameKey
  • NtSetInformationKey