内核对象命名空间
Windows 具有以下命名内核对象的多个命名空间:事件、信号灯、互斥体、可等待计时器、文件映射对象、作业对象以及符号链接对象。 有一个全局命名空间,主要由客户端/服务器应用程序中的服务使用。 此外,每个会话对于这些对象都有一个单独的命名空间。
单独的会话命名空间使多个客户端能够在不相互干扰的情况下运行相同的应用程序。 对于在客户端会话下启动的进程,系统默认使用客户端会话命名空间。 但是,这些进程可以通过在对象名称前加上“Global\”前缀来使用全局命名空间。 例如,以下代码调用 CreateEvent,并在全局命名空间中创建名为 CSAPP 的事件对象:
CreateEventW( NULL, FALSE, FALSE, L"Global\\CSAPP" );
默认情况下,服务应用程序使用全局命名空间。
注意
全局命名空间不适用于 Windows 应用商店应用。
与 Windows Vista 之前的 Windows 版本不同,会话零仅用于托管服务,并且没有控制台会话。
全局命名空间使多个客户端会话上的进程能够与服务应用程序通信。 例如,客户端/服务器应用程序可能会使用互斥体对象进行同步。 服务器模块可以在全局命名空间中创建互斥体对象。 然后,客户端会话可以使用“Global\”前缀来打开互斥体对象。
全局命名空间的另一个用途是应用程序使用命名对象来检测系统中是否已经有应用程序实例在所有会话中运行。 必须在全局命名空间中创建或打开此命名对象,而不是按每个会话命名空间进行。 默认情况下支持每个会话运行一次应用程序的更常见情况,因为命名对象是在每个会话的命名空间中创建的。
除了“Global\”前缀之外,客户端进程还可以使用“Local\”前缀在其会话命名空间中显式创建对象。 这些关键字区分大小写。
“Session\”前缀保留供系统使用,不应在内核对象的名称中使用它。
通过使用会话实现快速用户切换。 第一个登录用户使用会话 1,下一个登录用户使用会话 2 等。 内核对象名称必须遵循为远程桌面服务列出的准则,以便应用程序可以支持多个用户。
从会话零以外的会话创建全局命名空间中的文件映射对象或符号链接对象(例如使用 CreateFileMapping)是一种特权操作。 因此,应用程序必须启用 SeCreateGlobalPrivilege 才能在全局命名空间中创建文件映射对象或符号链接对象。 特权检查仅限于创建这些对象,不适用于打开现有对象。 例如,如果服务或系统在全局命名空间中创建了一个文件映射对象,则任何会话中运行的任何进程都可以访问该文件映射对象,前提是进程具有必要的访问权限。