[ros-diffs] [sginsberg] 56235: [NTOS] - It appears ros wasn't ready for properly handling page faults with interrupts disabled, disable bugcheck and warn and dump stack instead for now. - Make KeRosDumpStackFr...

sginsberg at svn.reactos.org sginsberg at svn.reactos.org
Mon Mar 26 13:51:15 UTC 2012


Author: sginsberg
Date: Mon Mar 26 13:51:15 2012
New Revision: 56235

URL: http://svn.reactos.org/svn/reactos?rev=56235&view=rev
Log:
[NTOS]
- It appears ros wasn't ready for properly handling page faults with interrupts disabled, disable bugcheck and warn and dump stack instead for now.
- Make KeRosDumpStackFrameArray and KdbSymPrintAddress safe to use at elavated IRQL -- don't use Unicode formats for DbgPrint at possible elavated IRQL/interrupts disabled as this may generate a page fault. Safely convert to ANSI instead before printing out the address.

Modified:
    trunk/reactos/ntoskrnl/include/internal/ke.h
    trunk/reactos/ntoskrnl/kdbg/kdb_symbols.c
    trunk/reactos/ntoskrnl/ke/bug.c
    trunk/reactos/ntoskrnl/ke/i386/traphdlr.c

Modified: trunk/reactos/ntoskrnl/include/internal/ke.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/ke.h?rev=56235&r1=56234&r2=56235&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/include/internal/ke.h [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/include/internal/ke.h [iso-8859-1] Mon Mar 26 13:51:15 2012
@@ -1130,4 +1130,12 @@
 KiRosPcToUserFileHeader(IN PVOID Eip,
                         OUT PLDR_DATA_TABLE_ENTRY *LdrEntry);
 
+PCHAR
+NTAPI
+KeBugCheckUnicodeToAnsi(
+    IN PUNICODE_STRING Unicode,
+    OUT PCHAR Ansi,
+    IN ULONG Length
+);
+
 #include "ke_x.h"

Modified: trunk/reactos/ntoskrnl/kdbg/kdb_symbols.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/kdbg/kdb_symbols.c?rev=56235&r1=56234&r2=56235&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/kdbg/kdb_symbols.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/kdbg/kdb_symbols.c [iso-8859-1] Mon Mar 26 13:51:15 2012
@@ -109,6 +109,30 @@
                                    pLdrEntry);
 }
 
