131 lines
3.9 KiB
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_
|