/*++ Copyright (c) 1989-2000 Microsoft Corporation Module Name: Log.cpp Abstract: This module implements the code for manipulating the log file. Author: clupu created 02/08/2001 Revision History: --*/ #include "stdafx.h" #include "Log.h" #include #include BOOL g_bFileLogEnabled; TCHAR g_szFileLog[MAX_PATH]; BOOL InitFileLogSupport( LPCTSTR lpszLogFileName ) { HANDLE hFile = INVALID_HANDLE_VALUE; HANDLE hMap = NULL; PBYTE pMap; PISSUEREC pRecord; g_bFileLogEnabled = FALSE; // // The file log will be located on %windir% // GetSystemWindowsDirectory(g_szFileLog, MAX_PATH); lstrcat(g_szFileLog, _T("\\AppPatch\\")); lstrcat(g_szFileLog, lpszLogFileName); // // Try open the file. Create it if it doesn't exist. // hFile = CreateFile(g_szFileLog, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if ( hFile == INVALID_HANDLE_VALUE ) { LogMessage(LOG_ERROR, _T("[InitFileLogSupport] Cannot create log file.")); return FALSE; } hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, LOGFILESIZE, NULL); if ( hMap == NULL ) { LogMessage(LOG_ERROR, _T("[LogAVStatus] CreateFileMapping failed. Status 0x%x"), GetLastError()); goto CleanupAndFail; } pMap = (PBYTE)MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, LOGFILESIZE); if ( pMap == NULL ) { LogMessage(LOG_ERROR, _T("[LogAVStatus] MapViewOfFile failed.")); goto CleanupAndFail; } ZeroMemory(pMap, LOGFILESIZE); // // Write the log header. // LOGFILEHEADER LogHeader; char szTemp[64]; DWORD cbSize; ZeroMemory(&LogHeader, sizeof(LOGFILEHEADER)); lstrcpyA(LogHeader.szMagic, LOG_FILE_MAGIC); LogHeader.dwRecords = MAX_ISSUES_COUNT; LogHeader.OSVersion.dwOSVersionInfoSize = sizeof(LogHeader.OSVersion); GetVersionExA((OSVERSIONINFOA*)&LogHeader.OSVersion); GetLocalTime(&LogHeader.time); cbSize = 64; GetUserNameA(szTemp, &cbSize); CopyMemory(LogHeader.szUserName, szTemp, 63); LogHeader.szUserName[63] = 0; cbSize = 64; GetComputerNameA(szTemp, &cbSize); CopyMemory(LogHeader.szMachineName, szTemp, 63); LogHeader.szUserName[63] = 0; // // Log the app start event. // pRecord = (ISSUEREC*)(pMap + sizeof(LOGFILEHEADER)); pRecord += EVENTIND(AVS_APP_STARTED); (pRecord->dwOccurenceCount)++; FlushViewOfFile(pMap, 0); // // Set the global that tells file logging is enabled. // g_bFileLogEnabled = TRUE; CleanupAndFail: if ( pMap != NULL ) { UnmapViewOfFile(pMap); } if ( hMap != NULL ) { CloseHandle(hMap); } if ( hFile != INVALID_HANDLE_VALUE ) { CloseHandle(hFile); } return g_bFileLogEnabled; } BOOL LogAVStatus( DWORD dwStatus ) { HANDLE hFile = INVALID_HANDLE_VALUE; HANDLE hMap = NULL; PBYTE pMap = NULL; BOOL bReturn = FALSE; PISSUEREC pRecord; if ( !g_bFileLogEnabled ) { return FALSE; } hFile = CreateFile(g_szFileLog, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL); if ( hFile == INVALID_HANDLE_VALUE ) { LogMessage(LOG_ERROR, _T("[LogAVStatus] Cannot open the log file.")); goto CleanupAndFail; } hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, LOGFILESIZE, NULL); if ( hMap == NULL ) { LogMessage(LOG_ERROR, _T("[LogAVStatus] CreateFileMapping failed.")); goto CleanupAndFail; } pMap = (PBYTE)MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, LOGFILESIZE); if ( pMap == NULL ) { LogMessage(LOG_ERROR, _T("[LogAVStatus] MapViewOfFile failed.")); goto CleanupAndFail; } pRecord = (PISSUEREC)(pMap + sizeof(LOGFILEHEADER)); pRecord += EVENTIND(dwStatus); (pRecord->dwOccurenceCount)++; FlushViewOfFile(pMap, 0); bReturn = TRUE; CleanupAndFail: if ( pMap != NULL ) { UnmapViewOfFile(pMap); } if ( hMap != NULL ) { CloseHandle(hMap); } if ( hFile != INVALID_HANDLE_VALUE ) { CloseHandle(hFile); } return bReturn; }