350 lines
7.2 KiB
C
350 lines
7.2 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1990 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module provides error logging routines needed for the entire
|
|||
|
WINS. See header file winsevt.h for the
|
|||
|
macros which use the functions in this module.
|
|||
|
|
|||
|
Functions:
|
|||
|
|
|||
|
|
|||
|
Portability:
|
|||
|
|
|||
|
The current implementation of the module is not portable.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Pradeep Bahl (PradeepB) Dec-1992
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
Modification date Person Description of modification
|
|||
|
----------------- ------- ----------------------------
|
|||
|
--*/
|
|||
|
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
#include <stdarg.h>
|
|||
|
#include <time.h>
|
|||
|
#include "wins.h"
|
|||
|
#ifdef DBGSVC
|
|||
|
#include "nms.h"
|
|||
|
#endif
|
|||
|
#include "winsevt.h"
|
|||
|
#include "winscnf.h"
|
|||
|
#include "winsmsc.h"
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* Local Macro Declarations
|
|||
|
*/
|
|||
|
#if 0
|
|||
|
|
|||
|
/*
|
|||
|
* get_month_m:
|
|||
|
*
|
|||
|
* This macro converts a numerical month (0-11) to a month string
|
|||
|
* abbreviation.
|
|||
|
*
|
|||
|
* NOTE: This macro must *NOT* be called with an expression as an argument.
|
|||
|
* If this is done, then you will get the expression
|
|||
|
* evaluated 11 times
|
|||
|
* (probably not desired).
|
|||
|
*/
|
|||
|
|
|||
|
#define get_month_m(month_int) \
|
|||
|
(((month_int) == 0) ? "JAN" : \
|
|||
|
((month_int) == 1) ? "FEB" : \
|
|||
|
((month_int) == 2) ? "MAR" : \
|
|||
|
((month_int) == 3) ? "APR" : \
|
|||
|
((month_int) == 4) ? "MAY" : \
|
|||
|
((month_int) == 5) ? "JUN" : \
|
|||
|
((month_int) == 6) ? "JUL" : \
|
|||
|
((month_int) == 7) ? "AUG" : \
|
|||
|
((month_int) == 8) ? "SEP" : \
|
|||
|
((month_int) == 9) ? "OCT" : \
|
|||
|
((month_int) == 10) ? "NOV" : "DEC" \
|
|||
|
)
|
|||
|
#endif
|
|||
|
|
|||
|
/*
|
|||
|
* Local Typedef Declarations
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* Global Variable Definitions
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* Local Variable Definitions
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* Local Function Prototype Declarations
|
|||
|
*/
|
|||
|
|
|||
|
/* prototypes for functions local to this module go here */
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* Function Name:
|
|||
|
* extern WinsEvtLogEvt
|
|||
|
*
|
|||
|
* Function Description:
|
|||
|
* This is funtion that logs all errors from the WINS process. It should
|
|||
|
* only be "called" using the WINSEVT_ macros, except within
|
|||
|
* this module.
|
|||
|
*
|
|||
|
* Arguments:
|
|||
|
* IN StatusCode - integer containing the status code of the
|
|||
|
* error to be printed.
|
|||
|
*
|
|||
|
* Return value:
|
|||
|
* None.
|
|||
|
*
|
|||
|
* Error Handling:
|
|||
|
* None.
|
|||
|
*
|
|||
|
* Extern Variables used:
|
|||
|
* None.
|
|||
|
*
|
|||
|
* Side Effects:
|
|||
|
* None.
|
|||
|
*
|
|||
|
* Comments:
|
|||
|
* Make sure that printf is thread-renetrant.
|
|||
|
*
|
|||
|
*/
|
|||
|
VOID
|
|||
|
WinsEvtLogEvt
|
|||
|
(
|
|||
|
LONG BinaryData,
|
|||
|
WORD EvtTyp,
|
|||
|
DWORD EvtId,
|
|||
|
LPTSTR pFileStr,
|
|||
|
DWORD LineNumber,
|
|||
|
PWINSEVT_STRS_T pStr
|
|||
|
)
|
|||
|
{
|
|||
|
BOOL fRet = TRUE;
|
|||
|
DWORD Error;
|
|||
|
DWORD NoOfBytes;
|
|||
|
WORD BinData[4];
|
|||
|
|
|||
|
BinData[0] = (WORD)(LineNumber & 0xFFFF);
|
|||
|
BinData[1] = (WORD)(LineNumber >> 16);
|
|||
|
BinData[2] = (WORD)(BinaryData & 0xFFFF); //lower word first
|
|||
|
BinData[3] = (WORD)(BinaryData >> 16); //then higher word
|
|||
|
|
|||
|
try {
|
|||
|
|
|||
|
NoOfBytes = sizeof(BinData);
|
|||
|
|
|||
|
|
|||
|
fRet = ReportEvent(
|
|||
|
WinsCnf.LogHdl,
|
|||
|
(WORD)EvtTyp,
|
|||
|
(WORD)0, //category zero
|
|||
|
EvtId,
|
|||
|
NULL, //no user SID
|
|||
|
(WORD)(pStr != NULL ? pStr->NoOfStrs : 0),//no of strings
|
|||
|
NoOfBytes, //no of bytes in binary data
|
|||
|
pStr != NULL ? (LPCTSTR *)(pStr->pStr) : (LPCTSTR *)NULL,//address of string arr
|
|||
|
BinData //address of data
|
|||
|
);
|
|||
|
if (!fRet)
|
|||
|
{
|
|||
|
Error = GetLastError();
|
|||
|
DBGPRINT1(
|
|||
|
ERR,
|
|||
|
"WinsEvtLogEvt: ReportEvent returned error = (%d)",
|
|||
|
Error
|
|||
|
);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
except(EXCEPTION_EXECUTE_HANDLER) {
|
|||
|
|
|||
|
DBGPRINT1(EXC, "WinsEvtLogEvt: Report Event generated the exception (%x). Check if you have the right access. You should have power user access on this machine\n", GetExceptionCode());
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
WinsEvtLogDetEvt(
|
|||
|
BOOL fInfo,
|
|||
|
DWORD EvtId,
|
|||
|
LPTSTR pFileName,
|
|||
|
DWORD LineNumber,
|
|||
|
LPSTR pFormat,
|
|||
|
...
|
|||
|
)
|
|||
|
|
|||
|
{
|
|||
|
LPBYTE pFmt = pFormat;
|
|||
|
DWORD NoOfStr = 0;
|
|||
|
DWORD NoOfW = 0;
|
|||
|
DWORD Data[30];
|
|||
|
LPWSTR ppwStr[10];
|
|||
|
WCHAR wStr[10][80];
|
|||
|
BOOL fRet = TRUE;
|
|||
|
DWORD Error;
|
|||
|
DWORD ArrIndex = 0;
|
|||
|
|
|||
|
va_list ap;
|
|||
|
|
|||
|
if (!WinsCnf.LogDetailedEvts)
|
|||
|
return;
|
|||
|
|
|||
|
DBGENTER("WinsEvtLogDetEvt\n");
|
|||
|
|
|||
|
try {
|
|||
|
|
|||
|
va_start(ap, pFormat);
|
|||
|
Data[NoOfW++] = LineNumber;
|
|||
|
if (pFileName != (LPTSTR)NULL)
|
|||
|
{
|
|||
|
ppwStr[NoOfStr++] = pFileName;
|
|||
|
}
|
|||
|
for (; *pFmt; pFmt++)
|
|||
|
{
|
|||
|
switch(*pFmt)
|
|||
|
{
|
|||
|
case('d'):
|
|||
|
Data[NoOfW++] = (DWORD)va_arg(ap, long);
|
|||
|
break;
|
|||
|
|
|||
|
case('s'):
|
|||
|
WinsMscConvertAsciiStringToUnicode(
|
|||
|
va_arg(ap, char *),
|
|||
|
(LPBYTE)wStr[ArrIndex], 80);
|
|||
|
ppwStr[NoOfStr++] = wStr[ArrIndex++];
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case('u'):
|
|||
|
ppwStr[NoOfStr++] = va_arg(ap, short *);
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
ppwStr[NoOfStr] = (LPWSTR)NULL;
|
|||
|
fRet = ReportEvent(
|
|||
|
WinsCnf.LogHdl,
|
|||
|
(WORD)(fInfo ? EVENTLOG_INFORMATION_TYPE : EVENTLOG_ERROR_TYPE),
|
|||
|
(WORD)0, //category zero
|
|||
|
EvtId,
|
|||
|
NULL, //no user SID
|
|||
|
(WORD)NoOfStr, //no of strings
|
|||
|
NoOfW * sizeof(DWORD), //no of bytes in binary data
|
|||
|
NoOfStr != 0 ? (LPCTSTR *)ppwStr : (LPCTSTR *)NULL,//address of string arr
|
|||
|
Data //address of data
|
|||
|
);
|
|||
|
if (!fRet)
|
|||
|
{
|
|||
|
Error = GetLastError();
|
|||
|
DBGPRINT1(
|
|||
|
ERR,
|
|||
|
"WinsEvtLogDetEvt: ReportEvent returned error = (%d)",
|
|||
|
Error
|
|||
|
);
|
|||
|
|
|||
|
}
|
|||
|
va_end(ap);
|
|||
|
} // end of try
|
|||
|
except(EXCEPTION_EXECUTE_HANDLER) {
|
|||
|
|
|||
|
DBGPRINT1(EXC, "WinsLogDetEvt: Report Event generated the exception (%x). Check if you have the right access. You should have power user access on this machine\n", GetExceptionCode());
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
DBGLEAVE("WinsEvtLogDetEvt\n");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
WinsLogAdminEvent(
|
|||
|
IN DWORD EventId,
|
|||
|
IN DWORD StrArgs,
|
|||
|
IN ...
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine is called to log admin triggerd events.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
EventId - The id of the event to be logged.
|
|||
|
|
|||
|
StrArgs - No of additional args.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None
|
|||
|
|
|||
|
Comments:
|
|||
|
This routine must be called fromt he RPC API processing code only.
|
|||
|
None
|
|||
|
--*/
|
|||
|
{
|
|||
|
RPC_STATUS RpcStatus;
|
|||
|
TCHAR UserNameBuf[MAX_PATH+1];
|
|||
|
DWORD Size;
|
|||
|
WINSEVT_STRS_T EvtStr;
|
|||
|
va_list ap;
|
|||
|
DWORD i;
|
|||
|
|
|||
|
// first impersonate the client.
|
|||
|
RpcStatus = RpcImpersonateClient( NULL );
|
|||
|
if (RPC_S_OK != RpcStatus) {
|
|||
|
DBGPRINT1(ERR, "WinsLogAdminEvent: Could not impersonate client (Error = %ld)\n", RpcStatus);
|
|||
|
return;
|
|||
|
}
|
|||
|
if (!GetUserName(UserNameBuf,&Size)) {
|
|||
|
DBGPRINT1(ERR, "WinsLogAdminEvent: Could not get user name (Error = %ld)\n", GetLastError());
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
EvtStr.NoOfStrs = 1;
|
|||
|
EvtStr.pStr[0] = UserNameBuf;
|
|||
|
ASSERT( StrArgs < MAX_NO_STRINGS );
|
|||
|
|
|||
|
va_start(ap,StrArgs);
|
|||
|
for(i=1;i<= StrArgs && i<= MAX_NO_STRINGS; i++) {
|
|||
|
EvtStr.pStr[i] = va_arg(ap, LPTSTR);
|
|||
|
EvtStr.NoOfStrs++;
|
|||
|
}
|
|||
|
va_end(ap);
|
|||
|
|
|||
|
WINSEVT_LOG_INFO_STR_M(EventId, &EvtStr);
|
|||
|
|
|||
|
Cleanup:
|
|||
|
RpcStatus = RpcRevertToSelf();
|
|||
|
if (RPC_S_OK != RpcStatus) {
|
|||
|
ASSERT( FALSE );
|
|||
|
}
|
|||
|
return;
|
|||
|
}
|
|||
|
|