Hauptseite   Auflistung der Dateien   Datei-Elemente  

Driver.cpp Dateireferenz

#include "Driver.h"

Funktionen

NTSTATUS DriverEntry (IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath)
 Wird beim erstmaligen Laden des Treibers aufgerufen. Initialisiert den Treiber.

VOID DriverUnload (IN PDRIVER_OBJECT pDriverObject)
 Wird vom PnP-Manager aufgerufen, um den Treiber zu entladen.

NTSTATUS AddDevice (IN PDRIVER_OBJECT pDriverObject, IN PDEVICE_OBJECT pPdo)
 Sobald ein neues Gerät am Bus gefunden wurde, wird AddDevice aufgerufen.

NTSTATUS DispPnp (IN PDEVICE_OBJECT pDo, IN PIRP pIrp)
 Wird vom PnP-Manager aufgerufen, um entsprechende PnP-Codes zu übergeben.

NTSTATUS PassDownPnP (IN PDEVICE_OBJECT pDo, IN PIRP pIrp)
 Zentrale Funktion, die die Weiterleitung nach IO-Request-Packets durch den Treiberstack ermöglicht.

NTSTATUS HandleStartDevice (IN PDEVICE_OBJECT pDo, IN PIRP pIrp)
 Wird aus dem Treiber heraus aufgerufen.

NTSTATUS HandleStopDevice (IN PDEVICE_OBJECT pDo, IN PIRP pIrp)
 Aufruf aus dem Treiber heraus.

NTSTATUS HandleRemoveDevice (IN PDEVICE_OBJECT pDo, IN PIRP pIrp)
 Aufruf aus dem Treiber heraus.

