Creazione di sottodispositivi

Il termine subdevice viene usato per descrivere l'associazione dei quattro componenti elencati nella tabella seguente.

Componente Descrizione

Oggetto Miniport

Oggetto che espone l'interfaccia IMiniportXxx del driver miniport

Oggetto Porta

Oggetto che espone l'interfaccia IPortXxx del driver di porta

Oggetto Elenco risorse

Oggetto contenente un elenco di risorse del driver dell'adattatore assegnate al sottodevice

Stringa di riferimento

Nome aggiunto al nome del percorso del dispositivo per specificare un sottodevice durante la creazione del filtro

Le interfacce IMiniportXxx e IPortXxx di un subdevice ereditano rispettivamente da interfacce di base IMiniport e IPort.

Il driver di sistema PortCls non distingue tra il driver di porta e il driver miniport. Richiede semplicemente un oggetto, ad esempio l'oggetto porta, con un'interfaccia che può gestire le richieste generate dal sistema.

Analogamente, PortCls non è direttamente coinvolto nella gestione delle risorse. Deve associare solo il gestore della richiesta (il driver della porta) a un elenco di risorse. Il driver dell'adattatore è responsabile dell'associazione tra gli oggetti porta, miniport e elenco risorse.

Nell'esempio di codice seguente viene illustrato come il driver dell'adapter esegue queste azioni:

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

Per informazioni sulle chiamate della funzione PortCls nell'esempio di codice precedente, vedere PcNewPort, PcNewMiniport e PcRegisterSubdevice.