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.
 
 
 
 
 
 

549 lines
13 KiB

/*++
Copyright (c) 2000-2001 Microsoft Corporation
Module Name:
Log.cpp
Abstract:
This DLL handles the logging for the SMVTest.
Author:
Diaa Fathalla (DiaaF) 27-Nov-2000
Revision History:
--*/
#include "stdafx.h"
#include "Log.h"
#include "memory.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
//
// Constructor of a class that is being exported.
//
CLog::CLog()
{
m_iProcessor = 0;
m_iOperatingSys = 0;
m_iNTProductType = 0;
m_sMachineName = new TCHAR[MAX_COMPUTERNAME_LENGTH + 1];
m_sBuildNumber = new TCHAR[NORMAL_SIZE];
m_sCSDVersion = new TCHAR[NORMAL_SIZE];
m_sProcessor = new TCHAR[NORMAL_SIZE];
ZeroMemory(m_sMachineName,MAX_COMPUTERNAME_LENGTH + 1);
ZeroMemory(m_sBuildNumber, NORMAL_SIZE);
ZeroMemory(m_sCSDVersion, NORMAL_SIZE);
ZeroMemory(m_sProcessor, NORMAL_SIZE);
}
//
// Destructor of a class that is being exported.
//
CLog::~CLog()
{
if (m_sMachineName)
delete m_sMachineName;
if (m_sBuildNumber)
delete m_sBuildNumber;
if (m_sCSDVersion)
delete m_sCSDVersion;
if (m_sProcessor)
delete m_sProcessor;
}
//
// InitLogfile
//
BOOL LOG_API CLog::InitLogfile(LPCTSTR szLogfile, LPCTSTR szLogfileFolder)
{
if (!s_bFirstTime)
s_bFirstTime = TRUE;
else
return SUCCESS;
LPTSTR szBuffer;
LPTSTR szLogfilePath = new TCHAR[MAX_PATH];
LPTSTR szTempPath = new TCHAR[MAX_PATH];
//Set Global path for the global
SetLogfile(szLogfile);
SetLogfileFolder(szLogfileFolder);
_tcscpy(m_sLogfile, szLogfile);
_tcscpy(m_sLogfileFolder, szLogfileFolder);
GetWindowsDirectory(szLogfilePath, MAX_PATH);
_tcscat(szLogfilePath, TEXT("\\"));
_tcscat(szLogfilePath, m_sLogfileFolder);
//Get local computer info
GetLocalComputerInfo();
//Make sure TestLogs folder exists
WIN32_FIND_DATA pFindFileData;
_tcscpy(szTempPath, szLogfilePath);
_tcscat(szTempPath, TEXT("\\*.*"));
HANDLE hFileHndl = FindFirstFile(szTempPath, &pFindFileData);
if(hFileHndl != INVALID_HANDLE_VALUE)
FindClose(hFileHndl);
else
CreateDirectory(szLogfilePath,NULL);
//DeleteAllLogFiles();
szTempPath = _tcscat(_tcscat(_tcscpy(szTempPath,szLogfilePath),TEXT("\\")),m_sLogfile);
hFileHndl = CreateFile(szTempPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
delete szLogfilePath;
delete szTempPath;
if(hFileHndl == NULL)
{
return FAILURE;
}
else
{
//Log file not found so create new one
DWORD dwWritten = NULL;
szBuffer = LogInitHeader();
WriteFile(hFileHndl, (LPTSTR) szBuffer, _tcslen(szBuffer), &dwWritten, NULL);
CloseHandle(hFileHndl);
delete szBuffer;
if (dwWritten == NULL)
return FAILURE;
}
return SUCCESS;
}
//
// InitLogfileInfo
//
BOOL LOG_API CLog::InitLogfileInfo(LPCTSTR szLogfile, LPCTSTR szLogfileFolder)
{
if (!s_bFirstTime)
s_bFirstTime = TRUE;
else
return SUCCESS;
LPTSTR szLogfilePath = new TCHAR[MAX_PATH];
LPTSTR szTempPath = new TCHAR[MAX_PATH];
//Set Global path for the global
SetLogfile(szLogfile);
SetLogfileFolder(szLogfileFolder);
_tcscpy(m_sLogfile, szLogfile);
_tcscpy(m_sLogfileFolder, szLogfileFolder);
GetWindowsDirectory(szLogfilePath, MAX_PATH);
_tcscat(szLogfilePath, TEXT("\\"));
_tcscat(szLogfilePath, m_sLogfileFolder);
//Get local computer info
GetLocalComputerInfo();
//Make sure TestLogs folder exists
WIN32_FIND_DATA pFindFileData;
szTempPath = _tcscat(_tcscat(_tcscpy(szTempPath,szLogfilePath),TEXT("\\")),m_sLogfile);
HANDLE hFileHndl = FindFirstFile(szTempPath, &pFindFileData);
if(hFileHndl != INVALID_HANDLE_VALUE)
FindClose(hFileHndl);
else
{
CreateDirectory(szLogfilePath,NULL);
hFileHndl = CreateFile(szTempPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
}
delete szLogfilePath;
delete szTempPath;
return SUCCESS;
}
//
// EndLogfile
//
BOOL CLog::EndLogfile()
{
if (s_bFirstTime)
s_bFirstTime = FALSE;
else
return SUCCESS;
LPCTSTR szShortLine = TEXT("------------------------------------------------------------");
LPCTSTR szLEnd = TEXT("-----------------------------------");
LPCTSTR szLogtext = TEXT("SMV : Shim Automation Verifier");
LPTSTR szLine = new TCHAR[_tcslen(szShortLine) + _tcslen(szLEnd) + 1];
LPTSTR szLogfilePath = new TCHAR[MAX_PATH];
GetWindowsDirectory(szLogfilePath, MAX_PATH);
_tcscat(szLogfilePath, TEXT("\\"));
_tcscat(szLogfilePath, m_sLogfileFolder);
_tcscat(szLogfilePath, TEXT("\\"));
_tcscat(szLogfilePath, m_sLogfile);
LPTSTR szBuffer = LogCompTail();
HANDLE hFileHndl = CreateFile(szLogfilePath, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
SetFilePointer(hFileHndl, NULL, NULL, FILE_END);
DWORD dwWritten = NULL;
WriteFile(hFileHndl, (LPSTR)szBuffer, _tcslen(szBuffer), &dwWritten, NULL);
WriteFile(hFileHndl, (LPSTR)szBuffer, _tcslen(szBuffer), &dwWritten, NULL);
CloseHandle(hFileHndl);
delete szBuffer;
delete szLine;
delete szLogfilePath;
if (m_sLogfile)
delete m_sLogfile;
if (m_sLogfileFolder)
delete m_sLogfileFolder;
return SUCCESS;
}
//
// DeleteAllLogFiles
//
void CLog::DeleteAllLogFiles()
{
LPTSTR szLogfileFolder = new TCHAR[MAX_PATH];
_tcscpy(szLogfileFolder,m_sLogfileFolder);
LPTSTR szSearchForFiles = new TCHAR[MAX_PATH];
_tcscpy(szSearchForFiles, szLogfileFolder);
_tcscat(szSearchForFiles, TEXT("\\*.*"));
LPTSTR szLogfilePath = new TCHAR[MAX_PATH];
_tcscpy(szLogfilePath, szLogfileFolder);
_tcscat(szLogfilePath, TEXT("\\"));
_tcscat(szLogfilePath, m_sLogfile);
WIN32_FIND_DATA pFindFileData;
HANDLE hFileToDelete;
BOOL bFoundNextFile = FALSE;
DWORD dwFindNextFileLastErr = 0;
DWORD fErr = 0;
hFileToDelete = FindFirstFile(szSearchForFiles, &pFindFileData);
if(hFileToDelete != INVALID_HANDLE_VALUE)
{
do
{
if(FindNextFile(hFileToDelete, &pFindFileData))
{
if(pFindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
//Do not delete the SMV log file
if(strcmp(m_sLogfile,pFindFileData.cFileName) != 0)
{
LPTSTR szTemp = new TCHAR[MAX_PATH];
_tcscpy(szTemp, m_sLogfileFolder);
_tcscat(szTemp, TEXT("\\"));
_tcscat(szTemp, pFindFileData.cFileName);
DeleteFile(szTemp);
delete szTemp;
}
}
dwFindNextFileLastErr = GetLastError();
}
while (dwFindNextFileLastErr != ERROR_NO_MORE_FILES);
FindClose(hFileToDelete);
}
delete szLogfileFolder;
delete szSearchForFiles;
delete szLogfilePath;
}
//
// LogResults
//
BOOL CLog::LogResults(BOOL bPassed, LPCTSTR szText)
{
if (!s_bFirstTime)
return FAILURE; //initLogFile is not initialized
LPTSTR szLogfileFolder = new TCHAR[MAX_PATH];
_tcscpy(szLogfileFolder, m_sLogfileFolder);
LPTSTR szLogfilePath = new TCHAR[MAX_PATH];
GetWindowsDirectory(szLogfilePath, MAX_PATH);
szLogfilePath = _tcscat(szLogfilePath, TEXT("\\"));
szLogfilePath = _tcscat(_tcscat(_tcscat(szLogfilePath,m_sLogfileFolder), TEXT("\\")), m_sLogfile);
LPCTSTR szTab = TEXT("\t");
LPCTSTR szSpace = TEXT("\r\n");
LPCTSTR szPassed = TEXT("PASSED\t:");
LPCTSTR szFailed = TEXT("FAILED\t:");
LPTSTR szBuffer = new TCHAR[NORMAL_SIZE + _tcslen(szText)];
_tcscpy(szBuffer, szTab);
IncNumberOfTests();
if (bPassed)
szBuffer = _tcscat(_tcscat(szBuffer, szPassed), szText);
else
{
IncNumberOfFailures();
szBuffer = _tcscat(_tcscat(_tcscat(szBuffer, szFailed), szText), szSpace);
}
szBuffer = _tcscat(szBuffer, szSpace);
HANDLE hFileHndl = CreateFile(szLogfilePath, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
SetFilePointer(hFileHndl, NULL, NULL, FILE_END);
delete szLogfileFolder;
delete szLogfilePath;
if(hFileHndl == NULL)
{
delete szBuffer;
return FAILURE;
}
else
{
DWORD dwWritten = NULL;
WriteFile(hFileHndl, (LPSTR)szBuffer, _tcslen(szBuffer), &dwWritten, NULL);
CloseHandle(hFileHndl);
delete szBuffer;
if (dwWritten == NULL)
return FAILURE;
}
return SUCCESS;
}
//
// LogInitHeader
//
LPTSTR CLog::LogInitHeader()
{
LPTSTR szBuffer = new TCHAR[NORMAL_SIZE*10];
LPCTSTR szTab = TEXT("\t");
LPCTSTR szSpace = TEXT("\r\n");
LPCTSTR szShortLine = TEXT("------------------------------------------------------------");
LPCTSTR szLEnd = TEXT("-----------------------------------");
LPCTSTR szLogtext = TEXT("SMV-TEST : Shim Automation Verifier TEST");
LPTSTR szLine = new TCHAR[_tcslen(szShortLine) + _tcslen(szLEnd) + 1];
szLine = _tcscat(_tcscpy(szLine,szShortLine),szLEnd);
LPTSTR szVersion = new TCHAR[NORMAL_SIZE*3];
_tcscpy(szVersion, m_sBuildNumber);
LPTSTR szMachineName = new TCHAR[NORMAL_SIZE*2];
_tcscpy(szMachineName,TEXT("Machine Name:"));
szMachineName = _tcscat(_tcscat(_tcscat(szMachineName, szTab), szTab), m_sMachineName);
if (m_sCSDVersion != NULL)
szVersion = _tcscat(_tcscat(_tcscat(szVersion, TEXT(" (")), m_sCSDVersion), _TEXT(")"));
LPTSTR szBuildNumber = new TCHAR[NORMAL_SIZE*3];
_tcscpy(szBuildNumber, _T("Build # :"));
szBuildNumber = _tcscat(_tcscat(_tcscat(szBuildNumber, szTab), szTab), szVersion);
szBuffer = _tcscat(_tcscpy(szBuffer, szLine), szSpace);
szBuffer = _tcscat(_tcscat(_tcscat(szBuffer, szTab), szLogtext), szSpace);
szBuffer = _tcscat(_tcscat(_tcscat(szBuffer, szLine), szSpace), szSpace);
szBuffer = _tcscat(_tcscat(_tcscat(szBuffer, szTab), szMachineName), szSpace);
szBuffer = _tcscat(_tcscat(_tcscat(szBuffer, szTab), szBuildNumber), szSpace);
//SYSTEMTIME InitLogTime;
//GetSystemTime(&InitLogTime);
szBuffer = _tcscat(_tcscat(szBuffer, szLine), szSpace);
szBuffer = _tcscat(_tcscat(szBuffer, szLine), szSpace);
delete szLine;
delete szVersion;
delete szMachineName;
delete szBuildNumber;
return szBuffer;
}
//
// LogCompTail
//
LPTSTR CLog::LogCompTail()
{
LPTSTR szTemp = new TCHAR[NORMAL_SIZE * 10];
LPTSTR szLogfilePath = new TCHAR[MAX_PATH];
szLogfilePath = _tcscat(_tcscat(_tcscpy(szLogfilePath,m_sLogfileFolder), TEXT("\\")), m_sLogfile);
LPCTSTR szSpace = TEXT("\r\n");
LPCTSTR szTab = TEXT("\t");
LPCTSTR szShortLine = TEXT("------------------------------------------------------------");
LPCTSTR szLEnd = TEXT("-----------------------------------");
LPCTSTR szLogtext = TEXT("Shim Mechanism Verifier");
LPTSTR szLine = new TCHAR[_tcslen(szShortLine) + _tcslen(szLEnd) + 1];
szLine = _tcscat(_tcscpy(szLine,szShortLine),szLEnd);
//CTime tmEnd = m_pScript->m_tmScriptEndTime;
//CTime tmStart = m_pScript->m_tmScriptStartTime;
//CString sDate1 = tmStart.Format("%A, %B %d, %Y\t%I:%M:%S%p");
//CString sDate2 = tmEnd.Format("%A, %B %d, %Y\t%I:%M:%S%p");
//sTemp += sTab + _T("Script Start Time :") + sTab + sDate1 + sSpace;
//sTemp += sTab + _T("Script Finish Time:") + sTab + sDate2 + sSpace;
szTemp = _tcscat(_tcscpy(szTemp,szLine), szSpace);
szTemp = _tcscat(_tcscat(szTemp,szLine), szSpace);
delete szLogfilePath;
delete szLine;
return szTemp;
}
//
// DoesLogfileExist: Checks if ShimTest.log exists on the local machine.
//
BOOL CLog::DoesLogfileExist()
{
LPTSTR szPath = new TCHAR[MAX_PATH];
_tcscat(szPath,m_sLogfileFolder);
_tcscat(szPath,TEXT("\\"));
_tcscat(szPath,m_sLogfile);
WIN32_FIND_DATA pFindFileData;
HANDLE hFileHndl = FindFirstFile(szPath, &pFindFileData);
if(hFileHndl != INVALID_HANDLE_VALUE)
{
FindClose(hFileHndl);
delete szPath;
return TRUE;
}
delete szPath;
return FALSE;
}
//
// GetLocalComputerInfo()
//
void CLog::GetLocalComputerInfo()
{
OSVERSIONINFO OSVer;
SYSTEM_INFO SysInf;
DWORD dwNameSize = MAX_COMPUTERNAME_LENGTH + 1;
TCHAR sMachineName[MAX_COMPUTERNAME_LENGTH + 1];
// Get machine name and language of system
GetComputerName(sMachineName, &dwNameSize);
_tcscpy(m_sMachineName, TEXT(sMachineName));
//Get OS and build #
OSVer.dwOSVersionInfoSize = sizeof(OSVer);
GetVersionEx(&OSVer);
m_iOperatingSys = OSVer.dwPlatformId;
wsprintf(m_sBuildNumber, TEXT("%d"), OSVer.dwBuildNumber);
if (OSVer.szCSDVersion[0] != NULL)
m_sCSDVersion = TEXT(OSVer.szCSDVersion);
//Get processor type, and workstation or server
GetSystemInfo(&SysInf);
m_iProcessor = SysInf.wProcessorArchitecture;
switch(m_iProcessor)
{
case 0: _tcscpy(m_sProcessor,TEXT("x86")); break;
case 2: _tcscpy(m_sProcessor,TEXT("Alpha")); break;
default: _tcscpy(m_sProcessor, TEXT("Unknown Processor Architcture")); break;
}
}
//
// SetLogfile
//
void CLog::SetLogfile(LPCTSTR szLogfile)
{
m_sLogfile = new TCHAR[MAX_PATH];
_tcscpy(m_sLogfile,szLogfile);
}
//
// SetLogfileFolder
//
void CLog::SetLogfileFolder(LPCTSTR szLogfileFolder)
{
m_sLogfileFolder = new TCHAR[MAX_PATH];
_tcscpy(m_sLogfileFolder,szLogfileFolder);
}
//
// IncNumberOfTests
//
void CLog::IncNumberOfTests()
{
s_NumberOfTests++;
}
//
// IncNumberOfFailures
//
void CLog::IncNumberOfFailures()
{
s_NumberOfFailures++;
}
//
// NumberOfTests
//
int CLog::NumberOfTests()
{
return s_NumberOfTests;
}
//
// NumberOfFailures
//
int CLog::NumberOfFailures()
{
return s_NumberOfFailures;
}