NTSTATUS DispatchCreate (IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
 Wird direkt vom IO-Manager aufgerufen, um den Win32-Funktionsaufruf CreateHandle zu bearbeiten.

NTSTATUS DispatchClose (IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
 Wird direkt vom IO-Manager aufgerufen, um den Win32-Funktionsaufruf CloseHandle zu bearbeiten.

VOID DispatchCancel (IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
 Wird aufgerufen, wenn die Bearbeitung eines IRP abgebrochen wurde.

NTSTATUS DispatchWrite (IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
 Wird für die Win32-Funktion WriteFile aufgerufen.

NTSTATUS DispatchRead (IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
 Wird für die Win32-Funktion ReadFile aufgerufen.

BOOLEAN Isr (IN PKINTERRUPT pIntObj, IN PVOID pServiceContext)
 Eigentlicher Einsprungpunkt, um einen aufgetretenen Interrupt zu bearbeiten.

VOID StartIo (IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
 Funktion für den eigentlichen Datentransfer.

VOID DpcForIsr (IN PKDPC pDpc, IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp, IN PVOID pContext)
 Wird vom IO-Manager als DPC aufgerufen.


Dokumentation der Funktionen

NTSTATUS AddDevice IN PDRIVER_OBJECT    pDriverObject,
IN PDEVICE_OBJECT    pPdo
 

Sobald ein neues Gerät am Bus gefunden wurde, wird AddDevice aufgerufen.

AddDevice dient dazu, den Gerätestack aufzubauen. Es muß also für das PhysicalDeviceObject (PDO) ein entsprechendes FunctionalDeviceObject (FDO) erzeugt werden. Außerdem ist eine "Bekanntmachung" des Gerätes in Form eines symbolischen Gerätenames erforderlich.

Parameter:
pDriverObject  Das für diesen Treiber angelegte Objekt.
pdo  Ein Zeiger auf das PDO, welches für den Zugriff auf die Hardware vom PNP-Manager angelegt wurde. WICHTIG: Für unsere Funktion stellt sich dieses Objekt als PDO dar, kann aber im Kontext des Treiberstacks auch die Rolle eines Filterobjektes spielen, was für uns aber völlig transparent und auch egal ist.
Rückgabe :
Ein Long-Wert, verpackt als NTSTATUS, welcher mittels NT_SUCCESS ausgwertet werden kann.

VOID DispatchCancel IN PDEVICE_OBJECT    pDevObj,
IN PIRP    pIrp
 

Wird aufgerufen, wenn die Bearbeitung eines IRP abgebrochen wurde.

Parameter:
pDevObj  Zeiger auf das entsprechende DeviceObject, welches uns eine eindeutige Identifikation des Gerätes ermöglicht.
pIrp  Zeiger auf entsprechendes IRP

NTSTATUS DispatchClose IN PDEVICE_OBJECT    pDevObj,
IN PIRP    pIrp
 

Wird direkt vom IO-Manager aufgerufen, um den Win32-Funktionsaufruf CloseHandle zu bearbeiten.

Parameter:
pDevObj  Zeiger auf das entsprechende DeviceObject, welches uns eine eindeutige Identifikation des Gerätes ermöglicht.
pIrp  Zeiger auf entsprechendes IRP
Rückgabe :
Long-Wert, verpackt als NTSTATUS. Kann mittels NT_SUCCESS ausgewertet werden.

NTSTATUS DispatchCreate IN PDEVICE_OBJECT    pDevObj,
IN PIRP    pIrp
 

Wird direkt vom IO-Manager aufgerufen, um den Win32-Funktionsaufruf CreateHandle zu bearbeiten.

Parameter:
pDevObj  Von uns erzeugtes DeviceObject, welches der IO-Manager dem Funktionsaufruf mit übergibt. WIr können damit das angesprochene Gerät eindeutig zuordnen.
pIrp  Zugehöriger Zeiger auf ein IRP.
Rückgabe :
Long-Wert, verpackt als NTSTATUS. Kann mittels NT_SUCCESS ausgewertet werden.

NTSTATUS DispatchRead IN PDEVICE_OBJECT    pDevObj,
IN PIRP    pIrp
 

Wird für die Win32-Funktion ReadFile aufgerufen.

Parameter:
pDevObj  pDevObj Zeiger auf das entsprechende DeviceObject, welches uns eine eindeutige Identifikation des Gerätes ermöglicht.
pIrp  pIrp Zeiger auf entsprechendes IRP
Rückgabe :
Long-Wert, verpackt als NTSTATUS. Wird vom IO-Manager ausgewertet.

NTSTATUS DispatchWrite IN PDEVICE_OBJECT    pDevObj,
IN PIRP    pIrp
 

Wird für die Win32-Funktion WriteFile aufgerufen.

Parameter:
pDevObj  pDevObj Zeiger auf das entsprechende DeviceObject, welches uns eine eindeutige Identifikation des Gerätes ermöglicht.
pIrp  pIrp Zeiger auf entsprechendes IRP
Rückgabe :
Long-Wert, verpackt als NTSTATUS. Wird vom IO-Manager ausgewertet.

NTSTATUS DispPnp IN PDEVICE_OBJECT    pDo,
IN PIRP    pIrp
 

Wird vom PnP-Manager aufgerufen, um entsprechende PnP-Codes zu übergeben.

Parameter:
pDo  Ist der Zeiger auf das DeviceObject, welches wir in AddDevice angelegt haben.
pIrp  Zeiger auf das entsprechende IO-Request-Packet. Dieses durchwandert den gesamten Stack, anschaulich gesagt, zuerst von oben nach unten und wieder zurück.
Rückgabe :
Ein Long-Wert, verpackt als NTSTATUS, der mittels NT_SUCCESS überprüft ausgewertet werden kann.

VOID DpcForIsr IN PKDPC    pDpc,
IN PDEVICE_OBJECT    pDevObj,
IN PIRP    pIrp,
IN PVOID    pContext
 

Wird vom IO-Manager als DPC aufgerufen.

Ist ein Interrupt aufgetreten, wird die entsprechende ISR aufgerufen. Da diese entsprechend kurz gehalten werden muß, können ausstehende Arbeiten in eine eigene Funktion ausgelagert werden, in diesem Fall DpcForIsr. Diese wird dann auf einem niedrigeren IRQL ausgeführt. Es ist dabei darauf zu achten, daß ein mehrmaliges Einfügen eines DPC-Aufrufes in die Windows-interne Warteschlange in diesem einfachen Fall nicht möglich ist. Der Aufruf dafür kann zwar mehrfach erfolgen, die Ausführung erfolgt jedoch nur einmal. Wird jedoch eine strenge 1:1 Abbildung von IoRequestDpc auf DpcForIsr gefordert, muß man einen eigenen Mechanismus implementieren.

Parameter:
pDpc  Ein Zeiger auf DPC-Objekt, siehe hierzu wdm.h
pDevObj  Zeiger auf unser DeviceObject
pIrp  Zeiger auf entsprechendes IRP
pContext  Zeiger auf unsere eigene Struktur, in diesem Fall unsere DeviceExtension

NTSTATUS DriverEntry IN PDRIVER_OBJECT    pDriverObject,
IN PUNICODE_STRING    pRegistryPath
 

Wird beim erstmaligen Laden des Treibers aufgerufen. Initialisiert den Treiber.

Parameter:
pDriverObject  Wird vom PNP-Manager übergeben und repräsentiert den Treiber im Kernel.
pRegistryPath  Dieser Zeiger auf einen Unicode-String entspricht dem Schlüssel aus der Registry für diesen Treiber. In userem Beispiel nicht von Belang.
Rückgabe :
Rückgabewert ist ein NTSTATUS-Code (LONG), der Erfolg bzw. Fehlercode signalisiert. Die Auswertung erfolgt mittels des Makros NT_SUCCESS.

VOID DriverUnload IN PDRIVER_OBJECT    pDriverObject
 

Wird vom PnP-Manager aufgerufen, um den Treiber zu entladen.

Der Treiber kann noch ausstehende Arbeiten ausführen, sofern dies nötig ist. Der IRQL-Kontext ist PASSIVE_LEVEL, so dass eben auch Speicher wieder freigegeben werden kann.

Parameter:
pDriverObject  Zeiger auf TreiberObjekt, welches vom IO-Manager verwaltet wird. Es ist NICHT unsere Aufgabe, dieses zu löschen.

NTSTATUS HandleRemoveDevice IN PDEVICE_OBJECT    pDo,
IN PIRP    pIrp
 

Aufruf aus dem Treiber heraus.

Parameter:
pDo  Von uns erzeugtes DeviceObject
pIrp  Zeiger auf entsprechendes IRP
Rückgabe :
Long-Wert, verpackt als NTSTATUS. Kann mittels NT_SUCCESS ausgewertet werden.
Siehe auch:
HandleStartDevice , DispPnp

NTSTATUS HandleStartDevice IN PDEVICE_OBJECT    pDo,
IN PIRP    pIrp
 

Wird aus dem Treiber heraus aufgerufen.

Um eine bessere Verteilung der Funktionalität und Wartbarkeit des Codes zu erreichen, wird der KontrollCode IRP_MN_START_DEVICE auf diese Funktion abgebildet.

Parameter:
pDo  Zeiger auf von uns erzeugtes DeviceObject.
pIrp  Zeiger auf entsprechendes IRP
Rückgabe :
Long-Wert, verpackt als NTSTATUS. Kann mittels NT_SUCCESS ausgewertet werden.
Siehe auch:
DispPnP

NTSTATUS HandleStopDevice IN PDEVICE_OBJECT    pDo,
IN PIRP    pIrp
 

Aufruf aus dem Treiber heraus.

Parameter:
pDo  Von uns erzeugtes DeviceObject
pIrp  Zeiger auf entsprechendes IRP
Rückgabe :
Long-Wert, verpackt als NTSTATUS. Kann mittels NT_SUCCESS ausgewertet werden.
Siehe auch:
HandleStartDevice , DispPnp

BOOLEAN Isr IN PKINTERRUPT    pIntObj,
IN PVOID    pServiceContext
 

Eigentlicher Einsprungpunkt, um einen aufgetretenen Interrupt zu bearbeiten.

Parameter:
pIntObj  Zeiger auf das unserem Device zugeordnete InterruptObject. Dieses wurde in HandleStartDevice angelegt.
pServiceContext  Zeiger auf eine von uns bereitgestellte Struktur, der DeviceExtension. Auf diese Art und Weise können wir Rückschlüsse auf das entsprechende DeviceObject machen.
Rückgabe :
Der Rückgabewert ist TRUE, falls die ISR den Interrupt nicht behandelt, weil er nicht von der parallelen Schnittstelle stammt. FALSE andernfalls. Der Kernel wird dann die nächste ISR aufrufen, die ebenfalls auf diesen Interrupt abgebildet worden ist.

NTSTATUS PassDownPnP IN PDEVICE_OBJECT    pDo,
IN PIRP    pIrp
 

Zentrale Funktion, die die Weiterleitung nach IO-Request-Packets durch den Treiberstack ermöglicht.

Parameter:
pDo  Zeiger auf von uns in AddDevice angelegtes DeviceObject.
pIrp  Zeiger auf entsprechendes IRP.
Rückgabe :
Long-Wert, verpackt als NTSTATUS. Kann mittels NT_SUCCESS ausgewertet werden.

VOID StartIo IN PDEVICE_OBJECT    pDevObj,
IN PIRP    pIrp
 

Funktion für den eigentlichen Datentransfer.

Parameter:
pDevObj  Zeiger auf das von uns erzeugte DeviceObject
pIrp  Zeiger auf entsprechendes IRP.


Erzeugt am Mon Jun 23 10:20:03 2003 von doxygen1.2.17