Erstellen von Geräteobjekten in einem Funktionstreiber
Jeder Funktionstreiber erstellt ein Framework-Geräteobjekt für jedes seiner unterstützten Geräte, die im System vorhanden sind. Da diese Geräteobjekte von Funktionstreibern erstellt werden, werden sie als funktionale Geräteobjekte (FDOs) bezeichnet. Jede FDO ist die Darstellung eines Geräts durch einen Funktionstreiber.
Ein Funktionstreiber muss jedes Mal ein Framework-Geräteobjekt erstellen, wenn das Framework die Rückruffunktion EvtDriverDeviceAdd des Treibers aufruft. Das Framework ruft diese Rückruffunktion auf, um den Treiber darüber zu informieren, dass eines seiner unterstützten Geräte im System vorhanden ist.
Die Rückruffunktion EvtDriverDeviceAdd des Treibers empfängt einen Zeiger auf eine WDFDEVICE_INIT-Struktur . Der Treiber kann eine Reihe von Frameworkmethoden für die Geräteobjektinitialisierung aufrufen, die Informationen in der WDFDEVICE_INIT-Struktur speichern. Darüber hinaus können Funktionstreiber Framework-FDO-Initialisierungsmethoden aufrufen.
Das Erstellen eines Framework-Geräteobjekts in einem Funktionstreiber umfasst in der Regel die folgenden Schritte:
Registrieren von PnP-, Power- und Power Policy-Rückruffunktionen.
Die meisten Funktionstreiber rufen WdfDeviceInitSetPnpPowerEventCallbacks auf, um PnP- und Power-Rückruffunktionen zu registrieren. Weitere Informationen zu diesen Rückruffunktionen finden Sie unter Unterstützen der PnP- und Energieverwaltung in Funktionstreibern.
Wenn das Gerät den Leerlauf mit niedrigem Stromverbrauch unterstützt oder über Aktivierungsfunktionen verfügt, ruft der Funktionstreiber in der Regel auch WdfDeviceInitSetPowerPolicyEventCallbacks auf, um Rückruffunktionen für Energierichtlinien zu registrieren. Weitere Informationen zu diesen Rückruffunktionen finden Sie unter Power Policy Ownership.
Registrieren von funktionstreiberspezifischen Rückruffunktionen.
Einige Funktionstreiber rufen WdfFdoInitSetEventCallbacks auf, wenn sie an der Angabe der Für ein Gerät benötigten Systemhardwareressourcen beteiligt sein müssen. Weitere Informationen zu Hardwareressourcen finden Sie unter Hardwareressourcen für Framework-Based Treiber.
Registrieren von Dateiereignisrückruffunktionen.
Wenn Ihr Treiber reagieren muss, wenn eine Anwendung eine Datei auf einem Gerät öffnet oder schließt, muss der Treiber WdfDeviceInitSetFileObjectConfig aufrufen, um Rückruffunktionen für das Frameworkdateiobjekt zu registrieren. Weitere Informationen finden Sie unter Verwenden von Framework-Dateiobjekten.
Festlegen von E/A-Anforderungsattributen.
Wenn Ihr Treiber E/A-Anforderungen von Framework-Warteschlangenobjekten empfängt, kann der Treiber WdfDeviceInitSetRequestAttributes aufrufen, um Kontextspeicher einzurichten, den das Framework den Anforderungsobjekten eines Geräts zuweist. Weitere Informationen finden Sie unter Verwenden des Anforderungsobjektkontexts.
Festlegen von Gerätemerkmalen.
In der Regel ruft ein Funktionstreiber einige der folgenden Methoden auf, um die Merkmale eines Geräts anzugeben:
- WdfDeviceInitSetDeviceType, um den Vom Treiber unterstützten Hardwaretyp zu identifizieren.
- WdfDeviceInitSetIoType, um eine Methode für den Zugriff auf Datenpuffer zu identifizieren, wenn der Treiber E/A-Anforderungen von Anwendungen verarbeitet.
- WdfDeviceInitSetCharacteristics, um Gerätemerkmale festzulegen, z. B. ob das Gerät schreibgeschützt ist oder Wechselmedien unterstützt.
- WdfDeviceInitSetExclusive, wenn das Gerät exklusiven Zugriff von jeweils einer Anwendung erfordert.
- WdfDeviceInitSetPowerInrush, wenn das Gerät einen Stromeinstrom benötigt, wenn es von einem Energiesparzustand in den Betriebszustand (D0) wechselt.
- WdfDeviceInitSetPowerPageable oder WdfDeviceInitSetPowerNotPageable, um anzugeben, ob der Treiber auf auslagerungsfähige Daten zugreifen muss, während das System zwischen einem Ruhezustand und dem Arbeitszustand (S0) wechselt.
- WdfDeviceInitAssignName, um dem Geräteobjekt einen Namen zuzuweisen.
- WdfDeviceInitAssignSDDLString, um dem Geräteobjekt einen Sicherheitsdeskriptor zuzuweisen.
- WdfDeviceInitSetDeviceClass, um die Setupklasse des Geräts zu identifizieren.
Abrufen von Geräteeigenschaften.
Manchmal müssen Funktionstreiber Informationen über die Geräteeigenschaften abrufen, die der Treiber für den Gerätebus oder einen anderen Treiber auf niedrigerer Ebene festgelegt hat. Der Treiber kann WdfFdoInitQueryProperty oder WdfFdoInitAllocAndQueryProperty aufrufen, um diese Informationen abzurufen. Neue Treiber für Windows 8.1 und höher können WdfFdoInitQueryPropertyEx und WdfFdoInitAllocAndQueryPropertyEx aufrufen.
Zugreifen auf den Registrierungsschlüssel des Geräts.
Einige Funktionstreiber müssen Informationen zu dem Gerät oder Treiber abrufen, das ein anderer Treiber, ein Benutzer oder ein Installationspaket in der Registrierung platziert hat. Der Treiber kann WdfFdoInitOpenRegistryKey aufrufen, um den Registrierungsschlüssel des Geräts oder Treibers zu öffnen. Weitere Informationen finden Sie unter Verwenden der Registrierung in Framework-Based Treibern.
Erstellen einer standardmäßigen untergeordneten Listenkonfiguration, die für die dynamische Enumeration verwendet werden soll.
Wenn Sie einen Funktionstreiber für einen Bus schreiben und Ihr Treiber eine dynamische Enumeration untergeordneter Geräte ausführt, die mit dem Bus verbunden sind, muss der Treiber WdfFdoInitSetDefaultChildListConfig aufrufen. Weitere Informationen finden Sie unter Auflisten der Geräte in einem Bus.
Erstellen des Geräteobjekts.
Der letzte Schritt beim Erstellen eines Geräteobjekts besteht darin, WdfDeviceCreate aufzurufen.