Compartilhar via


Namespaces de objeto do kernel

O Windows tem vários namespaces para os seguintes objetos de kernel nomeados: eventos, semáforos, mutexes, temporizadores de espera, objetos de mapeamento de arquivo, objetos de trabalho e objetos de link simbólico. Há um namespace global usado principalmente por serviços em aplicativos cliente/servidor. Além disso, cada sessão tem um namespace separado para esses objetos.

Os namespaces de sessão separados permitem que vários clientes executem os mesmos aplicativos sem interferir uns com os outros. Para processos iniciados em uma sessão de cliente, o sistema usa o namespace de sessão de cliente por padrão. No entanto, esses processos podem usar o namespace global precedendo o prefixo "Global\" para o nome do objeto. Por exemplo, o código a seguir chama CreateEvent e cria um objeto de evento chamado CSAPP no namespace global:

CreateEventW( NULL, FALSE, FALSE, L"Global\\CSAPP" );

Os aplicativos de serviço usam o namespace global por padrão.

Observação

O namespace global não está disponível para aplicativos da Windows Store.

A sessão zero é usada apenas para serviços de hospedagem e não há sessão de console, ao contrário das versões do Windows anteriores ao Windows Vista.

O namespace global permite que processos em várias sessões de cliente se comuniquem com um aplicativo de serviço. Por exemplo, um aplicativo cliente/servidor pode usar um objeto mutex para sincronização. O módulo do servidor pode criar o objeto mutex no namespace global. Em seguida, uma sessão de cliente pode usar o prefixo "Global\" para abrir o objeto mutex.

Outro uso do namespace global é para aplicativos que usam objetos nomeados para detectar que já há uma instância do aplicativo em execução no sistema em todas as sessões. Esse objeto nomeado deve ser criado ou aberto no namespace global em vez do namespace por sessão. O caso mais comum de executar o aplicativo uma vez por sessão é suportado por padrão porque o objeto nomeado é criado em um namespace por sessão.

Além do prefixo "Global\", os processos de cliente podem usar o prefixo "Local\" para criar explicitamente um objeto em seu namespace de sessão. Essas palavras-chave diferenciam maiúsculas de minúsculas.

O prefixo "Session\" é reservado para uso do sistema e você não deve usá-lo em nomes de objetos do kernel.

A troca rápida de usuário é implementada usando sessões. O primeiro usuário a fazer logon usa a sessão um, o próximo usuário a fazer logon usa a sessão dois e assim por diante. Os nomes de objeto do kernel devem seguir as diretrizes descritas para os Serviços de Área de Trabalho Remota para que os aplicativos possam oferecer suporte a vários usuários.

A criação de um objeto de mapeamento de arquivo ou objeto de link simbólico no namespace global, como usando CreateFileMapping, a partir de uma sessão diferente da sessão zero é uma operação privilegiada. Devido a isso, um aplicativo deve ter SeCreateGlobalPrivilege habilitado para criar um objeto de mapeamento de arquivo ou objeto de link simbólico no namespace global. A verificação de privilégios é limitada à criação desses objetos e não se aplica à abertura de objetos existentes. Por exemplo, se um serviço ou o sistema criar um objeto de mapeamento de arquivo no namespace global, qualquer processo em execução em qualquer sessão poderá acessar esse objeto de mapeamento de arquivo, desde que o processo tenha o acesso necessário.