Freigeben über


Subdevice-Erstellung

Der Begriff "Subdevice " wird verwendet, um die Bindung der vier Komponenten zu beschreiben, die in der folgenden Tabelle aufgeführt sind.

Komponente BESCHREIBUNG

Miniport-Objekt

Ein Objekt, das die IMiniportXxx-Schnittstelle des Miniporttreibers verfügbar macht

Port-Objekt

Ein Objekt, das die IPortXxx-Schnittstelle des Porttreibers verfügbar macht

Ressourcenlistenobjekt

Ein Objekt, das eine Liste der Adaptertreiberressourcen enthält, die dem Untergerät zugewiesen sind

Verweiszeichenfolge

Ein Name, der dem Gerätepfadnamen hinzugefügt wurde, um während der Filtererstellung einen Unterdevice anzugeben

Die IMiniportXxx - und IPortXxx-Schnittstellen eines Subdevice erben von den Basisschnittstellen IMiniport bzw. IPort.

Der PortCls-Systemtreiber unterscheidet nicht zwischen dem Porttreiber und dem Miniporttreiber. Es erfordert einfach ein Objekt, z. B. das Portobjekt, mit einer Schnittstelle, die vom System generierte Anforderungen verarbeiten kann.

Ebenso ist PortCls nicht direkt an der Verwaltung von Ressourcen beteiligt. Er muss nur den Anforderungshandler (den Porttreiber) an eine Ressourcenliste binden. Der Adaptertreiber ist für die Verknüpfung der Port-, Miniport- und Ressourcenlistenobjekte verantwortlich.

Das folgende Codebeispiel zeigt, wie der Adaptertreiber diese Aktionen ausführt:

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

Informationen zu den PortCls-Funktionsaufrufen im vorherigen Codebeispiel finden Sie unter "PcNewPort", "PcNewMiniport" und "PcRegisterSubdevice".