Erstellen von Geräteobjekten in einem Bustreiber
Jeder Bustreiber muss ein Framework-Geräteobjekt erstellen, wenn er erkennt, dass ein untergeordnetes Gerät mit einem übergeordneten Gerät verbunden ist. Das übergeordnete Gerät ist in der Regel ein Bus, aber es kann auch ein Multifunktionsgerät sein, für das jede Funktion einen separaten Satz von Treibern erfordert (z. B. eine Soundkarte, die digitales Audio und MIDI unterstützt). Die Geräteobjekte, die Von Bustreibern erstellt werden, werden als physische Geräteobjekte (PDOs) bezeichnet, da jedes eine tatsächliche Verbindung zwischen einem Hardwareteil (dem untergeordneten Element) mit einem anderen (dem übergeordneten Element) darstellt.
Der Prozess zum Identifizieren und Melden der Geräte, die mit einem Bus verbunden sind, wird als Busenumeration bezeichnet.
Wenn ein Bustreiber eine dynamische Busaufzählung ausführt, empfängt seine EvtChildListCreateDevice-Rückruffunktion ein Handle für eine WDFDEVICE_INIT-Struktur .
Wenn ein Bustreiber eine statische Busaufzählung ausführt, muss er WdfPdoInitAllocate aufrufen, um ein Handle für eine WDFDEVICE_INIT-Struktur abzurufen.
Weitere Informationen zur Busaufzählung finden Sie unter Auflisten der Geräte in einem Bus.
Ein Bustreiber kann eine Reihe von Framework-Geräteobjektinitialisierungsmethoden aufrufen, die Informationen in der WDFDEVICE_INIT-Struktur speichern. Darüber hinaus können Bustreiber Framework-PDO-Initialisierungsmethoden aufrufen.
Das Erstellen eines Framework-Geräteobjekts für ein aufgezähltes untergeordnetes Gerät umfasst in der Regel die folgenden Schritte:
Registrieren von Bustreiber-spezifischen Rückruffunktionen.
Die meisten Bustreiber rufen WdfPdoInitSetEventCallbacks auf, da sie die Systemhardwareressourcen angeben müssen, die ein Gerät benötigt. Weitere Informationen zum Angeben von Hardwareressourcen finden Sie unter Hardwareressourcen für Framework-Based Treiber. Zusätzliche Rückruffunktionen können registriert werden, wenn das Gerät und der Treiber den Auswurf unterstützen.
Melden von Geräteidentifikationszeichenfolgen.
Bustreiber müssen die Identifikationszeichenfolgen des Geräts melden, indem sie WdfPdoInitAssignDeviceID, WdfPdoInitAssignInstanceID, WdfPdoInitAddCompatibleID und WdfPdoInitAddHardwareID für jeden vom Gerät unterstützten Zeichenfolgentyp aufrufen. Darüber hinaus können Bustreiber, die Version 1.9 oder höher des Frameworks verwenden , WdfPdoInitAssignContainerID aufrufen.
Gibt an, ob der Bustreiber das Gerät im Unformatierten Modus unterstützen kann.
Wenn der Bustreiber den Unformatierten Modus für das Gerät unterstützt, muss er WdfPdoInitAssignRawDevice aufrufen.
Bereitstellen von anzeigebarem Text, der das Gerät beschreibt.
Bustreiber rufen WdfPdoInitAddDeviceText und WdfPdoInitSetDefaultLocale auf, um Text bereitzustellen, der das Gerät für Benutzer in mehreren Sprachen beschreibt.
Erstellen des Geräteobjekts.
Der letzte Schritt beim Erstellen eines Geräteobjekts besteht darin, WdfDeviceCreate aufzurufen.
Wenn beim Initialisieren der WDFDEVICE_INIT Struktur, die er aus WdfPdoInitAllocate abgerufen hat, ein Fehler auftritt, muss der Treiber WdfDeviceInitFree anstelle von WdfDeviceCreate aufrufen.
Nachdem der Bustreiber das Geräteobjekt erstellt hat, ruft er in der Regel WdfDeviceSetPnpCapabilities und WdfDeviceSetPowerCapabilities auf, um die Plug & Play und Energiefunktionen des Geräts zu melden.
Jeder Bustreiber ist auch der Funktionstreiber für den Busadapter. Daher muss der Treiber auch eine EvtDriverDeviceAdd-Rückruffunktion bereitstellen. Diese Rückruffunktion erstellt ein funktionales Geräteobjekt (Functional Device Object, FDO) für jeden Busadapter im System. Weitere Informationen zum Erstellen von FDOs finden Sie unter Erstellen von Geräteobjekten in einem Funktionstreiber.