Freigeben über


EX_CALLBACK_FUNCTION Rückruffunktion (wdm.h)

Die RegistryCallback Routine eines Filtertreibers kann einen Registrierungsvorgang überwachen, blockieren oder ändern.

Syntax

EX_CALLBACK_FUNCTION ExCallbackFunction;

NTSTATUS ExCallbackFunction(
  [in]           PVOID CallbackContext,
  [in, optional] PVOID Argument1,
  [in, optional] PVOID Argument2
)
{...}

Parameter

[in] CallbackContext

Der Wert, den der Treiber als Context Parameter an CmRegisterCallback oder CmRegisterCallbackEx, wenn er diese RegistryCallback-Routine registriert hat.

[in, optional] Argument1

Ein REG_NOTIFY_CLASS-typed-Wert, der den Typ des ausgeführten Registrierungsvorgangs angibt und ob die RegistryCallback- routine vor oder nach dem Ausführen des Registrierungsvorgangs aufgerufen wird.

[in, optional] Argument2

Ein Zeiger auf eine Struktur, die Informationen enthält, die für den Registrierungsvorgangstyp spezifisch sind. Der Strukturtyp hängt vom REG_NOTIFY_CLASS-typed-Wert für Argument1ab, wie in der folgenden Tabelle dargestellt. Informationen dazu, welche REG_NOTIFY_CLASS-Typ-Werte für welche Betriebssystemversionen verfügbar sind, finden Sie unter REG_NOTIFY_CLASS.

wert REG_NOTIFY_CLASS Strukturtyp
RegNtDeleteKey- REG_DELETE_KEY_INFORMATION
RegNtPreDeleteKey REG_DELETE_KEY_INFORMATION
RegNtPostDeleteKey- REG_POST_OPERATION_INFORMATION
RegNtSetValueKey- REG_SET_VALUE_KEY_INFORMATION
RegNtPreSetValueKey- REG_SET_VALUE_KEY_INFORMATION
RegNtPostSetValueKey REG_POST_OPERATION_INFORMATION
RegNtDeleteValueKey- REG_DELETE_VALUE_KEY_INFORMATION
RegNtPreDeleteValueKey- REG_DELETE_VALUE_KEY_INFORMATION
RegNtPostDeleteValueKey REG_POST_OPERATION_INFORMATION
RegNtSetInformationKey- REG_SET_INFORMATION_KEY_INFORMATION
RegNtPreSetInformationKey- REG_SET_INFORMATION_KEY_INFORMATION
RegNtPostSetInformationKey REG_POST_OPERATION_INFORMATION
RegNtRenameKey- REG_RENAME_KEY_INFORMATION
RegNtPreRenameKey- REG_RENAME_KEY_INFORMATION
RegNtPostRenameKey REG_POST_OPERATION_INFORMATION
RegNtEnumerateKey- REG_ENUMERATE_KEY_INFORMATION
RegNtPreEnumerateKey REG_ENUMERATE_KEY_INFORMATION
RegNtPostEnumerateKey REG_POST_OPERATION_INFORMATION
RegNtEnumerateValueKey- REG_ENUMERATE_VALUE_KEY_INFORMATION
RegNtPreEnumerateValueKey REG_ENUMERATE_VALUE_KEY_INFORMATION
RegNtPostEnumerateValueKey REG_POST_OPERATION_INFORMATION
RegNtQueryKey- REG_QUERY_KEY_INFORMATION
RegNtPreQueryKey- REG_QUERY_KEY_INFORMATION
RegNtPostQueryKey- REG_POST_OPERATION_INFORMATION
RegNtQueryValueKey- REG_QUERY_VALUE_KEY_INFORMATION
RegNtPreQueryValueKey- REG_QUERY_VALUE_KEY_INFORMATION
RegNtPostQueryValueKey- REG_POST_OPERATION_INFORMATION
RegNtQueryMultipleValueKey REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
RegNtPreQueryMultipleValueKey REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
RegNtPostQueryMultipleValueKey REG_POST_OPERATION_INFORMATION
RegNtPreCreateKey- REG_PRE_CREATE_KEY_INFORMATION
RegNtPreCreateKeyEx- REG_CREATE_KEY_INFORMATION**
RegNtPostCreateKey REG_POST_CREATE_KEY_INFORMATION
RegNtPostCreateKeyEx- REG_POST_OPERATION_INFORMATION
RegNtPreOpenKey- REG_PRE_OPEN_KEY_INFORMATION**
RegNtPreOpenKeyEx- REG_OPEN_KEY_INFORMATION
RegNtPostOpenKey- REG_POST_OPEN_KEY_INFORMATION
RegNtPostOpenKeyEx REG_POST_OPERATION_INFORMATION
RegNtKeyHandleClose REG_KEY_HANDLE_CLOSE_INFORMATION
RegNtPreKeyHandleClose REG_KEY_HANDLE_CLOSE_INFORMATION
RegNtPostKeyHandleClose REG_POST_OPERATION_INFORMATION
RegNtPreFlushKey REG_FLUSH_KEY_INFORMATION
RegNtPostFlushKey- REG_POST_OPERATION_INFORMATION
RegNtPreLoadKey- REG_LOAD_KEY_INFORMATION
RegNtPostLoadKey- REG_POST_OPERATION_INFORMATION
RegNtPreUnLoadKey- REG_UNLOAD_KEY_INFORMATION
RegNtPostUnLoadKey- REG_POST_OPERATION_INFORMATION
RegNtPreQueryKeySecurity- REG_QUERY_KEY_SECURITY_INFORMATION
RegNtPostQueryKeySecurity REG_POST_OPERATION_INFORMATION
RegNtPreSetKeySecurity REG_SET_KEY_SECURITY_INFORMATION
RegNtPostSetKeySecurity REG_POST_OPERATION_INFORMATION
RegNtCallbackObjectContextCleanup REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION
RegNtPreRestoreKey- REG_RESTORE_KEY_INFORMATION
RegNtPostRestoreKey- REG_POST_OPERATION_INFORMATION
RegNtPreSaveKey REG_SAVE_KEY_INFORMATION
RegNtPostSaveKey REG_POST_OPERATION_INFORMATION
RegNtPreReplaceKey- REG_REPLACE_KEY_INFORMATION
RegNtPostReplaceKey REG_POST_OPERATION_INFORMATION
RegNtPreQueryKeyName- REG_QUERY_KEY_NAME
RegNtPostQueryKeyName- REG_POST_OPERATION_INFORMATION
RegNtPreSaveMergedKey REG_SAVE_MERGED_KEY_INFORMATION
RegNtPostSaveMergedKey REG_POST_OPERATION_INFORMATION

