用户进程无法查看服务创建的全局共享内存

时间:2015-06-17 18:06:58

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

我有一个Windows服务(在系统进程中运行)和一个需要共享配置结构的桌面应用程序。数据源自应用程序,但用户进程没有创建全局内存对象的权限,因此我在服务启动时使用CreateFileMapping()和基于this answer的DACL创建它。这看起来工作正常:我从CreateFileMapping()获取非null句柄,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);

1 个答案:

答案 0 :(得分:4)

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

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

相关问题