Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

311 lines
7.3 KiB

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