281 lines
7.2 KiB
C++
281 lines
7.2 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 2000.
|
||
|
//
|
||
|
// File: GetRstrLog.cxx
|
||
|
//
|
||
|
// Contents: Intepreting the rstrlog.dat to a more readable format
|
||
|
//
|
||
|
// Objects:
|
||
|
//
|
||
|
// Coupling:
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
// History: 03-May-2001 WeiyouC Copied from dev code and minor rewite
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
//--------------------------------------------------------------------------
|
||
|
// includes
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
#include "SrHeader.hxx"
|
||
|
#include <srdefs.h>
|
||
|
#include <restmap.h>
|
||
|
#include <srshell.h>
|
||
|
|
||
|
#include "mfr.h"
|
||
|
|
||
|
//--------------------------------------------------------------------------
|
||
|
// Defines
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
#define COUNT_RESNAME (sizeof(s_cszResName)/sizeof(LPCWSTR)-1)
|
||
|
|
||
|
//--------------------------------------------------------------------------
|
||
|
// Global variables
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
static LPCWSTR s_cszResName[] =
|
||
|
{
|
||
|
L"",
|
||
|
L"Fail",
|
||
|
L"OK",
|
||
|
L"Lock",
|
||
|
L"Disk R/O",
|
||
|
L"Exists",
|
||
|
L"Ignored",
|
||
|
L"Not Found",
|
||
|
L"Conflict",
|
||
|
L"Optimized",
|
||
|
L"Lock Alt",
|
||
|
NULL
|
||
|
};
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: ParseRstrLog
|
||
|
//
|
||
|
// Synopsis: Parse rstrlog.dat to a readable format
|
||
|
//
|
||
|
// Arguments: ptszRstrLog -- restore log
|
||
|
// ptszReadableLog -- the result log
|
||
|
//
|
||
|
// Returns: HRESULT
|
||
|
//
|
||
|
// History: 20-04-2001 weiyouc Created
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
HRESULT ParseRstrLog(LPTSTR ptszRstrLog,
|
||
|
LPTSTR ptszReadableLog)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
DWORD i = 0;
|
||
|
DWORD dwFlags = 0;
|
||
|
FILE* fpLog = NULL;
|
||
|
CMappedFileRead cMFR;
|
||
|
SRstrLogHdrBase sHdr1;
|
||
|
SRstrLogHdrV3 sHdr2;
|
||
|
SRstrEntryHdr sEntHdr;
|
||
|
WCHAR wszBuf1[SR_MAX_FILENAME_LENGTH];
|
||
|
WCHAR wszBuf2[SR_MAX_FILENAME_LENGTH];
|
||
|
WCHAR wszBuf3[SR_MAX_FILENAME_LENGTH];
|
||
|
|
||
|
DH_VDATEPTRIN(ptszRstrLog, TCHAR);
|
||
|
DH_VDATEPTRIN(ptszReadableLog, TCHAR);
|
||
|
|
||
|
fpLog = _tfopen(ptszReadableLog, TEXT("w"));
|
||
|
if (NULL == fpLog)
|
||
|
goto ErrReturn;
|
||
|
|
||
|
if (_taccess(ptszRstrLog, 0) == -1)
|
||
|
goto ErrReturn;
|
||
|
|
||
|
if (!cMFR.Open(ptszRstrLog))
|
||
|
goto ErrReturn;
|
||
|
|
||
|
if (!cMFR.Read(&sHdr1, sizeof(sHdr1)))
|
||
|
goto ErrReturn;
|
||
|
|
||
|
if ((sHdr1.dwSig1 != RSTRLOG_SIGNATURE1) ||
|
||
|
(sHdr1.dwSig2 != RSTRLOG_SIGNATURE2))
|
||
|
{
|
||
|
fprintf(stderr, "Invalid restore log file signature...\n");
|
||
|
goto ErrReturn;
|
||
|
}
|
||
|
if (HIWORD(sHdr1.dwVer) != RSTRLOG_VER_MAJOR)
|
||
|
{
|
||
|
fprintf(stderr,
|
||
|
"Unknown restore log file version - %d (0x%08X)\n",
|
||
|
HIWORD(sHdr1.dwVer), sHdr1.dwVer);
|
||
|
goto ErrReturn;
|
||
|
}
|
||
|
|
||
|
if (!cMFR.Read(&sHdr2, sizeof(sHdr2)))
|
||
|
goto ErrReturn;
|
||
|
|
||
|
fprintf(fpLog, "Flags, ");
|
||
|
if (sHdr2.dwFlags == 0)
|
||
|
{
|
||
|
fprintf(fpLog, "<none>");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (sHdr2.dwFlags & RLHF_SILENT)
|
||
|
fprintf(fpLog, " Silent");
|
||
|
if (sHdr2.dwFlags & RLHF_UNDO)
|
||
|
fprintf(fpLog, " Undo");
|
||
|
}
|
||
|
fprintf(fpLog, "\n");
|
||
|
fprintf(fpLog, "Restore Point, %d\n", sHdr2.dwRPNum);
|
||
|
fprintf(fpLog, "New Restore RP, %d\n", sHdr2.dwRPNew);
|
||
|
fprintf(fpLog, "# of Drives, %d\n", sHdr2.dwDrives);
|
||
|
for (i = 0; i < sHdr2.dwDrives; i++)
|
||
|
{
|
||
|
if (!cMFR.Read(&dwFlags))
|
||
|
goto ErrReturn;
|
||
|
if (!cMFR.ReadDynStrW(wszBuf1, MAX_PATH))
|
||
|
goto ErrReturn;
|
||
|
if (!cMFR.ReadDynStrW(wszBuf2, MAX_PATH))
|
||
|
goto ErrReturn;
|
||
|
if (!cMFR.ReadDynStrW(wszBuf3, MAX_PATH))
|
||
|
goto ErrReturn;
|
||
|
fprintf(fpLog,
|
||
|
"%08X, %ls, %ls, %ls\n",
|
||
|
dwFlags,
|
||
|
wszBuf1,
|
||
|
wszBuf2,
|
||
|
wszBuf3);
|
||
|
}
|
||
|
|
||
|
for (i = 0; cMFR.GetAvail() > 0; i++)
|
||
|
{
|
||
|
LPCWSTR cszOpr;
|
||
|
WCHAR szRes[16];
|
||
|
|
||
|
if (!cMFR.Read(&sEntHdr, sizeof(sEntHdr)))
|
||
|
goto ErrReturn;
|
||
|
|
||
|
if (sEntHdr.dwID == RSTRLOGID_ENDOFMAP)
|
||
|
{
|
||
|
fprintf(fpLog,
|
||
|
"%4d, , , END OF MAP\n",
|
||
|
i);
|
||
|
continue;
|
||
|
}
|
||
|
else if (sEntHdr.dwID == RSTRLOGID_STARTUNDO)
|
||
|
{
|
||
|
fprintf(fpLog,
|
||
|
"%4d, , , START UNDO\n",
|
||
|
i);
|
||
|
continue;
|
||
|
}
|
||
|
else if (sEntHdr.dwID == RSTRLOGID_ENDOFUNDO)
|
||
|
{
|
||
|
fprintf(fpLog,
|
||
|
"%4d, , , END OF UNDO\n",
|
||
|
i);
|
||
|
continue;
|
||
|
}
|
||
|
else if (sEntHdr.dwID == RSTRLOGID_SNAPSHOTFAIL)
|
||
|
{
|
||
|
fprintf(fpLog,
|
||
|
"%4d, , , SNAPSHOT RESTORE FAILED : Error=%ld\n",
|
||
|
i,
|
||
|
sEntHdr.dwErr);
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
switch (sEntHdr.dwOpr)
|
||
|
{
|
||
|
case OPR_DIR_CREATE :
|
||
|
cszOpr = L"DirAdd";
|
||
|
break;
|
||
|
case OPR_DIR_RENAME :
|
||
|
cszOpr = L"DirRen";
|
||
|
break;
|
||
|
case OPR_DIR_DELETE :
|
||
|
cszOpr = L"DirDel";
|
||
|
break;
|
||
|
case OPR_FILE_ADD :
|
||
|
cszOpr = L"Create";
|
||
|
break;
|
||
|
case OPR_FILE_DELETE :
|
||
|
cszOpr = L"Delete";
|
||
|
break;
|
||
|
case OPR_FILE_MODIFY :
|
||
|
cszOpr = L"Modify";
|
||
|
break;
|
||
|
case OPR_FILE_RENAME :
|
||
|
cszOpr = L"Rename";
|
||
|
break;
|
||
|
case OPR_SETACL :
|
||
|
cszOpr = L"SetACL";
|
||
|
break;
|
||
|
case OPR_SETATTRIB :
|
||
|
cszOpr = L"Attrib";
|
||
|
break;
|
||
|
default :
|
||
|
cszOpr = L"Unknown";
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (!cMFR.ReadDynStrW(wszBuf1, SR_MAX_FILENAME_LENGTH))
|
||
|
goto ErrReturn;
|
||
|
|
||
|
if (!cMFR.ReadDynStrW(wszBuf2, SR_MAX_FILENAME_LENGTH))
|
||
|
goto ErrReturn;
|
||
|
|
||
|
if (!cMFR.ReadDynStrW(wszBuf3, SR_MAX_FILENAME_LENGTH))
|
||
|
goto ErrReturn;
|
||
|
|
||
|
if (sEntHdr.dwID == RSTRLOGID_COLLISION)
|
||
|
{
|
||
|
fprintf(fpLog,
|
||
|
"%4d, , , Collision, , , %ls, %ls, %ls\n",
|
||
|
i,
|
||
|
wszBuf1,
|
||
|
wszBuf2,
|
||
|
wszBuf3);
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
if (sEntHdr.dwRes < COUNT_RESNAME)
|
||
|
{
|
||
|
::lstrcpy(szRes, s_cszResName[sEntHdr.dwRes]);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
::wsprintf(szRes, L"%X", sEntHdr.dwRes);
|
||
|
}
|
||
|
fprintf(fpLog,
|
||
|
"%4d,%4d,%5I64d, %ls, %ls, %d, %ls, %ls, %ls\n",
|
||
|
i,
|
||
|
sEntHdr.dwID,
|
||
|
sEntHdr.llSeq,
|
||
|
cszOpr,
|
||
|
szRes,
|
||
|
sEntHdr.dwErr,
|
||
|
wszBuf1,
|
||
|
wszBuf2,
|
||
|
wszBuf3);
|
||
|
}
|
||
|
|
||
|
ErrReturn:
|
||
|
|
||
|
cMFR.Close();
|
||
|
if (NULL != fpLog)
|
||
|
{
|
||
|
fclose(fpLog);
|
||
|
}
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
// end of file
|