Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Термин subdevice используется для описания привязки четырех компонентов, перечисленных в следующей таблице.
| Компонент | Описание |
|---|---|
Минипорт-объект |
Объект, предоставляющий интерфейс IMiniportXxx драйвера мини-порта |
Объект Port |
Объект, предоставляющий интерфейс IPortXxx драйвера порта |
Объект списка ресурсов |
Объект, содержащий список ресурсов драйвера адаптера, назначенных подустройству. |
Строка ссылки |
Имя, добавленное к пути устройства, чтобы указать подустройство при создании фильтра. |
Интерфейсы IMiniportXxx и IPortXxx подустройства наследуются от базовых интерфейсов IMiniport и IPort соответственно.
Системный драйвер PortCls не отличается от драйвера порта и мини-порта. Для этого просто требуется объект, например объект порта, с интерфейсом, который может обрабатывать системные запросы.
Аналогичным образом ПортКлс не участвует непосредственно в управлении ресурсами. Он должен привязать обработчик запросов (драйвер порта) только к списку ресурсов. Драйвер адаптера отвечает за привязку объектов списка портов, минипортов и ресурсов.
В следующем примере кода показано, как драйвер адаптера выполняет следующие действия:
//
// Instantiate the port by calling a function supplied by PortCls.
//
PPORT port;
NTSTATUS ntStatus = PcNewPort(&port, PortClassId);
if (NT_SUCCESS(ntStatus))
{
PUNKNOWN miniport;
//
// Create the miniport object.
//
if (MiniportCreate) // a function to create a proprietary miniport
{
ntStatus = MiniportCreate(&miniport,
MiniportClassId, NULL, NonPagedPool);
}
else // Ask PortCls for one of its built-in miniports.
{
ntStatus = PcNewMiniport((PMINIPORT*)&miniport,
MiniportClassId);
}
if (NT_SUCCESS(ntStatus))
{
//
// Bind the port, miniport, and resources.
//
ntStatus = port->Init(DeviceObject,
Irp, miniport, UnknownAdapter, ResourceList);
if (NT_SUCCESS(ntStatus))
{
//
// Hand the port driver and the reference
// string to PortCls.
//
ntStatus = PcRegisterSubdevice(DeviceObject,
Name, port);
}
//
// We no longer need to reference the miniport driver.
// Either the port driver now references it,
// or binding failed and it should be deleted.
//
miniport->Release();
}
//
// Release the reference that existed when PcNewPort() gave us
// the pointer in the first place. This reference must be released
// regardless of whether the binding of the port and miniport
// drivers succeeded.
//
port->Release();
}
Сведения о вызовах функции PortCls в предыдущем примере кода см. в разделе PcNewPort, PcNewMiniport и PcRegisterSubdevice.