|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.