/****************************************************************************** * * Copyright (c) 1999 Microsoft Corporation * * Module Name: * restmap.cpp * * Abstract: * This file contains the implementation of RestoreMap apis. * * Revision History: * Kanwaljit Marok (kmarok) 06/22/1999 * created * * ******************************************************************************/ #include #include #include #include #include "restmap.h" #include "reslist.h" #include "enumlogs.h" #include "utils.h" #ifdef THIS_FILE #undef THIS_FILE #endif static char __szTraceSourceFile[] = __FILE__; #define THIS_FILE __szTraceSourceFile #include "dbgtrace.h" // // CreateRestoreMap : Creates a restore map file for a given drive and restore point number // Appends the restore map to file hFile // DWORD CreateRestoreMap(LPWSTR pszDrive, DWORD dwRPNum, HANDLE hFile) { CRestoreList resList; DWORD dwRc; WCHAR szPath[MAX_PATH]; BOOL fRet = FALSE; // enumerate backward, skipping current restore point CChangeLogEntryEnum cle_enum(pszDrive, FALSE, dwRPNum, TRUE); CChangeLogEntry cle; dwRc = cle_enum.FindFirstChangeLogEntry(cle); while (dwRc == ERROR_SUCCESS) { fRet = resList.AddMergeElement( pszDrive, cle.GetType(), cle.GetAttributes(), cle.GetFlags(), cle.GetTemp(), cle.GetPath1(), cle.GetPath2(), cle.GetAcl(), cle.GetAclSize(), cle.GetAclInline()); if (! fRet) { dwRc = ERROR_INTERNAL_ERROR; goto Exit; } dwRc = cle_enum.FindNextChangeLogEntry(cle); } // if there was an error, then we're done if (dwRc != ERROR_NO_MORE_ITEMS) goto Exit; // if there are no entries to restore, then we're done if (! fRet) goto Exit; // // Generate the restore map in the specified file. // if (! resList.GenerateRestoreMap(hFile)) { dwRc = ERROR_INTERNAL_ERROR; goto Exit; } dwRc = ERROR_SUCCESS; Exit: cle_enum.FindClose(); return dwRc; } // // AppendRestoreMapEntry : writes the restore map entry to file // BOOL AppendRestoreMapEntry( HANDLE hFile, DWORD dwOperation, DWORD dwAttribute, LPWSTR pTmpFile, LPWSTR pPathSrc, LPWSTR pPathDes, BYTE *pbAcl, DWORD cbAcl, BOOL fAclInline) { BOOL fRet = FALSE; INT cbSrc = 0, cbDes = 0, cbTemp = 0; RestoreMapEntry *pMapEnt = NULL; DWORD dwRead, dwSize; if (! pPathSrc) // something wrong goto done; cbSrc = STRSIZE(pPathSrc); // only one of pPathDes, pTmpFile and pbAcl will be non-NULL, if at all if (pTmpFile) cbTemp = STRSIZE(pTmpFile); if (pPathDes) cbDes = STRSIZE(pPathDes); dwSize = sizeof(RestoreMapEntry) - sizeof(BYTE) + cbSrc + cbTemp + cbDes + cbAcl; pMapEnt = (RestoreMapEntry *) HEAP_ALLOC(dwSize); if (! pMapEnt) goto done; pMapEnt->m_dwSize = dwSize; pMapEnt->m_dwOperation = dwOperation; pMapEnt->m_dwAttribute = dwAttribute; pMapEnt->m_cbAcl = cbAcl; pMapEnt->m_fAclInline = fAclInline; memcpy(pMapEnt->m_bData, pPathSrc, cbSrc); if (pTmpFile) memcpy((BYTE *) pMapEnt->m_bData + cbSrc, pTmpFile, cbTemp); if (pPathDes) memcpy((BYTE *) pMapEnt->m_bData + cbSrc + cbTemp, pPathDes, cbDes); if (pbAcl) memcpy((BYTE *) pMapEnt->m_bData + cbSrc + cbTemp + cbDes , pbAcl, cbAcl); fRet = WriteFile( hFile, pMapEnt, pMapEnt->m_dwSize, &dwRead, NULL ); HEAP_FREE(pMapEnt); done: return fRet; } // reads a restore map entry from a given file DWORD ReadRestoreMapEntry( HANDLE hFile, RestoreMapEntry **pprme) { DWORD dwRead, dwErr = ERROR_SUCCESS, dwSize; if (*pprme) HEAP_FREE(*pprme); if (! ReadFile(hFile, &dwSize, sizeof(DWORD), &dwRead, NULL)) { dwErr = GetLastError(); goto Err; } if (dwRead == 0 || dwSize == 0) { dwErr = ERROR_NO_MORE_ITEMS; goto Err; } *pprme = (RestoreMapEntry *) HEAP_ALLOC(dwSize); if (! *pprme) { dwErr = ERROR_INTERNAL_ERROR; goto Err; } (*pprme)->m_dwSize = dwSize; if (! ReadFile(hFile, (PVOID) ((BYTE *) (*pprme) + sizeof(DWORD)), (*pprme)->m_dwSize - sizeof(DWORD), &dwRead, NULL) || dwRead != (*pprme)->m_dwSize - sizeof(DWORD) ) { dwErr = GetLastError(); goto Err; } Err: return dwErr; } PVOID GetOptional( RestoreMapEntry *prme) { DWORD cbData = STRSIZE((LPWSTR) prme->m_bData); DWORD dwBasicSize = sizeof(RestoreMapEntry) + cbData - sizeof(BYTE); if (prme->m_dwSize > dwBasicSize) return (PVOID) (prme->m_bData + cbData); else return NULL; } void FreeRestoreMapEntry( RestoreMapEntry *prme) { HEAP_FREE(prme); }