Untergeräteerstellung

Der Begriff Untergeräte 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 wird, um während der Filtererstellung ein Untergerät anzugeben.

Die IMiniport Xxx- und IPortXxx-Schnittstellen eines Untergeräteserben von den Basisschnittstellen IMiniport bzw. IPort.

Der PortCls-Systemtreiber unterscheidet nicht zwischen dem Porttreiber und dem Miniporttreiber. Sie erfordert lediglich 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. Es muss nur der Anforderungshandler (der Porttreiber) an eine Ressourcenliste gebunden werden. Der Adaptertreiber ist für die Bindung 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.