структура DEVICE_OBJECT (wdm.h)

Структура DEVICE_OBJECT используется операционной системой для представления объекта устройства. Объект устройства представляет собой логическое, виртуальное или физическое устройство, для которого драйвер обрабатывает запросы ввода-вывода.

Синтаксис

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;

Члены

Type

Используется операционной системой для указания того, что объект является объектом устройства. Для объектов устройства значение этого элемента равно 3. Это член, доступный только для чтения.

Size

Задает размер объекта устройства в байтах. Этот размер включает указанное драйвером расширение устройства, на которое указывает элемент DeviceExtension , но не включает расширение непрозрачного объекта устройства, на которое указывает элемент DeviceObjectExtension . Размер является элементом, доступным только для чтения.

ReferenceCount

Используется диспетчером ввода-вывода для отслеживания количества открытых дескрипторов для устройства, связанных с объектом устройства. Это позволяет диспетчеру ввода-вывода избежать выгрузки драйвера при наличии необработанных дескрипторов для устройств драйвера. Это член, доступный только для чтения.

DriverObject

Указатель на объект драйвера (DRIVER_OBJECT), представляющий загруженный образ драйвера, который был входным для процедур DriverEntry и AddDevice . Этот элемент задается диспетчером ввода-вывода при успешном вызове IoCreateDevice или IoCreateDeviceSecure. Это член, доступный только для чтения.

NextDevice

Указатель на следующий объект устройства , если таковой имеется, который был создан тем же драйвером. Диспетчер ввода-вывода обновляет этот список при каждом успешном вызове IoCreateDevice или IoCreateDeviceSecure.

Драйвер, отличный от Plug and Play (PnP), который выгружается, должен пройти ("пройти") список своих объектов устройства и удалить их. Драйверу PnP не нужно идти по этому списку объектов устройств. Вместо этого драйверы PnP выполняют очистку во время операции PnP удаления устройства (IRP_MN_REMOVE_DEVICE).

Драйвер, динамически воссоздающий объекты устройства, также использует этот элемент. Это элемент для чтения и записи.

AttachedDevice

Указатель на подключенный объект устройства. Если присоединенный объект устройства отсутствует, этот элемент имеет значение NULL. Объект устройства, на который указывает элемент AttachedDevice , обычно является объектом устройства драйвера фильтра, который перехватывает запросы ввода-вывода, изначально предназначенные для устройства, представленного объектом устройства. Дополнительные сведения см. в разделах IoAttachDevice и IoAttachDeviceByPointer . Это непрозрачный элемент.

CurrentIrp

Указатель на текущий IRP, если у драйвера есть подпрограмма StartIo , точка входа которой была задана в объекте драйвера, и если драйвер в настоящее время обрабатывает IRP. В противном случае этот элемент имеет значение NULL. Дополнительные сведения см. в разделах IoStartPacket и IoStartNextPacket . Это член, доступный только для чтения.

Timer

Указатель на объект таймера. Это позволяет диспетчеру ввода-вывода вызывать подпрограмму таймера, предоставляемую драйвером, каждую секунду. Дополнительные сведения см. в разделе IoInitializeTimer. Это элемент для чтения и записи.

Flags

Драйверы устройств выполняют побитовую операцию OR с этим элементом во вновь созданных объектах устройства, используя одно или несколько следующих системных значений.

Дополнительные сведения о том, как задать элемент Flags , см. в разделе Инициализация объекта устройства.

