レジストリ通知内の無効なキー オブジェクト ポインター
致命的なエラーやメモリ破損の可能性を回避するために、レジストリ フィルター ドライバーは、無効なオブジェクト ポインターを使用してキー オブジェクトへのアクセスを試みてはなりません。 このトピックでは、レジストリ コールバック通知構造体の Object メンバーに未定義の NULL 以外の値が含まれている可能性がある状況を説明します。
レジストリ フィルター ドライバーでは、RegistryCallback ルーチンの 2 番目のパラメーターは、REG_NOTIFY_CLASS 列挙値です。 この値は、RegistryCallback ルーチンの 3 番目のパラメーターが指すレジストリ コールバック通知構造体の種類を示します。 通知構造体には、レジストリ操作に関する情報が含まれています。 この構造体の種類は、実行されているレジストリ操作によって異なります。
多くの通知構造体の種類には、キー オブジェクトを指す Object メンバーが含まれています。 場合によっては、Object メンバーに NULL 以外の値を含めることができますが、有効なキー オブジェクトへのポインターではありません。
キー オブジェクトの値が未定義
レジストリ フィルター ドライバーの RegistryCallback ルーチンの呼び出しの 2 番目のパラメーターが RegNtPostCreateKeyEx または RegNtPostOpenKeyEx の REG_NOTIFY_CLASS 列挙値である場合、3 番目のパラメーターは REG_POST_OPERATION_INFORMATION 構造体へのポインターです。 この構造体の Object メンバーは、構造体の Status メンバーが STATUS_SUCCESS に設定されている場合にのみ有効です。 NT_SUCCESS マクロが TRUE と評価される 0 以外の状態コードなど、その他の Status 値は、Object メンバーの値が未定義であることを示します。
キー オブジェクトの値が有効な状態ではない
レジストリ コールバックの 2 番目のパラメーターが次の REG_NOTIFY_CLASS 列挙値のいずれかである場合、レジストリ コールバック通知構造体の Object メンバーは、破棄され、参照カウントが 0 であるキー オブジェクトを指します。
RegNtPreKeyHandleClose (REG_KEY_HANDLE_CLOSE_INFORMATION 構造体)
RegNtPostKeyHandleClose (REG_POST_OPERATION_INFORMATION 構造体)
RegNtCallbackObjectContextCleanup (REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION 構造体)
Object メンバーは有効な状態ではないキー オブジェクトを指しているため、レジストリ フィルター ドライバーは、オブジェクト ポインター値をパラメーターとして Windows ドライバー サポート ルーチン (ObReferenceObjectByPointer など) に渡してはなりません。
ただし、RegNtPreKeyHandleClose または RegNtPostKeyHandleClose 通知を処理するための RegistryCallback 呼び出し中に、レジストリ フィルター ドライバーは、レジストリ オブジェクトをパラメーターとして受け取る構成マネージャー ルーチン (CmGetBoundTransaction など) を呼び出すことができます。