home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / sdktools / image / drwatson / eventlog.c < prev    next >
C/C++ Source or Header  |  1996-08-29  |  7KB  |  257 lines

  1. /*++
  2.  
  3. Copyright (c) 1993  Microsoft Corporation
  4.  
  5. Module Name:
  6.  
  7.     ui.c
  8.  
  9. Abstract:
  10.  
  11.     This file contains all functions that access the application event log.
  12.  
  13. Author:
  14.  
  15.     Wesley Witt (wesw) 1-May-1993
  16.  
  17. Environment:
  18.  
  19.     User Mode
  20.  
  21. --*/
  22.  
  23. #include <windows.h>
  24. #include <stdlib.h>
  25. #include <stdio.h>
  26. #include <string.h>
  27.  
  28. #include "drwatson.h"
  29. #include "proto.h"
  30. #include "messages.h"
  31.  
  32.  
  33. char * AddString( char *p, char *s );
  34. char * AddNumber( char *p, char *f, DWORD dwNumber );
  35. char * GetDWORD( PDWORD pdwData, char *p );
  36. char * GetWORD( PWORD pwData, char *p );
  37. char * GetString( char *s, char *p, DWORD size );
  38.  
  39.  
  40. BOOL
  41. ElClearAllEvents( void )
  42. {
  43.     HANDLE           hEventLog;
  44.     char             szAppName[MAX_PATH];
  45.  
  46.  
  47.     GetAppName( szAppName, sizeof(szAppName) );
  48.     hEventLog = OpenEventLog( NULL, szAppName );
  49.     Assert( hEventLog != NULL );
  50.     ClearEventLog( hEventLog, NULL );
  51.     CloseEventLog( hEventLog );
  52.     RegSetNumCrashes(0);
  53.  
  54.     return TRUE;
  55. }
  56.  
  57. BOOL
  58. ElEnumCrashes( PCRASHINFO crashInfo, CRASHESENUMPROC lpEnumFunc )
  59. {
  60.     char             *p;
  61.     HANDLE           hEventLog;
  62.     char             *szEvBuf;
  63.     EVENTLOGRECORD   *pevlr;
  64.     DWORD            dwRead;
  65.     DWORD            dwNeeded;
  66.     DWORD            dwBufSize = 4096;
  67.     BOOL             rc;
  68.     BOOL             ec;
  69.     char             szAppName[MAX_PATH];
  70.  
  71.  
  72.     GetAppName( szAppName, sizeof(szAppName) );
  73.     hEventLog = OpenEventLog( NULL, szAppName );
  74.     if (hEventLog == NULL) {
  75.         return FALSE;
  76.     }
  77.  
  78.     szEvBuf = (char *) malloc( dwBufSize );
  79.     if (szEvBuf == NULL) {
  80.         return FALSE;
  81.     }
  82.  
  83.     while (TRUE) {
  84. try_again:
  85.         rc = ReadEventLog(hEventLog,
  86.                         EVENTLOG_FORWARDS_READ | EVENTLOG_SEQUENTIAL_READ,
  87.                         0,
  88.                         (EVENTLOGRECORD *) szEvBuf,
  89.                         dwBufSize,
  90.                         &dwRead,
  91.                         &dwNeeded);
  92.  
  93.         if (!rc) {
  94.             ec = GetLastError();
  95.             if (ec != ERROR_INSUFFICIENT_BUFFER) {
  96.                 goto exit;
  97.             }
  98.  
  99.             free( szEvBuf );
  100.  
  101.             dwBufSize = dwNeeded + 1024;
  102.             szEvBuf = (char *) malloc( dwBufSize );
  103.             if (szEvBuf == NULL) {
  104.                 return FALSE;
  105.             }
  106.  
  107.             goto try_again;
  108.         }
  109.  
  110.         if (dwRead == 0) {
  111.             break;
  112.         }
  113.  
  114.         GetAppName( szAppName, sizeof(szAppName) );
  115.         p = szEvBuf;
  116.  
  117.         do {
  118.  
  119.             pevlr = (EVENTLOGRECORD *) p;
  120.  
  121.             p += pevlr->StringOffset;
  122.  
  123.             p = GetString( crashInfo->crash.szAppName,           p, sizeof(crashInfo->crash.szAppName) );
  124.             p = GetWORD  ( &crashInfo->crash.time.wMonth,        p );
  125.             p = GetWORD  ( &crashInfo->crash.time.wDay,          p );
  126.             p = GetWORD  ( &crashInfo->crash.time.wYear,         p );
  127.             p = GetWORD  ( &crashInfo->crash.time.wHour,         p );
  128.             p = GetWORD  ( &crashInfo->crash.time.wMinute,       p );
  129.             p = GetWORD  ( &crashInfo->crash.time.wSecond,       p );
  130.             p = GetWORD  ( &crashInfo->crash.time.wMilliseconds, p );
  131.             p = GetDWORD ( &crashInfo->crash.dwExceptionCode,    p );
  132.             p = GetDWORD ( &crashInfo->crash.dwAddress,          p );
  133.             p = GetString( crashInfo->crash.szFunction,          p, sizeof(crashInfo->crash.szFunction) );
  134.  
  135.             p = (char *) ((DWORD)pevlr + sizeof(EVENTLOGRECORD));
  136.  
  137.             if (strcmp( p, szAppName) == 0) {
  138.                 crashInfo->dwCrashDataSize = pevlr->DataLength;
  139.                 crashInfo->pCrashData = (char *) ((DWORD)pevlr + pevlr->DataOffset);
  140.  
  141.                 if (!lpEnumFunc( crashInfo )) {
  142.                     goto exit;
  143.                 }
  144.             }
  145.  
  146.             //
  147.             // update the pointer & read count
  148.             //
  149.             dwRead -= pevlr->Length;
  150.             p = (char *) ((DWORD)pevlr + pevlr->Length);
  151.  
  152.         } while ( dwRead > 0 );
  153.     }
  154.  
  155. exit:
  156.     free( szEvBuf );
  157.     CloseEventLog( hEventLog );
  158.     return TRUE;
  159. }
  160.  
  161. BOOL
  162. ElSaveCrash( PCRASHES crash, DWORD dwMaxCrashes )
  163. {
  164.     char    szStrings[4096];
  165.     LPSTR   p = szStrings;
  166.     HANDLE  hEventSrc;
  167.     LPSTR   pp[20];
  168.     char    *pLogFileData;
  169.     DWORD   dwLogFileDataSize;
  170.     char    szAppName[MAX_PATH];
  171.  
  172.  
  173.     if (dwMaxCrashes > 0) {
  174.         if (RegGetNumCrashes() >= dwMaxCrashes) {
  175.             return FALSE;
  176.         }
  177.     }
  178.  
  179.     RegSetNumCrashes( RegGetNumCrashes()+1 );
  180.  
  181.     p = AddString( pp[0]  = p,         crash->szAppName           );
  182.     p = AddNumber( pp[1]  = p, "%2d",  crash->time.wMonth         );
  183.     p = AddNumber( pp[2]  = p, "%2d",  crash->time.wDay           );
  184.     p = AddNumber( pp[3]  = p, "%4d",  crash->time.wYear          );
  185.     p = AddNumber( pp[4]  = p, "%2d",  crash->time.wHour          );
  186.     p = AddNumber( pp[5]  = p, "%2d",  crash->time.wMinute        );
  187.     p = AddNumber( pp[6]  = p, "%2d",  crash->time.wSecond        );
  188.     p = AddNumber( pp[7]  = p, "%3d",  crash->time.wMilliseconds  );
  189.     p = AddNumber( pp[8]  = p, "%08x", crash->dwExceptionCode     );
  190.     p = AddNumber( pp[9]  = p, "%08x", crash->dwAddress           );
  191.     p = AddString( pp[10] = p,         crash->szFunction          );
  192.  
  193.     GetAppName( szAppName, sizeof(szAppName) );
  194.  
  195.     hEventSrc = RegisterEventSource( NULL, szAppName );
  196.  
  197.     if (hEventSrc == NULL) {
  198.         return FALSE;
  199.     }
  200.  
  201.     pLogFileData = GetLogFileData( &dwLogFileDataSize );
  202.  
  203.     ReportEvent( hEventSrc,
  204.                  EVENTLOG_INFORMATION_TYPE,
  205.                  0,
  206.                  MSG_CRASH,
  207.                  NULL,
  208.                  11,
  209.                  dwLogFileDataSize,
  210.                  pp,
  211.                  pLogFileData
  212.                );
  213.  
  214.     DeregisterEventSource( hEventSrc );
  215.  
  216.     free( pLogFileData );
  217.  
  218.     return TRUE;
  219. }
  220.  
  221. char *
  222. AddString( char *p, char *s )
  223. {
  224.     strcpy( p, s );
  225.     p += (strlen(s) + 1);
  226.     return p;
  227. }
  228.  
  229. char *
  230. AddNumber( char *p, char *f, DWORD dwNumber )
  231. {
  232.     char buf[20];
  233.     wsprintf( buf, f, dwNumber );
  234.     return AddString( p, buf );
  235. }
  236.  
  237. char *
  238. GetString( char *s, char *p, DWORD size )
  239. {
  240.     strncpy( s, p, size );
  241.     return p + strlen(p) + 1;
  242. }
  243.  
  244. char *
  245. GetDWORD( PDWORD pdwData, char *p )
  246. {
  247.     sscanf( p, "%x", pdwData );
  248.     return p + strlen(p) + 1;
  249. }
  250.  
  251. char *
  252. GetWORD( PWORD pwData, char *p )
  253. {
  254.     *pwData = atoi( p );
  255.     return p + strlen(p) + 1;
  256. }
  257.