Dela via


Objekthandtag

Drivrutiner och komponenter i användarläge kommer åt de flesta systemdefinierade objekt via hanterar. Handtagen representeras av den ogenomskinliga datatypen HANDLE. (Observera att handtag inte används för att komma åt enhetsobjekt eller drivrutinsobjekt.)

För de flesta objekttyper ger den kernellägesrutin som skapar eller öppnar objektet ett handtag till anroparen. Anroparen använder sedan den hanteraren vid efterföljande åtgärder på objektet.

Här är en lista över objekttyper som drivrutiner vanligtvis använder och de rutiner som ger referenser till objekt av den typen.

Objekttyp Motsvarande skapa/öppna rutin

Fil

IoCreateFile, ZwCreateFile, ZwOpenFile

Registernycklar

IoOpenDeviceInterfaceRegistryKey, IoOpenDeviceRegistryKey, ZwCreateKey, ZwOpenKey

Trådar

PsCreateSystemThread

Evenemang

IoCreateSynchronizationEvent, IoCreateNotificationEvent

Symboliska länkar

ZwOpenSymbolicLinkObject

Katalogobjekt

ZwCreateDirectoryObject

Avsnittsobjekt

ZwOpenSection

När drivrutinen inte längre behöver åtkomst till objektet anropas rutinen ZwClose för att stänga handtaget. Detta fungerar för alla objekttyper som anges i tabellen ovan.

De flesta rutiner som tillhandahåller handtag har en OBJECT_ATTRIBUTES struktur som parameter. Den här strukturen kan användas för att ange attribut för handtaget.

Drivrutiner kan specificera följande handtagsattribut:

  • OBJ_KERNEL_HANDLE

    Handtaget kan bara nås från kärnläge.

  • OBJ_INHERIT

    Alla underordnade i den aktuella processen får en kopia av handtaget när de skapas.

  • OBJ_FORCE_ACCESS_CHECK

    Det här attributet anger att systemet utför alla åtkomstkontroller på handtaget. Som standardinställning kringgår systemet alla åtkomstkontroller på hanterare som skapats i kernelläge.

Använd InitializeObjectAttributes rutin för att ange dessa attribut i en OBJECT_ATTRIBUTES struktur.

Information om hur du verifierar objektreferenser finns i Det gick inte att verifiera objektreferenser.

Hantering av privata objekt

När en drivrutin skapar ett objekthandtag för privat användning måste drivrutinen ange attributet OBJ_KERNEL_HANDLE. Detta säkerställer att handtaget inte är tillgängligt för program i användarläge.

Handtag för delat objekt

En drivrutin som delar objekthandtag mellan kernelläge och användarläge måste skrivas noggrant för att undvika att oavsiktligt skapa säkerhetshål. Här följer några riktlinjer:

  1. Skapa handtag i kernelläge och skicka dem till användarläge i stället för tvärtom. Handtag som skapas av en komponent i användarläge och skickas till drivrutinen bör inte vara betrodda.

  2. Om drivrutinen måste ändra handtagen för användarlägesprogram använder du attributet OBJ_FORCE_ACCESS_CHECK för att kontrollera att programmet har nödvändig åtkomst.

  3. Använd ObReferenceObjectByPointer för att behålla en referens i kernelläge på ett delat handtag. Om en komponent i användarläge stänger handtaget går annars referensantalet till noll och om drivrutinen sedan försöker använda eller stänga handtaget kraschar systemet.

Om ett program i användarläge skapar ett händelseobjekt kan en drivrutin vänta på att händelsen ska signaleras, men bara om programmet skickar ett handtag till händelseobjektet till drivrutinen via en IOCTL. Drivrutinen måste hantera IOCTL i kontexten för den process som skapade händelsen och måste verifiera att handtaget är en händelsereferens genom att anropa ObReferenceObjectByHandle.