【发布时间】:2011-04-10 21:49:02
【问题描述】:
我有一个使用
写入变量的程序CreateFileMapping (INVALID_HANDLE_VALUE, NULL, PAGE_EXECUTE_READWRITE , 0, sizeof(data), "Local\\testtest");
然后我将 dll 加载到调用
的 firefox 的 plugin-container.exe(以本地登录用户身份运行)中OpenFileMapping(FILE_MAP_READ, FALSE, "Local\\testtest");
这很好用。但是,当我尝试将我的 dll 加载到 iexplore.exe(也以本地登录用户身份运行)时尝试相同的操作时,我得到一个 NULL 值并且 GetLastError 返回 (0x5) ACCESS DENIED。
我尝试在 dll 中调整进程的权限以添加 SE_CREATE_GLOBAL_NAME 但这没有任何区别(而且我没想到会这样,因为只需要创建一个我相信的全局名称而不是本地名称我正在使用)。
无论我尝试什么,使用 iexplore.exe 都会失败并显示 ACCESS DENIED。我发现的唯一一种解决方法是以管理员身份运行我的 setter 程序并以管理员身份运行 iexplore.exe 然后它能够读取它。但我不认为这是一个解决方案,因为我真的想避免在管理员下运行整个 exe。
有人知道解决这个问题的方法吗?
【问题讨论】:
-
尝试显式设置映射权限?
-
您的意思是在 createfilemapping() 中设置 lpAttributes 吗?我还没有尝试过,我现在会考虑使用它。
-
不幸的是,这个没有骰子,我尝试设置它但没有任何区别。
-
什么操作系统?也许 IE 正在保护模式下运行,并且完整性级别阻止您访问它。
-
@OmerRaviv 我发现我上面尝试的技术只有在应用程序/插件容器最初以足够的权限运行时才有效。它在 Firefox 上完美运行(也许插件容器在接近管理员级别运行),但在 chrome 或 IE 上却没有。但是,如果我以管理员身份运行 chrome 或 IE,那么它也可以在这些浏览器上运行。我放弃了这种方法,因为我不能指望用户以管理员身份运行浏览器。相反,我选择在 DLL 中使用隐藏窗口 -CreateWindow(),然后使用 PostMessage 从我的主应用程序发送消息。
标签: c++ c windows visual-c++