|
|
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.