home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / winbase / security / winnt / gina / debug.c next >
C/C++ Source or Header  |  1997-10-09  |  6KB  |  294 lines

  1. //+---------------------------------------------------------------------------
  2. //
  3. //  Microsoft Windows
  4. //  Copyright 1992 - 1997 Microsoft Corporation.
  5. //
  6. //  File:       debug.c
  7. //
  8. //  Contents:   Debugging support functions
  9. //
  10. //  Classes:
  11. //
  12. //  Functions:
  13. //
  14. //  Note:       This file is not compiled for retail builds
  15. //
  16. //  History:    4-29-93   RichardW   Created
  17. //
  18. //----------------------------------------------------------------------------
  19.  
  20. //
  21. //  For ease of debugging the SPMgr, all the debug support functions have
  22. //  been stuck here.  Basically, we read info from win.ini, since that allows
  23. //  us to configure the debug level via a text file (and DOS, for example).
  24. //
  25. //  Format is:
  26. //
  27. //  win.ini
  28. //
  29. //  [Gina]
  30. //      DebugFlags=<Flag>[<,Flag>]*
  31. //
  32. //  WHERE:
  33. //      Flag is one of the following:
  34. //          Error, Warning, Trace
  35. //
  36.  
  37. #if DBG         // NOTE:  This file not compiled for retail builds
  38.  
  39. #include "gina.h"
  40. #include <stdio.h>
  41. #include <wchar.h>
  42.  
  43. FILE *  LogFile;
  44. DWORD   GINAInfoLevel = 3;
  45.  
  46.  
  47.  
  48. // Debugging support functions.
  49.  
  50. // These two functions do not exist in Non-Debug builds.  They are wrappers
  51. // to the commnot functions (maybe I should get rid of that as well...)
  52. // that echo the message to a log file.
  53.  
  54. char   szSection[] = "Gina";
  55. char * DebLevel[] = {"GINA-Error", "GINA-Warn", "GINA-Trace"
  56.                     };
  57.  
  58. typedef struct _DebugKeys {
  59.     char *  Name;
  60.     DWORD   Value;
  61. } DebugKeys, *PDebugKeys;
  62.  
  63. DebugKeys   DebugKeyNames[] = {
  64.                 {"Error",       DEB_ERROR},
  65.                 {"Warning",     DEB_WARN},
  66.                 {"Trace",       DEB_TRACE},
  67.                 };
  68.  
  69. #define NUM_DEBUG_KEYS  sizeof(DebugKeyNames) / sizeof(DebugKeys)
  70. #define NUM_BREAK_KEYS  sizeof(BreakKeyNames) / sizeof(DebugKeys)
  71.  
  72. //+---------------------------------------------------------------------------
  73. //
  74. //  Function:   LogEvent
  75. //
  76. //  Synopsis:   Logs an event to the console and, optionally, a file.
  77. //
  78. //  Effects:
  79. //
  80. //  Arguments:  [Mask]   --
  81. //              [Format] --
  82. //              [Format] --
  83. //
  84. //  Requires:
  85. //
  86. //  Returns:
  87. //
  88. //  Signals:
  89. //
  90. //  Modifies:
  91. //
  92. //  Algorithm:
  93. //
  94. //  History:    4-29-93   RichardW   Created
  95. //
  96. //  Notes:
  97. //
  98. //----------------------------------------------------------------------------
  99.  
  100. void
  101. LogEvent(   long            Mask,
  102.             const char *    Format,
  103.             ...)
  104. {
  105.     va_list ArgList;
  106.     int     Level = 0;
  107.     int     PrefixSize = 0;
  108.     char    szOutString[256];
  109.     long    OriginalMask = Mask;
  110.  
  111.  
  112.     if (Mask & GINAInfoLevel)
  113.     {
  114.         while (!(Mask & 1))
  115.         {
  116.             Level++;
  117.             Mask >>= 1;
  118.         }
  119.         if (Level >= (sizeof(DebLevel) / sizeof(char *)) )
  120.         {
  121.             Level = (sizeof(DebLevel) / sizeof(char *)) - 1;
  122.         }
  123.  
  124.  
  125.         //
  126.         // Make the prefix first:  "Process.Thread> GINA-XXX"
  127.         //
  128.  
  129.         PrefixSize = sprintf(szOutString, "%d.%d> %s: ",
  130.                 GetCurrentProcessId(), GetCurrentThreadId(), DebLevel[Level]);
  131.  
  132.  
  133.         va_start(ArgList, Format);
  134.  
  135.         if (_vsnprintf(&szOutString[PrefixSize], sizeof(szOutString) - PrefixSize,
  136.                             Format, ArgList) < 0)
  137.         {
  138.             //
  139.             // Less than zero indicates that the string could not be
  140.             // fitted into the buffer.  Output a special message indicating
  141.             // that:
  142.             //
  143.  
  144.             OutputDebugStringA("GINA!LogEvent:  Could not pack string into 256 bytes\n");
  145.  
  146.         }
  147.         else
  148.         {
  149.             OutputDebugStringA(szOutString);
  150.         }
  151.  
  152.  
  153.         if (LogFile)
  154.         {
  155.             SYSTEMTIME  stTime;
  156.  
  157.             GetLocalTime(&stTime);
  158.             fprintf(LogFile, "%02d:%02d:%02d.%03d: %s\n",
  159.                     stTime.wHour, stTime.wMinute, stTime.wSecond,
  160.                     stTime.wMilliseconds, szOutString);
  161.  
  162.             fflush(LogFile);
  163.         }
  164.  
  165.     }
  166.  
  167. }
  168.  
  169. void
  170. OpenLogFile(LPSTR   pszLogFile)
  171. {
  172.     LogFile = fopen(pszLogFile, "a");
  173.     if (!LogFile)
  174.     {
  175.         OutputDebugStringA("GINA: Could not open logfile for append");
  176.         OutputDebugStringA(pszLogFile);
  177.     }
  178.     DebugLog((DEB_TRACE, "Log file '%s' begins\n", pszLogFile));
  179. }
  180.  
  181.  
  182. DWORD
  183. GetDebugKeyValue(
  184.     PDebugKeys      KeyTable,
  185.     int             cKeys,
  186.     LPSTR           pszKey)
  187. {
  188.     int     i;
  189.  
  190.     for (i = 0; i < cKeys ; i++ )
  191.     {
  192.         if (strcmpi(KeyTable[i].Name, pszKey) == 0)
  193.         {
  194.             return(KeyTable[i].Value);
  195.         }
  196.     }
  197.     return(0);
  198. }
  199.  
  200. //+---------------------------------------------------------------------------
  201. //
  202. //  Function:   LoadDebugParameters
  203. //
  204. //  Synopsis:   Loads debug parameters from win.ini
  205. //
  206. //  Effects:
  207. //
  208. //  Arguments:  (none)
  209. //
  210. //  Requires:
  211. //
  212. //  Returns:
  213. //
  214. //  Signals:
  215. //
  216. //  Modifies:
  217. //
  218. //  Algorithm:
  219. //
  220. //  History:    4-29-93   RichardW   Created
  221. //
  222. //  Notes:
  223. //
  224. //----------------------------------------------------------------------------
  225.  
  226.  
  227. void
  228. LoadDebugParameters(void)
  229. {
  230.     char    szVal[128];
  231.     char *  pszDebug;
  232.     int     cbVal;
  233.  
  234.     cbVal = GetProfileStringA(szSection, "DebugFlags", "Error,Warning", szVal, sizeof(szVal));
  235.  
  236.     pszDebug = strtok(szVal, ", \t");
  237.     while (pszDebug)
  238.     {
  239.         GINAInfoLevel |= GetDebugKeyValue(DebugKeyNames, NUM_DEBUG_KEYS, pszDebug);
  240.         pszDebug = strtok(NULL, ", \t");
  241.     }
  242.  
  243.     cbVal = GetProfileStringA(szSection, "LogFile", "", szVal, sizeof(szVal));
  244.     if (cbVal)
  245.     {
  246.         OpenLogFile(szVal);
  247.     }
  248.  
  249. }
  250.  
  251. //+---------------------------------------------------------------------------
  252. //
  253. //  Function:   InitDebugSupport
  254. //
  255. //  Synopsis:   Initializes debugging support for the GINAgr
  256. //
  257. //  Effects:
  258. //
  259. //  Arguments:  (none)
  260. //
  261. //  Requires:
  262. //
  263. //  Returns:
  264. //
  265. //  Signals:
  266. //
  267. //  Modifies:
  268. //
  269. //  Algorithm:
  270. //
  271. //  History:    4-29-93   RichardW   Created
  272. //
  273. //  Notes:
  274. //
  275. //----------------------------------------------------------------------------
  276.  
  277.  
  278. void
  279. InitDebugSupport(void)
  280. {
  281.     LoadDebugParameters();
  282.  
  283. }
  284.  
  285.  
  286.  
  287. #else // DBG
  288.  
  289. #pragma warning(disable:4206)   // Disable the empty transation unit
  290.                                 // warning/error
  291.  
  292. #endif  // NOTE:  This file not compiled for retail builds
  293.  
  294.