Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Správce vstupně-výstupních operací volá rutinu Cancel dodanou ovladačem se vstupním IRP, který se má zrušit, a ukazatel DeviceObject , který představuje cílové zařízení pro vstupně-výstupní požadavek.
IRP může být taková, že rutina DispatchReadWrite ovladače může být zařazena do fronty právě ve chvíli, kdy uživatel uzavírá aktuální aplikaci Win32. IRP může být také takový, který ovladač vyšší úrovně explicitně zrušil v závislosti na povaze základního zařízení.
Při volání rutiny Zrušit může vstupní IRP být již CurrentIrp v objektu cílového zařízení nebo již může být ve frontě zařízení přidružené k objektu cílového zařízení, pokud má ovladač rutinu StartIo . Pokud ovladač nemá žádnou rutinu StartIo, IRP může být ve frontě IRP spravované ovladačem, když je volána jeho rutina Zrušit. V každém případě správce vstupně-výstupních operací zavolá rutinu Cancel pro příchozí IRP, správce vstupně-výstupních operací nastaví člena Cancel v tomto IRP na TRUE a nastaví člena CancelRoutine v IRP na NULL.
Rutina Zrušit pro hlavní IRP, který má přidružené IRP, je zodpovědná za volání IoCancelIrp ke zrušení těchto přidružených IRP.
Všechny rutiny Zrušit musí dodržovat tyto pokyny:
Zavolejte IoReleaseCancelSpinLock pro uvolnění systémového zrušovacího spin zámku.
Nastavte člena Status stavového bloku I/O na STATUS_CANCELLED a nastavte jeho člena Informace na nulu.
Dokončete zadané IRP voláním IoCompleteRequest.
Vzhledem k tomu, že rutina Cancel je vždy volána se systémovým blokovacím zámkem pro zrušení, tato rutina nesmí volat IoAcquireCancelSpinLock, pokud nejprve nevolá IoReleaseCancelSpinLock.
Rutina Zrušit nemůže při vrácení ovládacího prvku držet zámek zamčení zrušení systému. To znamená, že každá rutina Cancel musí volat IoReleaseCancelSpinLock alespoň jednou předtím, než vrátí řízení.
Pokud volá IoAcquireCancelSpinLock, rutina Cancel musí provést reciproční volání IoReleaseCancelSpinLock co nejrychleji.
Nikdy nevolejte IoCompleteRequest s IRP, když držíte spin lock. Pokus o dokončení protokolu IRP při podržení zámku otáčení může způsobit zablokování.