Значение Значение
DO_VERIFY_VOLUME (0x00000002) Драйверы съемных носителей устанавливают этот флаг при обработке запросов на передачу. Такие драйверы также должны проверка для этого флага в целевом объекте для запроса на передачу перед передачей каких-либо данных. Дополнительные сведения см. в разделе Поддержка съемных носителей .
DO_BUFFERED_IO (0x00000004) Указывает тип буферизации, используемый диспетчером ввода-вывода для запросов ввода-вывода, отправляемых в стек устройств. Драйверы более высокого уровня ИЛИ этот элемент с тем же значением, что и следующий драйвер в стеке, за исключением драйверов самого высокого уровня.
DO_EXCLUSIVE (0x00000008) Указывает, что драйвер обслуживает монопольное устройство, например видео, последовательное, параллельное или звуковое устройство. Драйверы WDM не должны устанавливать этот флаг. Дополнительные сведения см. в разделе Указание монопольного доступа к объектам устройств .
DO_DIRECT_IO (0x00000010) См. DO_BUFFERED_IO.
DO_MAP_IO_BUFFER (0x00000020) Этот флаг больше не используется. Драйверы не должны устанавливать этот флаг.
DO_DEVICE_INITIALIZING (0x00000080) Диспетчер ввода-вывода устанавливает этот флаг при создании объекта устройства. Драйвер функции устройства или драйвер фильтра очищает флаг в своей подпрограмме AddDevice после этого: (1) присоединяет объект устройства к стеку устройств. (2) Устанавливает состояние питания устройства. (3) Выполняет побитовую операцию ИЛИ для элемента с одним из флагов питания (если это необходимо). Диспетчер Plug and Play (PnP) проверяет, снят ли флаг после возврата подпрограммы AddDevice.
DO_SHUTDOWN_REGISTERED (0x00000800) Используется диспетчером ввода-вывода, чтобы указать, что драйвер зарегистрировал объект устройства для уведомлений о завершении работы. Этот флаг не должен использоваться драйверами.
DO_BUS_ENUMERATED_DEVICE (0x00001000) Операционная система устанавливает этот флаг в каждом объекте физического устройства (PDO). Драйверы не должны изменять этот флаг.
DO_POWER_PAGABLE (0x00002000) Драйверы с поддержкой страниц, совместимые с Microsoft Windows 2000 и более поздними версиями Windows, не являются частью пути разбиения по страницам и не требуют текущего входа, должны установить этот флаг. Система вызывает такие драйверы в IRQL = PASSIVE_LEVEL. Драйверы не могут установить как этот флаг, так и DO_POWER_INRUSH. Все драйверы для WDM, Microsoft Windows 98 и Windows Millennium Edition должны задавать DO_POWER_PAGABLE.
DO_POWER_INRUSH (0x00004000) Драйверы устройств, для которых требуется текущий вход в систему при включении устройства, должны установить этот флаг. Драйвер не может установить и этот флаг, и DO_POWER_PAGABLE.
DO_DEVICE_TO_BE_RESET (0x04000000) Диспетчер ввода-вывода устанавливает этот флаг в качестве сигнала для водителя шины о необходимости сбросить устройство. Другие драйверы не должны использовать этот флаг.
DO_DAX_VOLUME (0x10000000) Указывает, что том является томом DAX.

Characteristics

Указывает одну или несколько системных констант в сочетании с побитовой операцией ИЛИ, которые предоставляют дополнительные сведения об устройстве драйвера. К этим константам относятся следующие:

