Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Функция PcAddAdapterDevice добавляет устройство адаптера в стек устройств WDM.
Синтаксис
PORTCLASSAPI NTSTATUS PcAddAdapterDevice(
[in] PDRIVER_OBJECT DriverObject,
[in] PDEVICE_OBJECT PhysicalDeviceObject,
[in] PCPFNSTARTDEVICE StartDevice,
[in] ULONG MaxObjects,
[in] ULONG DeviceExtensionSize
);
Параметры
[in] DriverObject
Указатель на объект driver. Этот указатель передается в качестве параметра обработчику AddDevice адаптера. Объект driver — это системная структура типа DRIVER_OBJECT.
[in] PhysicalDeviceObject
Указатель на физический объект устройства (PDO). PortCls передает этот указатель в качестве параметра вызова обработчику AddDevice адаптера. PDO — это системная структура типа DEVICE_OBJECT.
[in] StartDevice
Указатель на функцию, вызываемую операционной системой, чтобы запустить устройство. Дополнительные сведения см. в следующем разделе Примечания.
[in] MaxObjects
Указывает максимальное количество вложенных объектов, зарегистрированных вызовами PcRegisterSubdevice. Это число задает верхний предел для общего числа минипорт-объектов, которые может создать драйвер адаптера.
[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 и программах запуска устройства и 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);
Переменная FunctionalDeviceObject — это указатель на FDO звукового адаптера, а pMyExtensionData — временный указатель на данные расширения. Избегайте путаницы FDO с PDO, который принадлежит драйверу шины PCI. Драйвер адаптера не должен изменять данные в PDO, так как это приводит к повреждению памяти, принадлежащей драйверу шины PCI, и может привести к сбою системы.
Требования
| Требование | Ценность |
|---|---|
| Минимально поддерживаемый клиент | Доступно начиная с Windows 2000. |
| целевая платформа | универсальный |
| Заголовок | portcls.h (include Portcls.h) |
| Библиотека | Portcls.lib |
| IRQL | пассивный уровень |