Sdílet prostřednictvím


Identifikátory objektů

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

IoCreateFile, ZwCreateFile, ZwOpenFile

Klíče registru

IoOpenDeviceInterfaceRegistryKey, IoOpenDeviceRegistryKey, ZwCreateKey, ZwOpenKey

Vlákna

PsCreateSystemThread

Události

IoCreateSynchronizationEvent, IoCreateNotificationEvent

Symbolické odkazy

ZwOpenSymbolicLinkObject

Objekty adresáře

ZwCreateDirectoryObject

Objekty oddílu

ZwOpenSection

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ů:

  1. 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é.

  2. 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.

  3. 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.