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á Nt nebo Zw verzi rutiny nativních systémových služeb, rutina vždy zachází s parametry, které přijímá jako hodnoty, které pocházejí ze zdroje uživatelského režimu, který není důvěryhodný. 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 poskytují 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ěť byla přidělena v systémové paměti, ne v paměti v uživatelském režimu. Pokud rutina obdrží popisovač, který byl otevřen aplikací v uživatelském režimu, rutina hledá popisovač v tabulce popisovačů uživatelského 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í témata:
knihovny a hlavičky