Создание подустройства

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