[LDR] Add debug logging when we encountered an exception in dll/tls callbacks.
authorMark Jansen <mark.jansen@reactos.org>
Sun, 29 Jul 2018 15:13:42 +0000 (17:13 +0200)
committerMark Jansen <mark.jansen@reactos.org>
Mon, 13 Aug 2018 11:24:12 +0000 (13:24 +0200)
CORE-14532

dll/ntdll/include/ntdllp.h
dll/ntdll/ldr/ldrapi.c
dll/ntdll/ldr/ldrinit.c
dll/ntdll/ldr/ldrutils.c

index 29ade67..934a4b2 100644 (file)
@@ -62,9 +62,9 @@ VOID NTAPI LdrpInitializeThread(IN PCONTEXT Context);
 NTSTATUS NTAPI LdrpInitializeTls(VOID);
 NTSTATUS NTAPI LdrpAllocateTls(VOID);
 VOID NTAPI LdrpFreeTls(VOID);
-VOID NTAPI LdrpCallTlsInitializers(PVOID BaseAddress, ULONG Reason);
-BOOLEAN NTAPI LdrpCallInitRoutine(PDLL_INIT_ROUTINE EntryPoint, PVOID BaseAddress, ULONG Reason, PVOID Context);
-NTSTATUS NTAPI LdrpInitializeProcess(PCONTEXT Context, PVOID SystemArgument1);
+VOID NTAPI LdrpCallTlsInitializers(IN PLDR_DATA_TABLE_ENTRY LdrEntry, IN ULONG Reason);
+BOOLEAN NTAPI LdrpCallInitRoutine(IN PDLL_INIT_ROUTINE EntryPoint, IN PVOID BaseAddress, IN ULONG Reason, IN PVOID Context);
+NTSTATUS NTAPI LdrpInitializeProcess(IN PCONTEXT Context, IN PVOID SystemArgument1);
 VOID NTAPI LdrpInitFailure(NTSTATUS Status);
 VOID NTAPI LdrpValidateImageForMp(IN PLDR_DATA_TABLE_ENTRY LdrDataTableEntry);
 VOID NTAPI LdrpEnsureLoaderLockIsHeld(VOID);
index d9da842..15f36bb 100644 (file)
@@ -1485,7 +1485,8 @@ LdrUnloadDll(IN PVOID BaseAddress)
             }
             _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
             {
-                /* Do nothing */
+                DPRINT1("WARNING: Exception 0x%x during LdrpCallInitRoutine(DLL_PROCESS_DETACH) for %wZ\n",
+                        _SEH2_GetExceptionCode(), &LdrEntry->BaseDllName);
             }
             _SEH2_END;
 
index 96af326..058a128 100644 (file)
@@ -561,7 +561,7 @@ LdrpInitializeThread(IN PCONTEXT Context)
                             if (!LdrpShutdownInProgress)
                             {
                                 /* Call TLS */
-                                LdrpCallTlsInitializers(LdrEntry->DllBase, DLL_THREAD_ATTACH);
+                                LdrpCallTlsInitializers(LdrEntry, DLL_THREAD_ATTACH);
                             }
                         }
 
@@ -581,7 +581,8 @@ LdrpInitializeThread(IN PCONTEXT Context)
                     }
                     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
                     {
-                        /* Do nothing */
+                        DPRINT1("WARNING: Exception 0x%x during LdrpCallInitRoutine(DLL_THREAD_ATTACH) for %wZ\n",
+                                _SEH2_GetExceptionCode(), &LdrEntry->BaseDllName);
                     }
                     _SEH2_END;
 
