windows-nt/Source/XPSP1/NT/admin/pchealth/sr/nttest/srdiag2/getrstrlog.cxx
2020-09-26 16:20:57 +08:00

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