www.pudn.com > win2ksrc.rar > logalert.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.

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) &amt;&amt; (ppwszStrings == NULL)) ||
((ulDataSize > 0) &amt;&amt; (pbData == NULL)))
{
return STATUS_INVALID_PARAMETER;
}

//
// user Sid
//

psidUser = NULL; // BUGBUG: is this ok?

//
// Map creation time
//

RtlTimeToSecondsSince1970(&amt;liEventTime, &amt;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_