c++ - 用户进程看不到服务创建的全局共享内存

标签 c++ windows security winapi memory-mapped-files

我有一个 Windows 服务(在系统进程中运行)和一个需要共享配置结构的桌面应用程序。数据源自应用程序,但用户进程没有创建全局内存对象的权限,因此我在服务启动时使用 CreateFileMapping() 和基于 this answer 的 DACL 创建了它。 .这似乎工作正常:我从 CreateFileMapping() 得到一个非空句柄并且 GetLastError() 是 0。问题是应用程序看不到对象——OpenFileMapping() 返回一个 NULL 句柄和 ERROR_FILE_NOT_FOUND——如果我用 WinObj 手动浏览全局对象,我也看不到它。是什么让我的对象不可见?

SECURITY_ATTRIBUTES security;
ZeroMemory(&security, sizeof(security));
security.nLength = sizeof(security);
ConvertStringSecurityDescriptorToSecurityDescriptor(
    "D:P(A;OICI;GA;;;SY)(A;OICI;GA;;;BA)(A;OICI;GWGR;;;IU)",
    SDDL_REVISION_1,
    &security.lpSecurityDescriptor,
    NULL);
HANDLE  hFile = CreateFileMapping(INVALID_HANDLE_VALUE, &security, PAGE_READWRITE, 0, 1024*4, "Global\\gCONFIGXFILE");
DWORD   fileMappingResult = GetLastError();
if (hFile)
{
    CloseHandle(hFile);
}
LocalFree(security.lpSecurityDescriptor);

最佳答案

您的服务在创建文件映射后立即关闭其句柄,因此在应用程序有机会打开其映射句柄之前映射被销毁。您的服务需要使其映射句柄保持打开状态,至少要等到应用打开其映射句柄之后。

由于您正在共享配置,您可能应该在服务启动时创建映射并在服务停止之前保持打开状态。您可以通过 CreateEvent() 使用命名事件让服务在实际创建映射时通知应用程序,并且可以在任一进程更改映射内容时使用另一个命名事件。

关于c++ - 用户进程看不到服务创建的全局共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30899107/

相关文章:

c++ - 无法在 STL 中打印一组 vector 的元素

docker - 为什么不使用root用户作为默认用户

windows - 如何清除 AuthzGetInformationFromContext API 使用的缓存?

javascript - 如何播放系统媒体声音

r - 如何在 R 中将默认浏览器设置为 Internet Explorer?

windows - 在 Windows 上将 docker compose 更新到 1.8

java - 使用 Java 在受密码保护的网站上下载大文件时出现问题

c++ - 自己做一个stdafx.h文件可以吗?

c++ - 三元运算符和增量运算符

c++ - 如何通过 .pro 文件 (Qt) 将命令传递给链接描述文件