Condividi tramite


Oggetti kernel

Gli handle di oggetti kernel sono specifici del processo. Ovvero, un processo deve creare l'oggetto o aprire un oggetto esistente per ottenere un handle di oggetto kernel. Il limite per processo per handle del kernel è 2^24. Tuttavia, gli handle vengono archiviati nel pool di paging, quindi il numero effettivo di handle che è possibile creare è basato sulla memoria disponibile. Il numero di handle che è possibile creare in Windows a 32 bit è notevolmente inferiore a 2^24.

Qualsiasi processo può creare un nuovo handle per un oggetto kernel esistente (anche uno creato da un altro processo), a condizione che il processo conosca il nome dell'oggetto e abbia accesso di sicurezza all'oggetto. Gli handle di oggetti kernel includono diritti di accesso che indicano le azioni che possono essere concesse o negate a un processo. Un'applicazione specifica i diritti di accesso quando crea un oggetto o ottiene un handle di oggetto esistente. Ogni tipo di oggetto kernel supporta il proprio set di diritti di accesso. Ad esempio, gli handle di eventi possono avere accesso impostato o in attesa (o entrambi), gli handle di file possono avere accesso in lettura o scrittura (o entrambi) e così via. Per altre informazioni, vedere Oggetti a protezione diretta.

Nella figura seguente un'applicazione crea un oggetto evento. La funzione CreateEvent crea l'oggetto evento e restituisce un handle di oggetto.

applicazione che crea un oggetto evento

Dopo aver creato l'oggetto evento, l'applicazione può usare l'handle eventi per impostare o attendere l'evento. L'handle rimane valido fino a quando l'applicazione chiude o termina l'handle.

La maggior parte degli oggetti kernel supporta più handle per un singolo oggetto. Ad esempio, l'applicazione nella figura precedente potrebbe ottenere handle di oggetti evento aggiuntivi usando la funzione OpenEvent , come illustrato nella figura seguente.

applicazione che crea un oggetto evento con più handle

Questo metodo consente a un'applicazione di avere handle con diritti di accesso diversi. Ad esempio, Handle 1 potrebbe avere impostato e attendere l'accesso all'evento e Handle 2 potrebbe avere solo l'accesso in attesa.

Se un altro processo conosce il nome dell'evento e ha accesso alla sicurezza all'oggetto, può creare un proprio handle di oggetto evento usando OpenEvent. L'applicazione di creazione può anche duplicare uno dei relativi handle nello stesso processo o in un altro processo usando la funzione DuplicateHandle .

Un oggetto rimane in memoria finché esiste almeno un handle di oggetto. Nella figura seguente le applicazioni usano la funzione CloseHandle per chiudere gli handle dell'oggetto evento. Quando non sono presenti handle di evento, il sistema rimuove l'oggetto dalla memoria, come illustrato nella figura seguente.

handle dell'oggetto evento di chiusura dell'applicazione per rimuovere l'oggetto dalla memoria

Il sistema gestisce gli oggetti file in modo leggermente diverso da altri oggetti kernel. Gli oggetti file contengono il puntatore al file, ovvero il puntatore al byte successivo da leggere o scrivere in un file. Ogni volta che un'applicazione crea un nuovo handle di file, il sistema crea un nuovo oggetto file. Pertanto, più oggetti file possono fare riferimento a un singolo file su disco, come illustrato nella figura successiva.

più oggetti file che fanno riferimento a un file su disco

Solo tramite duplicazione o ereditarietà è possibile fare riferimento allo stesso oggetto file, come illustrato nella figura seguente.

due handle di file fanno riferimento allo stesso oggetto file

Nella tabella seguente sono elencati ognuno degli oggetti kernel, insieme alle funzioni creator e destroyer di ogni oggetto. Le funzioni creator creano l'oggetto e un handle di oggetto o creano un nuovo handle di oggetto esistente. Le funzioni destroyer chiudono l'handle dell'oggetto. Quando un'applicazione chiude l'ultimo handle a un oggetto kernel, il sistema rimuove l'oggetto dalla memoria.

Oggetto kernel Funzione Creator Funzione Destroyer
Token di accesso CreateRestrictedToken, DuplicateToken, DuplicateTokenEx, OpenProcessToken, OpenThreadToken Closehandle
Notifica di modifica FindFirstChangeNotification FindCloseChangeNotification
Dispositivo di comunicazione CreateFile Closehandle
Input della console CreateFile, con CONIN$ Closehandle
Buffer dello schermo della console CreateFile, con CONOUT$ Closehandle
Desktop GetThreadDesktop Le applicazioni non possono eliminare questo oggetto.
Evento CreateEvent, CreateEventEx, OpenEvent Closehandle
Registro eventi OpenEventLog, RegisterEventSource, OpenBackupEventLog CloseEventLog
File CreateFile CloseHandle, DeleteFile
Mapping dei file CreateFileMapping, OpenFileMapping Closehandle
Trova file Findfirstfile FindClose
Heap HeapCreate HeapDestroy
Porta di completamento di I/O CreateIoCompletionPort Closehandle
Processo CreateJobObject Closehandle
Mailslot CreateMailslot Closehandle
Notifica delle risorse di memoria CreateMemoryResourceNotification Closehandle
Modulo LoadLibrary, GetModuleHandle Freelibrary
Mutex CreateMutex, CreateMutexEx, OpenMutex Closehandle
Pipe CreateNamedPipe, CreatePipe CloseHandle, DisconnectNamedPipe
Processo CreateProcess, OpenProcess, GetCurrentProcess CloseHandle, TerminateProcess
Semaphore CreateSemaphore, CreateSemaphoreEx, OpenSemaphore Closehandle
Presa elettrica socket, accetta closesocket
Thread CreateThread, CreateRemoteThread, GetCurrentThread CloseHandle, TerminateThread
Timer CreateWaitableTimer, CreateWaitableTimerEx, OpenWaitableTimer Closehandle
Aggiornare una risorsa BeginUpdateResource EndUpdateResource
Stazione finestra GetProcessWindowStation Le applicazioni non possono eliminare questo oggetto.

 

Spazi dei nomi degli oggetti kernel