estructura DEVICE_OBJECT (wdm.h)

El sistema operativo usa la estructura DEVICE_OBJECT para representar un objeto de dispositivo. Un objeto de dispositivo representa un dispositivo lógico, virtual o físico para el que un controlador controla las solicitudes de E/S.

Sintaxis

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;

Miembros

Type

Usado por el sistema operativo para indicar que un objeto es un objeto de dispositivo. En el caso de los objetos de dispositivo, el valor de este miembro es 3. Se trata de un miembro de solo lectura.

Size

Especifica el tamaño, en bytes, del objeto de dispositivo. Este tamaño incluye la extensión de dispositivo especificada por el controlador a la que apunta el miembro DeviceExtension , pero no incluye la extensión de objeto de dispositivo opaco a la que apunta el miembro DeviceObjectExtension . Size es un miembro de solo lectura.

ReferenceCount

Usado por el administrador de E/S para realizar un seguimiento del número de identificadores abiertos del dispositivo asociado al objeto de dispositivo. Esto permite que el administrador de E/S evite descargar un controlador cuando haya controladores pendientes para los dispositivos del controlador. Se trata de un miembro de solo lectura.

DriverObject

Puntero al objeto de controlador (DRIVER_OBJECT), que representa la imagen cargada del controlador que se ha introducido en las rutinas DriverEntry y AddDevice . El administrador de E/S establece este miembro tras una llamada correcta a IoCreateDevice o IoCreateDeviceSecure. Se trata de un miembro de solo lectura.

NextDevice

Puntero al siguiente objeto de dispositivo, si existe, creado por el mismo controlador. El administrador de E/S actualiza esta lista en cada llamada correcta a IoCreateDevice o IoCreateDeviceSecure.

Un controlador que no sea Plug and Play (PnP) que se está descargando debe atravesar ("walk") la lista de sus objetos de dispositivo y eliminarlos. Un controlador PnP no tiene que recorrer esta lista de objetos de dispositivo. En su lugar, los controladores PnP realizan su limpieza durante la operación PnP de eliminación del dispositivo (IRP_MN_REMOVE_DEVICE).

Un controlador que vuelve a crear sus objetos de dispositivo dinámicamente también usa este miembro. Se trata de un miembro de lectura y escritura.

AttachedDevice

Puntero al objeto de dispositivo conectado. Si no hay ningún objeto de dispositivo asociado, este miembro es NULL. El objeto de dispositivo al que apunta el miembro AttachedDevice suele ser el objeto de dispositivo de un controlador de filtro, que intercepta las solicitudes de E/S destinadas originalmente al dispositivo que representa el objeto de dispositivo. Para obtener más información, consulte los temas IoAttachDevice e IoAttachDeviceByPointer . Se trata de un miembro opaco.

CurrentIrp

Puntero al IRP actual si el controlador tiene una rutina StartIo cuyo punto de entrada se estableció en el objeto de controlador y si el controlador está procesando actualmente los IRP. De lo contrario, este miembro es NULL. Para obtener más información, consulte los temas IoStartPacket e IoStartNextPacket . Se trata de un miembro de solo lectura.

Timer

Puntero a un objeto de temporizador. Esto permite al administrador de E/S llamar a una rutina de temporizador proporcionada por el controlador cada segundo. Para obtener más información, consulte IoInitializeTimer. Se trata de un miembro de lectura y escritura.

Flags

Los controladores de dispositivo realizan una operación OR bit a bit con este miembro en sus objetos de dispositivo recién creados mediante uno o varios de los siguientes valores definidos por el sistema.

Para obtener más información sobre cómo establecer el miembro Flags , vea Inicializar un objeto device.

