Objekthandles

Treiber und Benutzermoduskomponenten greifen über Handles auf die meisten systemdefinierte Objekte zu. Handles werden durch den handle undurchsichtigen Datentyp dargestellt. (Beachten Sie, dass Handles nicht für den Zugriff auf Geräteobjekte oder Treiberobjekte verwendet werden.)

Bei den meisten Objekttypen stellt die Kernelmodusroutine, die das Objekt erstellt oder öffnet, dem Aufrufer ein Handle bereit. Der Aufrufer verwendet dieses Handle dann in nachfolgenden Vorgängen für das -Objekt.

Hier finden Sie eine Liste der Objekttypen, die Treiber normalerweise verwenden, und die Routinen, die Handles für Objekte dieses Typs bereitstellen.

Objekttyp Entsprechende Create/Open-Routine

Datei

IoCreateFile, ZwCreateFile, ZwOpenFile

Registrierungsschlüssel

IoOpenDeviceInterfaceRegistryKey, IoOpenDeviceRegistryKey, ZwCreateKey, ZwOpenKey

Threads

PsCreateSystemThread

Ereignisse

IoCreateSynchronizationEvent, IoCreateNotificationEvent

Symbolische Links

ZwOpenSymbolicLinkObject

Verzeichnisobjekte

ZwCreateDirectoryObject

Section-Objekte

ZwOpenSection

Wenn der Treiber keinen Zugriff mehr auf das Objekt benötigt, ruft er die ZwClose-Routine auf, um das Handle zu schließen. Dies funktioniert für alle in der obigen Tabelle aufgeführten Objekttypen.

Die meisten Routinen, die Handles bereitstellen, verwenden eine OBJECT_ATTRIBUTES-Struktur als Parameter. Diese Struktur kann verwendet werden, um Attribute für das Handle anzugeben.

Treiber können die folgenden Handle-Attribute angeben:

  • OBJ_KERNEL_HANDLE

    Auf das Handle kann nur im Kernelmodus zugegriffen werden.

  • OBJ_INHERIT

    Alle untergeordneten Elemente des aktuellen Prozesses erhalten eine Kopie des Handles, wenn sie erstellt werden.

  • OBJ_FORCE_ACCESS_CHECK

    Dieses Attribut gibt an, dass das System alle Zugriffsprüfungen für das Handle ausführt. Standardmäßig umgeht das System alle Zugriffsprüfungen für Handles, die im Kernelmodus erstellt wurden.

Verwenden Sie die InitializeObjectAttributes-Routine , um diese Attribute in einer OBJECT_ATTRIBUTES-Struktur festzulegen.

Informationen zum Überprüfen von Objekthandles finden Sie unter Fehler beim Überprüfen von Objekthandles.

Private Objekthandles

Wenn ein Treiber ein Objekthandle für seine private Verwendung erstellt, muss der Treiber das attribut OBJ_KERNEL_HANDLE angeben. Dadurch wird sichergestellt, dass für Anwendungen im Benutzermodus nicht auf das Handle zugegriffen werden kann.

Handles für freigegebene Objekte

Ein Treiber, der Objekthandles zwischen Kernelmodus und Benutzermodus gemeinsam verwendet, muss sorgfältig geschrieben werden, um versehentlich Sicherheitslücken zu vermeiden. Hier finden Sie einige Richtlinien:

  1. Erstellen Sie Handles im Kernelmodus, und übergeben Sie sie an den Benutzermodus, anstatt umgekehrt. Von einer Benutzermoduskomponente erstellte und an den Treiber übergebene Handles sollten nicht vertrauenswürdig sein.

  2. Wenn der Treiber Handles im Auftrag von Benutzermodusanwendungen bearbeiten muss, verwenden Sie das attribut OBJ_FORCE_ACCESS_CHECK, um zu überprüfen, ob die Anwendung über den erforderlichen Zugriff verfügt.

  3. Verwenden Sie ObReferenceObjectByPointer , um einen Kernelmodusverweis auf einem freigegebenen Handle beizubehalten. Wenn andernfalls eine Benutzermoduskomponente das Handle schließt, wird die Verweisanzahl auf 0 (null) festgelegt, und wenn der Treiber dann versucht, das Handle zu verwenden oder zu schließen, stürzt das System ab.

Wenn eine Benutzermodusanwendung ein Ereignisobjekt erstellt, kann ein Treiber sicher auf das Signal dieses Ereignisses warten, aber nur, wenn die Anwendung ein Handle über eine IOCTL an das Ereignisobjekt an den Treiber übergibt. Der Treiber muss die IOCTL im Kontext des Prozesses behandeln, der das Ereignis erstellt hat, und muss überprüfen, ob das Handle ein Ereignishandle ist, indem ObReferenceObjectByHandle aufgerufen wird.