windows-nt/Source/XPSP1/NT/net/wins/server/msc/winsevt.c

350 lines
7.2 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
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;
}