Valor Significado
DO_VERIFY_VOLUME (0x00000002) Los controladores de medios extraíbles establecen esta marca mientras procesan las solicitudes de transferencia. Estos controladores también deben comprobar esta marca en el destino de una solicitud de transferencia antes de transferir los datos. Para obtener más información, vea el tema Compatibilidad con medios extraíbles .
DO_BUFFERED_IO (0x00000004) Especifica el tipo de almacenamiento en búfer que usa el administrador de E/S para las solicitudes de E/S que se envían a la pila de dispositivos. Controladores de nivel superior O este miembro con el mismo valor que el controlador siguiente inferior de la pila, excepto posiblemente para los controladores de nivel superior.
DO_EXCLUSIVE (0x00000008) Indica que el controlador atiende un dispositivo exclusivo, como un dispositivo de vídeo, serie, paralelo o sonido. Los controladores WDM no deben establecer esta marca. Para obtener más información, vea el tema Especificar el acceso exclusivo a objetos de dispositivo .
DO_DIRECT_IO (0x00000010) Consulte DO_BUFFERED_IO.
DO_MAP_IO_BUFFER (0x00000020) Esta marca ya no se usa. Los controladores no deben establecer esta marca.
DO_DEVICE_INITIALIZING (0x00000080) El administrador de E/S establece esta marca cuando crea el objeto de dispositivo. Un controlador de función de dispositivo o un controlador de filtro borra la marca en su rutina AddDevice , después de ello: (1) Asocia el objeto de dispositivo a la pila de dispositivos. (2) Establece el estado de alimentación del dispositivo. (3) Realiza una operación OR bit a bit en el miembro con una de las marcas de alimentación (si es necesario). El administrador de Plug and Play (PnP) comprueba que la marca está desactivada después de que se devuelva la rutina AddDevice.
DO_SHUTDOWN_REGISTERED (0x00000800) Usado por el administrador de E/S para indicar que un controlador ha registrado el objeto de dispositivo para las notificaciones de apagado. Los controladores no deben usar esta marca.
DO_BUS_ENUMERATED_DEVICE (0x00001000) El sistema operativo establece esta marca en cada objeto de dispositivo físico (PDO). Los controladores no deben modificar esta marca.
DO_POWER_PAGABLE (0x00002000) Los controladores paginables que son compatibles con Microsoft Windows 2000 y versiones posteriores de Windows, no forman parte de la ruta de acceso de paginación y no requieren que inrush current establezca esta marca. El sistema llama a estos controladores en IRQL = PASSIVE_LEVEL. Los controladores no pueden establecer esta marca y DO_POWER_INRUSH. Todos los controladores de WDM, Microsoft Windows 98 y Windows Millennium Edition deben establecer DO_POWER_PAGABLE.
DO_POWER_INRUSH (0x00004000) Los controladores de dispositivos que requieren la corriente de entrada cuando el dispositivo está activado deben establecer esta marca. Un controlador no puede establecer esta marca y DO_POWER_PAGABLE.
DO_DEVICE_TO_BE_RESET (0x04000000) El administrador de E/S establece esta marca como una señal para que el controlador de bus restablezca el dispositivo. Otros controladores no deben usar esta marca.
DO_DAX_VOLUME (0x10000000) Indica que un volumen es un volumen DAX.

Characteristics

Especifica una o varias constantes definidas por el sistema, combinadas con una operación OR bit a bit, que proporcionan información adicional sobre el dispositivo del controlador. Estas constantes incluyen lo siguiente:

