Freigeben über


Startsequenz

Da der Adaptertreiber als Kernelmodustreiberdienst installiert ist, lädt das Betriebssystem den Adaptertreiber zur Systemstartzeit und ruft die DriverEntry-Routine des Treibers auf. Die DriverEntry-Routine empfängt zwei Parameter: ein Treiberobjekt und einen Registrierungspfadnamen. DriverEntry sollte die PortCls-Funktion PcInitializeAdapterDriver mit den Parametern driver-object und registry-path name sowie einem dritten Parameter aufrufen, der ein Zeiger auf die AddDevice-Funktion des Adaptertreibers ist.

Im folgenden Beispiel übergibt die DriverEntry-Funktion des Treibers den Funktionszeiger MyAddDevice, der auf die AddDevice-Funktion des Treibers verweist, als dritten Parameter an die PcInitializeAdapterDriver-Routine .

NTSTATUS 
  DriverEntry( 
    PDRIVER_OBJECT  DriverObject,
    PUNICODE_STRING  RegistryPath
    )
  {
      return PcInitializeAdapterDriver(DriverObject, RegistryPath, MyAddDevice);
  }

Die PcInitializeAdapterDriver-Routine installiert die angegebene AddDevice-Routine in der Treibererweiterung des Treiberobjekts und installiert die IRP-Handler des PortCls-Treibers im Treiberobjekt selbst.

Der folgende Code ist eine Beispielimplementierung der Funktion des Treibers MyAddDevice .

#define MAX_MINIPORTS 6    // maximum number of miniports
NTSTATUS
  MyAddDevice(
    PDRIVER_OBJECT  DriverObject,
    PDEVICE_OBJECT  PhysicalDeviceObject 
    )
  {
      return PcAddAdapterDevice(DriverObject, PhysicalDeviceObject, MyStartDevice,
                                MAX_MINIPORTS, 0);
  }

Diese Funktion ruft die PortCls-Funktion PcAddAdapterDevice auf, die das angegebene Adaptergerät erstellt, dem Gerät einen Treiber ordnet und einen Zeiger auf die Funktion des Adaptertreibers MyStartDevice speichert, die aufgerufen wird, wenn das Betriebssystem das Gerät startet (siehe Starten eines Geräts). Die PcAddAdapterDevice-Routine erstellt ein funktionales Geräteobjekt (Functional Device Object, FDO) und ordnet es dem vom System bereitgestellten physischen Geräteobjekt (PDO) zu. Die neue FDO wird mit einer Erweiterung erstellt, die PortCls verwendet, um Kontextinformationen zum Gerät zu speichern. Dieser Kontext umfasst den Funktionszeiger, der MyStartDevice von MyAddDevicebereitgestellt wird.

Nachdem das Betriebssystem ermittelt hat, welche Ressourcen (Interrupts, DMA-Kanäle, E/A-Portadressen usw.) dem Gerät zugewiesen werden sollen, sendet es dem Gerät eine Anforderung zum Starten (IRP_MN_START_DEVICE). Als Antwort auf diese Anforderung ruft der Anforderungshandler im PortCls-Treiber die Funktion des Adaptertreibers MyStartDevice auf, was im folgenden Beispielcode gezeigt wird:

NTSTATUS
  MyStartDevice(
    PDEVICE_OBJECT DeviceObject,
    PIRP Irp,
    PRESOURCELIST ResourceList
    )
  {
    ...
  }

Der Anforderungshandler stellt MyStartDevice Zeiger auf das Geräteobjekt, IRP_MN_START_DEVICE Anforderung und ressourcenliste bereit (siehe IResourceList). Die MyStartDevice Funktion partitioniert die Ressourcenliste in die Ressourcen, die für jeden Miniporttreiber erforderlich sind, der gestartet werden muss. Die Funktion startet dann jeden Miniporttreiber und gibt die Steuerung an PortCls zurück, wodurch die IRP abgeschlossen und die Steuerung an das Betriebssystem zurückgegeben wird.

Weitere Beispiele für Treiberstartcode finden Sie in den Beispieltreibern für Audioadapter im Microsoft Windows Driver Kit (WDK).