Sdílet prostřednictvím


Použití verzí Nt a Zw rutin nativních systémových služeb

Rozhraní API nativních služeb operačního systému Windows se implementuje jako sada rutin, které běží v režimu jádra. Tyto rutiny mají názvy začínající předponou Nt nebo Zw. Ovladače režimu jádra mohou tyto rutiny volat přímo. Aplikace v uživatelském režimu mají přístup k těmto rutinám pomocí systémových volání.

S několika výjimkami má každá rutina nativních systémových služeb dvě mírně odlišné verze, které mají podobné názvy, ale různé předpony. Například volání NtCreateFile a ZwCreateFile provádějí podobné operace a ve skutečnosti je obsluhuje stejná rutina v režimu jádra systému. V případě systémových volání z uživatelského režimu se Nt a Zw verze rutiny chovají stejně. U volání ovladače režimu jádra se Nt a Zw verze rutiny liší v tom, jak zpracovávají hodnoty parametrů, které volající předává rutině.

Ovladač režimu jádra volá Zw verzi rutiny nativních systémových služeb, aby informoval rutinu, že parametry pocházejí z důvěryhodného zdroje režimu jádra. V tomto případě rutina předpokládá, že může bezpečně používat parametry bez jejich prvního ověření. Pokud však parametry mohou být buď ze zdroje uživatelského režimu, nebo ze zdroje v režimu jádra, ovladač místo toho volá Nt verzi rutiny, která určuje na základě historie volajícího vlákna, zda parametry pocházejí v uživatelském režimu nebo v režimu jádra. Další informace o tom, jak rutina rozlišuje parametry uživatelského režimu od parametrů režimu jádra, naleznete v tématu PreviousMode.

Když aplikace v uživatelském režimu volá rutinu nativní systémové služby, jako je Nt nebo Zw, rutina vždy nakládá s parametry, které přijímá, jako s hodnotami pocházejícími z nedůvěryhodného zdroje uživatelského režimu. Rutina důkladně ověří hodnoty parametrů před použitím parametrů. Konkrétně rutina kontroluje veškeré vyrovnávací paměti poskytnuté volajícím, aby ověřila, že tyto paměti jsou umístěny v platném uživatelském režimu a správně zarovnány.

Rutiny nativních systémových služeb činí další předpoklady o parametrech, které přijímají. Pokud rutina obdrží ukazatel na vyrovnávací paměť přidělenou ovladačem režimu jádra, rutina předpokládá, že vyrovnávací paměť je přidělena v systémové paměti, nikoli v paměti v uživatelském režimu. Pokud rutina obdrží popisovač otevřený aplikací v uživatelském režimu, rutina hledá popisovač v tabulce popisovačů v uživatelském režimu, ne v tabulce popisovačů v režimu jádra.

V několika případech se význam hodnoty parametru výrazně liší mezi voláními z uživatelského režimu a z režimu jádra. Například rutina ZwNotifyChangeKey (nebo její NtNotifyChangeKey protějšku) má dvojici vstupních parametrů, ApcRoutine a ApcContext, které znamenají různé věci v závislosti na tom, jestli jsou parametry ze zdroje uživatelského režimu nebo režimu jádra. Pro volání z uživatelského režimu ApcRoutine odkazuje na rutinu APC a ApcContext odkazuje na kontextovou hodnotu, kterou operační systém poskytuje při volání rutiny APC. U volání z režimu jádra ApcRoutine odkazuje na strukturu WORK_QUEUE_ITEM a ApcContext určuje typ položky pracovní fronty, který je popsán strukturou WORK_QUEUE_ITEM.

Tato část obsahuje následující články:

předchozíRežim

knihovny a hlavičky

Co znamená předpona Zw?

určení přístupových práv

rutin NtXxx