@@ -610,7 +611,7 @@ LdrpInitializeThread(IN PCONTEXT Context)
         _SEH2_TRY
         {
             /* Do TLS callbacks */
-            LdrpCallTlsInitializers(Peb->ImageBaseAddress, DLL_THREAD_ATTACH);
+            LdrpCallTlsInitializers(LdrpImageEntry, DLL_THREAD_ATTACH);
         }
         _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
         {
@@ -818,7 +819,7 @@ LdrpRunInitializeRoutines(IN PCONTEXT Context OPTIONAL)
                 if (LdrEntry->TlsIndex && Context)
                 {
                     /* Call TLS */
-                    LdrpCallTlsInitializers(LdrEntry->DllBase, DLL_PROCESS_ATTACH);
+                    LdrpCallTlsInitializers(LdrEntry, DLL_PROCESS_ATTACH);
                 }
 
                 /* Call the Entrypoint */
@@ -835,6 +836,8 @@ LdrpRunInitializeRoutines(IN PCONTEXT Context OPTIONAL)
             _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
             {
                 DllStatus = FALSE;
+                DPRINT1("WARNING: Exception 0x%x during LdrpCallInitRoutine(DLL_PROCESS_ATTACH) for %wZ\n",
+                        _SEH2_GetExceptionCode(), &LdrEntry->BaseDllName);
             }
             _SEH2_END;
 
@@ -889,7 +892,7 @@ LdrpRunInitializeRoutines(IN PCONTEXT Context OPTIONAL)
         _SEH2_TRY
         {
             /* Do TLS callbacks */
-            LdrpCallTlsInitializers(Peb->ImageBaseAddress, DLL_PROCESS_ATTACH);
+            LdrpCallTlsInitializers(LdrpImageEntry, DLL_PROCESS_ATTACH);
         }
         _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
         {
@@ -996,7 +999,7 @@ LdrShutdownProcess(VOID)
                     if (LdrEntry->TlsIndex)
                     {
                         /* Call TLS */
-                        LdrpCallTlsInitializers(LdrEntry->DllBase, DLL_PROCESS_DETACH);
+                        LdrpCallTlsInitializers(LdrEntry, DLL_PROCESS_DETACH);
                     }
 
                     /* Call the Entrypoint */
@@ -1009,7 +1012,8 @@ LdrShutdownProcess(VOID)
                 }
                 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
                 {
-                    /* Do nothing */
+                    DPRINT1("WARNING: Exception 0x%x during LdrpCallInitRoutine(DLL_PROCESS_DETACH) for %wZ\n",
+                            _SEH2_GetExceptionCode(), &LdrEntry->BaseDllName);
                 }
                 _SEH2_END;
 
@@ -1034,7 +1038,7 @@ LdrShutdownProcess(VOID)
         _SEH2_TRY
         {
             /* Do TLS callbacks */
-            LdrpCallTlsInitializers(Peb->ImageBaseAddress, DLL_PROCESS_DETACH);
+            LdrpCallTlsInitializers(LdrpImageEntry, DLL_PROCESS_DETACH);
         }
         _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
         {
@@ -1123,7 +1127,7 @@ LdrShutdownThread(VOID)
                             if (!LdrpShutdownInProgress)
                             {
                                 /* Call TLS */
-                                LdrpCallTlsInitializers(LdrEntry->DllBase, DLL_THREAD_DETACH);
+                                LdrpCallTlsInitializers(LdrEntry, DLL_THREAD_DETACH);
                             }
                         }
 
@@ -1141,7 +1145,8 @@ LdrShutdownThread(VOID)
                     }
                     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
                     {
-                        /* Do nothing */
+                        DPRINT1("WARNING: Exception 0x%x during LdrpCallInitRoutine(DLL_THREAD_DETACH) for %wZ\n",
+                                _SEH2_GetExceptionCode(), &LdrEntry->BaseDllName);
                     }
                     _SEH2_END;
 
@@ -1167,7 +1172,7 @@ LdrShutdownThread(VOID)
         _SEH2_TRY
         {
             /* Do TLS callbacks */
-            LdrpCallTlsInitializers(Peb->ImageBaseAddress, DLL_THREAD_DETACH);
+            LdrpCallTlsInitializers(LdrpImageEntry, DLL_THREAD_DETACH);
         }
         _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
         {
index 5459d4a..5f55938 100644 (file)
@@ -470,7 +470,7 @@ LdrpUpdateLoadCount2(IN PLDR_DATA_TABLE_ENTRY LdrEntry,
 
 VOID
 NTAPI
-LdrpCallTlsInitializers(IN PVOID BaseAddress,
+LdrpCallTlsInitializers(IN PLDR_DATA_TABLE_ENTRY LdrEntry,
                         IN ULONG Reason)
 {
     PIMAGE_TLS_DIRECTORY TlsDirectory;
@@ -478,7 +478,7 @@ LdrpCallTlsInitializers(IN PVOID BaseAddress,
     ULONG Size;
 
     /* Get the TLS Directory */
-    TlsDirectory = RtlImageDirectoryEntryToData(BaseAddress,
+    TlsDirectory = RtlImageDirectoryEntryToData(LdrEntry->DllBase,
                                                 TRUE,
                                                 IMAGE_DIRECTORY_ENTRY_TLS,
                                                 &Size);
@@ -497,7 +497,7 @@ LdrpCallTlsInitializers(IN PVOID BaseAddress,
                 if (ShowSnaps)
                 {
                     DPRINT1("LDR: Tls Callbacks Found. Imagebase %p Tls %p CallBacks %p\n",
-                            BaseAddress, TlsDirectory, Array);
+                            LdrEntry->DllBase, TlsDirectory, Array);
                 }
 
                 /* Loop the array */
@@ -510,12 +510,12 @@ LdrpCallTlsInitializers(IN PVOID BaseAddress,
                     if (ShowSnaps)
                     {
                         DPRINT1("LDR: Calling Tls Callback Imagebase %p Function %p\n",
-                                BaseAddress, Callback);
+                                LdrEntry->DllBase, Callback);
                     }
 
                     /* Call it */
                     LdrpCallInitRoutine((PDLL_INIT_ROUTINE)Callback,
-                                        BaseAddress,
+                                        LdrEntry->DllBase,
                                         Reason,
                                         NULL);
                 }
@@ -524,7 +524,8 @@ LdrpCallTlsInitializers(IN PVOID BaseAddress,
     }
     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
     {
-        /* Do nothing */
+        DPRINT1("LDR: Exception 0x%x during Tls Callback(%u) for %wZ\n",
+                _SEH2_GetExceptionCode(), Reason, &LdrEntry->BaseDllName);
     }
     _SEH2_END;
 }