summaryrefslogtreecommitdiffstats
path: root/private/eventlog/misc/logalert.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/eventlog/misc/logalert.c')
-rw-r--r--private/eventlog/misc/logalert.c204
1 files changed, 204 insertions, 0 deletions
diff --git a/private/eventlog/misc/logalert.c b/private/eventlog/misc/logalert.c
new file mode 100644
index 000000000..2b5e5f760
--- /dev/null
+++ b/private/eventlog/misc/logalert.c
@@ -0,0 +1,204 @@
+/*++
+
+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.
+
+Arguments:
+
+
+Return Value:
+
+ Returns an NTSTATUS code.
+
+Note:
+
+
+--*/
+{
+ 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_