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) |