IoSetCancelRoutine-Funktion (wdm.h)
Die IoSetCancelRoutine-Routine richtet eine vom Treiber bereitgestellte Cancel-Routine ein, die aufgerufen wird, wenn eine bestimmte IRP abgebrochen wird.
Syntax
PDRIVER_CANCEL IoSetCancelRoutine(
[in] PIRP Irp,
[in] PDRIVER_CANCEL CancelRoutine
);
Parameter
[in] Irp
Zeiger auf das IRP, das in einen abbrechbaren Zustand versetzt oder aus diesem entfernt wird.
[in] CancelRoutine
Gibt den Einstiegspunkt der vom Aufrufer bereitgestellten Cancel-Routine an, die aufgerufen werden soll, wenn der angegebene IRP abgebrochen wird, oder NULL ist, wenn die angegebene IRP aus dem abbrechbaren Zustand entfernt wird. Diese Routine wird wie folgt deklariert:
VOID
(*PDRIVER_CANCEL)(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
Rückgabewert
IoSetCancelRoutine gibt den vorherigen Wert von Irp-CancelRoutine> zurück. Wenn zuvor keine Cancel-Routine festgelegt wurde oder die IRP-Abbruch bereits ausgeführt wird, gibt IoSetCancelRoutineNULL zurück.
Hinweise
Diese Routine kann die derzeit in einem IRP festgelegte Cancel-Routine deaktivieren.
Ein Treiber muss die Systemabbruchsperre beim Aufrufen dieser Routine halten, wenn der Treiber die vom E/A-Manager bereitgestellte Gerätewarteschlange im Geräteobjekt verwendet. Der Treiber wird bei IRQL = DISPATCH_LEVEL ausgeführt, nachdem IoAcquireCancelSpinLock aufgerufen wurde, bis er die Drehsperre mit IoReleaseCancelSpinLock aufbricht.
Wenn der Treiber seine eigenen Warteschlangen von IRPs verwaltet, muss der Treiber beim Aufrufen dieser Routine nicht die Abbruch-Spin-Sperre halten. IoSetCancelRoutine verwendet einen intrinsischen Austausch, um die Adresse der Cancel-Routine als atomaren Vorgang festzulegen. Eine geringere Nutzung der Drehsperre kann die Treiberleistung und die Gesamtleistung des Systems verbessern.
Driver Cancel-Routinen werden unter IRQL = DISPATCH_LEVEL aufgerufen, wobei die Abbruchdrehsperre gehalten wird. Die Cancel-Routine muss die Abbruch-Drehsperre freigeben, bevor sie die Steuerung zurückgibt.
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform | Desktop |
Header | wdm.h (einschließlich Wdm.h, Ntddk.h, Ntifs.h) |
Bibliothek | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | DISPATCH_LEVEL (siehe Abschnitt Hinweise) |
DDI-Complianceregeln | IrpCancelField(wdm), StartIoCancel(wdm) |