Erstellen eines Geräteobjekts

Ein monolithischer Treiber muss ein Geräteobjekt für jedes physische, logische oder virtuelle Gerät erstellen, für das E/A-Anforderungen verarbeitet werden. Ein Treiber, der kein Geräteobjekt für ein Gerät erstellt, empfängt keine IRPs für das Gerät.

In einigen Technologiebereichen muss ein Minitreiber, der einem Klassentreiber oder Porttreiber zugeordnet ist, keine eigenen Geräteobjekte erstellen. Stattdessen erstellt die Klasse oder der Porttreiber das Geräteobjekt und empfängt alle IRPs für das Gerät. Der Klassen- oder Porttreiber verwendet dann eine treiberspezifische Methode, um die E/A-Anforderung an den Minitreiber zu übergeben. In der Dokumentation für Ihren jeweiligen Technologiebereich erfahren Sie, ob Microsoft einen Klassen- oder Porttreiber bereitstellt, der Geräteobjekte im Namen Ihres Treibers erstellt.

Treiber rufen entweder IoCreateDevice oder IoCreateDeviceSecure auf, um ihre Geräteobjekte zu erstellen. Weitere Informationen zur zu verwendenden Routine finden Sie in den folgenden Abschnitten.

Erstellen von Geräteobjekten für WDM-Funktions- und Filtertreiber

Erstellen von Geräteobjekten für WDM-Bustreiber

Erstellen von Geräteobjekten für Nicht-WDM-Treiber

Wenn der Treiber ein Geräteobjekt erstellt, stellt er ioCreateDevice oder IoCreateDeviceSecure die folgenden Informationen bereit:

  • Die Größe der Geräteerweiterung des Geräts. Die Geräteerweiterung ist ein vom System zugeordneter Speicherbereich, den der Treiber für gerätespezifischen Speicher verwenden kann. Weitere Informationen finden Sie unter Geräteerweiterungen.

  • Eine systemdefinierte Konstante, die den vom Geräteobjekt dargestellten DeviceType angibt. Weitere Informationen finden Sie unter Angeben von Gerätetypen.

  • Eine oder mehrere vom System definierte ORed-Konstanten, die die Gerätemerkmale für das Gerät angeben. Weitere Informationen finden Sie unter Angeben von Gerätemerkmalen.

  • Ein boolescher Wert namens Exclusive, der angibt, ob ein Bit in den Flags des Geräteobjekts mit DO_EXCLUSIVE festgelegt werden soll, was angibt, dass der Treiber ein exklusives Gerät wie ein Video-, serielles, paralleles oder Soundgerät bereitstellt. WDM-Treiber müssen Exklusiv auf FALSE festlegen. Weitere Informationen finden Sie unter Angeben des exklusiven Zugriffs auf Geräteobjekte.

  • Ein Zeiger auf das Treiberobjekt für den Treiber. Eine WDM-Funktion oder ein Filtertreiber empfängt einen Zeiger auf sein Treiberobjekt als Parameter auf die AddDevice-Routine . Alle Treiber erhalten einen Zeiger auf ihr Treiberobjekt in ihrer DriverEntry-Routine . Das System verwendet diesen Zeiger, um den Treiber seinem Geräteobjekt zuzuordnen.

  • Ein optionaler Zeiger auf eine mit NULL endende Unicode-Zeichenfolge (DeviceName), die das Gerät benennt. WDM-Treiber, mit Ausnahme von Bustreibern, geben keinen Gerätenamen an. Dadurch werden die Sicherheitsfeatures des PnP-Managers umgangen. Weitere Informationen finden Sie unter Benannte Geräteobjekte.

Wenn der Aufruf von IoCreateDevice oder IoCreateDeviceSecure erfolgreich ist, stellt der E/A-Manager Speicher für das Geräteobjekt selbst und für alle anderen Datenstrukturen bereit, die dem Geräteobjekt zugeordnet sind, einschließlich der Geräteerweiterung, die mit Nullen initialisiert wird.

Erstellen von Geräteobjekten für WDM-Funktions- und Filtertreiber

WDM-Treiber, die keine Bustreiber sind, rufen IoCreateDevice auf, um ihre Geräteobjekte zu erstellen. Die meisten WDM-Treiber erstellen ihre Geräteobjekte aus ihren AddDevice-Routinen . Einige Treiber, z. B. Datenträgertreiber, die auf IOCTLs des Laufwerklayouts reagieren müssen, rufen IoCreateDevice aus einer Dispatchroutine auf.

Sofern gerätetypspezifische Abschnitte des Windows Driver Kit (WDK)-Dokumentationszustands nicht anderweitig angegeben sind, sollte Ihr Treiber seine Geräteobjekte in seiner AddDevice-Routine erstellen. Weitere Informationen finden Sie unter Schreiben einer AddDevice-Routine.

Erstellen von Geräteobjekten für WDM-Bustreiber

Ein WDM-Bustreiber erstellt eine PDO, wenn er ein neues Gerät als Reaktion auf eine IRP_MN_QUERY_DEVICE_RELATIONS-Anforderung aufzählt, wenn der Beziehungstyp BusRelations ist.

Die folgenden Regeln bestimmen, ob ein Bustreiber IoCreateDevice oder IoCreateDeviceSecure aufruft, um ein Geräteobjekt zu erstellen:

  • Wenn ein Gerät im Rohmodus verwendet werden kann, muss es IoCreateDeviceSecure aufrufen.

  • Wenn das Gerät nicht für den Rohmodus geeignet ist, kann der Bustreiber entweder IoCreateDevice oder IoCreateDeviceSecure verwenden. IoCreateDevice kann verwendet werden, wenn die Standardsystemsicherheit für Geräte auf dem Bus ausreichend ist. IoCreateDeviceSecure kann verwendet werden, um einen strengeren Sicherheitsdeskriptor anzugeben. Weitere Informationen finden Sie unter Steuern des Gerätezugriffs.

Erstellen von Geräteobjekten für Nicht-WDM-Treiber

Ein Nicht-WDM-Treiber verwendet IoCreateDevice , um unbenannte Geräteobjekte zu erstellen, und IoCreateDeviceSecure zum Erstellen benannter Geräteobjekte. Beachten Sie, dass auf die unbenannten Geräteobjekte eines Nicht-WDM-Treibers nicht über den Benutzermodus zugegriffen werden kann, sodass der Treiber in der Regel mindestens ein benanntes Objekt erstellen muss.