implement DbgPrintEx, vDbgPrintEx, and vDbgPrintExWithPrefix
authorRoyce Mitchell III <royce3@ev1.net>
Sun, 14 Aug 2005 04:24:01 +0000 (04:24 +0000)
committerRoyce Mitchell III <royce3@ev1.net>
Sun, 14 Aug 2005 04:24:01 +0000 (04:24 +0000)
svn path=/trunk/; revision=17378

reactos/ntoskrnl/rtl/debug.c

index 5d6246a..396076a 100644 (file)
 #include <ntoskrnl.h>
 #include <internal/debug.h>
 
 #include <ntoskrnl.h>
 #include <internal/debug.h>
 
+/* DATA *********************************************************************/
+
+typedef struct
+{
+       ULONG ComponentId;
+       ULONG Level;
+} KD_COMPONENT_DATA;
+#define MAX_KD_COMPONENT_TABLE_ENTRIES 128
+KD_COMPONENT_DATA KdComponentTable[MAX_KD_COMPONENT_TABLE_ENTRIES];
+ULONG KdComponentTableEntries = 0;
+
 /* FUNCTIONS ****************************************************************/
 
 /*
 /* FUNCTIONS ****************************************************************/
 
 /*
 /*
  * @implemented
  */
 /*
  * @implemented
  */
-ULONG
-DbgPrint(PCH Format, ...)
+ULONG WINAPI
+vDbgPrintExWithPrefix(IN LPCSTR Prefix,
+                      IN ULONG ComponentId,
+                      IN ULONG Level,
+                      IN LPCSTR Format,
+                      IN va_list ap)
 {
    ANSI_STRING DebugString;
 {
    ANSI_STRING DebugString;
-   CHAR Buffer[1024];
-   va_list ap;
+   CHAR Buffer[513];
+   PCHAR pBuffer;
+   ULONG pBufferSize;
 #ifdef SERIALIZE_DBGPRINT
 #  define MESSAGETABLE_SIZE  16
    LONG MyTableIndex;
 #ifdef SERIALIZE_DBGPRINT
 #  define MESSAGETABLE_SIZE  16
    LONG MyTableIndex;
@@ -37,13 +53,30 @@ DbgPrint(PCH Format, ...)
    static CHAR MessageTable[MESSAGETABLE_SIZE][sizeof(Buffer)] = { { '\0' } };
 #endif /* SERIALIZE_DBGPRINT */
 
    static CHAR MessageTable[MESSAGETABLE_SIZE][sizeof(Buffer)] = { { '\0' } };
 #endif /* SERIALIZE_DBGPRINT */
 
+   /* TODO FIXME - call NtQueryDebugFilterState() instead per Alex */
+   if ( !DbgQueryDebugFilterState ( ComponentId, Level ) )
+      return 0;
+
    /* init ansi string */
    DebugString.Buffer = Buffer;
    DebugString.MaximumLength = sizeof(Buffer);
 
    /* init ansi string */
    DebugString.Buffer = Buffer;
    DebugString.MaximumLength = sizeof(Buffer);
 
-   va_start (ap, Format);
-   DebugString.Length = _vsnprintf (Buffer, sizeof( Buffer ), Format, ap);
-   va_end (ap);
+   pBuffer = Buffer;
+   pBufferSize = sizeof(Buffer);
+   DebugString.Length = 0;
+   if ( Prefix && *Prefix )
+   {
+      DebugString.Length = strlen(Prefix);
+      if ( DebugString.Length >= sizeof(Buffer) )
+         DebugString.Length = sizeof(Buffer) - 1;
+      memmove ( Buffer, Prefix, DebugString.Length );
+      Buffer[DebugString.Length] = '\0';
+      pBuffer = &Buffer[DebugString.Length];
+      pBufferSize -= DebugString.Length;
+   }
+
+   DebugString.Length += _vsnprintf ( pBuffer, pBufferSize, Format, ap );
+   Buffer[sizeof(Buffer)-1] = '\0';
 
 #ifdef SERIALIZE_DBGPRINT
    /* check if we are already running */
 
 #ifdef SERIALIZE_DBGPRINT
    /* check if we are already running */
@@ -62,9 +95,6 @@ DbgPrint(PCH Format, ...)
           }
         else
           {
           }
         else
           {
-             /*DebugString.Buffer = "ยตยตยต";
-             DebugString.Length = 3;
-             KdpPrintString(&DebugString);*/
              memcpy(MessageTable[MyTableIndex], DebugString.Buffer, DebugString.Length);
              MessageTable[MyTableIndex][DebugString.Length] = '\0';
           }
              memcpy(MessageTable[MyTableIndex], DebugString.Buffer, DebugString.Length);
              MessageTable[MyTableIndex][DebugString.Length] = '\0';
           }
