IO_DPC_ROUTINE Rückruffunktion (wdm.h)
Die DpcForIsr-Routine beendet die Wartung eines E/A-Vorgangs, nachdem eine InterruptService-Routine zurückgegeben wurde.
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
Vom Aufrufer bereitgestellter Zeiger auf eine KDPC-Struktur , die das DPC-Objekt darstellt, das dieser 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 von der 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 IoRequestDpc angegeben wurden.
Rückgabewert
Keine
Bemerkungen
Um eine DpcForIsr-Routine für ein bestimmtes Geräteobjekt zu registrieren, muss ein Treiber IoInitializeDpcRequest aufrufen, wodurch das System ein DPC-Objekt ordnet 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 Treibers IoRequestDPC aufrufen.
Eine DpcForIsr-Routine ist in der Regel für mindestens die folgenden Aufgaben zuständig:
Abschließen des E/A-Vorgangs, der vom empfangenen IRP beschrieben wird.
Entfernen des nächsten IRP.
Wenn der Treiber die vom System bereitgestellte IRP-Warteschlange verwendet, sollte die DpcForIsr-RoutineIoStartNextPacket oder IoStartNextPacketByKey aufrufen, damit 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 die nächste IRP aus der Warteschlange entfernen und mit der Verarbeitung für die nächste E/A-Anforderung beginnen.
Festlegen des E/A-status-Blocks im empfangenen IRP und Aufrufen von 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-Objekte und DPCs.
Beispiele
Um eine DpcForIsr-Rückrufroutine zu definieren, müssen Sie zunächst eine Funktionsdeklaration bereitstellen, die den Typ der Rückrufroutine identifiziert, die Sie definieren. Windows bietet eine Reihe von Rückruffunktionstypen für Treiber. Das Deklarieren einer Funktion mithilfe der Rückruffunktionstypen hilft der Codeanalyse für Treiber, der statischen Treiberüberprüfung (Static Driver Verifier , SDV) und anderen Überprüfungstools, Fehler zu finden, und es ist eine Voraussetzung für das Schreiben von Treibern für das Windows-Betriebssystem.
Um beispielsweise eine DpcForIsr-Rückrufroutine mit dem Namen MyDpcForIsr
zu definieren, verwenden Sie den typ IO_DPC_ROUTINE, 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 ist in der Wdm.h-Headerdatei definiert. Um Fehler beim Ausführen der Codeanalysetools genauer zu identifizieren, fügen Sie die _Use_decl_annotations_
Anmerkung ihrer Funktionsdefinition hinzu. Die _Use_decl_annotations_
Anmerkung stellt sicher, dass die Anmerkungen verwendet werden, die auf den IO_DPC_ROUTINE Funktionstyp in der Headerdatei angewendet 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 Verhalten von Funktionen mit Anmerkungen.
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform | Desktop |
Header | wdm.h (einschließlich Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | Wird bei DISPATCH_LEVEL aufgerufen. |