Создание дочерних цехов

Термин 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.