DEVICE_OBJECT structure (wdm.h)
La structure DEVICE_OBJECT est utilisée par le système d’exploitation pour représenter un objet d’appareil. Un objet d’appareil représente un appareil logique, virtuel ou physique pour lequel un pilote gère les demandes d’E/S.
Syntaxe
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;
Membres
Type
Utilisé par le système d’exploitation pour indiquer qu’un objet est un objet d’appareil. Pour les objets d’appareil, la valeur de ce membre est 3. Il s’agit d’un membre en lecture seule.
Size
Spécifie la taille, en octets, de l’objet d’appareil. Cette taille inclut l’extension de périphérique spécifiée par le pilote pointée par le membre DeviceExtension , mais n’inclut pas l’extension d’objet de périphérique opaque pointée par le membre DeviceObjectExtension . Size est un membre en lecture seule.
ReferenceCount
Utilisé par le gestionnaire d’E/S pour suivre le nombre de handles ouverts pour l’appareil qui sont associés à l’objet d’appareil. Cela permet au gestionnaire d’E/S d’éviter de décharger un pilote lorsqu’il existe des poignées en attente pour le ou les périphériques du pilote. Il s’agit d’un membre en lecture seule.
DriverObject
Pointeur vers l’objet driver (DRIVER_OBJECT), qui représente l’image chargée du pilote qui a été entrée dans les routines DriverEntry et AddDevice . Ce membre est défini par le gestionnaire d’E/S lors d’un appel réussi à IoCreateDevice ou IoCreateDeviceSecure. Il s’agit d’un membre en lecture seule.
NextDevice
Pointeur vers l’objet de périphérique suivant, le cas échéant, qui a été créé par le même pilote. Le gestionnaire d’E/S met à jour cette liste à chaque appel réussi à IoCreateDevice ou IoCreateDeviceSecure.
Un pilote non-Plug-and-Play (PnP) en cours de déchargement doit parcourir (« parcourir ») la liste de ses objets d’appareil et les supprimer. Un pilote PnP n’a pas besoin d’parcourir cette liste d’objets d’appareil. Au lieu de cela, les pilotes PnP effectuent leur nettoyage pendant l’opération PnP de suppression de périphérique (IRP_MN_REMOVE_DEVICE).
Un pilote qui recrée dynamiquement ses objets d’appareil utilise également ce membre. Il s’agit d’un membre en lecture/écriture.
AttachedDevice
Pointeur vers l’objet d’appareil attaché. S’il n’y a pas d’objet d’appareil attaché, ce membre est NULL. L’objet d’appareil vers lequel pointe le membre AttachedDevice est généralement l’objet d’appareil d’un pilote de filtre, qui intercepte les demandes d’E/S initialement ciblées sur l’appareil représenté par l’objet de périphérique. Pour plus d’informations, consultez les rubriques IoAttachDevice et IoAttachDeviceByPointer . Il s’agit d’un membre opaque.
CurrentIrp
Pointeur vers l’IRP actuel si le pilote a une routine StartIo dont le point d’entrée a été défini dans l’objet pilote et si le pilote traite actuellement les IRP. Sinon, ce membre est NULL. Pour plus d’informations, consultez les rubriques IoStartPacket et IoStartNextPacket . Il s’agit d’un membre en lecture seule.
Timer
Pointeur vers un objet minuteur. Cela permet au gestionnaire d’E/S d’appeler une routine de minuteur fournie par le pilote toutes les secondes. Pour plus d’informations, consultez IoInitializeTimer. Il s’agit d’un membre en lecture/écriture.
Flags
Les pilotes de périphérique effectuent une opération OR au niveau du bit avec ce membre dans leurs nouveaux objets d’appareil en utilisant une ou plusieurs des valeurs définies par le système suivantes.
Pour plus d’informations sur la définition du membre Flags , consultez Initialisation d’un objet Device.
Valeur | Signification |
---|---|
DO_VERIFY_VOLUME (0x00000002) | Les pilotes de média amovible définissent cet indicateur pendant qu’ils traitent les demandes de transfert. Ces pilotes doivent également case activée pour cet indicateur dans la cible pour une demande de transfert avant de transférer des données. Pour plus d’informations, consultez la rubrique Prise en charge du support amovible . |
DO_BUFFERED_IO (0x00000004) | Spécifie le type de mise en mémoire tampon utilisée par le gestionnaire d’E/S pour les demandes d’E/S envoyées à la pile d’appareils. Pilotes de niveau supérieur OU ce membre avec la même valeur que le pilote inférieur suivant dans la pile, sauf éventuellement pour les pilotes de niveau supérieur. |
DO_EXCLUSIVE (0x00000008) | Indique que le pilote met en service un appareil exclusif, tel qu’un périphérique vidéo, série, parallèle ou audio. Les pilotes WDM ne doivent pas définir cet indicateur. Pour plus d’informations, consultez la rubrique Spécification de l’accès exclusif aux objets d’appareil . |
DO_DIRECT_IO (0x00000010) | Voir DO_BUFFERED_IO. |
DO_MAP_IO_BUFFER (0x00000020) | Cet indicateur n’est plus utilisé. Les pilotes ne doivent pas définir cet indicateur. |
DO_DEVICE_INITIALIZING (0x00000080) | Le gestionnaire d’E/S définit cet indicateur lorsqu’il crée l’objet d’appareil. Un pilote de fonction de périphérique ou un pilote de filtre efface l’indicateur dans sa routine AddDevice , après : (1) Attache l’objet de périphérique à la pile de périphériques. (2) Établit l’état d’alimentation de l’appareil. (3) Effectue une opération OR au niveau du bit sur le membre avec l’un des indicateurs d’alimentation (si nécessaire). Le gestionnaire Plug-and-Play (PnP) vérifie que l’indicateur est clair après le retour de la routine AddDevice. |
DO_SHUTDOWN_REGISTERED (0x00000800) | Utilisé par le gestionnaire d’E/S pour indiquer qu’un pilote a inscrit l’objet de périphérique pour les notifications d’arrêt. Cet indicateur ne doit pas être utilisé par les pilotes. |
DO_BUS_ENUMERATED_DEVICE (0x00001000) | Le système d’exploitation définit cet indicateur dans chaque objet d’appareil physique (PDO). Les pilotes ne doivent pas modifier cet indicateur. |
DO_POWER_PAGABLE (0x00002000) | Les pilotes paginables compatibles avec Microsoft Windows 2000 et versions ultérieures de Windows, ne font pas partie du chemin d’accès de pagination et ne nécessitent pas d’appel actuel doivent définir cet indicateur. Le système appelle ces pilotes à IRQL = PASSIVE_LEVEL. Les pilotes ne peuvent pas définir cet indicateur et ce DO_POWER_INRUSH. Tous les pilotes pour WDM, Microsoft Windows 98 et Windows Millennium Edition doivent définir DO_POWER_PAGABLE. |
DO_POWER_INRUSH (0x00004000) | Les pilotes des appareils qui nécessitent un courant d’appel lorsque l’appareil est allumé doivent définir cet indicateur. Un pilote ne peut pas définir cet indicateur et ce DO_POWER_PAGABLE. |
DO_DEVICE_TO_BE_RESET (0x04000000) | Le gestionnaire d’E/S définit cet indicateur en tant que signal pour que le pilote de bus réinitialise l’appareil. Les autres pilotes ne doivent pas utiliser cet indicateur. |
DO_DAX_VOLUME (0x10000000) | Indique qu’un volume est un volume DAX. |
Characteristics
Spécifie une ou plusieurs constantes définies par le système, combinées à une opération OR au niveau du bit, qui fournissent des informations supplémentaires sur le périphérique du pilote. Ces constantes sont les suivantes :
Valeur | Signification |
---|---|
FILE_AUTOGENERATED_DEVICE_NAME | Indique au gestionnaire d’E/S de générer un nom pour l’appareil, au lieu que l’appelant spécifie un DeviceName lorsqu’il appelle cette routine. Le gestionnaire d’E/S vérifie que le nom est unique. Cette caractéristique est généralement spécifiée par un pilote de bus PnP pour générer un nom pour un objet de périphérique physique (PDO) pour un appareil enfant sur le même bus. |
FILE_CHARACTERISTIC_PNP_DEVICE | Indique que l’objet d’appareil fait partie d’une pile de Plug-and-Play (PnP). Cette caractéristique est requise si un pilote de bus (ou un pilote de filtre de bus) inscrit la prise en charge de WMI pour un objet de périphérique qui n’a pas encore reçu la demande de IRP_MN_START_DEVICE . FILE_CHARACTERISTIC_PNP_DEVICE est également nécessaire si un pilote de fonction ou de filtre s’inscrit pour WMI avant de l’attacher à sa pile de périphériques. |
FILE_CHARACTERISTIC_TS_DEVICE | Indique que l’objet d’appareil fait partie d’une pile d’appareils Terminal Services. Les pilotes ne doivent pas définir cette caractéristique. |
FILE_CHARACTERISTIC_WEBDAV_DEVICE | Indique qu’un système de fichiers Web-based Distributed Authoring and Versioning (WebDAV) est monté sur l’appareil. Les pilotes ne doivent pas définir cette caractéristique. |
FILE_DEVICE_IS_MOUNTED | Indique qu’un système de fichiers est monté sur l’appareil. Les pilotes ne doivent pas définir cette caractéristique. |
FILE_DEVICE_SECURE_OPEN | Indique au gestionnaire d’E/S d’appliquer le descripteur de sécurité de l’objet d’appareil aux ouvertures relatives et au nom de fichier de fin s’ouvre pour l’appareil. Pour plus d’informations, consultez la rubrique Contrôle de l’accès à l’espace de noms des appareils . |
FILE_FLOPPY_DISKETTE | Indique que l’appareil est une unité de disquette. |
FILE_READ_ONLY_DEVICE | Indique que l’appareil ne peut pas être écrit dans. |
FILE_REMOTE_DEVICE | Indique que l’appareil est distant. |
FILE_REMOVABLE_MEDIA | Indique que le périphérique de stockage prend en charge le support amovible. Notez que cette caractéristique indique un média amovible, et non un appareil amovible. Par exemple, les pilotes des périphériques de lecteur JAZ doivent spécifier cette caractéristique, mais pas les pilotes pour les disques flash PCMCIA. |
FILE_VIRTUAL_VOLUME | Indique que le volume est virtuel. Les pilotes ne doivent pas définir cette caractéristique. |
FILE_WRITE_ONCE_MEDIA | Indique que l’appareil prend en charge le média en écriture unique. Les pilotes ne définissent pas ce membre directement. Pour plus d’informations sur la définition des caractéristiques de l’appareil, consultez la rubrique Spécification des caractéristiques de l’appareil . |
FILE_CHARACTERISTIC_CSV | Indique que l’appareil est un volume partagé de cluster (CSV). |
FILE_DEVICE_ALLOW_APPCONTAINER_TRAVERSAL | Le gestionnaire d’E/S effectue normalement une case activée de sécurité complète pour l’accès via chaque fichier ouvert lorsque le client est un conteneur d’application. Le paramètre de cet indicateur contourne ce case activée d’accès de traverse appliqué si le jeton client dispose déjà de privilèges de traversée. |
FILE_PORTABLE_DEVICE | Indique que la pile sous-jacente considère l’appareil comme portable. Cela est utilisé par la pile de stockage et signifie que l’appareil ne se trouve pas dans le conteneur de l’ordinateur local et n’est pas sur un type de bus fixe. |
Vpb
Pointeur vers le bloc de paramètres de volume (VPB) associé à l’objet d’appareil. Pour les pilotes de système de fichiers, le VPB peut fournir une connexion à n’importe quel objet de périphérique logique sans nom qui représente une instance d’un volume monté. Il s’agit d’un membre opaque.
DeviceExtension
Pointeur vers l’extension d’appareil. La structure et le contenu de l’extension de périphérique sont définis par le pilote. La taille est déterminée par le pilote, spécifiée dans l’appel du pilote à IoCreateDevice ou IoCreateDeviceSecure. Pour plus d’informations sur les extensions d’appareil, consultez Extensions d’appareil. Il s’agit d’un membre en lecture seule. Toutefois, l’objet vers lequel le membre pointe peut être modifié par le pilote.
DeviceType
Défini par IoCreateDevice et IoCreateDeviceSecure à l’aide de la valeur spécifiée pour le paramètre DeviceType de cette routine. Pour plus d’informations, consultez la rubrique Spécification des types d’appareils .
StackSize
Spécifie le nombre minimal d’emplacements de pile dans les irps à envoyer à ce pilote. IoCreateDevice et IoCreateDeviceSecure définissent ce membre sur 1 dans les objets d’appareil nouvellement créés ; les pilotes de niveau inférieur peuvent donc ignorer ce membre. Le gestionnaire d’E/S définit automatiquement le membre StackSize dans l’objet d’appareil d’un pilote de niveau supérieur sur la valeur appropriée si le pilote appelle IoAttachDevice ou IoAttachDeviceToDeviceStack. Seul un pilote de niveau supérieur qui se chaîne sur un autre pilote avec IoGetDeviceObjectPointer doit définir explicitement la valeur de StackSize dans ses propres objets d’appareil sur 1 + la valeur StackSize de l’objet de périphérique du pilote inférieur suivant.
Queue
Utilisé en interne par le gestionnaire d’E/S pour mettre en file d’attente l’objet d’appareil lorsque cela est nécessaire. Il s’agit d’un membre opaque.
Queue.ListEntry
Structure LIST_ENTRY qui contient des pointeurs vers l’avant et vers l’arrière pour une liste doublement liée.
Queue.Wcb
Informations sur le contexte de l’appareil utilisées par le gestionnaire d’E/S.
AlignmentRequirement
Spécifie l’exigence d’alignement d’adresse de l’appareil pour les transferts de données. La valeur doit être l’une des valeurs FILE_XXX_ALIGNMENT définies dans Wdm.h. Pour plus d’informations, consultez les rubriques Initialisation d’un objet d’appareil, GetDmaAlignment et ZwQueryInformationFile .
DeviceQueue
Objet de file d’attente d’appareil pour l’objet d’appareil. L’objet de file d’attente de périphérique contient tous les IRP qui attendent d’être traités par le pilote associé à l’objet de périphérique. Pour plus d’informations, consultez la rubrique Files d’attente IRP gérées par le pilote . Il s’agit d’un membre opaque.
Dpc
Objet d’appel de procédure différée (DPC) pour l’objet d’appareil. Pour plus d’informations, consultez la rubrique Présentation des objets DPC . Il s’agit d’un membre opaque.
ActiveThreadCount
Réservé pour un usage futur. Il s’agit d’un membre opaque.
SecurityDescriptor
Spécifie un descripteur de sécurité (SECURITY_DESCRIPTOR) pour l’objet d’appareil lors de sa création. Si ce membre a la valeur NULL, l’objet d’appareil reçoit les paramètres de sécurité par défaut. Il s’agit d’un membre en lecture seule, bien que le membre puisse être modifié via la fonction ZwSetSecurityObject .
DeviceLock
Objet d’événement de synchronisation alloué par le gestionnaire d’E/S. Le gestionnaire d’E/S obtient son objet d’événement avant de distribuer une demande de montage ou de montage-vérification à un pilote de système de fichiers. Il s’agit d’un membre opaque.
SectorSize
Si l’objet d’appareil ne représente pas de volume, ce membre est défini sur zéro. Si l’objet d’appareil représente un volume, ce membre spécifie la taille de secteur du volume, en octets. Le gestionnaire d’E/S utilise ce membre pour s’assurer que toutes les opérations de lecture, d’écriture et de définition de la position de fichier émises sont alignées correctement lorsque la mise en mémoire tampon intermédiaire est désactivée. Une valeur d’octets système par secteur par défaut est utilisée lors de la création de l’objet d’appareil, mais des pilotes de système de fichiers ; et plus rarement, les pilotes hérités et minifiltres, peuvent mettre à jour cette valeur basée sur la géométrie du matériel de volume sous-jacent lors d’un montage. Les autres pilotes ne doivent pas modifier ce membre.
Spare1
Réservé pour le système. Il s’agit d’un membre opaque.
DeviceObjectExtension
Pointeur vers une extension d’objet d’appareil utilisée par le gestionnaire d’E/S et le gestionnaire PnP pour stocker des informations sur l’état de l’appareil. Il s’agit d’un membre opaque.
Reserved
Réservé pour le système. Il s’agit d’un membre opaque.
Remarques
Le système d’exploitation représente les appareils par objets d’appareil. Pour plus d’informations, consultez la rubrique Device Objects and Device Stacks .
Les pilotes créent des objets d’appareil à l’aide des routines IoCreateDevice et IoCreateDeviceSecure . Pour plus d’informations sur la création d’objets d’appareil, consultez Création d’un objet d’appareil.
Un objet d’appareil est partiellement opaque. Les pilotes ne définissent pas directement les membres de l’objet de périphérique, sauf indication contraire. Pour plus d’informations sur les membres que les pilotes peuvent modifier directement, consultez Initialisation d’un objet device. Pour plus d’informations sur les autres propriétés d’objet d’appareil, consultez Propriétés des objets d’appareil.
Les membres opaques au sein d’un objet d’appareil doivent être considérés comme inaccessibles. Les pilotes qui ont des dépendances sur les emplacements des membres de l’objet ou l’accès à des membres opaques peuvent ne pas rester portables et interopérables avec d’autres pilotes au fil du temps.
Le pilote de port vidéo fourni par le système configure les champs des objets d’appareil qu’il crée pour le compte des pilotes de miniport vidéo.
Le pilote de port SCSI fourni par le système configure les champs des objets de périphérique qu’il crée pour le compte des pilotes miniport SCSI.
La bibliothèque NDIS fournie par le système configure les champs des objets d’appareil qu’elle crée pour le compte des pilotes miniport NDIS.
Configuration requise
Condition requise | Valeur |
---|---|
En-tête | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h, Fltkernel.h) |