Ungültige Schlüsselobjektzeiger in Registrierungsbenachrichtigungen

Um schwerwiegende Fehler und mögliche Speicherbeschädigungen zu vermeiden, darf ein Registrierungsfiltertreiber nicht versuchen, mithilfe eines ungültigen Objektzeigers auf ein Schlüsselobjekt zuzugreifen. In diesem Thema werden die Umstände aufgeführt, unter denen das Object-Element einer Registrierungsrückrufbenachrichtigungsstruktur einen nicht definierten Wert enthalten kann, der nicht NULL ist.

In einem Registrierungsfiltertreiber ist der zweite Parameter der RegistryCallback-Routine ein REG_NOTIFY_CLASS Enumerationswert. Dieser Wert gibt an, auf welche Art von Registrierungsrückrufbenachrichtigungsstruktur der dritte Parameter der RegistryCallback-Routine verweist. Die Benachrichtigungsstruktur enthält Informationen zum Registrierungsvorgang. Der Typ dieser Struktur variiert je nach durchgeführtem Registrierungsvorgang.

Viele der Benachrichtigungsstrukturtypen enthalten einen Object-Member , der auf ein Schlüsselobjekt verweist. In einigen Fällen kann der Object-Member einen Wert enthalten, der nicht NULL ist, aber kein Zeiger auf ein gültiges Schlüsselobjekt ist.

Key Object Value is Undefined

Wenn der zweite Parameter in einem Aufruf der RegistryCallback-Routine eines Registrierungsfiltertreibers ein REG_NOTIFY_CLASS Enumerationswert von RegNtPostCreateKeyEx oder RegNtPostOpenKeyEx ist, ist der dritte Parameter ein Zeiger auf eine REG_POST_OPERATION_INFORMATION-Struktur . Der Object-Member dieser Struktur ist nur gültig, wenn der Status-Member der Struktur auf STATUS_SUCCESS festgelegt ist. Jeder andere Status-Wert, einschließlich eines ungleich null status Code, für den das NT_SUCCESS Makro als TRUE ausgewertet wird, gibt an, dass der Wert des Object-Elements undefiniert ist.

Der Wert des Schlüsselobjekts ist nicht gültig.

Wenn der zweite Parameter in einem Registrierungsrückruf einer der folgenden REG_NOTIFY_CLASS Enumerationswerte ist, verweist der Object-Member der Registrierungsrückruf-Benachrichtigungsstruktur auf ein Schlüsselobjekt, das zerstört wird und dessen Verweisanzahl null ist:

Da der Object-Member auf ein Schlüsselobjekt verweist, das sich nicht in einem gültigen Zustand befindet, darf der Registrierungsfiltertreiber den Object-Zeigerwert nicht als Parameter an eine Windows-Treiberunterstützungsroutine (z. B. ObReferenceObjectByPointer) übergeben.

Während eines RegistryCallback-Aufrufs zur Behandlung einer RegNtPreKeyHandleClose - oder RegNtPostKeyHandleClose-Benachrichtigung kann ein Registrierungsfiltertreiber jedoch eine Configuration Manager-Routine (z. B. CmGetBoundTransaction) aufrufen, die ein Registrierungsobjekt als Parameter akzeptiert.