系统错误0x5:CreateFileMapping()
我希望执行IPC使用命名共享内存。系统错误0x5:CreateFileMapping()
为此,其中一个步骤是得到一个句柄映射内存对象,使用的CreateFileMapping()。
我这样做是完全一样的MSDN网站reccommends: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 64位系统位操作系统
- 管理员用户可用权限
- 开发的应用程序:64位插件应用文件(.dll)
是否有人有相同的经历,和请解决它的一种方法?我使用MSDN网站作为我的参考,所以我不认为,代码中存在问题。
看起来你没有足够的权限。
从MSDN:
创建其他 不是零会话的会话在 全局命名空间文件映射对象需要 SeCreateGlobalPrivilege特权。有关 的更多信息,请参阅内核对象 命名空间。
...
创建全局命名空间的文件映射对象 的,通过使用 的CreateFileMapping,比从零会话以外的会话 是 特权操作。正因为如此, 在任意 远程桌面会话主机上运行(RD 会话主机)服务器会话的应用必须在 为了成功地创建了全球命名空间的文件映射对象 启用 SeCreateGlobalPrivilege。 特权检查限于创建文件映射对象的 ,而 不适用于打开现有的 。例如,如果服务或 系统创建文件映射对象,则任何会话中运行的任何进程都可以 访问该文件映射对象 ,前提是用户必须具有访问权限 。
嗨尤金,那正是我的问题。我从我的映射对象的名称中删除了前缀“Global \\”,并且知道解决了这个问题。我不打算处理终端服务,所以现在解决方案应该是可以接受的。我阅读SeCreateGlobalPriviledge上的文档,但是我不清楚,如果特权可以由应用程序本身分配,或者我必须手动调整Windows资源管理器中的权限说明吗? – 2010-10-22 17:23:50
该特权由您的应用程序启动的用户帐户定义。您可以尝试按照此处所述使用AdjustTokenPrivilege函数:http://delphi.about.com/b/2008/09/26/zarko-needs-help-createfilemapping-terminal-services-global-session-secreateglobalprivilege.htm,但这并不能保证结果。一般来说,尝试搜索SeCreateGlobalPrivilege,结果包含一些有趣的信息来源 – 2010-10-22 20:00:13
要创建全局文件映射,您需要SeCreateGlobalPrivilege
特权 - 你有吗?拒绝访问意味着这是一个权限问题,当然。
嗨史蒂夫,那是我的问题。谢谢。我现在以不同的方式解决了这个问题,但是如果我想要设置特权,可以在我的应用程序中以编程方式完成吗? – 2010-10-22 17:25:03
您可以使用'AdjustTokenPrivileges'来执行此操作,如下所示:http://msdn.microsoft.com/en-us/library/aa446619(v=VS.85).aspx。令牌句柄来自'OpenProcessToken',必须使用(至少)'TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY' – 2010-10-22 17:35:19
非常感谢。 – 2010-10-22 17:42:34
默认情况下,管理员,服务和网络服务具有SeCreateGlobalPrivilege。你必须记住,Windows7/Vista并不像管理员那样运行所有的东西。因此,请使用“以管理员身份启动”使“全局”适用于您的应用程序。如果您正在调试,也可以以管理员身份启动Visual Studio。
非常感谢!默认情况下,Windows 10下的Visual Studio不是管理员。那是我的问题。 – 2016-07-12 15:55:06
有关全局名称空间的文档中对终端服务的引用有点误导,因为这意味着如果您遇到异常情况,您只需要担心这一点。
事实上,IIS和系统服务都在会话零中运行,并且第一个/唯一登录的用户在会话1中运行 - 因此必须使用全局名称空间在IIS或服务与普通程序之间进行通信。
不确定这是什么原因,但您是否需要将最大对象大小设置为内存页(4096字节)的倍数? – 2010-10-22 17:03:50
嗨尤金,不是,问题是我不设置SeCreateGlobalPriviledge。 – 2010-10-22 17:26:57