www.pudn.com > win2ksrc.rar > logalert.c, change:2000-07-26,size:4615b


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