/*++ 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 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_