Windows2000/private/eventlog/misc/logalert.c

131 lines
3.9 KiB
C

/*++
Copyright (c) 1995 Microsoft Corporation
Module Name:
LOGALERT.C
Abstract:
This file contains the routine to log a Cairo alert in the system log.
Author:
Ravi Rudrappa (ravir) 18-Jan-1995
Revision History:
18-Jan-1995 RaviR
Created
--*/
#ifdef _CAIRO_
#include <elfclntp.h>
NTSTATUS ElfLogCairoAlertInSystemLog(
IN HANDLE hLogHandle,
IN LARGE_INTEGER liEventTime,
IN USHORT usEventType,
IN USHORT usEventCategory,
IN ULONG ulEventID,
IN USHORT usNumStrings,
IN ULONG ulDataSize,
IN WCHAR* pwszComputerName,
IN WCHAR** ppwszStrings,
IN PBYTE pbData
)
/*++
Routine Description:
This routine logs the given Cairo Alert in the given log, through the ElfrReportEventW function.
Return Value:
Returns an NTSTATUS code.
--*/
{
NTSTATUS s = STATUS_SUCCESS;
ULONG ulEventTime;
PRPC_SID psidUser = NULL;
USHORT usFlags;
PUNICODE_STRING pusComputerName = NULL;
PUNICODE_STRING* ppusStrings = NULL;
ULONG i;
ULONG ulNumofAllocatedStrings = 0;
LPBYTE pbString = NULL;
// parameter validation
if ((hLogHandle == NULL) || (pwszComputerName == NULL) || ((usNumStrings > 0) && (ppwszStrings == NULL)) || ((ulDataSize > 0) && (pbData == NULL))) {
return STATUS_INVALID_PARAMETER;
}
// user Sid
psidUser = NULL; // BUGBUG: is this ok?
// Map creation time
RtlTimeToSecondsSince1970(&liEventTime, &ulEventTime);
// Convert the array of Alert description insert strings to an array of UNICODE_STRINGs.
if (usNumStrings > 0) {
LPBYTE pbPtr;
// allocate memory in one shot.
pbPtr = pbString = MIDL_user_allocate(sizeof(PUNICODE_STRING) * usNumStrings + sizeof(UNICODE_STRING) * usNumStrings);
if (pbString == NULL) {
s = STATUS_NO_MEMORY;
goto LCleanUp;
}
ppusStrings = (PUNICODE_STRING*)pbPtr;
pbPtr += sizeof(PUNICODE_STRING) * usNumStrings;
// For each string passed in, allocate a UNICODE_STRING structure and set it to the matching string.
for (i = 0; i < usNumStrings; i++) {
ppusStrings[i] = (PUNICODE_STRING)pbPtr;
pbPtr += sizeof(UNICODE_STRING);
RtlInitUnicodeString(ppusStrings[i], ppwszStrings[i]);
}
}
// Map the ComputerName to UNICODE_STRING.
pusComputerName = MIDL_user_allocate(sizeof(UNICODE_STRING));
if (pusComputerName == NULL) {
s = STATUS_NO_MEMORY;
goto LCleanUp;
}
RtlInitUnicodeString(pusComputerName, pwszComputerName);
// Do the RPC call with an exception handler since RPC will raise an exception if anything fails.
// It is up to us to figure out what to do once the exception is raised.
RpcTryExcept{
// Call service
s = ElfrReportEventW(
(IELF_HANDLE)hLogHandle,
ulEventTime,
usEventType,
usEventCategory,
ulEventID,
usNumStrings,
ulDataSize,
(PRPC_UNICODE_STRING)pusComputerName,
psidUser,
(PRPC_UNICODE_STRING*)ppusStrings,
pbData,
0, // Flags,
NULL, // RecordNumber,
NULL); // TimeWritten
}
RpcExcept(1) {
s = I_RpcMapWin32Status(RpcExceptionCode());
}
RpcEndExcept
LCleanUp :
// Free the space allocated for the inserts and then free the space for ComputerName.
if (pbString) {
MIDL_user_free(pbString);
}
if (pusComputerName) {
MIDL_user_free(pusComputerName);
}
return (s);
}
#endif // _CAIRO_