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

0x0000... の場所でメモリを参照できないというエラーが表示された場合、通常は、コードがオブジェクトのメンバー変数を参照しようとしているが、オブジェクト ポインターが NULL を指していることを意味します。この場合、メンバー変数はオブジェクトの 0x34 バイトです。さらに推測すると、制限されたユーザーの下で実行しているときにのみ失敗することを考えると、オブジェクトへのポインターを返すはずの操作が、権限が不十分なために失敗したと言えます。返されたポインターが null であるかどうかがテストされていない場合、誰かがそのメンバー変数の 1 つを読み取ろうとするまでコードは実行され続け、その時点でクラッシュが発生します。

私ならコードを徹底的にデバッグし、疑わしい NULL を探します。また、 LuaPriv テストをオンにしてAppVerifierの下でアプリを実行することもできます。私の推測が正しければ、いくつかの API 呼び出しの失敗が報告され、返された NULL としてコードに明示されます。AppVerifier はスタック トレースも提供する必要があるため、問題の根本を簡単に見つけることができます。

于 2009-05-14T12:39:57.327 に答える
1

あなたは「クラッシュ」が何を意味するのかを実際には語っていないので、見分けるのは難しい. コードは特にクラッシュの原因となるようなことをしていないため、おそらく ATL モジュールの呼び出しにはDllMain管理者権限が必要であり、それが原因で失敗しています。

于 2009-05-13T23:36:44.310 に答える
0

R 内で COM オブジェクトを実行するために使用される RDCOMClient をトレースしたようです。

みなさんの回答助かりました。ありがとうございました。

于 2009-05-15T13:37:39.050 に答える