Значение Значение
FILE_AUTOGENERATED_DEVICE_NAME Предписывает диспетчеру ввода-вывода создать имя устройства, а не вызывающий объект, указывающий deviceName при вызове этой подпрограммы. Диспетчер ввода-вывода гарантирует уникальность имени. Эта характеристика обычно задается драйвером шины PnP для создания имени объекта физического устройства (PDO) для дочернего устройства в той же шине.
FILE_CHARACTERISTIC_PNP_DEVICE Указывает, что объект устройства является частью стека Plug and Play (PnP). Эта характеристика необходима, если водитель шины (или драйвер фильтра шины) регистрирует поддержку WMI для объекта устройства, который еще не получил запрос IRP_MN_START_DEVICE . FILE_CHARACTERISTIC_PNP_DEVICE также требуется, если драйвер функции или фильтра регистрируется для WMI перед присоединением к стеку устройств.
FILE_CHARACTERISTIC_TS_DEVICE Указывает, что объект устройства является частью стека устройств служб терминалов. Драйверы не должны задавать эту характеристику.
FILE_CHARACTERISTIC_WEBDAV_DEVICE Указывает, что на устройстве подключена файловая система распределенной разработки и управления версиями (WebDAV). Драйверы не должны задавать эту характеристику.
FILE_DEVICE_IS_MOUNTED Указывает, что на устройстве подключена файловая система. Драйверы не должны задавать эту характеристику.
FILE_DEVICE_SECURE_OPEN Предписывает диспетчеру ввода-вывода применить дескриптор безопасности объекта устройства к относительному открытию и открытию имени конечного файла для устройства. Дополнительные сведения см. в разделе Управление доступом к пространству имен устройств .
FILE_FLOPPY_DISKETTE Указывает, что устройство является гибким диском.
FILE_READ_ONLY_DEVICE Указывает, что устройство не может быть записано.
FILE_REMOTE_DEVICE Указывает, что устройство удаленно.
FILE_REMOVABLE_MEDIA Указывает, что запоминающее устройство поддерживает съемный носитель. Обратите внимание, что эта характеристика указывает на съемный носитель, а не съемный носитель. Например, драйверы для устройств с дисками JAZ должны указывать эту характеристику, а драйверы для флэш-дисков PCMCIA — нет.
FILE_VIRTUAL_VOLUME Указывает, что том является виртуальным. Драйверы не должны задавать эту характеристику.
FILE_WRITE_ONCE_MEDIA Указывает, что устройство поддерживает носитель с однократной записью. Драйверы не задают этот элемент напрямую. Дополнительные сведения о том, как задать характеристики устройства, см. в разделе Указание характеристик устройства .
FILE_CHARACTERISTIC_CSV Указывает, что устройство является общим томом кластера (CSV).
FILE_DEVICE_ALLOW_APPCONTAINER_TRAVERSAL Диспетчер операций ввода-вывода обычно выполняет полный проверка безопасности для обхода доступа к каждому открытому файлу, если клиент является контейнером приложения. Установка этого флага обходит этот принудительный доступ к обходу проверка, если маркер клиента уже имеет права обхода.
FILE_PORTABLE_DEVICE Указывает, что базовый стек считает устройство переносимым. Это используется стеком хранилища и означает, что устройство не находится в контейнере локального компьютера и не находится в фиксированном типе шины.

Vpb

Указатель на блок параметров тома (VPB), связанный с объектом устройства. Для драйверов файловой системы VPB может обеспечить подключение к любому неименованному объекту логического устройства, представляющего экземпляр подключенного тома. Это непрозрачный элемент.

DeviceExtension

Указатель на расширение устройства. Структура и содержимое расширения устройства определяются драйвером. Размер определяется драйвером и указывается в вызове драйвера IoCreateDevice или IoCreateDeviceSecure. Дополнительные сведения о расширениях устройств см. в разделе Расширения устройств. Это член, доступный только для чтения. Однако объект, на который указывает элемент, может быть изменен драйвером.

DeviceType

Задаются с помощью IoCreateDevice и IoCreateDeviceSecure , используя значение, указанное для параметра DeviceType этой подпрограммы. Дополнительные сведения см. в разделе Указание типов устройств .

StackSize

Указывает минимальное количество расположений стека в IRP, отправляемых этому драйверу. IoCreateDevice и IoCreateDeviceSecure устанавливают для этого элемента значение 1 во вновь созданных объектах устройства; Поэтому драйверы самого низкого уровня могут игнорировать этот элемент. Диспетчер ввода-вывода автоматически задает член StackSize в объекте устройства драйвера более высокого уровня соответствующее значение, если драйвер вызывает IoAttachDevice или IoAttachDeviceToDeviceStack. Только драйвер более высокого уровня, который связан с другим драйвером с IoGetDeviceObjectPointer , должен явно задать значение StackSize в собственных объектах устройства равным 1 + значение StackSize объекта устройства следующего ниже драйвера.

Queue

Используется внутри диспетчера ввода-вывода для постановки объекта устройства в очередь, когда это необходимо. Это непрозрачный элемент.

Queue.ListEntry

Структура LIST_ENTRY , содержащая указатели вперед и назад для списка, связанного вдвойне.

