1 ////////////////////////////////////////////////////////////////////
4 // E V E N T L O G G I N G F U N C T I O N S
7 ////////////////////////////////////////////////////////////////////
14 #include <WINNT/afsreg.h>
16 #include "afsd_eventlog.h"
18 static BOOL GetServicePath(LPTSTR lpPathBuf, PDWORD pdwPathBufSize);
19 static BOOL AddEventSource(void);
22 GetServicePath(LPTSTR lpPathBuf, PDWORD pdwPathBufSize)
30 if ( RegOpenKeyEx( HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_SUBKEY, 0, KEY_QUERY_VALUE, &hKey ) )
36 // prepare user's buffer and read into it
37 dwData = *pdwPathBufSize;
38 memset(lpPathBuf, '\0', dwData);
39 if ( RegQueryValueEx( hKey, // handle to key
40 "ImagePath", // value name
43 (LPBYTE) lpPathBuf, // data buffer
44 &dwData)) // size of data buffer
50 *pdwPathBufSize = dwData;
61 // Ensure name for message file is in proper location in Registry.
66 HKEY hKey = NULL, hLogKey;
67 UCHAR szBuf[MAX_PATH];
68 DWORD dwData, dwDisposition;
72 if ( RegOpenKeyEx( HKEY_LOCAL_MACHINE, AFSREG_APPLOG_SUBKEY, 0,
73 KEY_QUERY_VALUE, &hLogKey ) )
76 if ( RegCreateKeyEx(HKEY_LOCAL_MACHINE, AFSREG_APPLOG_SUBKEY, 0,
77 NULL, REG_OPTION_NON_VOLATILE,
78 KEY_ALL_ACCESS, NULL, &hLogKey,
86 // Let's see if key already exists as a subkey under the
87 // Application key in the EventLog registry key. If not,
89 if ( RegOpenKeyEx( hLogKey, AFSREG_CLT_APPLOG_SUBKEY, 0,
90 KEY_QUERY_VALUE, &hKey ) )
93 if ( RegCreateKeyEx(hLogKey, AFSREG_CLT_APPLOG_SUBKEY, 0,
94 NULL, REG_OPTION_NON_VOLATILE,
95 KEY_ALL_ACCESS, NULL, &hKey,
103 // Set the name of the message file
104 // Get "ImagePath" from TransarcAFSDaemon service
105 memset(szBuf, '\0', MAX_PATH);
107 GetServicePath(szBuf, &dwData);
109 // Windows takes the specified name and searchs the PATH environment variable
110 // It never appears to even try the fully qualified name.
111 strcpy(szBuf, "afsd_service.exe");
113 // Add the name to the EventMessageFile subkey.
114 if ( RegSetValueEx( hKey, // subkey handle
115 AFSREG_APPLOG_MSGFILE_VALUE, // value name
117 REG_SZ, // value type
118 (LPBYTE) szBuf, // pointer to value data
119 (DWORD)strlen(szBuf) + 1)) // length of value data
125 // Set the supported event types in the TypesSupported subkey.
126 dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE |
127 EVENTLOG_INFORMATION_TYPE;
129 if ( RegSetValueEx( hKey, // subkey handle
130 AFSREG_APPLOG_MSGTYPE_VALUE, // value name
132 REG_DWORD, // value type
133 (LPBYTE) &dwData, // pointer to value data
134 sizeof(DWORD))) // length of value data
142 // key was opened - read it
143 memset(szBuf, '\0', MAX_PATH);
145 if ( RegQueryValueEx( hKey, // handle to key
146 AFSREG_APPLOG_MSGFILE_VALUE, // value name
149 (LPBYTE) szBuf, // data buffer
150 &dwData)) // size of data buffer
162 RegCloseKey(hLogKey);
167 // Log an event with a formatted system message as the (only) substitution
168 // string, from the given message ID.
170 LogEventMessage(WORD wEventType, DWORD dwEventID, DWORD dwMessageID)
174 FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
175 NULL, dwMessageID, 0, (LPTSTR)&msgBuf, 0, NULL);
176 LogEvent(wEventType, dwEventID, msgBuf, NULL);
181 // Use the ReportEvent API to write an entry to the system event log.
186 LogEvent(WORD wEventType, DWORD dwEventID, ...)
190 LPTSTR lpArgs[MAXARGS];
191 CHAR lpStrings[MAXARGS][STRLEN];
193 WORD wNumStrings = 0;
196 // Ensure that our event source is properly initialized.
197 if (!AddEventSource())
200 // Get a handle to the event log.
201 hEventSource = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME);
202 if (hEventSource == NULL)
205 // Construct the array of substitution strings.
206 va_start(listArgs, dwEventID);
208 switch ( dwEventID ) {
209 case MSG_FLUSH_NO_SHARE_NAME:
210 case MSG_FLUSH_NO_MEMORY:
211 case MSG_FLUSH_IMPERSONATE_ERROR:
212 case MSG_FLUSH_UNEXPECTED_EVENT:
213 case MSG_UNHANDLED_EXCEPTION:
214 case MSG_SMB_ZERO_TRANSACTION_COUNT:
215 case MSG_SERVICE_START_PENDING:
216 case MSG_SERVICE_INCORRECT_VERSIONS:
217 case MSG_SERVICE_RUNNING:
218 case MSG_SERVICE_STOPPING:
219 case MSG_SERVICE_ERROR_STOP:
223 case MSG_FLUSH_BAD_SHARE_NAME:
224 case MSG_FLUSH_OPEN_ENUM_ERROR:
225 case MSG_FLUSH_ENUM_ERROR:
226 case MSG_FLUSH_FAILED:
227 case MSG_RX_HARD_DEAD_TIME_EXCEEDED:
228 case MSG_SERVICE_ERROR_STOP_WITH_MSG:
229 case MSG_SMB_SEND_PACKET_FAILURE:
230 case MSG_UNEXPECTED_SMB_SESSION_CLOSE:
232 lpArgs[0] = va_arg(listArgs, LPTSTR);
234 case MSG_TIME_FLUSH_PER_VOLUME:
235 case MSG_TIME_FLUSH_TOTAL:
237 lpArgs[0] = va_arg(listArgs, LPTSTR);
238 lpArgs[1] = va_arg(listArgs, LPTSTR);
240 case MSG_SERVER_REPORTS_VNOVOL:
241 case MSG_SERVER_REPORTS_VMOVED:
242 case MSG_SERVER_REPORTS_VOFFLINE:
243 case MSG_SERVER_REPORTS_VSALVAGE:
244 case MSG_SERVER_REPORTS_VNOSERVICE:
245 case MSG_SERVER_REPORTS_VIO:
247 lpArgs[0] = va_arg(listArgs, LPTSTR);
248 StringCbPrintf(lpStrings[1],STRLEN,"%d",va_arg(listArgs,afs_int32));
249 lpArgs[1] = lpStrings[1];
251 case MSG_BAD_SMB_PARAM:
253 lpArgs[0] = va_arg(listArgs, LPTSTR);
254 StringCbPrintf(lpStrings[1],STRLEN,"%d",va_arg(listArgs,int));
255 StringCbPrintf(lpStrings[2],STRLEN,"%d",va_arg(listArgs,int));
256 StringCbPrintf(lpStrings[3],STRLEN,"%d",va_arg(listArgs,int));
257 StringCbPrintf(lpStrings[4],STRLEN,"%d",va_arg(listArgs,WORD));
258 lpArgs[1] = lpStrings[1];
259 lpArgs[2] = lpStrings[2];
260 lpArgs[3] = lpStrings[3];
261 lpArgs[4] = lpStrings[4];
263 case MSG_BAD_SMB_PARAM_WITH_OFFSET:
265 lpArgs[0] = va_arg(listArgs, LPTSTR);
266 StringCbPrintf(lpStrings[1],STRLEN,"%d",va_arg(listArgs,int));
267 StringCbPrintf(lpStrings[2],STRLEN,"%d",va_arg(listArgs,int));
268 StringCbPrintf(lpStrings[3],STRLEN,"%d",va_arg(listArgs,int));
269 StringCbPrintf(lpStrings[4],STRLEN,"%d",va_arg(listArgs,int));
270 StringCbPrintf(lpStrings[5],STRLEN,"%d",va_arg(listArgs,WORD));
271 lpArgs[1] = lpStrings[1];
272 lpArgs[2] = lpStrings[2];
273 lpArgs[3] = lpStrings[3];
274 lpArgs[4] = lpStrings[4];
275 lpArgs[5] = lpStrings[5];
277 case MSG_BAD_SMB_TOO_SHORT:
278 case MSG_BAD_SMB_INVALID:
279 case MSG_BAD_SMB_INCOMPLETE:
281 StringCbPrintf(lpStrings[0],STRLEN,"%d",va_arg(listArgs,WORD));
282 lpArgs[0] = lpStrings[0];
284 case MSG_SMB_SESSION_START:
286 StringCbPrintf(lpStrings[0],STRLEN,"%d",va_arg(listArgs,long));
287 lpArgs[0] = lpStrings[0];
289 case MSG_BAD_SMB_WRONG_SESSION:
291 StringCbPrintf(lpStrings[0],STRLEN,"%d",va_arg(listArgs,DWORD));
292 StringCbPrintf(lpStrings[1],STRLEN,"%d",va_arg(listArgs,WORD));
293 lpArgs[0] = lpStrings[0];
294 lpArgs[1] = lpStrings[1];
298 StringCbPrintf(lpStrings[0],STRLEN,"%d",va_arg(listArgs,UCHAR));
299 StringCbPrintf(lpStrings[1],STRLEN,"%d",va_arg(listArgs,UCHAR));
300 StringCbPrintf(lpStrings[2],STRLEN,"%d",va_arg(listArgs,UCHAR));
301 StringCbPrintf(lpStrings[3],STRLEN,"%d",va_arg(listArgs,UCHAR));
302 lpArgs[0] = lpStrings[0];
303 lpArgs[1] = lpStrings[1];
304 lpArgs[2] = lpStrings[2];
305 lpArgs[3] = lpStrings[3];
307 case MSG_SERVICE_ERROR_STOP_WITH_MSG_AND_LOCATION:
309 lpArgs[0] = va_arg(listArgs, LPTSTR);
310 StringCbPrintf(lpStrings[1],STRLEN,"%d",va_arg(listArgs,int));
311 lpArgs[1] = lpStrings[1];
312 lpArgs[2] = va_arg(listArgs,LPTSTR);
317 // Make sure we were not given too many args.
318 if (wNumArgs >= MAXARGS)
322 code = ReportEvent(hEventSource, // handle of event source
323 wEventType, // event type
325 dwEventID, // event ID
326 NULL, // current user's SID
327 wNumArgs, // strings in lpszArgs
328 0, // no bytes of raw data
329 wNumArgs ? lpArgs : NULL, // array of error strings
330 NULL); // no raw data
333 DeregisterEventSource(hEventSource);