系统错误0x5:CreateFileMapping()
-
10-10-2019 - |
题
我想实施 IPC使用命名共享内存。
为此,其中一个步骤是将其处理 映射内存对象, , 使用 CreateFileMapping()。
我完全按照MSDN网站进行注册: http://msdn.microsoft.com/en-us/library/aa366551(v=vs.85).aspx:
hFileMappingHandle = CreateFileMapping
(
INVALID_HANDLE_VALUE, // use paging file
NULL, // default security
PAGE_READWRITE, // read/write access
0, // maximum object size (high-order DWORD)
256, // maximum object size (low-order DWORD)
"Global\\MyFileMappingObject" // name of mapping object
);
DWORD dwError = GetLastError();
但是,返回的手柄总是 0x0, ,和 系统错误代码 返回的是: 0x5(访问被拒绝)。
- 仅有的 命名内存共享 所需的(不文件共享)。
- Windows 7 X64 位OS
- 管理员的 可用的用户权利
- 开发应用程序:64位插件应用程序 (.dll)
请问有人有相同的经验和解决方法吗?我使用MSDN网站作为我的参考,因此我不认为,代码中存在问题。
解决方案
看起来您没有足够的特权。
来自MSDN:
从会话零以外的其他会话中创建文件映射对象需要secreateglobalprivilege特权。有关更多信息,请参见内核对象名称空间。
...
通过使用CreateFileMapping从Session Zero以外的其他会话中创建文件映射对象是一个特权操作。因此,在任意远程桌面会话主机(RD会话主机)中运行的应用程序必须启用secreateglobalprivilege,才能成功地在全局名称空间中创建文件映射对象。特权检查仅限于创建文件映射对象,并且不适用于打开现有的对象。例如,如果服务或系统创建文件映射对象,则在任何会话中运行的任何进程都可以访问该文件映射对象,前提是用户具有必要的访问。
其他提示
默认情况下,管理员,服务和网络服务具有SecreateGlobalPrivilege。但是您必须记住,Windows7/Vista不会像管理员一样运行所有内容。因此,请使用“启动为管理员”使“全局”适用于您的应用程序。如果您要调试,请启动Visual Studio作为管理员。
要创建全局文件映射,您需要 SeCreateGlobalPrivilege
特权 - 您有吗?当然,被访问的访问意味着这是一个权限问题。
关于全局名称空间的文档中对终端服务的引用有些误导,因为这意味着如果您有异常情况,您只需要担心这一点。
实际上,IIS和系统服务都以零会话运行,也是第1次登录运行的第一个 /唯一的用户 - 因此,您必须使用全局名称空间在IIS或Service和Service和正常程序之间进行通信。