Valor Significado
FILE_AUTOGENERATED_DEVICE_NAME Dirige al administrador de E/S para generar un nombre para el dispositivo, en lugar del autor de la llamada que especifica un DeviceName cuando llama a esta rutina. El administrador de E/S se asegura de que el nombre es único. Esta característica se especifica normalmente mediante un controlador de bus PnP para generar un nombre para un objeto de dispositivo físico (PDO) para un dispositivo secundario en el mismo bus.
FILE_CHARACTERISTIC_PNP_DEVICE Indica que el objeto de dispositivo forma parte de una pila de Plug and Play (PnP). Esta característica es necesaria si un controlador de bus (o controlador de filtro de bus) registra la compatibilidad con WMI para un objeto de dispositivo que aún no ha recibido la solicitud de IRP_MN_START_DEVICE . FILE_CHARACTERISTIC_PNP_DEVICE también es necesario si una función o un controlador de filtro se registra para WMI antes de asociarse a su pila de dispositivos.
FILE_CHARACTERISTIC_TS_DEVICE Indica que el objeto de dispositivo forma parte de una pila de dispositivos de Terminal Services. Los controladores no deben establecer esta característica.
FILE_CHARACTERISTIC_WEBDAV_DEVICE Indica que un sistema de archivos de creación y control de versiones distribuidos basado en web (WebDAV) está montado en el dispositivo. Los controladores no deben establecer esta característica.
FILE_DEVICE_IS_MOUNTED Indica que un sistema de archivos está montado en el dispositivo. Los controladores no deben establecer esta característica.
FILE_DEVICE_SECURE_OPEN Dirige al administrador de E/S para aplicar el descriptor de seguridad del objeto de dispositivo a las aperturas relativas y se abre el nombre de archivo final del dispositivo. Para obtener más información, consulte el tema Control del acceso al espacio de nombres del dispositivo .
FILE_FLOPPY_DISKETTE Indica que el dispositivo es un dispositivo de disquete.
FILE_READ_ONLY_DEVICE Indica que el dispositivo no se puede escribir en.
FILE_REMOTE_DEVICE Indica que el dispositivo es remoto.
FILE_REMOVABLE_MEDIA Indica que el dispositivo de almacenamiento admite medios extraíbles. Tenga en cuenta que esta característica indica medios extraíbles, no un dispositivo extraíble. Por ejemplo, los controladores para dispositivos de unidad JAZ deben especificar esta característica, pero los controladores para los discos flash PCMCIA no deben.
FILE_VIRTUAL_VOLUME Indica que el volumen es virtual. Los controladores no deben establecer esta característica.
FILE_WRITE_ONCE_MEDIA Indica que el dispositivo admite medios de escritura una vez. Los controladores no establecen este miembro directamente. Para obtener más información sobre cómo establecer las características del dispositivo, consulte el tema Especificar características del dispositivo .
FILE_CHARACTERISTIC_CSV Indica que el dispositivo es un volumen compartido de clúster (CSV).
FILE_DEVICE_ALLOW_APPCONTAINER_TRAVERSAL Normalmente, el Administrador de E/S realiza una comprobación de seguridad completa para recorrer el acceso en todos los archivos abiertos cuando el cliente es un contenedor de aplicaciones. La configuración de esta marca omite esta comprobación de acceso de recorrido aplicada si el token de cliente ya tiene privilegios de recorrido.
FILE_PORTABLE_DEVICE Indica que la pila subyacente considera el dispositivo portátil. Esto lo usa la pila de almacenamiento y significa que el dispositivo no está en el contenedor de la máquina local y no está en un tipo de bus fijo.

Vpb

Puntero al bloque de parámetros de volumen (VPB) asociado al objeto de dispositivo. En el caso de los controladores del sistema de archivos, el VPB puede proporcionar una conexión a cualquier objeto de dispositivo lógico sin nombre que represente una instancia de un volumen montado. Se trata de un miembro opaco.

DeviceExtension

Puntero a la extensión del dispositivo. La estructura y el contenido de la extensión de dispositivo están definidos por el controlador. El tamaño está determinado por el controlador, especificado en la llamada del controlador a IoCreateDevice o IoCreateDeviceSecure. Para obtener más información sobre las extensiones de dispositivo, consulte Extensiones de dispositivo. Se trata de un miembro de solo lectura. Sin embargo, el controlador puede modificar el objeto al que apunta el miembro.

DeviceType

Se establece mediante IoCreateDevice e IoCreateDeviceSecure mediante el valor especificado para el parámetro DeviceType de esa rutina. Para obtener más información, consulte el tema Especificar tipos de dispositivo .

StackSize

Especifica el número mínimo de ubicaciones de pila en irP que se enviarán a este controlador. IoCreateDevice e IoCreateDeviceSecure establecen este miembro en 1 en objetos de dispositivo recién creados; Por lo tanto, los controladores de nivel más bajo pueden omitir este miembro. El administrador de E/S establece automáticamente el miembro StackSize en un objeto de dispositivo de controlador de nivel superior en el valor adecuado si el controlador llama a IoAttachDevice o IoAttachDeviceToDeviceStack. Solo un controlador de nivel superior que se encadene a otro controlador con IoGetDeviceObjectPointer debe establecer explícitamente el valor de StackSize en sus propios objetos de dispositivo en 1 + el valor StackSize del objeto de dispositivo del controlador siguiente inferior.

Queue

Lo usa internamente el administrador de E/S para poner en cola el objeto de dispositivo cuando es necesario. Se trata de un miembro opaco.

Queue.ListEntry

Estructura LIST_ENTRY que contiene punteros hacia delante y hacia atrás para una lista vinculada doblemente.

Queue.Wcb

Información de contexto del dispositivo utilizada por el administrador de E/S.

AlignmentRequirement

