Delen via


Subdevice maken

De term subdevice wordt gebruikt om de binding te beschrijven van de vier onderdelen die worden vermeld in de volgende tabel.

Onderdeel Beschrijving

Miniport-object

Een object dat de IMiniportXxx-interface van het minipoortstuurprogramma beschikbaar maakt

Poortobject

Een object dat de IPortXxx-interface van het poortstuurprogramma beschikbaar maakt

Bronnenlijstobject

Een object met een lijst met bronnen voor het adapterstuurprogramma die zijn toegewezen aan het subdevice

Referentiestring

Een naam die is toegevoegd aan de naam van het apparaatpad om een subapparaat op te geven tijdens het maken van het filter

De IMiniportXxx - en IPortXxx-interfaces van een subdevice nemen respectievelijk over van de basisinterfaces IMiniport en IPort.

Het PortCls-systeemstuurprogramma maakt geen onderscheid tussen het poortstuurprogramma en het minipoortstuurprogramma. Hiervoor is alleen een object vereist, zoals het poortobject, met een interface die door het systeem gegenereerde aanvragen kan verwerken.

Op dezelfde manier is PortCls niet rechtstreeks betrokken bij het beheren van resources. Het hoeft alleen de verzoekhandler (het poortstuurprogramma) aan een bronnenlijst te koppelen. Het adapterstuurprogramma is verantwoordelijk voor het verbinden van de poort-, minipoort- en resourcelijstobjecten.

In het volgende codevoorbeeld ziet u hoe het adapterstuurprogramma deze acties uitvoert:

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

Zie PcNewPort, PcNewMiniport en PcRegisterSubdevice voor meer informatie over de functieaanroepen van PortCls in het voorgaande codevoorbeeld.