Objetos Kernel

Identificadores de objeto kernel são específicos do processo. Ou seja, um processo deve criar o objeto ou abrir um objeto existente para obter um identificador de objeto kernel. O limite por processo em identificadores de kernel é 2^24. No entanto, os identificadores são armazenados no pool paginado, portanto, o número real de identificadores que você pode criar é baseado na memória disponível. O número de identificadores que você pode criar no Windows de 32 bits é significativamente menor que 2^24.

Qualquer processo pode criar um novo identificador para um objeto kernel existente (mesmo um criado por outro processo), desde que o processo saiba o nome do objeto e tenha acesso de segurança ao objeto. Os identificadores de objeto kernel incluem direitos de acesso que indicam as ações que podem ser concedidas ou negadas a um processo. Um aplicativo especifica direitos de acesso quando cria um objeto ou obtém um identificador de objeto existente. Cada tipo de objeto kernel dá suporte a seu próprio conjunto de direitos de acesso. Por exemplo, os identificadores de evento podem ter acesso definido ou de espera (ou ambos), os identificadores de arquivo podem ter acesso de leitura ou gravação (ou ambos) e assim por diante. Para obter mais informações, consulte Objetos protegíveis.

Na ilustração a seguir, um aplicativo cria um objeto de evento. A função CreateEvent cria o objeto de evento e retorna um identificador de objeto.

aplicativo criando um objeto de evento

Depois que o objeto de evento tiver sido criado, o aplicativo poderá usar o identificador de evento para definir ou aguardar o evento. O identificador permanece válido até que o aplicativo feche o identificador ou termine.

A maioria dos objetos kernel dá suporte a vários identificadores para um único objeto. Por exemplo, o aplicativo na ilustração anterior poderia obter identificadores de objeto de evento adicionais usando a função OpenEvent , conforme mostrado na ilustração a seguir.

aplicativo criando um objeto de evento com vários identificadores

Esse método permite que um aplicativo tenha identificadores com direitos de acesso diferentes. Por exemplo, o Identificador 1 pode ter definido e aguardar o acesso ao evento e o Identificador 2 pode ter apenas acesso de espera.

Se outro processo souber o nome do evento e tiver acesso de segurança ao objeto, ele poderá criar seu próprio identificador de objeto de evento usando OpenEvent. O aplicativo de criação também pode duplicar um de seus identificadores no mesmo processo ou em outro processo usando a função DuplicateHandle .

Um objeto permanece na memória, desde que exista pelo menos um identificador de objeto. Na ilustração a seguir, os aplicativos usam a função CloseHandle para fechar seus identificadores de objeto de evento. Quando não há identificadores de evento, o sistema remove o objeto da memória, conforme mostrado na ilustração a seguir.

identificadores de objeto de evento de fechamento de aplicativo para remover objeto da memória

O sistema gerencia objetos de arquivo de maneira um pouco diferente de outros objetos kernel. Os objetos file contêm o ponteiro do arquivo – o ponteiro para o próximo byte a ser lido ou gravado em um arquivo. Sempre que um aplicativo cria um novo identificador de arquivo, o sistema cria um novo objeto de arquivo. Portanto, mais de um objeto de arquivo pode se referir a um único arquivo em disco, conforme mostrado na próxima ilustração.

vários objetos de arquivo que se referem a um arquivo no disco

Somente por meio de duplicação ou herança é possível que mais de um identificador de arquivo se refira ao mesmo objeto de arquivo, conforme mostrado na ilustração a seguir.

dois identificadores de arquivo referem-se ao mesmo objeto de arquivo

A tabela a seguir lista cada um dos objetos kernel, juntamente com as funções de criador e destruidor de cada objeto. As funções do criador criam o objeto e um identificador de objeto ou criam um novo identificador de objeto existente. As funções de destruidor fecham o identificador do objeto. Quando um aplicativo fecha o último identificador de um objeto kernel, o sistema remove o objeto da memória.

Objeto Kernel Função Criador Função Destroyer
Token de acesso CreateRestrictedToken, DuplicateToken, DuplicateTokenEx, OpenProcessToken, OpenThreadToken CloseHandle
Notificação de alteração FindFirstChangeNotification FindCloseChangeNotification
Dispositivo de comunicações CreateFile CloseHandle
Entrada do console CreateFile, com CONIN$ CloseHandle
Buffer de tela do console CreateFile, com CONOUT$ CloseHandle
Área de Trabalho GetThreadDesktop Os aplicativos não podem excluir este objeto.
Evento CreateEvent, CreateEventEx, OpenEvent CloseHandle
Log de eventos OpenEventLog, RegisterEventSource, OpenBackupEventLog CloseEventLog
Arquivo CreateFile CloseHandle, DeleteFile
Mapeamento de arquivo CreateFileMapping, OpenFileMapping CloseHandle
Localizar arquivo FindFirstFile Findclose
Pilha Heapcreate HeapDestroy
Porta de conclusão de E/S Createiocompletionport CloseHandle
Trabalho CreateJobObject CloseHandle
Maillot CreateMailslot CloseHandle
Notificação de recursos de memória Creatememoryresourcenotification CloseHandle
Módulo LoadLibrary, GetModuleHandle FreeLibrary
Mutex CreateMutex, CreateMutexEx, OpenMutex CloseHandle
Pipe CreateNamedPipe, CreatePipe CloseHandle, DisconnectNamedPipe
Processar CreateProcess, OpenProcess, GetCurrentProcess CloseHandle, TerminateProcess
Sinal CreateSemaphore, CreateSemaphoreEx, OpenSemaphore CloseHandle
Soquete soquete, aceitar Closesocket
Thread CreateThread, CreateRemoteThread, GetCurrentThread CloseHandle, TerminateThread
Temporizador CreateWaitableTimer, CreateWaitableTimerEx, OpenWaitableTimer CloseHandle
Atualizar recurso BeginUpdateResource EndUpdateResource
Estação de janela GetProcessWindowStation Os aplicativos não podem excluir esse objeto.

 

Namespaces de objeto kernel