繁体   English   中英

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

[英]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()使用命名事件,以使服务告知应用程序实际创建映射的时间,并且无论哪个进程更改了映射的内容,都可以使用另一个命名事件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM