|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1999-2001.
//
// File: Main.cxx
//
// Contents: This the implementation for the main module of srdiag.exe.
//
// Classes: n/a
//
// Functions: DiaplayHelp
// ParseCmdLine
// Main
//
// Coupling:
//
// Notes:
//
// History: 20-04-2001 weiyouc Created
//
//----------------------------------------------------------------------------
//--------------------------------------------------------------------------
// Headers
//--------------------------------------------------------------------------
#include "SrHeader.hxx"
#ifdef ARRAYSIZE
#undef ARRAYSIZE
#endif
#include "stdafx.h"
#include "srdiag.h"
//--------------------------------------------------------------------------
// Local defines
//--------------------------------------------------------------------------
#define CAB_FILE_EXT ".cab"
//--------------------------------------------------------------------------
// Local function prototypes
//--------------------------------------------------------------------------
void DisplayHelp();
HRESULT ParseCmdLine(BOOL* pfDisplayHelp, LPTSTR* pptszCabFileName, LPTSTR* pptszCabLoc);
HRESULT GenerateCabFileName(LPTSTR* pptszCabFile);
HRESULT OpenCabFile(MPC::Cabinet* pCab, LPTSTR ptszCabFileName, LPTSTR ptszCabLoc);
HRESULT AppendFilesToCabFile(MPC::Cabinet * pCab);
//--------------------------------------------------------------------------
// Global Variables
//--------------------------------------------------------------------------
//
// List of files that we will collect at %windir% directory.
//
LPCTSTR g_tszWindirFileCollection[] = { TEXT("\\system32\\restore\\machineguid.txt"), TEXT("\\system32\\restore\\filelist.xml"), TEXT("\\system32\\restore\\rstrlog.dat") };
//
// List of the files, that we will collect at the root of
// %systemdrv%\System Volume Information\_Restore{GUID} directory.
//
LPCTSTR g_tszSysVolFileCollection[] = { TEXT("_filelst.cfg"), TEXT("drivetable.txt"), TEXT("_driver.cfg"), TEXT("fifo.log"), };
//--------------------------------------------------------------------------
// Functions
//--------------------------------------------------------------------------
//+---------------------------------------------------------------------------
//
// Function: DisplayHelp
//
// Synopsis: Displays a help page for the user
//
// Arguments: (none)
//
// Returns: void
//
// History: 20-04-2001 weiyouc Created
//
// Notes:
//
//----------------------------------------------------------------------------
void DisplayHelp() { printf("\n"); printf("Microsoft Windows XP \n"); printf("Usage: SrDiag [/CabName:test.cab] [/CabLoc:\"c:\\temp\\\"] \n"); printf(" /CabName is the full name of the cab file that you wish to use. \n" " If the cab file name is not specified, the system will \n" " automatically generate one in the following format: \n" " <machine_name>_mmddyy_hhss.cab \n"); printf(" /CabLoc points to the location to store the cab. \n" " It must have a \\ on the end. \n" " The default location is the current directory. \n"); }
//+---------------------------------------------------------------------------
//
// Function: ParseCmdLine
//
// Synopsis: Sets Globals based on Cmd and Enviroment settings
//
// Arguments: (none)
//
// Returns: HRESULT
//
// History: 20-04-2001 weiyouc Created
//
// Notes:
//
//----------------------------------------------------------------------------
HRESULT ParseCmdLine(BOOL* pfDisplayHelp, LPTSTR* pptszCabFileName, LPTSTR* pptszCabLoc) { HRESULT hr = S_OK;
//
// Do we want to generate full string for printed test cases?
//
*pfDisplayHelp = (GETPARAM_ISPRESENT("help") || GETPARAM_ISPRESENT("?"));
//
// Do we specify the cab file name or not
//
GETPARAM_ABORTONERROR("CabName:tstr", *pptszCabFileName);
//
// If cab file location is
//
GETPARAM_ABORTONERROR("CabLoc:tstr", *pptszCabLoc);
ErrReturn: return hr; } // ParseCmdLine
//+---------------------------------------------------------------------------
//
// Function: main
//
// Synopsis: Entry point for srdiag.exe
//
// Arguments: [argc] -- Command Line Arg Count
// [argv] -- Command Line Args
//
// Returns: VOID
//
// History: 20-04-2001 weiyouc Created
//
// Notes:
//
//----------------------------------------------------------------------------
void __cdecl main (int argc, char *argv[]) { HRESULT hr = S_OK; BOOL fDisplayHelp = FALSE; LPTSTR ptszCabFileName = NULL; LPTSTR ptszCabLoc = NULL; MPC::Cabinet Cab;
hr = ParseCmdLine(&fDisplayHelp, &ptszCabFileName, &ptszCabLoc); DH_HRCHECK_ABORT(hr, TEXT("ParseCmdLine"));
//
// Do we need to display help
//
if (fDisplayHelp) { DisplayHelp(); goto ErrReturn; }
//
// Make sure that we always start from a clean environment
//
hr = CleanupFiles(); DH_HRCHECK_ABORT(hr, TEXT("CleanupFiles")); //
// Open the cab file
//
hr = OpenCabFile(&Cab, ptszCabFileName, ptszCabLoc); DH_HRCHECK_ABORT(hr, TEXT("OpenCabFile"));
//
// Now append the files to the cab file
//
hr = AppendFilesToCabFile(&Cab); DH_HRCHECK_ABORT(hr, TEXT("AppendFilesToCabFile")); //
// Now we create the cab file for real
//
hr = Cab.Compress(); DH_HRCHECK_ABORT(hr, TEXT("Cabinet::Compress"));
//
// Clean up the files
//
hr = CleanupFiles(); DH_HRCHECK_ABORT(hr, TEXT("CleanupFiles")); ErrReturn:
CleanupTStr(&ptszCabFileName); CleanupTStr(&ptszCabLoc); return; }
//+---------------------------------------------------------------------------
//
// Function: GenerateCabFileName
//
// Synopsis: Generate a cab file name = ComputerName + ddmmyy + hhmmss
//
// Arguments: [pptszCabFile] -- cab file name
//
// Returns: HRESULT
//
// History: 20-04-2001 weiyouc Created
//
// Notes:
//
//----------------------------------------------------------------------------
HRESULT GenerateCabFileName(LPTSTR* pptszCabFile) { HRESULT hr = S_OK; time_t ltime = 0; tm* ptmNow = NULL; size_t stRet = 0; TCHAR tszTmTemp[MAX_PATH]; TCHAR tszCabFile[MAX_PATH];
DH_VDATEPTROUT(pptszCabFile, LPTSTR); //
// Copy Computer Name to CabFileName
//
_tcscpy(tszCabFile, _tgetenv(TEXT("COMPUTERNAME"))); DH_HRCHECK_ABORT(hr, TEXT("CopyString")); //
// Append Undescore character to CabFileName
//
_tcscat(tszCabFile, TEXT("_"));
//
// Get System Time and Date
//
time(<ime); ptmNow = localtime(<ime);
//
// Convert time/date to mmddyyhhmmss format (24hr)
//
stRet = _tcsftime(tszTmTemp, MAX_PATH, TEXT("%m%d%y_%H%M%S"), ptmNow); DH_ABORTIF(0 == stRet, E_FAIL, TEXT("_tcsftime")); _tcscat(tszCabFile, tszTmTemp);
//
// Finally append on the extension and now we are set.
//
_tcscat(tszCabFile, TEXT(CAB_FILE_EXT));
hr = CopyString(tszCabFile, pptszCabFile); DH_HRCHECK_ABORT(hr, TEXT("CopyString"));
ErrReturn: return hr; }
//+---------------------------------------------------------------------------
//
// Function: OpenCabFile
//
// Synopsis: Open the cab file
//
// Arguments: [pCab] -- pointer to the cab file
// [ptszCabFileName] -- cab file name
// [ptszCabLoc] -- cab file location
//
// Returns: HRESULT
//
// History: 20-04-2001 weiyouc Created
//
// Notes:
//
//----------------------------------------------------------------------------
HRESULT OpenCabFile(MPC::Cabinet* pCab, LPTSTR ptszCabFileName, LPTSTR ptszCabLoc) { HRESULT hr = S_OK; LPTSTR ptszFullCabFileName = NULL;
DH_VDATEPTRIN(pCab, MPC::Cabinet);
//
// If the user does not specify the cab file name,
// we will generate one.
//
if (NULL == ptszCabFileName) { hr = GenerateCabFileName(&ptszCabFileName); DH_HRCHECK_ABORT(hr, TEXT("GenerateCabFileName")); }
//
// If the use specifies a location for the cab file,
// we need to glue it together with the cab file name
//
if (NULL != ptszCabLoc) { hr = SrTstTStrCat(ptszCabLoc, ptszCabFileName, &ptszFullCabFileName); DH_HRCHECK_ABORT(hr, TEXT("SrTstStrCat")); } else { hr = CopyString(ptszCabFileName, &ptszFullCabFileName); DH_HRCHECK_ABORT(hr, TEXT("CopyString")); }
//
// Open the cabinet file
//
hr = pCab->put_CabinetFile(ptszFullCabFileName); DH_HRCHECK_ABORT(hr, TEXT("Cabinet::put_CabinetFile"));
//
// Also set a flag to ignore the missing file
//
hr = pCab->put_IgnoreMissingFiles(TRUE); DH_HRCHECK_ABORT(hr, TEXT("Cabinet::put_IgnoreMissingFiles"));
ErrReturn: CleanupTStr(&ptszFullCabFileName); return hr; }
//+---------------------------------------------------------------------------
//
// Function: OpenCabFile
//
// Synopsis: Append files to the cab file. However it has not written
// anyting to the cab file yet
//
// Arguments: [pCab] -- pointer to the cab file
//
// Returns: HRESULT
//
// History: 20-04-2001 weiyouc Created
//
// Notes:
//
//----------------------------------------------------------------------------
HRESULT AppendFilesToCabFile(MPC::Cabinet* pCab) { HRESULT hr = S_OK; int i = 0; LPTSTR ptszFileName = NULL; LPTSTR ptszDSOnSys = NULL;
DH_VDATEPTRIN(pCab, MPC::Cabinet);
//
// Add SR related registery settings
//
hr = GetSRRegInfo(TEXT("SR-Reg.TXT")); DH_HRCHECK_ABORT(hr, TEXT("GetSRRegInfo"));
hr = pCab->AddFile(TEXT("SR-Reg.TXT")); DH_HRCHECK_ABORT(hr, TEXT("MPC::Cabinet::AddFile()"));
//
// Add files based on WinDir relative root
//
for (i = 0; i < ARRAYSIZE(g_tszWindirFileCollection); i++) { hr = SrTstTStrCat(_tgetenv(TEXT("WINDIR")), g_tszWindirFileCollection[i], &ptszFileName); DH_HRCHECK_ABORT(hr, TEXT("SrTstTStrCat"));
hr = pCab->AddFile(ptszFileName); DH_HRCHECK_ABORT(hr, TEXT("MPC::Cabinet::AddFile"));
CleanupTStr(&ptszFileName); }
//
// Parse the restore log and add it to the cab
//
hr = SrTstTStrCat(_tgetenv(TEXT("WINDIR")), g_tszWindirFileCollection[2], &ptszFileName); DH_HRCHECK_ABORT(hr, TEXT("SrTstTStrCat"));
hr = ParseRstrLog(ptszFileName, TEXT("SR-RstrLog.TXT")); DH_HRCHECK_ABORT(hr, TEXT("ParseRstrLog")); hr = pCab->AddFile(TEXT("SR-RstrLog.TXT")); DH_HRCHECK_ABORT(hr, TEXT("MPC::Cabinet::AddFile"));
CleanupTStr(&ptszFileName);
//
// Get the restore directory on the system drive,
// and then Add in critial files
//
hr = GetDSOnSysVol(&ptszDSOnSys); DH_HRCHECK_ABORT(hr, TEXT("GetDSOnSysVol")); //
// Add files Bases on System Volume Information relative root
//
for (i = 0; i < ARRAYSIZE(g_tszSysVolFileCollection); i++) { hr = SrTstTStrCat(ptszDSOnSys, g_tszSysVolFileCollection[i], &ptszFileName); DH_HRCHECK_ABORT(hr, TEXT("SrTstTStrCat"));
hr = pCab->AddFile(ptszFileName); DH_HRCHECK_ABORT(hr, TEXT("MPC::Cabinet::AddFile()"));
CleanupTStr(&ptszFileName); }
//
// Get the Restore point enumeration, and then cab the file
//
hr = RPEnumDrives(pCab, TEXT("SR-RP.LOG")); DH_HRCHECK_ABORT(hr, TEXT("RPEnumDrives"));
hr = pCab->AddFile(TEXT("SR-RP.LOG")); DH_HRCHECK_ABORT(hr, TEXT("MPC::Cabinet::AddFile()"));
//
// Get change logs
//
hr = GetChgLogOnDrives(TEXT("SR-ChgLog.LOG")); DH_HRCHECK_ABORT(hr, TEXT("GetChgLog"));
hr = pCab->AddFile(TEXT("SR-ChgLog.LOG")); DH_HRCHECK_ABORT(hr, TEXT("MPC::Cabinet::AddFile()")); //
// Get file versions
//
hr = GetSRFileInfo(TEXT("SR-FileList.LOG")); DH_HRCHECK_ABORT(hr, TEXT("GetSRFileInfo"));
hr = pCab->AddFile(TEXT("SR-FileList.LOG")); DH_HRCHECK_ABORT(hr, TEXT("MPC::Cabinet::AddFile()"));
//
// Get SR related event logs
//
hr = GetSREvents(TEXT("SR-EventLogs.TXT")); DH_HRCHECK_ABORT(hr, TEXT("GetSREvents"));
hr = pCab->AddFile(TEXT("SR-EventLogs.TXT")); DH_HRCHECK_ABORT(hr, TEXT("MPC::Cabinet::AddFile()"));
ErrReturn: CleanupTStr(&ptszFileName); CleanupTStr(&ptszDSOnSys); return hr; }
//+---------------------------------------------------------------------------
//
// Function: CleanupFiles
//
// Synopsis: Remove the temporary file used by srdiag
//
// Arguments: none
//
// Returns: HRESULT
//
// History: 20-04-2001 weiyouc Created
//
// Notes:
//
//----------------------------------------------------------------------------
HRESULT CleanupFiles() { HRESULT hr = S_OK;
DeleteFileW(L"SR-Reg.TXT"); DeleteFileW(L"SR-RstrLog.TXT"); DeleteFileW(L"SR-RP.LOG"); DeleteFileW(L"SR-ChgLog.LOG"); DeleteFileW(L"SR-FileList.LOG"); DeleteFileW(L"SR-EventLogs.TXT");
return hr; }
|