EVT_WDF_DEVICE_PROCESS_QUERY_INTERFACE_REQUEST Rückruffunktion (wdfqueryinterface.h)
[Gilt nur für KMDF]
Die EvtDeviceProcessQueryInterfaceRequest Ereignisrückruffunktion eines Treibers untersucht die Anforderung eines anderen Treibers für den Zugriff auf eine treiberdefinierte Schnittstelle, bevor das Framework die Schnittstelle an den anfordernden Treiber übergibt.
Syntax
EVT_WDF_DEVICE_PROCESS_QUERY_INTERFACE_REQUEST EvtWdfDeviceProcessQueryInterfaceRequest;
NTSTATUS EvtWdfDeviceProcessQueryInterfaceRequest(
[in] WDFDEVICE Device,
[in] LPGUID InterfaceType,
[in, out] PINTERFACE ExposedInterface,
[in, out] PVOID ExposedInterfaceSpecificData
)
{...}
Parameter
[in] Device
Ein Handle zu einem Framework-Geräteobjekt.
[in] InterfaceType
Ein Zeiger auf die GUID, die die vom Treiber definierte Schnittstelle identifiziert.
[in, out] ExposedInterface
Ein Zeiger auf eine INTERFACE Struktur, die die treiberdefinierte Schnittstelle beschreibt und vom Treiber bereitgestellt wurde, der Zugriff auf die Schnittstelle anfordert.
[in, out] ExposedInterfaceSpecificData
Ein Zeiger auf zusätzliche, optionale, treiberdefinierte schnittstellenspezifische Informationen. Frameworkbasierte Treiber geben diesen Wert an, indem beim Aufrufen WdfFdoQueryForInterfaceein nichtNULL-InterfaceSpecificData-parameterwert angegeben wird.
Rückgabewert
Wenn die EvtDeviceProcessQueryInterfaceRequest Rückruffunktion eine von ihr unterstützte GUID empfängt und wenn die Funktion keine Fehler aufweist, muss sie STATUS_SUCCESS oder einen anderen Statuswert zurückgeben, für den NT_SUCCESS(Status) TRUEentspricht. Das Framework übergibt weiterhin die Anforderung nach unten, um festzustellen, ob zusätzliche Treiber auch die Schnittstelle unterstützen.
Die EvtDeviceProcessQueryInterfaceRequest Rückruffunktion muss STATUS_NOT_SUPPORTED zurückgeben, wenn festgestellt wird, dass die Schnittstelle für einen bestimmten Fall nicht gewartet wird. Das Framework übergibt weiterhin die Anforderung nach unten, um festzustellen, ob ein anderer Treiber die Schnittstelle unterstützt. Weitere Informationen zu dieser Situation finden Sie im folgenden Abschnitt "Hinweise".
Wenn bei der Rückruffunktion ein Fehler auftritt, muss ein Statuswert zurückgegeben werden, für den NT_SUCCESS(Status) FALSE-ist. Das Framework schlägt die Anforderung des anderen Treibers für die Schnittstelle fehl und übergibt die Anforderung nicht an den Stapel.
Bemerkungen
Frameworkbasierte Treiber registrieren eine EvtDeviceProcessQueryInterfaceRequest Ereignisrückruffunktion durch Aufrufen WdfDeviceAddQueryInterface.
Wenn die vom Treiber definierte Schnittstelle nur unidirektionale Kommunikation unterstützt und das ImportInterface Element der WDF_QUERY_INTERFACE_CONFIG-Struktur festlegt, das die Schnittstelle zu FALSE-beschreibt, ist die EvtDeviceProcessQueryInterfaceRequest Rückruffunktion optional. Wenn ein anderer Treiber WdfFdoQueryForInterfaceaufruft, kopiert das Framework die treiberdefinierte Schnittstellenwerte in die INTERFACE Struktur des anfordernden Treibers und ruft dann die Rückruffunktion auf. Für eine unidirektionale Kommunikation müssen Sie eine Rückruffunktion nur bereitstellen, wenn der Treiber die Schnittstellenwerte überprüfen und möglicherweise ändern soll, bevor das Framework sie an den anfordernden Treiber zurückgibt.
Ihr Treiber muss eine EvtDeviceProcessQueryInterfaceRequest Ereignisrückruffunktion bereitstellen, wenn der Treiber eine Schnittstelle definiert, die bidirektionale Kommunikation unterstützt (und das ImportInterface Member der WDF_QUERY_INTERFACE_CONFIG Struktur auf TRUEfestgelegt). Die Rückruffunktion ist erforderlich, da, wenn ImportInterface-TRUE- ist und ein anderer Treiber WdfFdoQueryForInterfaceaufruft, kopiert das Framework die vom Treiber definierte Schnittstelle nicht in die Anforderungstreiberschnittstellenstruktur. Stattdessen muss die Rückruffunktion die Schnittstellenstruktur des anfordernden Treibers aktualisieren.
Die Rückruffunktion kann die Schnittstelle ändern. Insbesondere kann dies:
- Ändern Sie einen beliebigen Wert in einem beliebigen Element der Schnittstelle.
- Weisen Sie einen dynamischen instanzspezifischen Kontext zu, indem Sie das Context Member der INTERFACE Struktur ändern.
Weitere Informationen zu treiberdefinierten Schnittstellen finden Sie unter Using Driver-Defined Interfaces.
Beispiele
Um eine EvtDeviceProcessQueryInterfaceRequest Rückruffunktion zu definieren, müssen Sie zuerst eine Funktionsdeklaration bereitstellen, die den Typ der rückruffunktion identifiziert, die Sie definieren. 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.
Um beispielsweise eine EvtDeviceProcessQueryInterfaceRequest Rückruffunktion zu definieren, die MyDeviceProcessQueryInterfaceRequestheißt, verwenden Sie den EVT_WDF_DEVICE_PROCESS_QUERY_INTERFACE_REQUEST Typ, wie in diesem Codebeispiel gezeigt:
EVT_WDF_DEVICE_PROCESS_QUERY_INTERFACE_REQUEST MyDeviceProcessQueryInterfaceRequest;
Implementieren Sie dann die Rückruffunktion wie folgt:
_Use_decl_annotations_
NTSTATUS
MyDeviceProcessQueryInterfaceRequest (
WDFDEVICE Device,
LPGUID InterfaceType,
PINTERFACE ExposedInterface,
PVOID ExposedInterfaceSpecificData
)
{...}
Der EVT_WDF_DEVICE_PROCESS_QUERY_INTERFACE_REQUEST Funktionstyp wird in der Headerdatei WdfQueryInterface.h 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 EVT_WDF_DEVICE_PROCESS_QUERY_INTERFACE_REQUEST 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 KMDF-Treiber. Informationen zu Use_decl_annotationsfinden Sie unter Annotating Function Behavior.
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform- | Universal |
Minimale KMDF-Version | 1.0 |
Header- | wdfqueryinterface.h (einschließen Wdf.h) |
IRQL- | PASSIVE_LEVEL |