https://git.reactos.org/?p=reactos.git;a=commitdiff;h=31a5fa61bbf47c897059d9af350f4646c1d01488

commit 31a5fa61bbf47c897059d9af350f4646c1d01488
Author:     Timo Kreuzer <[email protected]>
AuthorDate: Sun Jul 17 19:17:18 2022 +0200
Commit:     Timo Kreuzer <[email protected]>
CommitDate: Wed Jul 20 23:57:42 2022 +0200

    [NTOS:KDBG] Add KdbpPrintUnicodeString
    
    Calling normal unicode functions is not allowed at IRQL > APC_LEVEL, so 
calling _vsnprintf with unicode parameters from KDBG is invalid.
---
 ntoskrnl/kdbg/kdb.h     |  4 ++++
 ntoskrnl/kdbg/kdb_cli.c | 34 ++++++++++++++++++++++++++++++----
 2 files changed, 34 insertions(+), 4 deletions(-)

diff --git a/ntoskrnl/kdbg/kdb.h b/ntoskrnl/kdbg/kdb.h
index 68f4ce03b05..808c13c5550 100644
--- a/ntoskrnl/kdbg/kdb.h
+++ b/ntoskrnl/kdbg/kdb.h
@@ -107,6 +107,10 @@ KdbpPrint(
    IN PCHAR Format,
    IN ...  OPTIONAL);
 
+VOID
+KdbpPrintUnicodeString(
+    _In_ PCUNICODE_STRING String);
+
 BOOLEAN
 NTAPI
 KdbpGetHexNumber(
diff --git a/ntoskrnl/kdbg/kdb_cli.c b/ntoskrnl/kdbg/kdb_cli.c
index 4958dd9be71..7da99daef32 100644
--- a/ntoskrnl/kdbg/kdb_cli.c
+++ b/ntoskrnl/kdbg/kdb_cli.c
@@ -564,10 +564,14 @@ KdbpPrintStructInternal
         KdbpPrint("%s%p+%x: %s", Indent, ((PCHAR)BaseAddress) + 
Member->BaseOffset, Member->Size, Member->Name ? Member->Name : "<anoymous>");
         if (DoRead) {
             if (!strcmp(Member->Type, "_UNICODE_STRING")) {
-                KdbpPrint("\"%wZ\"\n", ((PCHAR)BaseAddress) + 
Member->BaseOffset);
+                KdbpPrint("\"");
+                KdbpPrintUnicodeString(((PCHAR)BaseAddress) + 
Member->BaseOffset);
+                KdbpPrint("\"\n");
                 continue;
             } else if (!strcmp(Member->Type, "PUNICODE_STRING")) {
-                KdbpPrint("\"%wZ\"\n", 
*(((PUNICODE_STRING*)((PCHAR)BaseAddress) + Member->BaseOffset)));
+                KdbpPrint("\"");
+                
KdbpPrintUnicodeString(*(((PUNICODE_STRING*)((PCHAR)BaseAddress) + 
Member->BaseOffset)));
+                KdbpPrint("\"\n");
                 continue;
             }
             switch (Member->Size) {
@@ -2109,7 +2113,9 @@ KdbpCmdMod(
     KdbpPrint("  Base      Size      Name\n");
     for (;;)
     {
-        KdbpPrint("  %08x  %08x  %wZ\n", LdrEntry->DllBase, 
LdrEntry->SizeOfImage, &LdrEntry->BaseDllName);
+        KdbpPrint("  %p  %08x  ", LdrEntry->DllBase, LdrEntry->SizeOfImage);
+        KdbpPrintUnicodeString(&LdrEntry->BaseDllName);
+        KdbpPrint("\n");
 
         if(DisplayOnlyOneModule || !KdbpSymFindModule(NULL, i++, &LdrEntry))
             break;
@@ -3035,6 +3041,24 @@ KdbpPrint(
     }
 }
 
+VOID
+KdbpPrintUnicodeString(
+    _In_ PCUNICODE_STRING String)
+{
+    ULONG i;
+
+    if ((String == NULL) || (String->Buffer == NULL))
+    {
+        KdbpPrint("<NULL>");
+        return;
+    }
+
+    for (i = 0; i < String->Length / sizeof(WCHAR); i++)
+    {
+        KdbpPrint("%c", (CHAR)String->Buffer[i]);
+    }
+}
+
 /** memrchr(), explicitly defined, since was absent in MinGW of RosBE. */
 /*
  * Reverse memchr()
@@ -3863,7 +3887,9 @@ KdbpCliModuleLoaded(
     if (!KdbBreakOnModuleLoad)
         return;
 
-    KdbpPrint("Module %wZ loaded.\n", Name);
+    KdbpPrint("Module ");
+    KdbpPrintUnicodeString(Name);
+    KdbpPrint(" loaded.\n");
     DbgBreakPointWithStatus(DBG_STATUS_CONTROL_C);
 }
 

Reply via email to