OpenFileMapping在某些前任中被拒绝访问

OpenFileMapping access denied in some exes

本文关键字:拒绝访问 前任 OpenFileMapping      更新时间:2023-10-16

我有一个程序,使用

写一个变量
CreateFileMapping (INVALID_HANDLE_VALUE, NULL, PAGE_EXECUTE_READWRITE , 0, sizeof(data), "Local\testtest");

然后我有加载到firefox的plugin-container.exe(作为本地登录用户运行)的dll,它调用

OpenFileMapping(FILE_MAP_READ,  FALSE, "Local\testtest");

这个很好。然而,当我尝试同样的事情与我的dll加载到iexplorer .exe(也运行为本地登录的用户),我得到一个NULL值和GetLastError返回(0x5) ACCESS DENIED。

我尝试在dll中调整进程的权限以添加SE_CREATE_GLOBAL_NAME,但这没有什么区别(我没有想到因为权限只需要制作一个我相信的全局名称,而不是我使用的本地名称)。

无论我尝试什么,使用iexplorer .exe它都失败并拒绝访问。我发现的唯一一种方法是以管理员身份运行我的setter程序,并以管理员身份运行iexplorer .exe,然后它就能够读取它。但是我不认为这是一个解决方案,因为我真的想避免在administrator下运行整个exe。

有人知道解决这个问题的方法吗?

如果安全性不是问题,但只是想使其工作,您也可以将文件映射的DACL设置为NULL,然后将赋予每个人完全访问权限。

示例如下:

SetSecurityInfo(handle, SE_KERNEL_OBJECT, 
    DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATION,
    NULL, NULL, NULL, NULL);

如果你想在其他系统会话(不同操作系统的用户启动你的进程)中交换内存或使用系统同步资源(互斥锁,信号量…),你需要做两个步骤:

生成过程中:

  1. 创建具有重置acl属性的对象。
  2. 创建带有前缀("Global")的对象如果您创建对象没有第一步,您将得到错误访问拒绝。如果你没有创建第二个步骤,你会得到错误文件没有找到。

在使用资源的进程中:

  1. 也打开带有前缀("Global")的对象

跟随代码在Windows 10中工作并演示细节:

    // prepare kernel synchronization objects
PSECURITY_DESCRIPTOR pSessionSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
if (!pSessionSD)
{
    ERR(TEXT("LocalAlloc error."));
}
if (!InitializeSecurityDescriptor(pSessionSD, SECURITY_DESCRIPTOR_REVISION))
{
    ERR(TEXT("InitializeSecurityDescriptor error."));
}
if (!SetSecurityDescriptorDacl(pSessionSD, TRUE, NULL, FALSE))
{
    ERR(TEXT("SetSecurityDescriptorDacl error"));
}
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = pSessionSD;
sa.bInheritHandle = FALSE;
// Multithread memory 
HANDLE hFileMapping;
hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE, sa, PAGE_READWRITE, size.HighPart, size.LowPart, "Global\MyMemoryFile.mem");
......
LocalFree(pSessionSD);