Annotation of mstools/samples/sdktools/image/drwatson/eventlog.c, revision 1.1

1.1     ! root        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 );
        !            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: 
        !            53:     return TRUE;
        !            54: }
        !            55: 
        !            56: BOOL
        !            57: ElEnumCrashes( PCRASHINFO crashInfo, CRASHESENUMPROC lpEnumFunc )
        !            58: {
        !            59:     char             *p;
        !            60:     HANDLE           hEventLog;
        !            61:     char             *szEvBuf;
        !            62:     EVENTLOGRECORD   *pevlr;
        !            63:     DWORD            dwRead;
        !            64:     DWORD            dwNeeded;
        !            65:     DWORD            dwBufSize = 4096;
        !            66:     BOOL             rc;
        !            67:     BOOL             ec;
        !            68:     char             szAppName[MAX_PATH];
        !            69: 
        !            70: 
        !            71:     GetAppName( szAppName, sizeof(szAppName) );
        !            72:     hEventLog = OpenEventLog( NULL, szAppName );
        !            73:     if (hEventLog == NULL) {
        !            74:         return FALSE;
        !            75:     }
        !            76: 
        !            77:     szEvBuf = (char *) malloc( dwBufSize );
        !            78:     if (szEvBuf == NULL) {
        !            79:         return FALSE;
        !            80:     }
        !            81: 
        !            82:     while (TRUE) {
        !            83: try_again:
        !            84:         rc = ReadEventLog(hEventLog,
        !            85:                         EVENTLOG_FORWARDS_READ | EVENTLOG_SEQUENTIAL_READ,
        !            86:                         0,
        !            87:                         (EVENTLOGRECORD *) szEvBuf,
        !            88:                         dwBufSize,
        !            89:                         &dwRead,
        !            90:                         &dwNeeded);
        !            91: 
        !            92:         if (!rc) {
        !            93:             ec = GetLastError();
        !            94:             if (ec != ERROR_INSUFFICIENT_BUFFER) {
        !            95:                 goto exit;
        !            96:             }
        !            97: 
        !            98:             free( szEvBuf );
        !            99: 
        !           100:             dwBufSize = dwNeeded + 1024;
        !           101:             szEvBuf = (char *) malloc( dwBufSize );
        !           102:             if (szEvBuf == NULL) {
        !           103:                 return FALSE;
        !           104:             }
        !           105: 
        !           106:             goto try_again;
        !           107:         }
        !           108: 
        !           109:         if (dwRead == 0) {
        !           110:             break;
        !           111:         }
        !           112: 
        !           113:         GetAppName( szAppName, sizeof(szAppName) );
        !           114:         p = szEvBuf;
        !           115: 
        !           116:         do {
        !           117: 
        !           118:             pevlr = (EVENTLOGRECORD *) p;
        !           119: 
        !           120:             p += pevlr->StringOffset;
        !           121: 
        !           122:             p = GetString( crashInfo->crash.szAppName,           p );
        !           123:             p = GetWORD  ( &crashInfo->crash.time.wMonth,        p );
        !           124:             p = GetWORD  ( &crashInfo->crash.time.wDay,          p );
        !           125:             p = GetWORD  ( &crashInfo->crash.time.wYear,         p );
        !           126:             p = GetWORD  ( &crashInfo->crash.time.wHour,         p );
        !           127:             p = GetWORD  ( &crashInfo->crash.time.wMinute,       p );
        !           128:             p = GetWORD  ( &crashInfo->crash.time.wSecond,       p );
        !           129:             p = GetWORD  ( &crashInfo->crash.time.wMilliseconds, p );
        !           130:             p = GetDWORD ( &crashInfo->crash.dwExceptionCode,    p );
        !           131:             p = GetDWORD ( &crashInfo->crash.dwAddress,          p );
        !           132:             p = GetString( crashInfo->crash.szFunction,          p );
        !           133: 
        !           134:             p = (char *) ((DWORD)pevlr + sizeof(EVENTLOGRECORD));
        !           135: 
        !           136:             if (strcmp( p, szAppName) == 0) {
        !           137:                 crashInfo->dwCrashDataSize = pevlr->DataLength;
        !           138:                 crashInfo->pCrashData = (char *) ((DWORD)pevlr + pevlr->DataOffset);
        !           139: 
        !           140:                 if (!lpEnumFunc( crashInfo )) {
        !           141:                     goto exit;
        !           142:                 }
        !           143:             }
        !           144: 
        !           145:             //
        !           146:             // update the pointer & read count
        !           147:             //
        !           148:             dwRead -= pevlr->Length;
        !           149:             p = (char *) ((DWORD)pevlr + pevlr->Length);
        !           150: 
        !           151:         } while ( dwRead > 0 );
        !           152:     }
        !           153: 
        !           154: exit:
        !           155:     free( szEvBuf );
        !           156:     CloseEventLog( hEventLog );
        !           157:     return TRUE;
        !           158: }
        !           159: 
        !           160: BOOL
        !           161: ElSaveCrash( PCRASHES crash, DWORD dwMaxCrashes )
        !           162: {
        !           163:     char    szStrings[4096];
        !           164:     LPSTR   p = szStrings;
        !           165:     HANDLE  hEventSrc;
        !           166:     LPSTR   pp[20];
        !           167:     char    *pLogFileData;
        !           168:     DWORD   dwLogFileDataSize;
        !           169:     char    szAppName[MAX_PATH];
        !           170: 
        !           171: 
        !           172:     if (dwMaxCrashes > 0) {
        !           173:         if (RegGetNumCrashes() >= dwMaxCrashes) {
        !           174:             return FALSE;
        !           175:         }
        !           176:     }
        !           177: 
        !           178:     RegSetNumCrashes( RegGetNumCrashes()+1 );
        !           179: 
        !           180:     p = AddString( pp[0]  = p,         crash->szAppName           );
        !           181:     p = AddNumber( pp[1]  = p, "%2d",  crash->time.wMonth         );
        !           182:     p = AddNumber( pp[2]  = p, "%2d",  crash->time.wDay           );
        !           183:     p = AddNumber( pp[3]  = p, "%4d",  crash->time.wYear          );
        !           184:     p = AddNumber( pp[4]  = p, "%2d",  crash->time.wHour          );
        !           185:     p = AddNumber( pp[5]  = p, "%2d",  crash->time.wMinute        );
        !           186:     p = AddNumber( pp[6]  = p, "%2d",  crash->time.wSecond        );
        !           187:     p = AddNumber( pp[7]  = p, "%3d",  crash->time.wMilliseconds  );
        !           188:     p = AddNumber( pp[8]  = p, "%08x", crash->dwExceptionCode     );
        !           189:     p = AddNumber( pp[9]  = p, "%08x", crash->dwAddress           );
        !           190:     p = AddString( pp[10] = p,         crash->szFunction          );
        !           191: 
        !           192:     GetAppName( szAppName, sizeof(szAppName) );
        !           193: 
        !           194:     hEventSrc = RegisterEventSource( NULL, szAppName );
        !           195: 
        !           196:     if (hEventSrc == NULL) {
        !           197:         return FALSE;
        !           198:     }
        !           199: 
        !           200:     pLogFileData = GetLogFileData( &dwLogFileDataSize );
        !           201: 
        !           202:     ReportEvent( hEventSrc,
        !           203:                  EVENTLOG_INFORMATION_TYPE,
        !           204:                  0,
        !           205:                  MSG_CRASH,
        !           206:                  NULL,
        !           207:                  11,
        !           208:                  dwLogFileDataSize,
        !           209:                  pp,
        !           210:                  pLogFileData
        !           211:                );
        !           212: 
        !           213:     DeregisterEventSource( hEventSrc );
        !           214: 
        !           215:     free( pLogFileData );
        !           216: 
        !           217:     return TRUE;
        !           218: }
        !           219: 
        !           220: char *
        !           221: AddString( char *p, char *s )
        !           222: {
        !           223:     strcpy( p, s );
        !           224:     p += (strlen(s) + 1);
        !           225:     return p;
        !           226: }
        !           227: 
        !           228: char *
        !           229: AddNumber( char *p, char *f, DWORD dwNumber )
        !           230: {
        !           231:     char buf[20];
        !           232:     wsprintf( buf, f, dwNumber );
        !           233:     return AddString( p, buf );
        !           234: }
        !           235: 
        !           236: char *
        !           237: GetString( char *s, char *p )
        !           238: {
        !           239:     strcpy( s, p );
        !           240:     return p + strlen(p) + 1;
        !           241: }
        !           242: 
        !           243: char *
        !           244: GetDWORD( PDWORD pdwData, char *p )
        !           245: {
        !           246:     sscanf( p, "%x", pdwData );
        !           247:     return p + strlen(p) + 1;
        !           248: }
        !           249: 
        !           250: char *
        !           251: GetWORD( PWORD pwData, char *p )
        !           252: {
        !           253:     *pwData = atoi( p );
        !           254:     return p + strlen(p) + 1;
        !           255: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.