Especifica el requisito de alineación de direcciones del dispositivo para las transferencias de datos. El valor debe ser uno de los valores FILE_XXX_ALIGNMENT definidos en Wdm.h. Para obtener más información, consulte los temas Inicialización de un objeto device, GetDmaAlignment y ZwQueryInformationFile .

DeviceQueue

Objeto de cola de dispositivos para el objeto de dispositivo. El objeto de cola de dispositivos contiene los IRP que están esperando que el controlador asociado al objeto de dispositivo procese. Para obtener más información, consulte el tema Colas de IRP administradas por controladores . Se trata de un miembro opaco.

Dpc

Objeto de llamada a procedimiento diferido (DPC) para el objeto de dispositivo. Para obtener más información, vea el tema Introducción a objetos DPC . Se trata de un miembro opaco.

ActiveThreadCount

Reservado para uso futuro. Se trata de un miembro opaco.

SecurityDescriptor

Especifica un descriptor de seguridad (SECURITY_DESCRIPTOR) para el objeto de dispositivo cuando se crea el objeto de dispositivo. Si este miembro es NULL, el objeto de dispositivo recibe la configuración de seguridad predeterminada. Se trata de un miembro de solo lectura, aunque el miembro se puede modificar a través de la función ZwSetSecurityObject .

DeviceLock

Objeto de evento de sincronización asignado por el administrador de E/S. El administrador de E/S obtiene su objeto de evento antes de enviar una solicitud de montaje o comprobación de montaje a un controlador del sistema de archivos. Se trata de un miembro opaco.

SectorSize

Si el objeto de dispositivo no representa un volumen, este miembro se establece en cero. Si el objeto de dispositivo representa un volumen, este miembro especifica el tamaño del sector del volumen, en bytes. El administrador de E/S usa este miembro para asegurarse de que todas las operaciones de lectura, operaciones de escritura y establecer operaciones de posición de archivo emitidas se alinean correctamente cuando se deshabilita el almacenamiento en búfer intermedio. Sin embargo, se usa un valor predeterminado de bytes por sector del sistema cuando se crea el objeto de dispositivo; sin embargo, los controladores del sistema de archivos; y, más rara vez, los controladores heredados y minifiltros pueden actualizar este valor que se basa en la geometría del hardware del volumen subyacente cuando se produce un montaje. Otros controladores no deben modificar este miembro.

Spare1

Reservado para uso del sistema. Se trata de un miembro opaco.

DeviceObjectExtension

Puntero a una extensión de objeto de dispositivo que usa el administrador de E/S y el administrador de PnP para almacenar información sobre el estado del dispositivo. Se trata de un miembro opaco.

Reserved

Reservado para uso del sistema. Se trata de un miembro opaco.

Comentarios

El sistema operativo representa los dispositivos por objetos de dispositivo. Para obtener más información, consulte el tema Objetos de dispositivo y Pilas de dispositivos .

Los controladores crean objetos de dispositivo mediante las rutinas IoCreateDevice e IoCreateDeviceSecure . Para obtener más información sobre cómo crear objetos de dispositivo, consulte Creación de un objeto de dispositivo.

Un objeto de dispositivo es parcialmente opaco. Los controladores no establecen miembros del objeto de dispositivo directamente, a menos que se documente lo contrario. Para obtener más información sobre los miembros que los controladores pueden modificar directamente, vea Inicializar un objeto de dispositivo. Para obtener información sobre otras propiedades de objeto de dispositivo, vea Propiedades de objetos de dispositivo.

Los miembros opacos de un objeto de dispositivo deben considerarse inaccesibles. Es posible que los controladores que tengan dependencias en ubicaciones de miembros de objeto o el acceso a miembros opacos no permanezcan portátiles e interoperables con otros controladores a lo largo del tiempo.

El controlador de puerto de vídeo proporcionado por el sistema configura los campos de los objetos de dispositivo que crea en nombre de los controladores de minipuerto de vídeo.

El controlador de puerto SCSI proporcionado por el sistema configura los campos de los objetos de dispositivo que crea en nombre de los controladores de miniporte SCSI.

La biblioteca NDIS proporcionada por el sistema configura los campos de los objetos de dispositivo que crea en nombre de los controladores de miniporte de NDIS.

Requisitos

Requisito Valor
Header wdm.h (include Wdm.h, Ntddk.h, Ntifs.h, Fltkernel.h)

Consulte también