Teilen über


Kernelobjekte

Kernelobjekthandles sind prozessspezifisch. Das heißt, ein Prozess muss entweder das Objekt erstellen oder ein vorhandenes Objekt öffnen, um ein Kernelobjekthandle abzurufen. 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 verfügt über Sicherheitszugriff auf das Objekt. Kernelobjekthandles umfassen Zugriffsrechte, die die Aktionen angeben, die einem Prozess gewährt oder verweigert werden können. Eine Anwendung gibt Zugriffsrechte an, wenn ein Objekt erstellt oder ein vorhandenes Objekthandle abruft. Jeder Kernelobjekttyp unterstützt einen eigenen Satz von Zugriffsrechten. Ereignishandles können z. B. den Zugriff festlegen oder warten (oder beides), Dateihandles können Lese- oder Schreibzugriff haben (oder beides). Weitere Informationen finden Sie unter Sicherungsobjekte.

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

Anwendung zum Erstellen eines Ereignisobjekts

Nachdem das Ereignisobjekt erstellt wurde, kann die Anwendung das Ereignishandle verwenden, um das Ereignis festzulegen oder 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 dargestellt.

Anwendung zum Erstellen eines Ereignisobjekts mit mehreren Handles

Mit dieser Methode kann eine Anwendung ÜberHandles mit unterschiedlichen Zugriffsrechten verfügen. Handle 1 kann z. B. den Zugriff auf das Ereignis festgelegt und warten, und Handle 2 hat möglicherweise nur Denkzugriff.

Wenn ein anderer Prozess den Ereignisnamen kennt und über Einen Sicherheitszugriff auf das Objekt verfügt, kann er mithilfe OpenEvent-ein eigenes Ereignisobjekthandle erstellen. Die erstellende Anwendung kann auch einen seiner Handles in denselben Prozess oder in einen anderen Prozess duplizieren, indem die DuplicateHandle--Funktion verwendet wird.

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

Anwendungsschließ-Ereignisobjekthandles zum Entfernen des Objekts aus dem Arbeitsspeicher

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 kann mehr als ein Dateiobjekt auf eine einzelne Datei auf dem Datenträger verweisen, wie in der nächsten Abbildung dargestellt.

mehrere Dateiobjekte, die auf eine Datei auf einem Datenträger verweisen

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

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

Kernel-Objekt Creator-Funktion Zerstörerfunktion
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-
Haufen HeapCreate HeapDestroy-
E/A-Vervollständigungsport CreateIoCompletionPort- CloseHandle-
Arbeit CreateJobObject- CloseHandle-
Mailslot CreateMailslot- CloseHandle-
Speicherressourcenbenachrichtigung CreateMemoryResourceNotification- CloseHandle-
Modul LoadLibrary, GetModuleHandle- FreeLibrary-
Mutex CreateMutex, CreateMutexEx, OpenMutex CloseHandle-
Pfeife CreateNamedPipe, CreatePipe CloseHandle, DisconnectNamedPipe
Prozess CreateProcess, OpenProcess, GetCurrentProcess CloseHandle-, TerminateProcess-
Semaphor CreateSemaphore, CreateSemaphoreEx, OpenSemaphore CloseHandle-
Steckdose Socket-akzeptieren Closesocket-
Faden CreateThread, CreateRemoteThread, GetCurrentThread CloseHandle, TerminateThread-
Zeitschaltuhr CreateWaitableTimer, CreateWaitableTimerEx, OpenWaitableTimer CloseHandle-
Ressource aktualisieren BeginUpdateResource- EndUpdateResource-
Fensterstation GetProcessWindowStation- Anwendungen können dieses Objekt nicht löschen.

 

Kernelobjektnamespaces