Fragensteller
Crash in OLMapi32.dll (stack buffer overflow)

Frage
-
Hallo
Ich bin Programmentwickler und seit einem Update von Outlook vom 21. April funktioniert stürzt unser Programm T4 ab. Wir verwenden die MAPI Schnittstelle und dadurch wird bei einer Outlook-Installation auch die Datei OLMAPI32.dll geladen die dann sofort abstürzt. Bedeutet der Code 0xc0000409 stack buffer overflow?
Im Ereignisprotokoll entsteht der folgende Eintrag:
Name der fehlerhaften Anwendung: T4_lokal.exe, Version: 4.17.2.240, Zeitstempel: 0x5897a398
Name des fehlerhaften Moduls: olmapi32.dll, Version: 16.0.7967.6531, Zeitstempel: 0x58f7803c
Ausnahmecode: 0xc0000409
Fehleroffset: 0x0012c733
ID des fehlerhaften Prozesses: 0x460
Startzeit der fehlerhaften Anwendung: 0x01d2bcf6a3918fcb
Pfad der fehlerhaften Anwendung: C:\T4\Prog\T4_lokal.exe
Pfad des fehlerhaften Moduls: C:\Program Files (x86)\Microsoft Office\Root\Office16\olmapi32.dll
Berichtskennung: acb67cad-c7b9-4e94-8c25-90141e1dcdcd
Vollständiger Name des fehlerhaften Pakets:
Anwendungs-ID, die relativ zum fehlerhaften Paket ist:
Unser Programm ist unter Embarcadero Delphi XE3 entwickelt.
Ich habe leider keinen Einfluss auf den Fehler, da ich die OLMAPI32.dll gar nicht explizit lade.
Erst wenn ich komplett auf die Verwendung der MAPI-Schnittstelle verzichte läuft das Programm wieder.
Was kann ich tun um das Problem zu lösen?
Mit freundlichen Grüßen
Oliver Wurdak
zuletzt hier noch der Crash Report:
Version=1
EventType=BEX
EventTime=131375106640996987
ReportType=2
Consent=1
UploadTime=131375106641465655
ReportIdentifier=e14d6c8b-28e9-11e7-ba5c-b8975ab1989c
IntegratorReportIdentifier=acb67cad-c7b9-4e94-8c25-90141e1dcdcd
WOW64=1
NsAppName=T4_lokal.exe
AppSessionGuid=00000460-0001-0032-cb8f-91a3f6bcd201
TargetAppId=W:0006c2040a723785561127737fdbe25540d800000904!00008f78365f5095468bcad83257fde66b663de56c70!T4_lokal.exe
TargetAppVer=2017//02//05:22:13:44!0!T4_lokal.exe
BootId=4294967295
Response.BucketId=dc2619b669f2b418fab298b94b562658
Response.BucketTable=5
Response.LegacyBucketId=116370955313
Response.type=4
Sig[0].Name=Anwendungsname
Sig[0].Value=T4_lokal.exe
Sig[1].Name=Anwendungsversion
Sig[1].Value=4.17.2.240
Sig[2].Name=Anwendungszeitstempel
Sig[2].Value=5897a398
Sig[3].Name=Fehlermodulname
Sig[3].Value=olmapi32.dll
Sig[4].Name=Fehlermodulversion
Sig[4].Value=16.0.7967.6531
Sig[5].Name=Fehlermodulzeitstempel
Sig[5].Value=58f7803c
Sig[6].Name=Ausnahmeoffset
Sig[6].Value=0012c733
Sig[7].Name=Ausnahmecode
Sig[7].Value=c0000409
Sig[8].Name=Ausnahmedaten
Sig[8].Value=00000007
DynamicSig[1].Name=Betriebsystemversion
DynamicSig[1].Value=10.0.14393.2.0.0.256.48
DynamicSig[2].Name=Gebietsschema-ID
DynamicSig[2].Value=3079
DynamicSig[22].Name=Zusatzinformation 1
DynamicSig[22].Value=4913
DynamicSig[23].Name=Zusatzinformation 2
DynamicSig[23].Value=4913f8deb262014bd949ec4131e3f3ac
DynamicSig[24].Name=Zusatzinformation 3
DynamicSig[24].Value=6ecf
DynamicSig[25].Name=Zusatzinformation 4
DynamicSig[25].Value=6ecf6227c6507139394b80e4e4fb8018
UI[2]=C:\T4\Prog\T4_lokal.exe
UI[3]=T4_lokal.exe funktioniert nicht mehr
UI[4]=Windows kann online nach einer Lösung für das Problem suchen.
UI[5]=Online nach einer Lösung suchen und das Programm schließen
UI[6]=Später online nach einer Lösung suchen und das Programm schließen
UI[7]=Programm schließen
LoadedModule[0]=C:\T4\Prog\T4_lokal.exe
LoadedModule[1]=C:\WINDOWS\SYSTEM32\ntdll.dll
LoadedModule[2]=C:\WINDOWS\System32\KERNEL32.DLL
LoadedModule[3]=C:\WINDOWS\System32\KERNELBASE.dll
LoadedModule[4]=C:\WINDOWS\System32\advapi32.dll
LoadedModule[5]=C:\WINDOWS\System32\msvcrt.dll
LoadedModule[6]=C:\WINDOWS\System32\sechost.dll
LoadedModule[7]=C:\WINDOWS\System32\RPCRT4.dll
LoadedModule[8]=C:\WINDOWS\System32\SspiCli.dll
LoadedModule[9]=C:\WINDOWS\System32\CRYPTBASE.dll
LoadedModule[10]=C:\WINDOWS\System32\bcryptPrimitives.dll
LoadedModule[11]=C:\WINDOWS\System32\comdlg32.dll
LoadedModule[12]=C:\WINDOWS\System32\combase.dll
LoadedModule[13]=C:\WINDOWS\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.14393.953_none_89c2555adb023171\comctl32.dll
LoadedModule[14]=C:\WINDOWS\System32\ucrtbase.dll
LoadedModule[15]=C:\WINDOWS\System32\GDI32.dll
LoadedModule[16]=C:\WINDOWS\System32\gdi32full.dll
LoadedModule[17]=C:\WINDOWS\System32\shcore.dll
LoadedModule[18]=C:\WINDOWS\System32\USER32.dll
LoadedModule[19]=C:\WINDOWS\System32\SHLWAPI.dll
LoadedModule[20]=C:\WINDOWS\System32\win32u.dll
LoadedModule[21]=C:\WINDOWS\System32\SHELL32.dll
LoadedModule[22]=C:\WINDOWS\System32\cfgmgr32.dll
LoadedModule[23]=C:\WINDOWS\System32\windows.storage.dll
LoadedModule[24]=C:\WINDOWS\System32\powrprof.dll
LoadedModule[25]=C:\WINDOWS\System32\kernel.appcore.dll
LoadedModule[26]=C:\WINDOWS\System32\profapi.dll
LoadedModule[27]=C:\WINDOWS\System32\ole32.dll
LoadedModule[28]=C:\WINDOWS\System32\oleaut32.dll
LoadedModule[29]=C:\WINDOWS\SYSTEM32\FONTSUB.dll
LoadedModule[30]=C:\WINDOWS\System32\msvcp_win.dll
LoadedModule[31]=C:\WINDOWS\SYSTEM32\SHFolder.dll
LoadedModule[32]=C:\WINDOWS\SYSTEM32\TAPI32.DLL
LoadedModule[33]=C:\WINDOWS\SYSTEM32\usp10.dll
LoadedModule[34]=C:\WINDOWS\SYSTEM32\version.dll
LoadedModule[35]=C:\WINDOWS\SYSTEM32\winmm.dll
LoadedModule[36]=C:\WINDOWS\SYSTEM32\wininet.dll
LoadedModule[37]=C:\WINDOWS\SYSTEM32\winspool.drv
LoadedModule[38]=C:\WINDOWS\SYSTEM32\wsock32.dll
LoadedModule[39]=C:\WINDOWS\System32\WS2_32.dll
LoadedModule[40]=C:\WINDOWS\SYSTEM32\WINMMBASE.dll
LoadedModule[41]=C:\WINDOWS\SYSTEM32\bcrypt.dll
LoadedModule[42]=C:\WINDOWS\System32\IMM32.DLL
LoadedModule[43]=C:\WINDOWS\system32\uxtheme.dll
LoadedModule[44]=C:\WINDOWS\System32\MSCTF.dll
LoadedModule[45]=C:\WINDOWS\system32\dwmapi.dll
LoadedModule[46]=C:\WINDOWS\SYSTEM32\wtsapi32.dll
LoadedModule[47]=C:\WINDOWS\SYSTEM32\WINSTA.dll
LoadedModule[48]=C:\WINDOWS\SYSTEM32\netapi32.dll
LoadedModule[49]=C:\WINDOWS\SYSTEM32\NETUTILS.DLL
LoadedModule[50]=C:\WINDOWS\SYSTEM32\olepro32.dll
LoadedModule[51]=C:\WINDOWS\System32\clbcatq.dll
LoadedModule[52]=C:\Program Files (x86)\Microsoft Office\Root\Office16\olmapi32.dll
LoadedModule[53]=C:\WINDOWS\SYSTEM32\VCRUNTIME140.dll
LoadedModule[54]=C:\WINDOWS\SYSTEM32\wevtapi.dll
LoadedModule[55]=C:\WINDOWS\SYSTEM32\MSVCP140.dll
LoadedModule[56]=C:\WINDOWS\WinSxS\x86_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.14393.953_none_baad48403594ab3f\gdiplus.dll
State[0].Key=Transport.DoneStage1
State[0].Value=1
FriendlyEventName=Nicht mehr funktionsfähig
ConsentKey=BEX
AppName=T4_lokal.exe
AppPath=C:\T4\Prog\T4_lokal.exe
NsPartner=windows
NsGroup=windows8
ApplicationIdentity=9586098547A6D59ECE8239A58E8555D0
MetadataHash=-82631260
Alle Antworten
-
Erklärung findest du hier:
https://en.wikipedia.org/wiki/Stack_buffer_overflowUrsache ist häufig ein geändertes Interface (Parameterstrukturen) von einer zur anderen Version.
In den Windows-API gibt es deshalb häufig eine Längen- und/oder Versions-Info am Anfang einer Struktur.Um den Fehler einzukreisen musst du den Callstack prüfen, damit du weißt, welche Funktion inkompatibel ist.
-
Danke für die Tipps. Ich bin leider trotzdem noch nicht weitergekommen. Ich konnte den Fehler noch nicht auf einem meiner Entwicklungsrechner reproduzieren.
Das Problem ist ja auch dass der Fehler schon beim Programmstart auftritt. Es wird da noch keine MAPI-Funktion aufgerufen. Wahrscheinlich passiert der Fehler bei einer automatischen Initialisierung. Ich kann mir nicht vorstellen, dass sich da das Interface geändert hat.
Es müssen doch alle spezifischen MAPI-DLLs (Outlook, Mozilla ,..) die gleichen Interfaces anbieten.
So ganz durchschaut hab ich das MAPI System auch noch nicht. Ich dachte es werden die Mapi-Prozedur- Aufrufe immer an die mapi32.dll geschickt und die ruft dann die spezifischen Mapi-DLLs z.B. olmapi32.dll auf.
Welchen Part hat die msmapi32.dll ? Es wird anscheinend auch die Prozedur FGetComponentPath aufgerufen um in der Registry HKLM\ SOFTWARE\Clients\Mail den Pfad der spezifischen MAPI-dll DLLPathEx abzufragen. Wird dann diese DLL explizit gelinkt?
Ich weiß auch nicht wie ich auf diese Dinge überhaupt einen Einfluss aus meiner Entwicklungsumgebung heraus habe.
-
Es ist zugegebener Maßen schwierig.
Aber leider befinden wir uns da wie üblich in der DLL-Hölle.Beim Laden einer DLL werden alle DLL's mit geladen, deren Funktionen durch statische Bindung benötigt werden. Da habe ich es schon erlebt, dass von einer Windowsversion zur anderen die Funktion in eine andere DLL verschoben wurde. Dadurch wird die DLL dann allerdings nicht geladen und es gäbe ggf. andere Fehler.
Daher war ich dann gezwungen, die Funktionsadresse zur Laufzeit in A.DLL oder B.DLL zu suchen.
Helfen kann dir hierbei ggf. der "DependencyWalker". Diesen rufst du mit deiner DLL/deinem Programm auf und es werden alle benötigten Funktionen/DLL's aufgelistet und fehlende Funktionen rot markiert.
Sollte allerdings in den beteiligten DLL's ein Funktionsaufruf bereits mit einem Funktionspointer durchgeführt werden, so ist es denkbar, dass hier der Init des Pointers fehlgeschlagen ist.