c++ - 为什么我在以受限用户身份运行时会在 DLLMain 中获得 GPF?

标签 c++ com activex atl

为什么这段代码在以受限用户身份运行时会崩溃,但在以机器管理员身份运行时却不会?

extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, 
                               DWORD dwReason, 
                               LPVOID lpReserved)
{
 hInstance;
 m_hInstance=hInstance;
 return _AtlModule.DllMain(dwReason, lpReserved); 
}

代码在返回时崩溃...我不知道为什么。

我得到:

The instruction at "0x7c90100b" referenced memory at "0x00000034". 
The memory could not be "read".

此外,_AtlModule.DLLMain 看起来像这样:

inline BOOL WINAPI CAtlDllModuleT<T>::DllMain(DWORD dwReason, LPVOID lpReserved) throw()
{
#if !defined(_ATL_NATIVE_INITIALIZATION)
    dwReason; lpReserved;
#pragma warning(push)
#pragma warning(disable:4483)
    using namespace __identifier("<AtlImplementationDetails>");
#pragma warning(pop)
    if (dwReason == DLL_PROCESS_ATTACH)
    {
        ATLASSERT(DllModuleInitialized == false);
    }
    return TRUE;
#else
    return _DllMain(dwReason, lpReserved);
#endif
}

我们正在导入 ATL DLL,并尝试静态链接......没有运气。


更新

使用 ProcMon,我在这里遇到缓冲区溢出:

正则查询值 HKU\S-1-5-21-448539723-854245398-1957994488-1005\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Cache 缓冲区溢出 长度:144

这是什么意思?

最佳答案

当你得到一个错误说你不能在某个 0x0000... 位置引用内存时,这通常意味着你的代码试图引用某个对象的成员变量,但对象指针指向 NULL。在这种情况下,成员变量是对象中的 0x34 字节。进一步猜测,鉴于它仅在受限用户下运行时失败,我会说一些应该返回指向对象的指针的操作由于权限不足而失败。如果没有测试返回的指针是否为空,代码将继续运行,直到有人试图读取其成员变量之一,此时您会崩溃。

我要做的是彻底调试代码并查找可疑的 NULL。此外,您可能希望在 AppVerifier 下运行您的应用程序开启 LuaPriv 测试。如果我的猜测是正确的,将报告一些 API 调用失败,在您的代码中表现为返回的 NULL。 AppVerifier 还应该为您提供堆栈跟踪,以便您能够轻松找到问题的根源。

关于c++ - 为什么我在以受限用户身份运行时会在 DLLMain 中获得 GPF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/860880/

相关文章:

internet-explorer - IE COM 的 querySelectorAll 在 IE 8 中不起作用

c++ - QAxObject 没有为 COM 对象创建槽信号

matlab - 使用 ActiveX 从 Matlab 打开现有工作簿

c++ - 之前没有任何关键字的{}的目的是什么?

c++ - 如何检查 sc_buffer 和 sc_signal 之间的区别?

python - 如何使用 CLSID 值和 C++ 头文件打开带有 ctypes 的库?

.net - 在 TLBIMP-ed dll 之后手动生成 ActiveX 包装器?

c# - 嵌入一​​个简单的 ActiveX 控件得到类未注册错误

c++ - 编译器不推导出模板参数(map std::vector -> std::vector)

c++ - 逐行读取文件并将其存储在 vector 中,对其进行处理