//+--------------------------------------------------------------------------- // // 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 #include #include #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, ""); } 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