3

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

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,我在这里遇到缓冲区溢出:

RegQueryValue HKU\S-1-5-21-448539723-854245398-1957994488-1005\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Cache BUFFER OVERFLOW 长度:144

这是什么意思?

4

5 回答 5

2

杰森,

你在哪里声明 m_hInstance?它在 DllMain 上方是静态的吗?只是试图获取有关代码的更多详细信息。

于 2009-05-14T00:16:45.027 回答
2

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

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

于 2009-05-14T12:39:57.327 回答
1

您并没有真正说出“崩溃”的含义,因此很难说。该代码没有做任何特别会导致崩溃的事情,因此对 ATL 模块的调用可能DllMain需要管理员权限并因此而失败。

于 2009-05-13T23:36:44.310 回答
1

尝试运行ProcMon 实用程序,看看是否能发现差异。您必须打开过滤,否则可能会有太多输出无法通过。

检查您是否使用 ATL DLL(而不是静态库)的一件事:确保在两种情况下都获得相同版本的 DLL。

于 2009-05-14T00:27:14.587 回答
0

看起来我们跟踪了 RDCOMClient,它用于在 R 内部运行 COM 对象。

每个人的回答都有帮助。谢谢你。

于 2009-05-15T13:37:39.050 回答