Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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" sowie einen dritten Parameter aufrufen, bei dem es sich um einen Zeiger auf die AddDevice-Funktion des Adaptertreibers handelt.
Im folgenden Beispiel übergibt die DriverEntry-Funktion 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 bereitgestellte 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 Treiberfunktion 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, einen Treiber mit dem Gerät verknüpft und einen Zeiger auf die Funktion des Adaptertreibers MyStartDevice speichert, die aufgerufen wird, wenn das Betriebssystem das Gerät startet (siehe Start eines Geräts). Die PcAddAdapterDevice-Routine erstellt ein funktionales Geräteobjekt (FDO) und ordnet es dem physischen Geräteobjekt (PDO) zu, das vom System bereitgestellt wird. Der neue FDO wird mit einer Erweiterung erstellt, die PortCls zum Speichern von Kontextinformationen über das Gerät verwendet. Dieser Kontext enthält den Funktionszeiger, der von MyAddDevice bereitgestellt wird.
Nachdem das Betriebssystem bestimmt 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 Reaktion auf diese Anforderung ruft der Anforderungshandler im PortCls-Treiber die Funktion des Adaptertreibers MyStartDevice auf, die im folgenden Beispielcode dargestellt wird:
NTSTATUS
MyStartDevice(
PDEVICE_OBJECT DeviceObject,
PIRP Irp,
PRESOURCELIST ResourceList
)
{
...
}
Der Anforderungshandler stellt MyStartDevice Zeiger auf das Geräteobjekt, die IRP_MN_START_DEVICE-Anforderung und die Ressourcenliste zur Verfügung (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, die das IRP abschließt und die Steuerung an das Betriebssystem zurückgibt.
Weitere Beispiele für Treiberstartcode finden Sie in den Beispieltreibern für Audioadapter im Microsoft Windows Driver Kit (WDK).