Ab Windows 7 wird die tatsächliche Datenstruktur übergeben, wenn die Notify-Klasse regNtPreCreateKeyEx oder RegNtPreOpenKeyEx die V1-Version dieser Struktur, REG_CREATE_KEY_INFORMATION_V1 oder REG_OPEN_KEY_INFORMATION_V1ist. Überprüfen Sie das Reservierte Element, um die Version der Struktur zu ermitteln.

Versionsnummer Strukturname
0 REG_CREATE_KEY_INFORMATION und REG_OPEN_KEY_INFORMATION
1 REG_CREATE_KEY_INFORMATION_V1 und REG_OPEN_KEY_INFORMATION_V1

Rückgabewert

Weitere Informationen dazu, wann eine RegistryCallback Routine jeden dieser Statuswerte zurückgeben sollte, finden Sie unter Filtern von Registrierungsaufrufen.

Bemerkungen

Um über Registrierungsvorgänge benachrichtigt zu werden, kann eine Kernelmoduskomponente (z. B. die Treiberkomponente eines Antivirensoftwarepakets) CmRegisterCallback- oder CmRegisterCallbackEx- aufrufen, um eine RegistryCallback Routine zu registrieren.

Die RegistryCallback Routine kann den Inhalt der Eingabe- und Ausgabepuffer prüfen, die für Registrierungsvorgänge bereitgestellt werden. Ein Registrierungsvorgang kann von einer Benutzermodusanwendung initiiert werden, die eine Registrierungsroutine für den Benutzermodus aufruft (z. B. RegCreateKeyEx oder RegOpenKeyEx) oder von einem Treiber, der eine Kernelmodusregistrierungsroutine aufruft (z. B. ZwCreateKey oder ZwOpenKey). Ein Eingabepuffer ist ein Vom Initiator bereitgestellter Speicherpuffer, aus dem die Registrierung Eingabedaten für den Vorgang liest. Ein Ausgabepuffer ist ein Vom Initiator bereitgestellter Puffer, in den die Registrierung Ausgabedaten schreibt, die vom Initiator angefordert werden.

Bevor Sie die RegistryCallback Routine aufrufen, erfassen die Kernelsonden (zur Überprüfung der Ausrichtung und Barrierefreiheit) alle Member der Argument2 Strukturen, die auf Ausgabepuffer im Benutzermodusspeicher verweisen, aber keine Ausgabepuffer im Systemspeicher erfassen. Die Rückrufroutine muss den Zugriff eines Ausgabepuffers in einen versuchen,/außer Block zu verwenden. Wenn die Rückrufroutine einen Ausgabepufferzeiger an eine Systemroutine übergeben muss (z. B. ZwOpenKey), und der Puffer im Benutzermodusspeicher ist, muss die Rückrufroutine zuerst den Puffer erfassen.

Die Behandlung von Eingabepuffern hängt von der Windows-Version ab. Ab Windows 8 erfasst der Kernel alle Eingabepuffer, auf die von Mitgliedern der Argument2 Strukturen im Systemspeicher verwiesen wird, bevor die RegistryCallback- Routine aufgerufen wird. In Windows-Versionen vor Windows 8 testet der Kernel alle Member der Argument2 Strukturen, die auf Eingabepuffer im Benutzermodusspeicher verweisen, erfasst jedoch nur einige dieser Puffer im Systemspeicher. In diesen früheren Versionen von Windows muss die Rückrufroutine den Zugriff eines Eingabepuffers in einen versuchen,/außer Block zu verwenden. Wenn die Rückrufroutine einen Eingabepufferzeiger an eine Systemroutine übergeben muss (z. B. ZwOpenKey), und der Puffer im Benutzermodusspeicher ist, muss die Rückrufroutine zuerst den Puffer erfassen.

In der folgenden Tabelle sind die Anforderungen für Pufferzugriffe durch die RegistryCallback Routine zusammengefasst.

Puffertyp Windows-Version An Rückrufroutine übergebener Pufferzeiger Sicher für Rückrufroutine, um direkt darauf zuzugreifen? Sicher, an Systemroutinen zu übergeben (z. B. ZwOpenKey)?
Benutzermoduseingabe Windows 8 und höher Verweist auf erfasste Daten. Ja Ja
Benutzermoduseingabe Windows 7 und frühere Versionen Verweist auf erfasste Daten oder den ursprünglichen Benutzermoduspuffer. Nein. Muss unter try/except gelesen werden. Nein. Muss Kernelspeicher zuweisen, Daten aus dem ursprünglichen Puffer kopieren, unter try/except, und übergeben Sie die kopierten Daten an die Systemroutine.
Ausgabe des Benutzermodus Alle Verweist auf den ursprünglichen Benutzermoduspuffer. Nein. Muss unter "try/except" schreiben. Nein. Muss Kernelspeicher zuweisen, Kernelspeicher an die Systemroutine übergeben und die Ergebnisse wieder in den ursprünglichen Puffer kopieren, unter try/except.
Kernelmoduseingabe und -ausgabe Alle Verweist auf den ursprünglichen Kernelmoduspuffer. Ja Ja

Weitere Informationen zu RegistryCallback Routinen und Registrierungsfiltertreibern finden Sie unter Filtern von Registrierungsaufrufen.

Ein RegistryCallback- wird bei IRQL = PASSIVE_LEVEL und im Kontext des Threads ausgeführt, der den Registrierungsvorgang ausführt.

Beispiele

Um eine RegistryCallback- Rückrufroutine zu definieren, müssen Sie zuerst eine Funktionsdeklaration bereitstellen, die den Typ der von Ihnen definierten Rückrufroutine identifiziert. Windows stellt eine Reihe von Rückruffunktionstypen für Treiber bereit. Durch das Deklarieren einer Funktion mithilfe der Rückruffunktionstypen können Codeanalyse für Treiber, statische Treiberüberprüfung (SDV) und andere Überprüfungstools Fehler finden, und es ist eine Anforderung zum Schreiben von Treibern für das Windows-Betriebssystem.

Wenn Sie beispielsweise eine RegistryCallback- Rückrufroutine definieren möchten, die MyRegistryCallbackheißt, verwenden Sie den EX_CALLBACK_FUNCTION Typ, wie in diesem Codebeispiel gezeigt:

EX_CALLBACK_FUNCTION MyRegistryCallback;

Implementieren Sie dann Ihre Rückrufroutine wie folgt:

_Use_decl_annotations_
NTSTATUS 
  MyRegistryCallback(
    PVOID  CallbackContext,
    PVOID  Argument1,
    PVOID  Argument2 
    )
  {
      // Function body
  }

Der EX_CALLBACK_FUNCTION Funktionstyp wird in der Wdm.h-Headerdatei definiert. Um Fehler genauer zu identifizieren, wenn Sie die Codeanalysetools ausführen, müssen Sie der Funktionsdefinition die Use_decl_annotations Anmerkung hinzufügen. Die Use_decl_annotations Anmerkung stellt sicher, dass die Anmerkungen, die auf den funktionstyp EX_CALLBACK_FUNCTION in der Headerdatei angewendet werden, verwendet werden. Weitere Informationen zu den Anforderungen für Funktionsdeklarationen finden Sie unter Deklarieren von Funktionen mithilfe von Funktionsrollentypen für WDM-Treiber. Informationen zu Use_decl_annotationsfinden Sie unter Annotating Function Behavior.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Unterstützt ab Windows XP (siehe Abschnitt "Rückgabewert").
Zielplattform- Desktop
Header- wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
IRQL- Aufgerufen bei PASSIVE_LEVEL (siehe Abschnitt "Hinweise").

Siehe auch

CmRegisterCallback-

CmUnRegisterCallback-

ProbeForRead-

REG_NOTIFY_CLASS

ZwOpenKey