用户进程看不到服务创建的全局共享内存
User process can't see global shared memory created by service
我有一个Windows服务(在系统进程中运行)和一个桌面应用程序需要共享配置结构。数据源自应用程序,但用户进程无权创建全局内存对象,因此我在服务开始使用 CreateFileMapping() 和基于此答案的 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()
使用命名事件,让服务告知应用实际创建映射的时间,并且可以在任一进程更改映射内容时使用另一个命名事件。
相关文章:
- 通过require在不同的Lua状态之间共享全局变量
- 在链接到两个 exe 的 dll 中共享全局变量
- 有没有办法在两个共享对象之间使用相同的全局变量?
- 共享库中 __attribute__((构造函数)) 的全局/静态变量初始化问题
- 如何在线程之间共享全局对象
- 为什么CUDA共享内存比瓷砖矩阵乘法中的全局内存慢
- 服务和用户模式进程之间的共享全局事件不起作用
- 编译单元之间共享的全局常量对象
- CUDA sprintf 到全局/共享内存缓冲区
- 将全局复制到共享内存
- C++/C在Visual Studio中的两个项目之间共享全局变量
- 全局共享类的一个对象/实例
- 动态链接共享库中的全局变量和静态变量会发生什么情况
- 将全局复制到共享内存的最佳方法
- C++ 使用共享库中程序中的全局变量
- 如何在 MPI 中使用共享的全局数据集
- Linux共享库中全局变量的单个副本
- 在同一DLL的实例之间共享静态和全局变量
- 如何创建一个具有全局变量的 lib 文件,这些全局变量应该将其信息共享给另一个项目
- 用户进程看不到服务创建的全局共享内存