@@ -101,7 +131,44 @@ DbgPrint(PCH Format, ...)
 }
 
 /*
 }
 
 /*
- * @unimplemented
+ * @implemented
+ */
+ULONG WINAPI
+vDbgPrintEx(IN ULONG ComponentId,
+            IN ULONG Level,
+            IN LPCSTR Format,
+            IN va_list ap)
+{
+       return vDbgPrintExWithPrefix ( NULL, ComponentId, Level, Format, ap );
+}
+
+/*
+ * @implemented
+ */
+ULONG
+DbgPrint(PCH Format, ...)
+{
+       va_list ap;
+       ULONG rc;
+
+       va_start (ap, Format);
+       /* TODO FIXME - use DPFLTR_DEFAULT_ID and DPFLTR_INFO_LEVEL
+        *
+        * https://www.osronline.com/article.cfm?article=295
+        *
+        * ( first need to add those items to registry by default tho so we don't anger
+        *  ros-devs when DbgPrint() suddenly stops working )
+        *
+        * ( also when you do this, remove -1 hack from DbgQueryDebugFilterState() )
+        */
+       rc = vDbgPrintExWithPrefix ( NULL, (ULONG)-1, (ULONG)-1, Format, ap );
+       va_end (ap);
+
+       return rc;
+}
+
+/*
+ * @implemented
  */
 ULONG
 __cdecl
  */
 ULONG
 __cdecl
@@ -110,8 +177,14 @@ DbgPrintEx(IN ULONG ComponentId,
            IN PCH Format,
            ...)
 {
            IN PCH Format,
            ...)
 {
-    UNIMPLEMENTED;
-    return 0;
+       va_list ap;
+       ULONG rc;
+
+       va_start (ap, Format);
+       rc = vDbgPrintExWithPrefix ( NULL, ComponentId, Level, Format, ap );
+       va_end (ap);
+
+       return rc;
 }
 
 /*
 }
 
 /*
@@ -151,19 +224,36 @@ DbgPrompt(PCH OutputString,
 }
 
 /*
 }
 
 /*
- * @unimplemented
+ * @implemented
  */
  */
-NTSTATUS
+BOOLEAN
 STDCALL
 DbgQueryDebugFilterState(IN ULONG ComponentId,
                          IN ULONG Level)
 {
 STDCALL
 DbgQueryDebugFilterState(IN ULONG ComponentId,
                          IN ULONG Level)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
+       int i;
+
+       if ( ComponentId == -1 )
+               return TRUE;
+
+       /* convert Level to mask if it isn't already one */
+       if ( Level < 32 )
+               Level = 1 << Level;
+
+       for ( i = 0; i < KdComponentTableEntries; i++ )
+       {
+               if ( ComponentId == KdComponentTable[i].ComponentId )
+               {
+                       if ( Level & KdComponentTable[i].Level )
+                               return TRUE;
+                       break;
+               }
+       }
+       return FALSE;
 }
 
 /*
 }
 
 /*
- * @unimplemented
+ * @implemented
  */
 NTSTATUS
 STDCALL
  */
 NTSTATUS
 STDCALL
@@ -171,8 +261,25 @@ DbgSetDebugFilterState(IN ULONG ComponentId,
                        IN ULONG Level,
                        IN BOOLEAN State)
 {
                        IN ULONG Level,
                        IN BOOLEAN State)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
+       int i;
+       for ( i = 0; i < KdComponentTableEntries; i++ )
+       {
+               if ( ComponentId == KdComponentTable[i].ComponentId )
+                       break;
+       }
+       if ( i == KdComponentTableEntries )
+       {
+               if ( i == MAX_KD_COMPONENT_TABLE_ENTRIES )
+                       return STATUS_INVALID_PARAMETER_1;
+               ++KdComponentTableEntries;
+               KdComponentTable[i].ComponentId = ComponentId;
+               KdComponentTable[i].Level = 0;
+       }
+       if ( State )
+               KdComponentTable[i].Level |= Level;
+       else
+               KdComponentTable[i].Level &= ~Level;
+       return STATUS_SUCCESS;
 }
 
 /*
 }
 
 /*