Sdílet prostřednictvím


Rutiny pro čištění správy

Rutina DispatchCleanup ovladače zpracovává IRP pro kód I/O funkce IRP_MJ_CLEANUP.

Ovladače mohou použít rutinu DispatchCleanup k provedení všech čistících operací, které jsou potřeba po uzavření všech popisovačů objektu souboru. Všimněte si, že DispatchCleanup je volána v kontextu procesu, který zavřel poslední popisovač; tento proces se může lišit od procesu, který původně otevřel popisovač. (K tomuto rozdílu obvykle dochází, protože jiný proces používá rutinu uživatelského režimu DuplicateHandle k duplikování popisovačů procesů.) Ovladače, které musí provést vyčištění v kontextu původního procesu, mohou použít rutinu PsSetCreateProcessNotifyRoutine k registraci rutiny zpětného volání pro tento účel, ale mějte na paměti, že takové zpětné volání jsou omezeným systémovým prostředkem.

Obecně platí, že rutina DispatchCleanup musí zpracovat požadavek IRP_MJ_CLEANUP provedením následujícího postupu pro každý protokol IRP, který je aktuálně ve frontě zařízení (nebo v interní frontě irPs ovladače), pro objekt cílového zařízení a je přidružený k objektu souboru:

  • Zavolejte IoSetCancelRoutine , aby se nastavil ukazatel rutiny Cancel na HODNOTU NULL.

  • Zrušte všechny IRP, které jsou aktuálně ve frontě pro objekt cílového zařízení, pokud objekt souboru zadaný v umístění V/V zásobníku ovladače ve frontě IRP odpovídá objektu souboru přijatému v umístění V/V zásobníku požadavku IRP_MJ_CLEANUP.

  • Voláním ioCompleteRequest dokončete IRP a vraťte STATUS_SUCCESS.

Při zpracování žádosti IRP_MJ_CLEANUP může ovladač přijímat další žádosti, například IRP_MJ_READ nebo IRP_MJ_WRITE. Ovladač, který musí uvolnit prostředky, musí také synchronizovat provádění své DispatchCleanup rutiny s ostatními dispečerskými rutinami, jako jsou DispatchRead a DispatchWrite.