Criação de subdispositivos

O termo subdispositivo é usado para descrever a associação dos quatro componentes listados na tabela a seguir.

Componente Descrição

Objeto Miniport

Um objeto que expõe a interface IMiniportXxx do driver de miniport

Objeto Port

Um objeto que expõe a interface IPortXxx do driver de porta

Objeto de lista de recursos

Um objeto que contém uma lista de recursos do driver do adaptador atribuídos ao subdispositivo

Cadeia de caracteres de referência

Um nome adicionado ao nome do caminho do dispositivo para especificar um subdispositivo durante a criação do filtro

As interfaces IMiniportXxx e IPortXxx de um subdevice herdam das interfaces base IMiniport e IPort, respectivamente.

O driver do sistema PortCls não distingue entre o driver de porta e o driver de miniport. Ele simplesmente requer um objeto, como o objeto de porta, com uma interface que pode lidar com solicitações geradas pelo sistema.

Da mesma forma, PortCls não está diretamente envolvido no gerenciamento de recursos. Ele só precisa associar o manipulador de solicitação (o driver de porta) a uma lista de recursos. O driver do adaptador é responsável por associar os objetos de porta, miniporte e lista de recursos.

O exemplo de código a seguir mostra como o driver do adaptador executa essas ações:

  //
  // 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();
  }

Para obter informações sobre as chamadas de função PortCls no exemplo de código anterior, consulte PcNewPort, PcNewMiniport e PcRegisterSubdevice.