Megosztás:


Objektumfogópontok

Az illesztőprogramok és a felhasználói módú összetevők a legtöbb rendszer által definiált objektumhoz fogópontokon keresztül férnek hozzá. A leírókat az átlátszatlan HANDLE adattípus jelöli meg. (Vegye figyelembe, hogy a leírók nem eszközobjektumokhoz vagy illesztőprogram-objektumokhoz való hozzáféréshez használhatók.)

A legtöbb objektumtípus esetében az objektumot létrehozó vagy megnyitó kernelmódú rutin egy fogantyút biztosít a hívó számára. Azután a hívó ezt a kezelőt használja az objektumon végzett későbbi műveletekhez.

Az alábbiakban felsoroljuk az illesztőprogramok által általában használt objektumtípusokat, valamint azokat a rutinokat, amelyek kezelik az ilyen típusú objektumokat.

Objektumtípus Megfelelő létrehozási/megnyitási rutin

Fájl

IoCreateFile, ZwCreateFile, ZwOpenFile

Regisztrációs kulcsok

IoOpenDeviceInterfaceRegistryKey, IoOpenDeviceRegistryKey, ZwCreateKey, ZwOpenKey

Szálak

PsCreateSystemThread

Események

IoCreateSynchronizationEvent, IoCreateNotificationEvent

Szimbolikus hivatkozások

ZwOpenSymbolicLinkObject

Címtárobjektumok

ZwCreateDirectoryObject

Szakaszobjektumok

ZwOpenSection

Ha az illesztőprogramnak már nincs szüksége az objektumhoz való hozzáférésre, meghívja a ZwClose rutint a fogópont bezárásához. Ez a fenti táblázatban felsorolt összes objektumtípus esetében működik.

A leírókat biztosító rutinok többsége paraméterként OBJECT_ATTRIBUTES struktúrát használ. Ez a struktúra a fogó attribútumainak megadására használható.

A járművezetők a következő leíróattribútumokat határozhatják meg:

  • OBJ_KERNEL_HANDLE

    A handle csak kernel módból érhető el.

  • OBJ_Öröklés

    Az aktuális folyamat gyermekei létrehozásukkor megkapják a fogantyú másolatát.

  • OBJ_FORCE_ACCESS_CHECK

    Ez az attribútum azt határozza meg, hogy a rendszer minden egyes hozzáférés-ellenőrzést végrehajt a fogantyún. Alapértelmezés szerint a rendszer kikerüli az összes hozzáférés-ellenőrzést a kernel módban létrehozott leírókon.

Az InitializeObjectAttributes rutin használatával állítsa be ezeket az attribútumokat egy OBJECT_ATTRIBUTES struktúrában.

Az objektumfogók érvényesítéséről további információt az Az objektumfogók érvényesítésének hibája című témakörben talál.

Privát objektumkezelők

Amikor egy illesztő létrehoz egy objektumfogópontot a privát használatra, az illesztőnek meg kell adnia a OBJ_KERNEL_HANDLE attribútumot. Ez biztosítja, hogy a fogantyú ne legyen elérhető a felhasználói módú alkalmazások számára.

Megosztott objektum fogópontjai

A rendszermag mód és a felhasználói mód között objektumfogópontokat megosztó illesztőprogramot gondosan meg kell írni, hogy elkerülje a biztonsági rések véletlen létrehozását. Íme néhány irányelv:

  1. Hozzunk létre fogópontokat kernel módban, és adjuk át őket a felhasználói módnak, ahelyett, hogy fordítva tennénk. Az illesztőprogramnak átadott, felhasználói módú összetevő által létrehozott leírókban nem szabad megbízni.

  2. Ha az illesztőnek felhasználói módú alkalmazások nevében kell kezelnie a kezelőket, használja a OBJ_FORCE_ACCESS_CHECK attribútumot annak ellenőrzéséhez, hogy az alkalmazás rendelkezik-e a szükséges hozzáféréssel.

  3. Az ObReferenceObjectByPointer használatával kernel módú hivatkozást tárolhat egy megosztott leírón. Ellenkező esetben, ha egy felhasználói módú összetevő bezárja a leírót, a hivatkozási szám nullára csökken, és ha az illesztőprogram ezután megpróbálja használni vagy bezárni a fogópontot, a rendszer összeomlik.

Ha egy felhasználói módú alkalmazás létrehoz egy eseményobjektumot, az illesztőprogram nyugodtan megvárhatja az esemény jelzését, de csak akkor, ha az alkalmazás egy IOCTL-sel továbbítja az eseményobjektumnak egy leírót. Az illesztőprogramnak az eseményt létrehozó folyamat kontextusában kell kezelnie az IOCTL-t, és az ObReferenceObjectByHandle meghívásával ellenőriznie kell, hogy a leíró eseményleíró-e.