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.
Když aplikace v uživatelském režimu volá Nt nebo Zw verzi nativní systémové služby, mechanismus volání systému přepne volající vlákno do režimu jádra. Chcete-li označit, že hodnoty parametrů mají původ v uživatelském režimu, obslužná rutina pasti pro systémové volání nastaví pole PreviousMode v objektu vlákna volajícího na UserMode. Rutina nativních systémových služeb zkontroluje pole PreviousMode volajícího vlákna a určí, zda parametry pocházejí ze zdroje uživatelského režimu.
Pokud ovladač režimu jádra volá rutinu nativních systémových služeb a předává hodnoty parametrů rutině, která je ze zdroje režimu jádra, musí ovladač zajistit, aby pole PreviousMode v aktuálním objektu vlákna bylo nastaveno na KernelMode.
Ovladač režimu jádra může běžet v kontextu libovolného vlákna a pole PreviousMode tohoto vlákna může být nastaveno na UserMode. V takovém případě může ovladač režimu jádra volat verzi Zw rutiny nativních systémových služeb, aby informoval rutinu, že hodnoty parametrů pocházejí z důvěryhodného zdroje v režimu jádra. Volání Zw přejde na tenkou vrstvovou funkci, která přepíše hodnotu PreviousMode v současném vláknovém objektu. Funkce obálky nastaví PreviousMode na KernelMode a volá nt verzi rutiny. Při návratu zNt verze rutiny obalující funkce obnoví původní hodnotu PreviousMode vláknového objektu a vrátí.
Ovladač režimu jádra může přímo volat verzi Nt nativní systémové služby. Když ovladač režimu jádra zpracuje vstupně-výstupní požadavek, který může pocházet buď v uživatelském režimu, nebo v režimu jádra, ovladač může volat nt verzi rutiny tak, aby hodnota PreviousMode aktuálního vlákna zůstala během volání nezměněna. Rutina NtXxx zkontroluje hodnotu PreviousMode volajícího vlákna, aby určila, zda jsou hodnoty parametrů z aplikace v uživatelském režimu nebo komponenty režimu jádra, a odpovídajícím způsobem je zpracovává.
K chybě může dojít v případě, že ovladač režimu jádra volá rutinu NtXxx a hodnota PreviousMode v aktuálním objektu vlákna přesně nezoznačuje, zda hodnoty parametrů pocházejí z uživatelského režimu nebo zdroje režimu jádra.
Předpokládejme například, že ovladač režimu jádra běží v kontextu libovolného vlákna a že hodnota PreviousMode pro toto vlákno je nastavena na UserMode. Pokud ovladač předá popisovač souboru v režimu jádra rutině NtClose, tato rutina zkontroluje hodnotu PreviousMode a určí, že popisovač musí být v uživatelském režimu. Pokud NtClose nenajde popisovač v tabulce popisovačů v uživatelském režimu, vrátí kód chyby STATUS_INVALID_HANDLE. Mezitím ovladač nevrací rukojeť režimu jádra, která nebyla nikdy uzavřena.
Pokud parametry rutiny NtXxx obsahují vstupní nebo výstupní vyrovnávací paměť a pokud PreviousMode je UserMode = , rutina ProbeForRead nebo ProbeForWrite se volá k provedení ověření vyrovnávací paměti. Pokud byla vyrovnávací paměť přidělena v systémové paměti místo v paměti uživatelského režimu, rutina ProbeForXxx vyvolá výjimku, a rutina NtXxx vrátí kód chyby STATUS_ACCESS_VIOLATION.
Je-li to nutné, ovladač může volat rutinu ExGetPreviousMode pro získání hodnoty PreviousMode z objektu aktuálního vlákna. Nebo může ovladač přečíst pole RequestorMode ze struktury IRP , která popisuje požadovanou vstupně-výstupní operaci. Pole RequestorMode obsahuje kopii hodnoty PreviousMode z vlákna, které požadovalo operaci.