Queue.Wcb

Сведения о контексте устройства, используемые диспетчером ввода-вывода.

AlignmentRequirement

Указывает требование к выравниванию адресов устройства для передачи данных. Значение должно быть одним из FILE_XXX_ALIGNMENT значений, определенных в Wdm.h. Дополнительные сведения см. в разделах Инициализация объекта устройства, GetDmaAlignment и ZwQueryInformationFile .

DeviceQueue

Объект очереди устройства для объекта устройства. Объект очереди устройства содержит все irP, ожидающие обработки драйвером, связанным с объектом устройства. Дополнительные сведения см. в разделе Очереди IRP, управляемые драйвером . Это непрозрачный элемент.

Dpc

Объект отложенного вызова процедуры (DPC) для объекта устройства. Дополнительные сведения см. в статье Общие сведения об объектах DPC . Это непрозрачный элемент.

ActiveThreadCount

Зарезервировано для последующего использования. Это непрозрачный элемент.

SecurityDescriptor

Указывает дескриптор безопасности (SECURITY_DESCRIPTOR) для объекта устройства при создании объекта устройства. Если этот элемент имеет значение NULL, объект устройства получает параметры безопасности по умолчанию. Это элемент, доступный только для чтения, хотя его можно изменить с помощью функции ZwSetSecurityObject .

DeviceLock

Объект события синхронизации, выделенный диспетчером ввода-вывода. Диспетчер ввода-вывода получает объект события перед отправкой запроса на подключение или проверку подключения к драйверу файловой системы. Это непрозрачный элемент.

SectorSize

Если объект устройства не представляет том, этому элементу присваивается нулевое значение. Если объект устройства представляет том, этот элемент указывает размер сектора тома в байтах. Диспетчер ввода-вывода использует этот элемент, чтобы убедиться, что при отключении промежуточной буферизации все операции чтения, записи и операции установки положения файла правильно выровнены. Значение системных байтов на сектор по умолчанию используется при создании объекта устройства, однако драйверы файловой системы; и в редких случаях драйверы устаревших версий и минифильтров могут обновлять это значение на основе геометрии базового оборудования тома при подключении. Другие драйверы не должны изменять этот элемент.

Spare1

Зарезервировано для системного использования. Это непрозрачный элемент.

DeviceObjectExtension

Указатель на расширение объекта устройства, используемое диспетчером ввода-вывода и диспетчером PnP для хранения сведений о состоянии устройства. Это непрозрачный элемент.

Reserved

Зарезервировано для системного использования. Это непрозрачный элемент.

Комментарии

Операционная система представляет устройства по объектам устройства. Дополнительные сведения см. в разделе Объекты устройств и стеки устройств .

Драйверы создают объекты устройств с помощью процедур IoCreateDevice и IoCreateDeviceSecure . Дополнительные сведения о создании объектов устройств см. в разделе Создание объекта устройства.

Объект устройства является частично непрозрачным. Драйверы не задают члены объекта устройства напрямую, если не задокументировано иное. Дополнительные сведения о членах, которые драйверы могут изменять напрямую, см. в разделе Инициализация объекта устройства. Дополнительные сведения о других свойствах объектов устройства см. в разделе Свойства объектов устройства.

Непрозрачные элементы в объекте устройства должны считаться недоступными. Драйверы с зависимостями от расположений элементов объекта или доступом к непрозрачным элементам могут со временем оставаться переносимыми и совместимыми с другими драйверами.

Драйвер видеопорта, предоставляемый системой, настраивает поля объектов устройства, создаваемых от имени драйверов видео минипорта.

Предоставляемый системой драйвер порта SCSI настраивает поля объектов устройства, создаваемых от имени драйверов мини-портов SCSI.

Предоставляемая системой библиотека NDIS настраивает поля объектов устройств, создаваемых от имени драйверов минипорта NDIS.

Требования

Требование Значение
Заголовок wdm.h (включая Wdm.h, Ntddk.h, Ntifs.h, Fltkernel.h)

См. также раздел