Leaked source code of windows server 2003
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.

338 lines
8.6 KiB

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