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.
Ovladače a komponenty uživatelského režimu přistupují k většině objektů definovaných systémem prostřednictvím popisovačů. Popisovače jsou reprezentovány neprůzorním datovým typem HANDLE. (Všimněte si, že popisovače se nepoužívají pro přístup k objektům zařízení nebo objektům ovladačů.)
U většiny typů objektů poskytuje volající rutina režimu jádra, která objekt vytvoří nebo otevře, popisovač. Volající pak použije tento popisovač v následných operacích s objektem.
Tady je seznam typů objektů, které ovladače obvykle používají, a rutiny, které poskytují popisovače objektů tohoto typu.
| Typ objektu | Odpovídající rutina vytvoření/otevření |
|---|---|
Soubor |
|
Klíče registru |
IoOpenDeviceInterfaceRegistryKey, IoOpenDeviceRegistryKey, ZwCreateKey, ZwOpenKey |
Vlákna |
|
Události |
|
Symbolické odkazy |
|
Objekty adresáře |
|
Objekty oddílu |
Pokud ovladač již nevyžaduje přístup k objektu, volá rutinu ZwClose pro zavření popisovače. To funguje pro všechny typy objektů uvedené v tabulce výše.
Většina rutin, které poskytují popisovače, jako parametr přebírají strukturu OBJECT_ATTRIBUTES . Tuto strukturu lze použít k určení atributů pro popisovač.
Ovladače mohou zadat následující atributy popisovače:
OBJ_KERNEL_HANDLE
Popisovač je přístupný pouze z režimu jádra.
OBJ_DĚDICTVÍ
Jakékoliv děti aktuálního procesu obdrží kopii popisovače, když jsou vytvořeny.
OBJ_FORCE_ACCESS_CHECK
Tento atribut určuje, že systém provádí všechny kontroly přístupu na popisovači. Ve výchozím nastavení systém obchází všechny kontroly přístupu u popisovačů vytvořených v režimu jádra.
Pomocí rutiny InitializeObjectAttributes nastavte tyto atributy ve struktuře OBJECT_ATTRIBUTES .
Informace o ověřování popisovačů objektů naleznete v tématu Selhání ověření popisovačů objektů.
Popisovače privátních objektů
Pokaždé, když ovladač vytvoří popisovač objektu pro jeho privátní použití, musí ovladač zadat atribut OBJ_KERNEL_HANDLE. Tím se zajistí nepřístupnost popisovače pro aplikace v uživatelském režimu.
Obslužné rutiny sdíleného objektu
Ovladač, který sdílí popisovače objektů mezi režimem jádra a uživatelským režimem, musí být pečlivě napsaný, aby se zabránilo náhodnému vytváření bezpečnostních otvorů. Tady je několik pokynů:
Vytvářejte popisovače v režimu jádra a předejte je do uživatelského režimu, místo opačného postupu. Handly vytvořené komponentou uživatelského režimu a předané ovladači by neměly být důvěryhodné.
Pokud ovladač musí manipulovat s popisovači jménem aplikací v uživatelském režimu, pomocí atributu OBJ_FORCE_ACCESS_CHECK ověřte, že aplikace má potřebný přístup.
Pomocí ObReferenceObjectByPointer ponechte odkaz na režim jádra na sdíleném popisovači. V opačném případě, pokud součást uživatelského režimu zavře popisovač, počet odkazů přejde na nulu a pokud se ovladač pokusí použít nebo zavřít popisovač, systém spadne.
Pokud aplikace v uživatelském režimu vytvoří objekt události, ovladač může bezpečně počkat na signál této události, ale pouze v případě, že aplikace předá popisovač objektu události ovladači prostřednictvím IOCTL. Ovladač musí zpracovat hodnotu IOCTL v kontextu procesu, který vytvořil událost, a musí ověřit, že se jedná o popisovač událostí voláním ObReferenceObjectByHandle.