尝试在CreateFileMapping和自定义DACL中创建只读共享内存区域在OpenFileMapping中失败

问题描述 投票:0回答:1

我有一个客户端/服务器本地进程,希望在公共只读共享内存区域中提供一些内容。我能够在服务器端成功创建安全描述符和共享内存区域,但是当我尝试访问客户端上的共享内存区域时,它会失败,并显示ACCESS_DENIED(5)除非安全描述符授予写访问权限除了阅读(GR)之外,还应提供给交互式用户(GW)。我试图避免向交互式用户授予写访问权,以防止恶意进程能够破坏共享内存区域。

服务器端被设计为作为Windows服务运行并使用全局部分,但我发现,出于故障排除此问题的目的,它的运行方式无关紧要。

服务器端:

// Error handling removed for brevity
SECURITY_ATTRIBUTES attributes = { 0 };
ZeroMemory(&attributes, sizeof(attributes));
attributes.nLength = sizeof(attributes);
ConvertStringSecurityDescriptorToSecurityDescriptor(
    L"D:P(D;;GA;;;BG)(A;;GA;;;SY)(A;;GA;;;BA)(A;;GR;;;IU)",
    SDDL_REVISION_1, &attributes.lpSecurityDescriptor, NULL);

DWORD cbMemShare = 1024;
m_hShareMem = CreateFileMappingW(INVALID_HANDLE_VALUE, &attributes, PAGE_READWRITE|SEC_COMMIT, 0, cbMemShare, L"MyMemShare");

客户端(作为交互用户):

// succeeds if SD has (A;;GRGW;;;IU), fails on (A;;GR;;;IU)
HANDLE hShareMem = OpenFileMappingW(PAGE_READONLY, 0, L"MyMemShare");
if (hShareMem == NULL)
{
    DWORD err = GetLastError();
}

最重要的是,我无法找到一种方法使该内存在不具有写访问权限的情况下可访问。服务器应已读/写,客户端应已读。我已经对此进行了研究,但没有发现任何确定的内容。

赞赏任何见解。

c++ c windows shared-memory
1个回答
0
投票

[CreateFileMappingW()OpenFileMappingW()使用不同的保护标志定义集。

CreateFileMappingW()支持的标志是documented here

OpenFileMappingW()支持的标志是documented here

[调用OpenFileMappingW()时,需要使用值为4的FILE_MAP_READ,而不是使用值为2的PAGE_READONLY-与FILE_MAP_WRITE相同的值。您实际上是在请求对映射的写访问权,因此安全描述符需要包括写访问权。

© www.soinside.com 2019 - 2024. All rights reserved.