Freigeben über


IoRegisterDriverProxyEndpoints-Funktion (wdm.h)

Hinweis

Diese Funktion wird nur für Treiber Hot-Swap V1 verwendet. Neue Treiber sollten Treiber Hot-Swap V2 verwenden, die die Endpunktregistrierung automatisch über compilerbasierte Endpunktenenumeration verarbeitet.

Die IoRegisterDriverProxyEndpoints-Funktion registriert Endpunktfunktionen in einer DriverProxy-Erweiterung und ermöglicht die Hot-Swappable-Treiberfunktionalität in Treiber-Hot-Swap V1-Implementierungen.

Syntax

NTSTATUS IoRegisterDriverProxyEndpoints(
  PDRIVER_PROXY_EXTENSION            DriverProxyExtension,
  PDRIVER_PROXY_ENDPOINT_INFORMATION EndpointInfo,
  ULONG                              Count,
  PDRIVER_PROXY_REGISTER_CALLBACK    PhasedCallback,
  PVOID                              Context
);

Die Parameter

DriverProxyExtension

[in] Ein Zeiger auf die DriverProxy-Erweiterung, für die die Endpunkte registriert werden. Diese Erweiterung muss mit IoCreateDriverProxyExtension erstellt worden sein.

EndpointInfo

[in, out] Ein Array von DRIVER_PROXY_ENDPOINT_INFORMATION Strukturen, die die zu registrierenden Endpunktfunktionen beschreiben. Die Funktion kann den Inhalt dieses Arrays während der Registrierung ändern.

Count

[in] Die Anzahl der Elemente im EndpointInfo-Array .

PhasedCallback

[in, optional] Ein optionaler Zeiger auf eine DRIVER_PROXY_REGISTER_CALLBACK-Funktion , die während des Registrierungsprozesses in verschiedenen Phasen aufgerufen wird, um treiberspezifische Vorgänge zu ermöglichen.

Context

[in, optional] Ein optionaler Kontextzeiger, der an die PhasedCallback-Funktion übergeben wird.

Rückgabewert

IoRegisterDriverProxyEndpoints gibt einen der folgenden NTSTATUS-Werte zurück:

Rückgabecode Description
STATUS_SUCCESS Die Endpunkte wurden erfolgreich registriert.
STATUS_INSUFFICIENT_RESOURCES Nicht genügend Arbeitsspeicher zum Registrieren der Endpunkte verfügbar.
STATUS_INVALID_PARAMETER_3 Mindestens eine Endpunktinformationsstruktur hat versucht, eine vorhandene Funktion mit einer anderen Parameteranzahl zu überschreiben.
STATUS_UNSUCCESSFUL Timeout des Vorgangs beim Warten auf den Abschluss vorhandener Funktionsaufrufe.

Bemerkungen

Diese Funktion richtet die Zuordnung zwischen den ursprünglichen Treiberfunktionen und ihren hot-swappable Wrappern ein. Nach der Registrierung werden Aufrufe der ursprünglichen Funktionen über das DriverProxy-System umgeleitet, sodass die Funktionen zur Laufzeit ersetzt werden können, ohne den Treiber entladen zu müssen.

Diese Funktion führt einen komplexen mehrstufigen Vorgang aus, um Funktionszeiger sicher zu ersetzen, während vorhandene Aufrufe ausgeführt werden können. Der Registrierungsprozess umfasst:

  • Vorverarbeitungsphase: Der optionale PhasedCallback wird mit DriverProxyRegisterCallbackPreProcess aufgerufen, um die Treibervorbereitung zu ermöglichen.

  • Rundown acquisition: The function waits for all existing calls to registered endpoints to complete before proceeding.

  • Phase des blockierten Proxys: Der PhasedCallback wird mit DriverProxyRegisterCallbackProxyStalled aufgerufen, während alle Aufrufe blockiert werden.

  • Funktionsersetzung: Die eigentlichen Funktionszeiger werden atomisch aktualisiert.

  • Nachbearbeitungsphase: Das PhasedCallback wird mit DriverProxyRegisterCallbackPostProcess aufgerufen, um die Treiberbereinigung zu ermöglichen.

Wenn ein Endpunkt dieselbe ID wie ein vorhandener registrierter Endpunkt aufweist, wird der Endpunkt ersetzt, aber nur, wenn er dieselbe Parameteranzahl aufweist.

Diese Funktion dient dualen Zwecken in Driver Hot-Swap V1: anfängliche Endpunktregistrierung (wobei PhasedCallback NULL sein sollte) und Endpunkttausch während Hot-Swap-Vorgängen.

Die Funktion muss bei PASSIVE_LEVEL aufgerufen werden, da sie möglicherweise auf den Abschluss vorhandener Funktionsaufrufe warten muss.

Anforderungen

Anforderung Wert
Zielplattform Universal
Header wdm.h
Library NtosKrnl.lib
IRQL PASSIVE_LEVEL

Siehe auch

IoCreateDriverProxyExtension

DRIVER_PROXY_ENDPOINT_INFORMATION

DRIVER_PROXY_REGISTER_CALLBACK

IoGetDriverProxyWrapperFromEndpoint