C++ 尝试使用CreateFileMapping和自定义DACL创建只读共享内存区域在OpenFileMapping中失败
我有一个客户端/服务器本地进程,我希望在一个公共的只读的共享内存区域中为其提供一些内容。我能够成功地在服务器端创建安全描述符和共享内存区域,但是,当我尝试访问客户端的共享内存区域时,访问被拒绝(5),除非安全描述符授予交互用户(GW)除读取(GR)之外的写访问权。我试图避免授予交互用户写访问权限,以防止rouge进程破坏共享内存区域 服务器端设计为作为windows服务运行,并使用全局部分,但我发现,为了解决此问题,它以什么方式运行并不重要 服务器端:C++ 尝试使用CreateFileMapping和自定义DACL创建只读共享内存区域在OpenFileMapping中失败,c++,c,windows,shared-memory,C++,C,Windows,Shared Memory,我有一个客户端/服务器本地进程,我希望在一个公共的只读的共享内存区域中为其提供一些内容。我能够成功地在服务器端创建安全描述符和共享内存区域,但是,当我尝试访问客户端的共享内存区域时,访问被拒绝(5),除非安全描述符授予交互用户(GW)除读取(GR)之外的写访问权。我试图避免授予交互用户写访问权限,以防止rouge进程破坏共享内存区域 服务器端设计为作为windows服务运行,并使用全局部分,但我发现,为了解决此问题,它以什么方式运行并不重要 服务器端: // Error handling rem
// 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");
客户端(作为交互用户):
底线是我想不出一种方法来让这个内存在没有写访问的情况下可以读访问。服务器应该读/写,客户端应该读。我对此进行了研究,但还没有找到任何确定的证据
感谢你的洞察力 CreateFileMappingW()
和OpenFileMappingW()
使用不同的保护标志定义集
文档中列出了CreateFileMappingW()
支持的标志:
flProtect
指定文件映射对象的页面保护。对象的所有映射视图必须与此保护兼容
此参数可以是以下值之一
页面\执行\读取页面\执行\读写
页面\执行\写入复制
页码\u只读
页面\读写
页面\可写副本 应用程序可以为文件映射对象指定以下一个或多个属性,方法是将它们与前面的一个页面保护值组合 SEC_提交
秒图像
SEC_IMAGE_NO_EXECUTE
第二大页面
SEC_NOCACHE
备用准备金
SEC_writecompine
OpenFileMappingW()
支持的标志列在文档中:
期望访问
对文件映射对象的访问权限。根据目标文件映射对象上的任何安全描述符检查此访问。有关值列表,请参见
其中文件说明:
下表列出了特定于文件映射对象的访问权限
文件映射所有访问权限文件映射执行
文件\u映射\u读取
文件映射写入 调用
OpenFileMappingW()
时,需要使用FILE\u MAP\u READ
而不是PAGE\u READONLY
。如果查看FILE\u MAP\u READ
和PAGE\u READONLY
的数值:
winbase.h
#定义文件_映射_读取4
#定义文件\u映射\u写入2
温特·h
#定义页面_只读0x02
如您所见,
FILE\u MAP\u READ
为4,但PAGE\u READONLY
为2,这与FILE\u MAP\u WRITE
的数值相同。因此,您的客户端实际上正在请求对映射的写访问,这就是为什么安全描述符需要包括写访问。谢谢您。我一定把文档重读了20遍,但看不到明显的内容。是的,我一直在请求写访问权限!
// 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();
}