次の方法で共有


レジストリ通知の無効なキー オブジェクト ポインター

致命的なエラーやメモリ破損の可能性を回避するために、レジストリ フィルター ドライバーは、無効なオブジェクト ポインターを使用してキー オブジェクトにアクセスしようとしないでください。 このトピックでは、レジストリ コールバック通知構造体の オブジェクト メンバーに未定義の NULL 以外の値が含まれている可能性がある状況を示します。

レジストリ フィルター ドライバーでは、 RegistryCallback ルーチンの 2 番目のパラメーターは 、REG_NOTIFY_CLASS 列挙値です。 この値は、 RegistryCallback ルーチンの 3 番目のパラメーターが指すレジストリ コールバック通知構造体の種類を示します。 通知構造体には、レジストリ操作に関する情報が含まれています。 この構造体の種類は、実行されているレジストリ操作によって異なります。

多くの通知構造体の種類には、キー オブジェクトを指す Object メンバーが含まれています。 場合によっては、 Object メンバーに NULL 以外の値を含めることができますが、有効なキー オブジェクトへのポインターではありません。

キー オブジェクトの値が未定義です

レジストリ フィルター ドライバーの RegistryCallback ルーチンの呼び出しの 2 番目のパラメーターが RegNtPostCreateKeyEx または RegNtPostOpenKeyExREG_NOTIFY_CLASS列挙値である場合、3 番目パラメーターはREG_POST_OPERATION_INFORMATION構造体へのポインターです。 この構造体の Object メンバーは、構造体の Status メンバーがSTATUS_SUCCESSに設定されている場合にのみ有効です。 NT_SUCCESS マクロが TRUE と評価される 0 以外の状態コードなど、その他の Status 値は、Object メンバーの値が未定義であることを示します。

キー オブジェクトの値が有効な状態ではありません

レジストリ コールバックの 2 番目のパラメーターが次の REG_NOTIFY_CLASS 列挙値のいずれかである場合、レジストリ コールバック通知構造体の Object メンバーは、破棄され、参照カウントが 0 であるキー オブジェクトを指します。

Object メンバーは有効な状態ではないキー オブジェクトを指しているため、レジストリ フィルター ドライバーは、オブジェクト ポインター値をパラメーターとして Windows ドライバー サポート ルーチン (ObReferenceObjectByPointer など) に渡してはなりません。

ただし、RegNtPreKeyHandleClose または RegNtPostKeyHandleClose 通知を処理する RegistryCallback 呼び出し中に、レジストリ フィルター ドライバーは、レジストリ オブジェクトをパラメーターとして受け取る構成マネージャー ルーチン (CmGetBoundTransaction など) を呼び出すことができます。