IO_DPC_ROUTINE Rückruffunktion (wdm.h)
Die DpcForIsr Routine beendet die Wartung eines E/A-Vorgangs, nachdem ein InterruptService- Routine zurückgegeben wird.
Syntax
IO_DPC_ROUTINE IoDpcRoutine;
void IoDpcRoutine(
[in] PKDPC Dpc,
[in] _DEVICE_OBJECT *DeviceObject,
[in, out] _IRP *Irp,
[in, optional] PVOID Context
)
{...}
Parameter
[in] Dpc
Aufrufer-bereitgestellter Zeiger auf eine KDPC--Struktur, die das DPC-Objekt darstellt, das diesem DpcForIsr--Routine zugeordnet ist.
[in] DeviceObject
Vom Aufrufer bereitgestellter Zeiger auf eine DEVICE_OBJECT Struktur. Dies ist das Geräteobjekt für das Zielgerät, das zuvor vom AddDevice Routine des Treibers erstellt wurde.
[in, out] Irp
Vom Aufrufer bereitgestellter Zeiger auf eine IRP--Struktur, die den E/A-Vorgang beschreibt.
[in, optional] Context
Vom Aufrufer bereitgestellter Zeiger auf treiberdefinierte Kontextinformationen, die in einem vorherigen Aufruf von IoRequestDpcangegeben wurden.
Rückgabewert
Nichts
Bemerkungen
Um eine DpcForIsr Routine für ein bestimmtes Geräteobjekt zu registrieren, muss ein Treiber IoInitializeDpcRequestaufrufen, wodurch das System ein DPC-Objekt zuweist und initialisiert. (Wenn Sie mehrere DPC-Routinen benötigen, verwenden Sie CustomDpc Routinen.)
Um eine DpcForIsr-routine für die Ausführung in die Warteschlange zu stellen, muss die InterruptService-Routine eines TreibersIoRequestDPC-aufrufen.
Eine DpcForIsr- Routine ist in der Regel für mindestens die folgenden Aufgaben verantwortlich:
Abschließen des von der empfangenen IRP beschriebenen E/A-Vorgangs.
Dequeuing next IRP.
Wenn der Treiber die vom System bereitgestellte IRP-Warteschlange verwendet, sollte die DpcForIsr-Routine IoStartNextPacket oder IoStartNextPacketByKey-aufrufen, sodass die StartIo Routine des Treibers mit der Verarbeitung der nächsten E/A-Anforderung beginnt.
Wenn der Treiber interne IRP-Warteschlangen verwendet, sollte die DpcForIsr Routine das nächste IRP dequeue und mit der Verarbeitung für die nächste E/A-Anforderung beginnen.
Festlegen des E/A-Statusblocks im empfangenen IRP und Aufrufen IoCompleteRequest- für die abgeschlossene Anforderung.
Eine DpcForIsr Routine kann auch einen fehlgeschlagenen Vorgang wiederholen oder die nächste Übertragung für eine große E/A-Anforderung einrichten, die in kleinere Teile unterteilt wurde.
Weitere Informationen zu DpcForIsr Routinen finden Sie unter DPC Objects and DPCs.
Beispiele
Um eine DpcForIsr- Rückrufroutine zu definieren, müssen Sie zuerst eine Funktionsdeklaration bereitstellen, die den Typ der von Ihnen definierten Rückrufroutine identifiziert. Windows stellt eine Reihe von Rückruffunktionstypen für Treiber bereit. Durch das Deklarieren einer Funktion mithilfe der Rückruffunktionstypen können Codeanalyse für Treiber, statische Treiberüberprüfung (SDV) und andere Überprüfungstools Fehler finden, und es ist eine Anforderung zum Schreiben von Treibern für das Windows-Betriebssystem.
Um beispielsweise eine DpcForIsr- Rückrufroutine zu definieren, die MyDpcForIsr
benannt ist, verwenden Sie den IO_DPC_ROUTINE Typ, wie in diesem Codebeispiel gezeigt:
IO_DPC_ROUTINE MyDpcForIsr;
Implementieren Sie dann Ihre Rückrufroutine wie folgt:
_Use_decl_annotations_
VOID
MyDpcForIsr(
PKDPC Dpc,
struct _DEVICE_OBJECT *DeviceObject,
struct _IRP *Irp,
PVOID Context
)
{
// Function body
}
Der IO_DPC_ROUTINE Funktionstyp wird in der Wdm.h-Headerdatei definiert. Um Fehler genauer zu identifizieren, wenn Sie die Codeanalysetools ausführen, müssen Sie der Funktionsdefinition die _Use_decl_annotations_
Anmerkung hinzufügen. Die _Use_decl_annotations_
Anmerkung stellt sicher, dass die Anmerkungen, die auf den Funktionstyp IO_DPC_ROUTINE in der Headerdatei angewendet werden, verwendet werden. Weitere Informationen zu den Anforderungen für Funktionsdeklarationen finden Sie unter Deklarieren von Funktionen mithilfe von Funktionsrollentypen für WDM-Treiber. Informationen zu _Use_decl_annotations_
finden Sie unter Annotating Function Behavior.
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform- | Desktop |
Header- | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
IRQL- | Wird bei DISPATCH_LEVEL aufgerufen. |