2009-05-13 3 views
3

Warum stürzt dieser Code ab, wenn er als eingeschränkter Benutzer ausgeführt wird, aber nicht, wenn er als Administrator des Computers ausgeführt wird?Warum sollte ich in DLLMain ein GPF erhalten, wenn es als eingeschränkter Benutzer ausgeführt wird?

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

Der Code stürzt bei der Rückkehr ... und ich weiß nicht warum.

Ich erhalte:

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

Des Weiteren sieht _AtlModule.DLLMain wie folgt aus:

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 
} 

Wir die ATL-DLL importieren, und versucht, statisch als auch ... kein Glück verbindet.


UPDATE

Mit ProcMon, erhalte ich einen Pufferüberlauf hier:

RegQueryValue HKU \ S-1-5-21-448539723-854245398-1957994488-1005 \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Shell Ordner \ Cache Pufferüberlauf Länge: 144

Was bedeutet das?

+0

Der RegQueryValue-Fehler könnte ein Red Hering sein. Es könnte der erste von zwei Aufrufen sein, wobei der dritte Parameter NULL ist. Dies geschieht, um die erforderliche Puffergröße zu erhalten. Wenn Sie einen erfolgreichen Anruf sehen, können Sie diesen Fehler wahrscheinlich ignorieren. Außerdem zeigt Ihnen ProcMon die Stack-Trace des Berichts IIRC. Versuche, mit dem Debugger dorthin zu gelangen und zu sehen, was passiert. – eran

Antwort

2

Wenn Sie einen Fehler erhalten, der besagt, dass Sie keinen Speicher an einem Speicherort von 0x0000 ... referenzieren können, bedeutet dies normalerweise, dass der Code versucht, auf eine Elementvariable eines Objekts zu verweisen, der Objektzeiger jedoch auf NULL zeigt. In diesem Fall ist die Elementvariable 0x34 Byte in das Objekt. Weiteres Raten, da es nur fehlschlägt, wenn es unter einem eingeschränkten Benutzer läuft, würde ich sagen, dass eine Operation, die einen Zeiger auf ein Objekt zurückgeben soll, aufgrund unzureichender Rechte fehlschlägt. Wenn der zurückgegebene Zeiger nicht auf Null getestet wird, wird der Code weiter ausgeführt, bis jemand versucht, eine seiner Mitgliedsvariablen zu lesen, und an diesem Punkt kommt der Absturz zustande.

was ich tun würde ist gründlich Debuggen Sie den Code und suchen Sie nach verdächtigen NULL. Möglicherweise möchten Sie Ihre App auch unter AppVerifier mit dem LuaPriv-Test ausführen. Wenn meine Vermutung richtig ist, würden einige API-Aufrufe fehlschlagen, die in Ihrem Code als zurückgegebene NULL-Werte angezeigt werden. AppVerifier sollte Ihnen auch den Stack-Trace zur Verfügung stellen, damit Sie die Wurzel des Problems leicht finden können.

1

Sie sagen nicht wirklich, was Sie mit "abstürzen" meinen, so ist es schwer zu sagen. Der Code tut insbesondere nichts, was zu einem Absturz führen wird, daher erfordert der Aufruf des ATL-Moduls DllMain möglicherweise Administratorrechte und schlägt deshalb fehl.

+0

Warum benötigt ein Aufruf von DllMain Administratorrechte? Absturz ... Ich erhalte eine "Der Befehl als X-Speicher bei Y verwiesen. Der Speicher konnte nicht gelesen werden" Fehler. – Jason

+0

Haben Sie versucht, mit einem Debugger auf den Anruf zuzugreifen? Vielleicht haben Sie eine Art Pufferüberlauf, der die Absenderadresse auf dem Stapel mit Müll überschreibt –

+0

Ist DLLMain nicht die erste, die ausgeführt wird? Wo kann ich damit meinen Stack vermasseln? Soll ich woanders hinschauen? – Jason

2

Jason,

Wo erklären Sie m_hInstance? Ist es oberhalb von DllMain statisch? Ich versuche nur, mehr Details über den Code zu erhalten.

+0

Oben erklärt DLLMain ... HINSTANCE m_hInstance; – Jason

+0

Jason, _AtlModule.DllMain() wird in eine DllMain.cpp-Datei eingefügt, wenn Sie ein ATL-basiertes .DLL-Projekt generieren. Hat dieses Projekt nicht als ATL-Projekt begonnen? –

+0

Ich denke, es war (es ist alt und geerbt), aber es wurde verändert. DllMain.cpp wird umbenannt, und daher erwarte ich, dass anderer Code optimiert wird. Die _AtlModule.DllMain Funktion ist oben, und ich denke, es ist Standard. Ich glaube nicht, dass es sich geändert hat. Außerdem funktioniert das, wenn du ein Administrator bist, aber nicht, wenn du eingeschränkt bist ... das ist für mich die seltsamste Sache. Sind verschiedene Bibliotheken für eingeschränkte Benutzer nicht verfügbar? – Jason

1

Versuchen Sie, die ProcMon utility laufen und sehen, ob Sie einen Unterschied erkennen können. Sie müssen die Filterung aktivieren, da sonst wahrscheinlich zu viel ausgegeben wird.

Eine Sache zu überprüfen, ob Sie die ATL-DLL (anstelle der statischen Bibliothek) verwenden: Stellen Sie sicher, dass Sie in beiden Fällen die gleiche Version der DLL erhalten.

+0

Danke für die Ideen ... werde es versuchen. – Jason

+0

Wir importieren ... aber versucht auch statische Bibliothek. Kein Unterschied. – Jason

+0

Haben Sie ProcMon schon probiert? Es kann Ihnen Fehler zeigen, die aus Berechtigungsproblemen usw. resultieren. – jdigital

0

Sieht so aus, als hätten wir RDCOMClient zurückverfolgt, mit dem das COM-Objekt innerhalb von R ausgeführt wird.

Alle Antworten haben geholfen. Vielen Dank.