Создание дочерних цехов
Термин subdevice используется для описания привязки четырех компонентов, перечисленных в следующей таблице.
Компонент | Описание |
---|---|
Объект miniport |
Объект , предоставляющий интерфейс IMiniportXxx драйвера мини-порта |
Объект Port |
Объект , предоставляющий интерфейс IPortXxx драйвера порта. |
Объект списка ресурсов |
Объект , содержащий список ресурсов драйвера адаптера, назначенных вложенной части. |
Строка ссылки |
Имя, добавляемое к имени пути к устройству, чтобы указать подсеть во время создания фильтра. |
Интерфейсы IMiniportXxx и IPortXxx подраздела наследуются от базовых интерфейсов IMiniport и IPort соответственно.
Системный драйвер PortCls не различает драйвер порта и драйвер мини-порта. Для этого просто требуется объект, например объект порта, с интерфейсом, который может обрабатывать системные запросы.
Аналогичным образом 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.