Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

267 lines
4.9 KiB

/*
* 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
}