268 lines
4.9 KiB
C++
268 lines
4.9 KiB
C++
|
/*
|
||
|
* Copyright (c) 1998 Microsoft Corporation
|
||
|
*
|
||
|
* Module Name:
|
||
|
*
|
||
|
* logfile.cpp
|
||
|
*
|
||
|
* Abstract:
|
||
|
*
|
||
|
* This file contains code to log messages to a file.
|
||
|
*
|
||
|
* Author:
|
||
|
*
|
||
|
* Breen Hagan (BreenH) Oct-02-98
|
||
|
*
|
||
|
* Environment:
|
||
|
*
|
||
|
* User Mode
|
||
|
*/
|
||
|
|
||
|
#define _LSOC_LOGFILE_CPP_
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "logfile.h"
|
||
|
|
||
|
/*
|
||
|
* Globals.
|
||
|
*/
|
||
|
|
||
|
LogFile SetupLog;
|
||
|
|
||
|
/*
|
||
|
* Constants.
|
||
|
*/
|
||
|
|
||
|
const UINT LOG_ENTRY_SIZE = 1024;
|
||
|
const UINT S_SIZE = 1024;
|
||
|
|
||
|
/*
|
||
|
* Function prototypes.
|
||
|
*/
|
||
|
|
||
|
DWORD TCharStringToAnsiString(LPCTSTR, LPSTR);
|
||
|
|
||
|
/*
|
||
|
* Class LogFile.
|
||
|
*/
|
||
|
|
||
|
LogFile::LogFile(
|
||
|
)
|
||
|
{
|
||
|
m_fInitialized = FALSE;
|
||
|
m_szLogFile[0] = (TCHAR)NULL;
|
||
|
m_szLogModule[0] = (TCHAR)NULL;
|
||
|
}
|
||
|
|
||
|
LogFile::~LogFile(
|
||
|
)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
LogFile::Close(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
if (m_fInitialized) {
|
||
|
LogMessage(_T(CRLF));
|
||
|
LogMessage(_T("**"));
|
||
|
LogMessage(_T("** Closing Message Log for %s"), m_szLogModule);
|
||
|
LogMessage(_T("**"));
|
||
|
LogMessage(_T(CRLF));
|
||
|
LogMessage(_T(CRLF));
|
||
|
CloseHandle(m_hFile);
|
||
|
m_fInitialized = FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
DWORD
|
||
|
LogFile::Initialize(
|
||
|
IN LPCTSTR pszLogFile,
|
||
|
IN LPCTSTR pszLogModule
|
||
|
)
|
||
|
{
|
||
|
OSVERSIONINFO osVersion;
|
||
|
TCHAR pszDate[S_SIZE];
|
||
|
TCHAR pszTime[S_SIZE];
|
||
|
|
||
|
//
|
||
|
// Initializing the log file twice is "A Bad Thing."
|
||
|
//
|
||
|
|
||
|
if (m_fInitialized) {
|
||
|
LogMessage(_T("LogFile::Initialize called twice!"));
|
||
|
return(ERROR_SUCCESS);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Sanity checks. Pointless in a limited setting, but useful if this
|
||
|
// file is copied to other projects.
|
||
|
//
|
||
|
|
||
|
if ((pszLogFile == NULL) || (pszLogFile[0] == (TCHAR)NULL)) {
|
||
|
return(ERROR_INVALID_PARAMETER);
|
||
|
}
|
||
|
|
||
|
if ((pszLogModule == NULL) || (pszLogModule[0] == (TCHAR)NULL)) {
|
||
|
return(ERROR_INVALID_PARAMETER);
|
||
|
}
|
||
|
|
||
|
if ((_tcslen(pszLogFile) > MAX_PATH) ||
|
||
|
(_tcslen(pszLogModule) > MAX_PATH)) {
|
||
|
return(ERROR_INVALID_PARAMETER);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Save the log file and module name.
|
||
|
//
|
||
|
|
||
|
_tcscpy(m_szLogFile, pszLogFile);
|
||
|
_tcscpy(m_szLogModule, pszLogModule);
|
||
|
|
||
|
//
|
||
|
// Open or create the log file.
|
||
|
//
|
||
|
|
||
|
m_hFile = CreateFile(
|
||
|
pszLogFile,
|
||
|
GENERIC_WRITE,
|
||
|
0,
|
||
|
NULL,
|
||
|
OPEN_ALWAYS,
|
||
|
0,
|
||
|
NULL
|
||
|
);
|
||
|
if (m_hFile == INVALID_HANDLE_VALUE) {
|
||
|
return(GetLastError());
|
||
|
}
|
||
|
|
||
|
m_fInitialized = TRUE;
|
||
|
SetFilePointer(m_hFile, 0, NULL, FILE_END);
|
||
|
|
||
|
//
|
||
|
// Get the current date and time for the log file.
|
||
|
//
|
||
|
|
||
|
_tstrdate(pszDate);
|
||
|
_tstrtime(pszTime);
|
||
|
|
||
|
LogMessage(_T("**"));
|
||
|
LogMessage(_T("** Initializing Message Log for %s"), m_szLogModule);
|
||
|
LogMessage(_T("** Date: %s Time: %s"), pszDate, pszTime);
|
||
|
LogMessage(_T("**"));
|
||
|
LogMessage(_T(CRLF));
|
||
|
|
||
|
//
|
||
|
// Log information on the OS version.
|
||
|
//
|
||
|
|
||
|
osVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
||
|
|
||
|
if (GetVersionEx(&osVersion) != 0) {
|
||
|
|
||
|
LogMessage(
|
||
|
_T("Version: %lu.%lu.%lu Platform: %lu, %s"),
|
||
|
osVersion.dwMajorVersion,
|
||
|
osVersion.dwMinorVersion,
|
||
|
osVersion.dwBuildNumber,
|
||
|
osVersion.dwPlatformId,
|
||
|
#ifdef DBG
|
||
|
_T("Checked")
|
||
|
#else
|
||
|
_T("Free")
|
||
|
#endif
|
||
|
);
|
||
|
}
|
||
|
|
||
|
return(ERROR_SUCCESS);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* LogFile::LogMessage()
|
||
|
*
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
DWORD
|
||
|
__cdecl
|
||
|
LogFile::LogMessage(
|
||
|
LPCTSTR pszFormat,
|
||
|
...
|
||
|
)
|
||
|
{
|
||
|
CHAR cszOutput[LOG_ENTRY_SIZE];
|
||
|
DWORD cBytes;
|
||
|
DWORD cLength;
|
||
|
TCHAR tszOutput[LOG_ENTRY_SIZE];
|
||
|
va_list vaList;
|
||
|
|
||
|
if (!m_fInitialized) {
|
||
|
return(ERROR_INVALID_HANDLE);
|
||
|
}
|
||
|
|
||
|
SetLastError(ERROR_SUCCESS);
|
||
|
|
||
|
va_start(vaList, pszFormat);
|
||
|
_vstprintf(tszOutput, pszFormat, vaList);
|
||
|
va_end(vaList);
|
||
|
|
||
|
cLength = TCharStringToAnsiString(tszOutput, cszOutput);
|
||
|
|
||
|
if (cLength != (DWORD)-1) {
|
||
|
WriteFile(m_hFile, cszOutput, cLength * sizeof(char), &cBytes, NULL);
|
||
|
WriteFile(m_hFile, CRLF, strlen(CRLF) * sizeof(char), &cBytes, NULL);
|
||
|
}
|
||
|
|
||
|
return(GetLastError());
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
*
|
||
|
*
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
DWORD
|
||
|
TCharStringToAnsiString(
|
||
|
LPCTSTR tszStr,
|
||
|
LPSTR cszStr
|
||
|
)
|
||
|
{
|
||
|
#ifdef UNICODE
|
||
|
DWORD cLength;
|
||
|
|
||
|
cLength = WideCharToMultiByte(
|
||
|
CP_ACP,
|
||
|
0,
|
||
|
tszStr,
|
||
|
-1,
|
||
|
NULL,
|
||
|
0,
|
||
|
NULL,
|
||
|
NULL
|
||
|
);
|
||
|
|
||
|
if ((cLength == 0) || (cLength > S_SIZE)) {
|
||
|
return((DWORD)-1);
|
||
|
}
|
||
|
|
||
|
cLength = WideCharToMultiByte(
|
||
|
CP_ACP,
|
||
|
0,
|
||
|
tszStr,
|
||
|
-1,
|
||
|
cszStr,
|
||
|
cLength,
|
||
|
NULL,
|
||
|
NULL
|
||
|
);
|
||
|
|
||
|
return(cLength);
|
||
|
#else
|
||
|
_tcscpy(cszStr, tszStr);
|
||
|
return(_tcslen(cszStr));
|
||
|
#endif
|
||
|
}
|
||
|
|