Функция PcAddAdapterDevice (portcls.h)

Функция PcAddAdapterDevice добавляет адаптерное устройство в стек устройств WDM.

Синтаксис

PORTCLASSAPI NTSTATUS PcAddAdapterDevice(
  [in] PDRIVER_OBJECT   DriverObject,
  [in] PDEVICE_OBJECT   PhysicalDeviceObject,
  [in] PCPFNSTARTDEVICE StartDevice,
  [in] ULONG            MaxObjects,
  [in] ULONG            DeviceExtensionSize
);

Параметры

[in] DriverObject

Указатель на объект драйвера. Этот указатель передается в качестве параметра в обработчик AddDevice адаптера. Объект driver — это системная структура типа DRIVER_OBJECT.

[in] PhysicalDeviceObject

Указатель на физический объект устройства (PDO). PortCls передает этот указатель в качестве параметра вызова обработчику AddDevice адаптера. PDO — это системная структура типа DEVICE_OBJECT.

[in] StartDevice

Указатель на функцию, вызываемую операционной системой для запуска устройства. Дополнительные сведения см. в следующем разделе Примечания .

[in] MaxObjects

Указывает максимальное количество вложенных вычислений, регистрируемых вызовами PcRegisterSubdevice. Это число задает верхнюю границу общего числа объектов miniport, которые драйвер адаптера может создать.

[in] DeviceExtensionSize

Указывает размер расширения устройства. Используйте ноль для размера по умолчанию. Сведения о размерах расширений, предоставляемых пользователем, см. в следующем разделе Примечаний .

Возвращаемое значение

PcAddAdapterDevice возвращает STATUS_SUCCESS, если вызов был успешным. В противном случае возвращается соответствующий код ошибки.

Комментарии

Эта функция выполняет большую часть работы, необходимой обработчику AddDevice драйвера аудиоадаптера. PcAddAdapterDevice создает объект устройства, инициализирует контекст устройства и присоединяет объект устройства к стеку устройств.

Драйвер адаптера вызывает PcAddAdapterDevice при получении вызова обработчика AddDevice . Драйвер адаптера обычно устанавливает обработчик AddDevice , вызывая PcInitializeAdapterDriver, хотя драйвер также может установить обработчик другими способами. PcAddAdapterDevice создает объект функционального устройства (FDO) для PDO, переданного обработчику AddDevice .

DeviceExtensionSize обычно имеет нулевое значение. Некоторым драйверам адаптера может потребоваться зарезервировать дополнительное пространство в расширении устройства. В этом случае следует указать DeviceExtensionSize больше PORT_CLASS_DEVICE_EXTENSION_SIZE, который является размером по умолчанию. Любое значение больше нуля и меньше PORT_CLASS_DEVICE_EXTENSION_SIZE является недопустимым. Драйверы адаптера могут использовать любую часть расширения устройства после PORT_CLASS_DEVICE_EXTENSION_SIZE смещения. Они также могут использовать байты в диапазоне смещения от 16 до 31 включительно в системе с 32-разрядной адресацией и байтами в диапазоне смещения от 32 до 63 в системе с 64-разрядной адресацией. Если расширение рассматривается как массив ULONG_PTR, то для использования драйвером адаптера доступны элементы массива с четырех по семь.

Параметр StartDevice указывает на функцию типа PCPFNSTARTDEVICE, которая определяет файл заголовка portcls.h как:

  NTSTATUS
    (*PCPFNSTARTDEVICE)(
      IN PDEVICE_OBJECT  DeviceObject,
      IN PIRP  Irp,
      IN PRESOURCELIST  ResourceList
      );

Дополнительные сведения о процедурах PcAddAdapterDevice и драйвера адаптера device-startup и AddDevice см. в разделе Последовательность запуска.

В следующем примере кода показано, как драйвер адаптера может использовать параметр DeviceExtensionSize , чтобы добавить 64 байта данных расширения для конкретного устройства в конец блока хранилища, выделенного PortCls для контекста устройства:

  #define MY_EXTENSION_SIZE  64
  NTSTATUS  ntstatus = PcAddAdapterDevice(DriverObject, PhysicalDeviceObject,
                                          MyStartDevice, MAX_MINIPORTS,
                                          MY_EXTENSION_SIZE + PORT_CLASS_DEVICE_EXTENSION_SIZE);

Приведенный выше вызов PcAddAdapterDevice аналогичен примеру в последовательности запуска, за исключением того, что последний параметр, передаваемый в PcAddAdapterDevice , является ненулевым.

Затем драйвер адаптера может получить доступ к данным расширения для конкретного устройства, как показано в следующем фрагменте кода:

  PVOID  pMyExtensionData = (PVOID)((PCHAR)FunctionalDeviceObject->DeviceExtension +
                                              PORT_CLASS_DEVICE_EXTENSION_SIZE);

Variable FunctionalDeviceObject — это указатель на FDO звукового адаптера, а pMyExtensionData — временный указатель на данные расширения. Избегайте путаницы FDO с PDO, который принадлежит драйверу шины PCI. Драйвер адаптера не должен изменять данные в PDO, так как это повреждает память, принадлежащей драйверу шины PCI, и может привести к сбою системы.

Требования

Требование Значение
Минимальная версия клиента Доступно начиная с Windows 2000.
Целевая платформа Универсальное
Верхняя часть portcls.h (включая Portcls.h)
Библиотека Portcls.lib
IRQL PASSIVE_LEVEL

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

AddDevice

DEVICE_OBJECT

DRIVER_OBJECT

PcRegisterSubdevice