DEVICE_OBJECT-Struktur (wdm.h)
Die DEVICE_OBJECT-Struktur wird vom Betriebssystem verwendet, um ein Geräteobjekt darzustellen. Ein Geräteobjekt stellt ein logisches, virtuelles oder physisches Gerät dar, für das ein Treiber E/A-Anforderungen verarbeitet.
Syntax
typedef struct _DEVICE_OBJECT {
CSHORT Type;
USHORT Size;
LONG ReferenceCount;
struct _DRIVER_OBJECT *DriverObject;
struct _DEVICE_OBJECT *NextDevice;
struct _DEVICE_OBJECT *AttachedDevice;
struct _IRP *CurrentIrp;
PIO_TIMER Timer;
ULONG Flags;
ULONG Characteristics;
__volatile PVPB Vpb;
PVOID DeviceExtension;
DEVICE_TYPE DeviceType;
CCHAR StackSize;
union {
LIST_ENTRY ListEntry;
WAIT_CONTEXT_BLOCK Wcb;
} Queue;
ULONG AlignmentRequirement;
KDEVICE_QUEUE DeviceQueue;
KDPC Dpc;
ULONG ActiveThreadCount;
PSECURITY_DESCRIPTOR SecurityDescriptor;
KEVENT DeviceLock;
USHORT SectorSize;
USHORT Spare1;
struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
PVOID Reserved;
} DEVICE_OBJECT, *PDEVICE_OBJECT;
Member
Type
Wird vom Betriebssystem verwendet, um anzugeben, dass ein Objekt ein Geräteobjekt ist. Für Geräteobjekte ist der Wert dieses Members 3. Dies ist ein schreibgeschütztes Element.
Size
Gibt die Größe des Geräteobjekts in Bytes an. Diese Größe umfasst die vom Treiber angegebene Geräteerweiterung, auf die vom DeviceExtension-Member verwiesen wird, aber nicht die undurchsichtige Geräteobjekterweiterung, auf die das DeviceObjectExtension-Element verweist. Size ist ein schreibgeschütztes Element.
ReferenceCount
Wird vom E/A-Manager verwendet, um die Anzahl geöffneter Handles für das Gerät nachzuverfolgen, die dem Geräteobjekt zugeordnet sind. Dadurch kann der E/A-Manager das Entladen eines Treibers vermeiden, wenn ausstehende Ziehpunkte für die Geräte des Treibers vorhanden sind. Dies ist ein schreibgeschütztes Element.
DriverObject
Ein Zeiger auf das Treiberobjekt (DRIVER_OBJECT), das das geladene Image des Treibers darstellt, der in die DriverEntry - und AddDevice-Routinen eingegeben wurde. Dieses Element wird vom E/A-Manager bei einem erfolgreichen Aufruf von IoCreateDevice oder IoCreateDeviceSecure festgelegt. Dies ist ein schreibgeschütztes Element.
NextDevice
Ein Zeiger auf das nächste Geräteobjekt, falls vorhanden, das vom gleichen Treiber erstellt wurde. Der E/A-Manager aktualisiert diese Liste bei jedem erfolgreichen Aufruf von IoCreateDevice oder IoCreateDeviceSecure.
Ein nicht Plug & Play (PnP)-Treiber, der entladen wird, muss die Liste seiner Geräteobjekte durchlaufen ("walk") und sie löschen. Ein PnP-Treiber muss diese Liste der Geräteobjekte nicht durchlaufen. Stattdessen führen PnP-Treiber ihre Bereinigung während des PnP-Vorgangs zum Entfernen des Geräts (IRP_MN_REMOVE_DEVICE) durch.
Ein Treiber, der seine Geräteobjekte dynamisch neu erstellt, verwendet diesen Member ebenfalls. Dies ist ein Lese-/Schreibelement.
AttachedDevice
Ein Zeiger auf das angefügte Geräteobjekt. Wenn kein angefügtes Geräteobjekt vorhanden ist, ist dieses Element NULL. Das Geräteobjekt, auf das vom AttachedDevice-Member verwiesen wird, ist in der Regel das Geräteobjekt eines Filtertreibers, das E/A-Anforderungen abfängt, die ursprünglich auf das Gerät ausgerichtet sind, das vom Geräteobjekt dargestellt wird. Weitere Informationen finden Sie in den Themen IoAttachDevice und IoAttachDeviceByPointer . Dies ist ein undurchsichtiges Element.
CurrentIrp
Ein Zeiger auf den aktuellen IRP, wenn der Treiber über eine StartIo-Routine verfügt, deren Einstiegspunkt im Treiberobjekt festgelegt wurde und ob der Treiber derzeit IRP(s) verarbeitet. Andernfalls ist dieser Member NULL. Weitere Informationen finden Sie in den Themen IoStartPacket und IoStartNextPacket . Dies ist ein schreibgeschütztes Element.
Timer
Ein Zeiger auf ein Timerobjekt. Dadurch kann der E/A-Manager jede Sekunde eine vom Treiber bereitgestellte Timerroutine aufrufen. Weitere Informationen finden Sie unter IoInitializeTimer. Dies ist ein Lese-/Schreibelement.
Flags
Gerätetreiber führen einen bitweisen OR-Vorgang mit diesem Member in ihren neu erstellten Geräteobjekten aus, indem sie einen oder mehrere der folgenden systemdefinierte Werte verwenden.
Weitere Informationen zum Festlegen des Flags-Elements finden Sie unter Initialisieren eines Geräteobjekts.
Wert | Bedeutung |
---|---|
DO_VERIFY_VOLUME (0x00000002) | Wechselmedientreiber legen dieses Flag fest, während sie Übertragungsanforderungen verarbeiten. Solche Treiber sollten auch auf dieses Flag im Ziel für eine Übertragungsanforderung überprüfen, bevor sie Daten übertragen. Weitere Informationen finden Sie im Thema Unterstützen von Wechselmedien . |
DO_BUFFERED_IO (0x00000004) | Gibt den Puffertyp an, der vom E/A-Manager für E/A-Anforderungen verwendet wird, die an den Gerätestapel gesendet werden. Treiber auf höherer Ebene ODER dieses Element mit demselben Wert wie der nächstniedrige Treiber im Stapel, mit Ausnahme von Treibern der höchsten Ebene. |
DO_EXCLUSIVE (0x00000008) | Gibt an, dass der Treiber ein exklusives Gerät, z. B. ein Video-, serielles, paralleles oder Soundgerät, verwendet. WDM-Treiber dürfen dieses Flag nicht festlegen. Weitere Informationen finden Sie im Thema Angeben des exklusiven Zugriffs auf Geräteobjekte . |
DO_DIRECT_IO (0x00000010) | Siehe DO_BUFFERED_IO. |
DO_MAP_IO_BUFFER (0x00000020) | Dieses Flag wird nicht mehr verwendet. Treiber sollten dieses Flag nicht festlegen. |
DO_DEVICE_INITIALIZING (0x00000080) | Der E/A-Manager legt dieses Flag fest, wenn das Geräteobjekt erstellt wird. Ein Gerätefunktionstreiber oder Filtertreiber löscht das Flag in seiner AddDevice-Routine , nachdem es: (1) Das Geräteobjekt an den Gerätestapel angefügt hat. (2) Legt den Energiezustand des Geräts fest. (3) Führt einen bitweisen OR-Vorgang auf dem Member mit einem der Energieflags aus (falls erforderlich). Der Plug & Play-Manager (PnP) überprüft, ob das Flag nach der Rückgabe der AddDevice-Routine eindeutig ist. |
DO_SHUTDOWN_REGISTERED (0x00000800) | Wird vom E/A-Manager verwendet, um anzugeben, dass ein Treiber das Geräteobjekt für Benachrichtigungen zum Herunterfahren registriert hat. Dieses Flag sollte nicht von Treibern verwendet werden. |
DO_BUS_ENUMERATED_DEVICE (0x00001000) | Das Betriebssystem legt dieses Flag in jedem physischen Geräteobjekt (PDO) fest. Treiber dürfen dieses Flag nicht ändern. |
DO_POWER_PAGABLE (0x00002000) | Auslagerungstreiber, die mit Microsoft Windows 2000 und höheren Versionen von Windows kompatibel sind, nicht Teil des Auslagerungspfads sind und keinen Einschaltstrom erfordern, müssen dieses Flag festlegen. Das System ruft solche Treiber unter IRQL = PASSIVE_LEVEL auf. Treiber können nicht sowohl dieses Flag als auch DO_POWER_INRUSH festlegen. Alle Treiber für WDM, Microsoft Windows 98 und Windows Millennium Edition müssen DO_POWER_PAGABLE festlegen. |
DO_POWER_INRUSH (0x00004000) | Treiber von Geräten, die einen Einschaltstrom benötigen, wenn das Gerät eingeschaltet ist, müssen dieses Flag festlegen. Ein Treiber kann nicht sowohl dieses Flag als auch DO_POWER_PAGABLE festlegen. |
DO_DEVICE_TO_BE_RESET (0x04000000) | Der E/A-Manager legt dieses Flag als Signal für den Bustreiber fest, um das Gerät zurückzusetzen. Andere Treiber sollten dieses Flag nicht verwenden. |
DO_DAX_VOLUME (0x10000000) | Gibt an, dass ein Volume ein DAX-Volume ist. |
Characteristics
Gibt eine oder mehrere systemdefinierte Konstanten in Kombination mit einem bitweisen OR-Vorgang an, die zusätzliche Informationen zum Treibergerät bereitstellen. Diese Konstanten umfassen Folgendes:
Wert | Bedeutung |
---|---|
FILE_AUTOGENERATED_DEVICE_NAME | Weist den E/A-Manager an, einen Namen für das Gerät zu generieren, anstatt dass der Aufrufer beim Aufrufen dieser Routine einen DeviceName angibt. Der E/A-Manager stellt sicher, dass der Name eindeutig ist. Dieses Merkmal wird in der Regel von einem PnP-Bustreiber angegeben, um einen Namen für ein physisches Geräteobjekt (PDO) für ein untergeordnetes Gerät auf demselben Bus zu generieren. |
FILE_CHARACTERISTIC_PNP_DEVICE | Gibt an, dass das Geräteobjekt Teil eines PnP-Stapels (Plug & Play) ist. Dieses Merkmal ist erforderlich, wenn ein Bustreiber (oder Busfiltertreiber) WMI-Unterstützung für ein Geräteobjekt registriert, das die IRP_MN_START_DEVICE-Anforderung noch nicht empfangen hat. FILE_CHARACTERISTIC_PNP_DEVICE ist auch erforderlich, wenn sich ein Funktions- oder Filtertreiber vor dem Anfügen an den Gerätestapel für WMI registriert. |
FILE_CHARACTERISTIC_TS_DEVICE | Gibt an, dass das Geräteobjekt Teil eines Terminaldienste-Gerätestapels ist. Treiber sollten dieses Merkmal nicht festlegen. |
FILE_CHARACTERISTIC_WEBDAV_DEVICE | Gibt an, dass ein webbasiertes WebDAV-Dateisystem (Distributed Authoring and Versioning) auf dem Gerät eingebunden ist. Treiber sollten dieses Merkmal nicht festlegen. |
FILE_DEVICE_IS_MOUNTED | Gibt an, dass ein Dateisystem auf dem Gerät eingebunden ist. Treiber sollten dieses Merkmal nicht festlegen. |
FILE_DEVICE_SECURE_OPEN | Weist den E/A-Manager an, den Sicherheitsdeskriptor des Geräteobjekts auf relativ geöffnete und nachgestellte Dateinamen für das Gerät anzuwenden. Weitere Informationen finden Sie im Thema Steuern des Gerätenamespacezugriffs . |
FILE_FLOPPY_DISKETTE | Gibt an, dass es sich bei dem Gerät um ein Diskettengerät handelt. |
FILE_READ_ONLY_DEVICE | Gibt an, dass das Gerät nicht geschrieben werden kann. |
FILE_REMOTE_DEVICE | Gibt an, dass das Gerät remote ist. |
FILE_REMOVABLE_MEDIA | Gibt an, dass das Speichergerät Wechselmedien unterstützt. Beachten Sie, dass dieses Merkmal auf Wechselmedien und kein Wechselmedium hinweist. Beispielsweise sollten Treiber für JAZ-Laufwerkgeräte diese Eigenschaft angeben, Treiber für PCMCIA-Flash-Datenträger jedoch nicht. |
FILE_VIRTUAL_VOLUME | Gibt an, dass das Volume virtuell ist. Treiber sollten dieses Merkmal nicht festlegen. |
FILE_WRITE_ONCE_MEDIA | Gibt an, dass das Gerät einmal geschriebene Medien unterstützt. Treiber legen diesen Member nicht direkt fest. Weitere Informationen zum Festlegen von Gerätemerkmalen finden Sie im Thema Angeben von Gerätemerkmalen . |
FILE_CHARACTERISTIC_CSV | Gibt an, dass es sich bei dem Gerät um ein freigegebenes Clustervolume (CSV) handelt. |
FILE_DEVICE_ALLOW_APPCONTAINER_TRAVERSAL | Der E/A-Manager führt normalerweise eine vollständige Sicherheitsüberprüfung für den Durchlaufzugriff auf jede geöffnete Datei durch, wenn es sich beim Client um einen App-Container handelt. Durch festlegen dieses Flags wird diese erzwungene Traverse-Zugriffsüberprüfung umgangen, wenn das Clienttoken bereits über Durchlaufberechtigungen verfügt. |
FILE_PORTABLE_DEVICE | Gibt an, dass der zugrunde liegende Stapel das tragbare Gerät berücksichtigt. Dies wird vom Speicherstapel verwendet und bedeutet, dass sich das Gerät nicht im lokalen Computercontainer befindet und sich nicht auf einem festen Bustyp befindet. |
Vpb
Ein Zeiger auf den Volumeparameterblock (VPB), der dem Geräteobjekt zugeordnet ist. Bei Dateisystemtreibern kann der VPB eine Verbindung mit jedem unbenannten logischen Geräteobjekt bereitstellen, das eine instance eines eingebundenen Volumes darstellt. Dies ist ein undurchsichtiges Element.
DeviceExtension
Ein Zeiger auf die Geräteerweiterung. Die Struktur und der Inhalt der Geräteerweiterung sind treiberdefiniert. Die Größe wird vom Treiber bestimmt und im Aufruf von IoCreateDevice oder IoCreateDeviceSecure des Treibers angegeben. Weitere Informationen zu Geräteerweiterungen finden Sie unter Geräteerweiterungen. Dies ist ein schreibgeschütztes Element. Das Objekt, auf das das Element verweist, kann jedoch vom Treiber geändert werden.
DeviceType
Legen Sie durch IoCreateDevice und IoCreateDeviceSecure unter Verwendung des Werts fest, der für den DeviceType-Parameter dieser Routine angegeben wird. Weitere Informationen finden Sie im Thema Angeben von Gerätetypen .
StackSize
Gibt die Mindestanzahl von Stapelspeicherorten in IRPs an, die an diesen Treiber gesendet werden sollen. IoCreateDevice und IoCreateDeviceSecure legen diesen Member in neu erstellten Geräteobjekten auf 1 fest. Treiber der niedrigsten Ebene können diesen Member daher ignorieren. Der E/A-Manager legt den StackSize-Member im Geräteobjekt eines übergeordneten Treibers automatisch auf den entsprechenden Wert fest, wenn der Treiber IoAttachDevice oder IoAttachDeviceToDeviceStack aufruft. Nur ein Treiber auf höherer Ebene, der sich mit IoGetDeviceObjectPointer über einen anderen Treiber ketten lässt, muss den Wert von StackSize in seinen eigenen Geräteobjekten explizit auf 1 + den StackSize-Wert des Geräteobjekts des nächstniedrigen Treibers festlegen.
Queue
Wird intern vom E/A-Manager verwendet, um das Geräteobjekt bei Bedarf in die Warteschlange zu stellen. Dies ist ein undurchsichtiges Element.
Queue.ListEntry
Eine LIST_ENTRY Struktur, die Vorwärts- und Rückwärtszeiger für eine doppelt verknüpfte Liste enthält.
Queue.Wcb
Vom E/A-Manager verwendete Gerätekontextinformationen.
AlignmentRequirement
Gibt die Adressausrichtungsanforderung des Geräts für Datenübertragungen an. Der Wert muss einer der FILE_XXX_ALIGNMENT-Werte sein, die in Wdm.h definiert sind. Weitere Informationen finden Sie in den Themen Initialisieren eines Geräteobjekts, GetDmaAlignment und ZwQueryInformationFile .
DeviceQueue
Das Gerätewarteschlangenobjekt für das Geräteobjekt. Das Gerätewarteschlangenobjekt enthält alle IRPs, die darauf warten, vom Treiber verarbeitet zu werden, der dem Geräteobjekt zugeordnet ist. Weitere Informationen finden Sie im Thema Vom Treiber verwaltete IRP-Warteschlangen . Dies ist ein undurchsichtiges Element.
Dpc
Das DPC-Objekt (DeFerred Procedure Call) für das Geräteobjekt. Weitere Informationen finden Sie im Thema Einführung in DPC-Objekte . Dies ist ein undurchsichtiges Element.
ActiveThreadCount
Für die zukünftige Verwendung reserviert. Dies ist ein undurchsichtiges Element.
SecurityDescriptor
Gibt einen Sicherheitsdeskriptor (SECURITY_DESCRIPTOR) für das Geräteobjekt an, wenn das Geräteobjekt erstellt wird. Wenn dieses Element NULL ist, empfängt das Geräteobjekt die Standardsicherheitseinstellungen. Dies ist ein schreibgeschütztes Element, obwohl das Element über die ZwSetSecurityObject-Funktion geändert werden kann.
DeviceLock
Ein Synchronisierungsereignisobjekt, das vom E/A-Manager zugeordnet wird. Der E/A-Manager ruft sein Ereignisobjekt ab, bevor er eine Bereitstellungs- oder Einbindungsüberprüfungsanforderung an einen Dateisystemtreiber sendet. Dies ist ein undurchsichtiges Element.
SectorSize
Wenn das Geräteobjekt kein Volume darstellt, wird dieses Element auf 0 festgelegt. Wenn das Geräteobjekt ein Volume darstellt, gibt dieses Element die Sektorgröße des Volumes in Bytes an. Der E/A-Manager verwendet diesen Member, um sicherzustellen, dass alle Ausgegebenen Lesevorgänge, Schreibvorgänge und Festlegen von Dateipositionsvorgängen ordnungsgemäß ausgerichtet werden, wenn die Zwischenpufferung deaktiviert ist. Beim Erstellen des Geräteobjekts wird ein Standardmäßiger Systembyte-pro-Sektor-Wert verwendet, jedoch Dateisystemtreiber. Und seltener können Legacy- und Minifiltertreiber diesen Wert aktualisieren, der auf der Geometrie der zugrunde liegenden Volumehardware basiert, wenn eine Bereitstellung erfolgt. Andere Treiber sollten diesen Member nicht ändern.
Spare1
Ist für das System reserviert. Dies ist ein undurchsichtiges Element.
DeviceObjectExtension
Ein Zeiger auf eine Geräteobjekterweiterung, die vom E/A-Manager und PnP-Manager verwendet wird, um Informationen zum Zustand des Geräts zu speichern. Dies ist ein undurchsichtiges Element.
Reserved
Ist für das System reserviert. Dies ist ein undurchsichtiges Element.
Hinweise
Das Betriebssystem stellt Geräte nach Geräteobjekten dar. Weitere Informationen finden Sie im Thema Geräteobjekte und Gerätestapel .
Treiber erstellen Geräteobjekte mithilfe der Routinen IoCreateDevice und IoCreateDeviceSecure . Weitere Informationen zum Erstellen von Geräteobjekten finden Sie unter Erstellen eines Geräteobjekts.
Ein Geräteobjekt ist teilweise undurchsichtig. Treiber legen Elemente des Geräteobjekts nicht direkt fest, es sei denn, es ist anders dokumentiert. Weitere Informationen zu den Membern, die Treiber direkt ändern können, finden Sie unter Initialisieren eines Geräteobjekts. Informationen zu anderen Geräteobjekteigenschaften finden Sie unter Eigenschaften von Geräteobjekten.
Undurchsichtige Member innerhalb eines Geräteobjekts müssen als nicht zugänglich betrachtet werden. Treiber, die Abhängigkeiten von Objektmemberspeicherorten oder Zugriff auf undurchsichtige Member aufweisen, bleiben möglicherweise nicht portabel und interoperabel mit anderen Treibern im Laufe der Zeit.
Der vom System bereitgestellte Videoporttreiber richtet die Felder der Geräteobjekte ein, die er im Auftrag von Video-Miniporttreibern erstellt.
Der vom System bereitgestellte SCSI-Porttreiber richtet die Felder der Geräteobjekte ein, die er im Auftrag von SCSI-Miniporttreibern erstellt.
Die systemseitig bereitgestellte NDIS-Bibliothek richtet die Felder der Geräteobjekte ein, die sie im Auftrag von NDIS-Miniporttreibern erstellt.
Anforderungen
Anforderung | Wert |
---|---|
Header | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h, Fltkernel.h) |