+PCHAR
+NTAPI
+KdbpSymUnicodeToAnsi(IN PUNICODE_STRING Unicode,
+                     OUT PCHAR Ansi,
+                     IN ULONG Length)
+{
+    PCHAR p;
+    PWCHAR pw;
+    ULONG i;
+
+    /* Set length and normalize it */
+    i = Unicode->Length / sizeof(WCHAR);
+    i = min(i, Length - 1);
+
+    /* Set source and destination, and copy */
+    pw = Unicode->Buffer;
+    p = Ansi;
+    while (i--) *p++ = (CHAR)*pw++;
+
+    /* Null terminate and return */
+    *p = ANSI_NULL;
+    return Ansi;
+}
+
 /*! \brief Print address...
  *
  * Tries to lookup line number, file name and function name for the given
@@ -131,9 +155,14 @@
     ULONG LineNumber;
     CHAR FileName[256];
     CHAR FunctionName[256];
+    CHAR ModuleNameAnsi[64];
 
     if (!KdbpSymbolsInitialized || !KdbpSymFindModule(Address, NULL, -1, &LdrEntry))
         return FALSE;
+        
+    KdbpSymUnicodeToAnsi(&LdrEntry->BaseDllName,
+                         ModuleNameAnsi,
+                         sizeof(ModuleNameAnsi));
 
     RelativeAddress = (ULONG_PTR)Address - (ULONG_PTR)LdrEntry->DllBase;
     Status = KdbSymGetAddressInformation(LdrEntry->PatchInformation,
@@ -143,12 +172,12 @@
                                          FunctionName);
     if (NT_SUCCESS(Status))
     {
-        DbgPrint("<%wZ:%x (%s:%d (%s))>",
-            &LdrEntry->BaseDllName, RelativeAddress, FileName, LineNumber, FunctionName);
+        DbgPrint("<%s:%x (%s:%d (%s))>",
+            ModuleNameAnsi, RelativeAddress, FileName, LineNumber, FunctionName);
     }
     else
     {
-        DbgPrint("<%wZ:%x>", &LdrEntry->BaseDllName, RelativeAddress);
+        DbgPrint("<%s:%x>", ModuleNameAnsi, RelativeAddress);
     }
 
     return TRUE;

Modified: trunk/reactos/ntoskrnl/ke/bug.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/bug.c?rev=56235&r1=56234&r2=56235&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/ke/bug.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/bug.c [iso-8859-1] Mon Mar 26 13:51:15 2012
@@ -102,42 +102,6 @@
     return PcBase;
 }
 
-BOOLEAN
-NTAPI
-KiRosPrintAddress(PVOID address)
-{
-    PLIST_ENTRY current_entry;
-    PLDR_DATA_TABLE_ENTRY current;
-    extern LIST_ENTRY PsLoadedModuleList;
-    ULONG_PTR RelativeAddress;
-    ULONG i = 0;
-
-    do
-    {
-        current_entry = PsLoadedModuleList.Flink;
-
-        while (current_entry != &PsLoadedModuleList)
-        {
-            current = CONTAINING_RECORD(current_entry,
-                                        LDR_DATA_TABLE_ENTRY,
-                                        InLoadOrderLinks);
-
-            if (address >= (PVOID)current->DllBase &&
-                address < (PVOID)((ULONG_PTR)current->DllBase +
-                                             current->SizeOfImage))
-            {
-                RelativeAddress = (ULONG_PTR)address -
-                                  (ULONG_PTR)current->DllBase;
-                DbgPrint("<%wZ: %x>", &current->FullDllName, RelativeAddress);
-                return(TRUE);
-            }
-            current_entry = current_entry->Flink;
-        }
-    } while(++i <= 1);
-
-    return(FALSE);
-}
-
 PVOID
 NTAPI
 KiRosPcToUserFileHeader(IN PVOID Pc,
@@ -270,9 +234,14 @@
             if (!KdbSymPrintAddress((PVOID)Addr, NULL))
 #endif
             {
-                /* Print out the module name */
+                CHAR AnsiName[64];
+
+                /* Convert module name to ANSI and print it */
+                KeBugCheckUnicodeToAnsi(&LdrEntry->BaseDllName,
+                                        AnsiName,
+                                        sizeof(AnsiName));
                 Addr -= (ULONG_PTR)LdrEntry->DllBase;
-                DbgPrint("<%wZ: %p>", &LdrEntry->FullDllName, (PVOID)Addr);
+                DbgPrint("<%s: %p>", AnsiName, (PVOID)Addr);
             }
         }
         else

Modified: trunk/reactos/ntoskrnl/ke/i386/traphdlr.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/traphdlr.c?rev=56235&r1=56234&r2=56235&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/ke/i386/traphdlr.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/i386/traphdlr.c [iso-8859-1] Mon Mar 26 13:51:15 2012
@@ -1190,6 +1190,7 @@
     /* Enable interupts */
     _enable();
 
+#if 0
     /* Check if we faulted with interrupts disabled */
     if (!(TrapFrame->EFlags & EFLAGS_INTERRUPT_MASK))
     {
@@ -1201,6 +1202,14 @@
                          TrapFrame->Eip,
                          TrapFrame);
     }
+#else
+    if (!(TrapFrame->EFlags & EFLAGS_INTERRUPT_MASK))
+    {
+        /* Warn and dump stack */
+        DPRINT1("Page fault with interrupts disabled!\n");
+        KeRosDumpStackFrames(NULL, 0);
+    }
+#endif
 
     /* Check for S-LIST fault in kernel mode */
     if (TrapFrame->Eip == (ULONG_PTR)ExpInterlockedPopEntrySListFault)




More information about the Ros-diffs mailing list