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 MyAddDevice
bereitgestellt 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).