Kernelobjekte

Kernelobjekthandles sind prozessspezifisch. Das heißt, ein Prozess muss entweder das -Objekt erstellen oder ein vorhandenes -Objekt öffnen, um ein Kernelobjekthandle zu erhalten. Der Grenzwert pro Prozess für Kernelhandles beträgt 2^24. Handles werden jedoch im ausgelagerten Pool gespeichert, sodass die tatsächliche Anzahl der Handles, die Sie erstellen können, auf dem verfügbaren Arbeitsspeicher basiert. Die Anzahl der Handles, die Sie unter 32-Bit-Windows erstellen können, ist deutlich niedriger als 2^24.

Jeder Prozess kann ein neues Handle für ein vorhandenes Kernelobjekt erstellen (auch eines, das von einem anderen Prozess erstellt wurde), vorausgesetzt, der Prozess kennt den Namen des Objekts und hat Sicherheitszugriff auf das Objekt. Kernel-Objekthandles enthalten Zugriffsrechte, die die Aktionen angeben, die einem Prozess gewährt oder verweigert werden können. Eine Anwendung gibt Zugriffsrechte an, wenn sie ein Objekt erstellt oder ein vorhandenes Objekthandle abruft. Jeder Typ von Kernelobjekt unterstützt seinen eigenen Satz von Zugriffsrechten. Beispielsweise können Ereignishandles den Zugriff festlegen oder warten (oder beides), Dateihandles können Lese- oder Schreibzugriff (oder beides) haben usw. Weitere Informationen finden Sie unter Sicherungsfähige Objekte.

In der folgenden Abbildung erstellt eine Anwendung ein Ereignisobjekt. Die CreateEvent-Funktion erstellt das Ereignisobjekt und gibt ein Objekthandle zurück.

Anwendung, die ein Ereignisobjekt erstellt

Nachdem das Ereignisobjekt erstellt wurde, kann die Anwendung das Ereignishandle verwenden, um das Ereignis festzulegen oder darauf zu warten. Das Handle bleibt gültig, bis die Anwendung das Handle schließt oder beendet.

Die meisten Kernelobjekte unterstützen mehrere Handles für ein einzelnes Objekt. Beispielsweise könnte die Anwendung in der vorherigen Abbildung zusätzliche Ereignisobjekthandles mithilfe der OpenEvent-Funktion abrufen, wie in der folgenden Abbildung gezeigt.

Anwendung, die ein Ereignisobjekt mit mehreren Handles erstellt

Diese Methode ermöglicht es einer Anwendung, Über Handles mit unterschiedlichen Zugriffsrechten zu verfügen. Beispielsweise kann Handle 1 den Zugriff auf das Ereignis festgelegt und gewartet haben, und Handle 2 hat möglicherweise nur Wartezugriff.

Wenn ein anderer Prozess den Ereignisnamen kennt und über Sicherheitszugriff auf das Objekt verfügt, kann er mithilfe von OpenEvent ein eigenes Ereignisobjekthandle erstellen. Die erstellte Anwendung kann auch mithilfe der DuplicateHandle-Funktion eines ihrer Handles in denselben Prozess oder in einen anderen Prozess duplizieren.

Ein Objekt verbleibt im Arbeitsspeicher, solange mindestens ein Objekthandle vorhanden ist. In der folgenden Abbildung verwenden die Anwendungen die CloseHandle-Funktion , um ihre Ereignisobjekthandles zu schließen. Wenn keine Ereignishandles vorhanden sind, entfernt das System das -Objekt aus dem Arbeitsspeicher, wie in der folgenden Abbildung gezeigt.

Ereignisobjekthandles zum Schließen der Anwendung, um das Objekt aus dem Arbeitsspeicher zu entfernen

Das System verwaltet Dateiobjekte etwas anders als andere Kernelobjekte. Dateiobjekte enthalten den Dateizeiger – den Zeiger auf das nächste Byte, das in einer Datei gelesen oder geschrieben werden soll. Wenn eine Anwendung ein neues Dateihandle erstellt, erstellt das System ein neues Dateiobjekt. Daher können mehr als ein Dateiobjekt auf eine einzelne Datei auf dem Datenträger verweisen, wie in der nächsten Abbildung gezeigt.

Mehrere Dateiobjekte, die auf eine Datei auf dem Datenträger verweisen

Nur durch Duplizierung oder Vererbung können mehrere Dateihandles auf dasselbe Dateiobjekt verweisen, wie in der folgenden Abbildung gezeigt.

Zwei Dateihandles verweisen auf dasselbe Dateiobjekt.

In der folgenden Tabelle sind die einzelnen Kernelobjekte zusammen mit den Ersteller- und Zerstörerfunktionen jedes Objekts aufgeführt. Die Erstellerfunktionen erstellen entweder das Objekt und ein Objekthandle oder erstellen ein neues vorhandenes Objekthandle. Die Zerstörerfunktionen schließen das Objekthandle. Wenn eine Anwendung das letzte Handle für ein Kernelobjekt schließt, entfernt das System das Objekt aus dem Arbeitsspeicher.

Kernel-Objekt Creator-Funktion Destroyer-Funktion
Zugriffstoken CreateRestrictedToken, DuplicateToken, DuplicateTokenEx, OpenProcessToken, OpenThreadToken Closehandle
Änderungsbenachrichtigung FindFirstChangeNotification FindCloseChangeNotification
Kommunikationsgerät CreateFile Closehandle
Konsoleneingabe CreateFile, mit CONIN$ Closehandle
Konsolenbildschirmpuffer CreateFile mit CONOUT$ Closehandle
Desktop GetThreadDesktop Anwendungen können dieses Objekt nicht löschen.
Ereignis CreateEvent, CreateEventEx, OpenEvent Closehandle
Ereignisprotokoll OpenEventLog, RegisterEventSource, OpenBackupEventLog CloseEventLog
Datei CreateFile CloseHandle, DeleteFile
Dateizuordnung CreateFileMapping, OpenFileMapping Closehandle
Datei suchen FindFirstFile FindClose
Heap HeapCreate HeapDestroy
E/A-Abschlussport CreateIoCompletionPort Closehandle
Auftrag CreateJobObject Closehandle
Mailslot CreateMailslot Closehandle
Benachrichtigung zur Speicherressource CreateMemoryResourceNotification Closehandle
Modul LoadLibrary, GetModuleHandle FreeLibrary
Mutex CreateMutex, CreateMutexEx, OpenMutex Closehandle
Pipe CreateNamedPipe, CreatePipe CloseHandle, DisconnectNamedPipe
Prozess CreateProcess, OpenProcess, GetCurrentProcess CloseHandle, TerminateProcess
Semaphore CreateSemaphore, CreateSemaphoreEx, OpenSemaphore Closehandle
Steckdose Socket, akzeptieren closesocket
Thread CreateThread, CreateRemoteThread, GetCurrentThread CloseHandle, TerminateThread
Timer CreateWaitableTimer, CreateWaitableTimerEx, OpenWaitableTimer Closehandle
Aktualisieren von Ressourcen BeginUpdateResource EndUpdateResource
Fensterstation GetProcessWindowStation Anwendungen können dieses Objekt nicht löschen.

 

Kernelobjektnamespaces