Namespaces de objeto 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ólicos. 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 do cliente por padrão. No entanto, esses processos podem usar o namespace global anexando o prefixo "Global\" ao 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.
Nota
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á nenhuma 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á existe 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 do 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 kernel.
A alternância 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 kernel devem seguir as diretrizes descritas para os Serviços de Área de Trabalho Remota para que os aplicativos possam dar 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, de uma sessão diferente da sessão zero é uma operação privilegiada. Por 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 dos 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.