You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
477 lines
12 KiB
477 lines
12 KiB
/******************************************************************************
|
|
|
|
Copyright (c) 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
logfile.cpp
|
|
|
|
Abstract:
|
|
This file contains the implementation of CRestoreLogFile class and
|
|
::CreateRestoreLogFile.
|
|
|
|
Revision History:
|
|
Seong Kook Khang (SKKhang) 06/21/00
|
|
created
|
|
|
|
******************************************************************************/
|
|
|
|
#include "stdwin.h"
|
|
#include "rstrcore.h"
|
|
#include "resource.h"
|
|
|
|
|
|
static LPCWSTR s_cszLogFile = L"%SystemRoot%\\system32\\restore\\rstrlog.dat";
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CRestoreLogFile construction / destruction
|
|
|
|
CRestoreLogFile::CRestoreLogFile()
|
|
{
|
|
m_szLogFile[0] = L'\0';
|
|
m_hfLog = INVALID_HANDLE_VALUE;
|
|
}
|
|
|
|
CRestoreLogFile::~CRestoreLogFile()
|
|
{
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CRestoreLogFile - methods
|
|
|
|
BOOL
|
|
CRestoreLogFile::Open()
|
|
{
|
|
TraceFunctEnter("CRestoreLogFile::Open");
|
|
BOOL fRet = FALSE;
|
|
LPCWSTR cszErr;
|
|
SRstrLogHdrBase sHdrBase;
|
|
DWORD dwRes;
|
|
|
|
if ( m_hfLog != INVALID_HANDLE_VALUE )
|
|
{
|
|
ErrorTrace(0, "File is already opened...");
|
|
goto Exit;
|
|
}
|
|
|
|
if ( !Init() )
|
|
goto Exit;
|
|
|
|
m_hfLog = ::CreateFile( m_szLogFile, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL );
|
|
if ( m_hfLog == INVALID_HANDLE_VALUE )
|
|
{
|
|
cszErr = ::GetSysErrStr();
|
|
ErrorTrace(0, "::CreateFile failed - %ls", cszErr);
|
|
goto Exit;
|
|
}
|
|
|
|
READFILE_AND_VALIDATE( m_hfLog, &sHdrBase, sizeof(SRstrLogHdrBase), dwRes, Exit );
|
|
|
|
if ( ( sHdrBase.dwSig1 != RSTRLOG_SIGNATURE1 ) ||
|
|
( sHdrBase.dwSig2 != RSTRLOG_SIGNATURE2 ) ||
|
|
( sHdrBase.dwVer != RSTRLOG_VERSION ) )
|
|
{
|
|
ErrorTrace(0, "Invalid restore log file header signature...");
|
|
goto Exit;
|
|
}
|
|
|
|
fRet = TRUE;
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( fRet );
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
BOOL
|
|
CRestoreLogFile::Close()
|
|
{
|
|
TraceFunctEnter("CRestoreLogFile::Close");
|
|
BOOL fRet = TRUE;
|
|
|
|
if ( m_hfLog != INVALID_HANDLE_VALUE )
|
|
{
|
|
fRet = ::CloseHandle( m_hfLog );
|
|
if ( fRet )
|
|
m_hfLog = INVALID_HANDLE_VALUE;
|
|
}
|
|
|
|
TraceFunctLeave();
|
|
return( fRet );
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
BOOL
|
|
CRestoreLogFile::ReadHeader( SRstrLogHdrV3 *pRPInfo, CRDIArray &aryDrv )
|
|
{
|
|
TraceFunctEnter("CRestoreLogFile::ReadHeader");
|
|
BOOL fRet = FALSE;
|
|
SRstrLogHdrBase sHdr;
|
|
DWORD dwRes;
|
|
DWORD i;
|
|
CRstrDriveInfo *pRDI = NULL;
|
|
|
|
if ( m_hfLog == INVALID_HANDLE_VALUE )
|
|
{
|
|
ErrorTrace(0, "File is not opened...");
|
|
goto Exit;
|
|
}
|
|
|
|
READFILE_AND_VALIDATE( m_hfLog, pRPInfo, sizeof(SRstrLogHdrV3), dwRes, Exit );
|
|
|
|
// read drive table information
|
|
for ( i = 0; i < pRPInfo->dwDrives; i++ )
|
|
{
|
|
|
|
if ( !CreateAndLoadDriveInfoInstance( m_hfLog, &pRDI ) )
|
|
goto Exit;
|
|
|
|
if ( !aryDrv.AddItem( pRDI ) )
|
|
goto Exit;
|
|
pRDI = NULL;
|
|
}
|
|
|
|
fRet = TRUE;
|
|
Exit:
|
|
if ( !fRet )
|
|
{
|
|
aryDrv.DeleteAll();
|
|
SAFE_RELEASE(pRDI);
|
|
}
|
|
|
|
TraceFunctLeave();
|
|
return( fRet );
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
BOOL
|
|
CRestoreLogFile::AppendHeader( SRstrLogHdrV3Ex *pExtInfo )
|
|
{
|
|
TraceFunctEnter("CRestoreLogFile::AppendHeader");
|
|
BOOL fRet = FALSE;
|
|
DWORD dwRes;
|
|
|
|
if ( m_hfLog == INVALID_HANDLE_VALUE )
|
|
{
|
|
ErrorTrace(0, "File is not opened...");
|
|
goto Exit;
|
|
}
|
|
|
|
// Assuming ReadHeader has been called to move file pointer to a proper location.
|
|
// Review if explicit setting of file pointer would be necessary.
|
|
|
|
WRITEFILE_AND_VALIDATE( m_hfLog, pExtInfo, sizeof(SRstrLogHdrV3Ex), dwRes, Exit );
|
|
|
|
fRet = TRUE;
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( fRet );
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
BOOL
|
|
CRestoreLogFile::WriteEntry( DWORD dwID, CRestoreMapEntry *pEnt, LPCWSTR cszMount )
|
|
{
|
|
TraceFunctEnter("CRestoreLogFile::WriteEntry");
|
|
BOOL fRet = FALSE;
|
|
BYTE *pBuf = NULL;
|
|
SRstrEntryHdr *pEntHdr;
|
|
DWORD dwSize;
|
|
DWORD dwRes;
|
|
WCHAR szTemp[SR_MAX_FILENAME_LENGTH];
|
|
DWORD cbBuf;
|
|
|
|
if ( m_hfLog == INVALID_HANDLE_VALUE )
|
|
{
|
|
ErrorTrace(0, "File is not opened...");
|
|
goto Exit;
|
|
}
|
|
|
|
cbBuf = sizeof(SRstrEntryHdr);
|
|
if (pEnt->GetPath1())
|
|
cbBuf += (lstrlen(pEnt->GetPath1())+1)*sizeof(WCHAR);
|
|
|
|
if (pEnt->GetPath2())
|
|
cbBuf += (lstrlen(pEnt->GetPath2())+1)*sizeof(WCHAR);
|
|
|
|
if (pEnt->GetAltPath())
|
|
cbBuf += (lstrlen(pEnt->GetAltPath())+1)*sizeof(WCHAR);
|
|
|
|
pBuf = (BYTE *) SRMemAlloc(cbBuf);
|
|
if (! pBuf)
|
|
{
|
|
trace(0, "! SRMemAlloc for pBuf");
|
|
goto Exit;
|
|
}
|
|
|
|
pEntHdr = (SRstrEntryHdr*) pBuf;
|
|
pEntHdr->dwID = dwID;
|
|
pEntHdr->dwOpr = pEnt->GetOpCode();
|
|
pEntHdr->llSeq = pEnt->GetSeqNum();
|
|
pEntHdr->dwRes = pEnt->GetResult();
|
|
pEntHdr->dwErr = pEnt->GetError();
|
|
dwSize = sizeof(SRstrEntryHdr);
|
|
|
|
// change \\?\Volume{Guid}\path to <Mountpoint>\Path
|
|
wsprintf(szTemp, L"%s\\%s", cszMount, PathFindNextComponent(pEnt->GetPath1()+4));
|
|
dwSize += ::StrCpyAlign4( pBuf+dwSize, szTemp );
|
|
|
|
if (pEnt->GetPath2())
|
|
wsprintf(szTemp, L"%s\\%s", cszMount, PathFindNextComponent(pEnt->GetPath2()+4));
|
|
dwSize += ::StrCpyAlign4( pBuf+dwSize, pEnt->GetPath2() ? szTemp : NULL );
|
|
|
|
if (pEnt->GetAltPath())
|
|
wsprintf(szTemp, L"%s\\%s", cszMount, PathFindNextComponent(pEnt->GetAltPath()+4));
|
|
dwSize += ::StrCpyAlign4( pBuf+dwSize, pEnt->GetAltPath() ? szTemp : NULL );
|
|
|
|
WRITEFILE_AND_VALIDATE( m_hfLog, pBuf, dwSize, dwRes, Exit );
|
|
|
|
fRet = TRUE;
|
|
Exit:
|
|
if (pBuf)
|
|
SRMemFree(pBuf);
|
|
|
|
TraceFunctLeave();
|
|
return( fRet );
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
BOOL
|
|
CRestoreLogFile::WriteCollisionEntry( LPCWSTR cszSrc, LPCWSTR cszDst, LPCWSTR cszMount )
|
|
{
|
|
TraceFunctEnter("CRestoreLogFile::WriteCollisionEntry");
|
|
BOOL fRet = FALSE;
|
|
BYTE *pBuf = NULL;
|
|
SRstrEntryHdr *pEntHdr;
|
|
DWORD dwSize;
|
|
DWORD dwRes;
|
|
WCHAR szTemp[SR_MAX_FILENAME_LENGTH];
|
|
DWORD cbBuf;
|
|
|
|
if ( m_hfLog == INVALID_HANDLE_VALUE )
|
|
{
|
|
ErrorTrace(0, "File is not opened...");
|
|
goto Exit;
|
|
}
|
|
|
|
cbBuf = sizeof(SRstrEntryHdr);
|
|
if (cszSrc)
|
|
cbBuf += (lstrlen(cszSrc)+1)*sizeof(WCHAR);
|
|
|
|
if (cszDst)
|
|
cbBuf += (lstrlen(cszDst)+1)*sizeof(WCHAR);
|
|
|
|
pBuf = (BYTE *) SRMemAlloc(cbBuf);
|
|
if (! pBuf)
|
|
{
|
|
trace(0, "! SRMemAlloc for pBuf");
|
|
goto Exit;
|
|
}
|
|
|
|
pEntHdr = (SRstrEntryHdr*) pBuf;
|
|
pEntHdr->dwID = RSTRLOGID_COLLISION;
|
|
pEntHdr->dwOpr = 0;
|
|
pEntHdr->dwRes = 0;
|
|
pEntHdr->dwErr = 0;
|
|
dwSize = sizeof(SRstrEntryHdr);
|
|
|
|
wsprintf(szTemp, L"%s\\%s", cszMount, PathFindNextComponent(cszSrc+4));
|
|
dwSize += ::StrCpyAlign4( pBuf+dwSize, szTemp );
|
|
wsprintf(szTemp, L"%s\\%s", cszMount, PathFindNextComponent(cszDst+4));
|
|
dwSize += ::StrCpyAlign4( pBuf+dwSize, szTemp );
|
|
dwSize += ::StrCpyAlign4( pBuf+dwSize, NULL );
|
|
|
|
WRITEFILE_AND_VALIDATE( m_hfLog, pBuf, dwSize, dwRes, Exit );
|
|
|
|
fRet = TRUE;
|
|
Exit:
|
|
if (pBuf)
|
|
SRMemFree(pBuf);
|
|
|
|
TraceFunctLeave();
|
|
return( fRet );
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
BOOL
|
|
CRestoreLogFile::WriteMarker( DWORD dwMarker, DWORD dwErr )
|
|
{
|
|
TraceFunctEnter("CRestoreLogFile::WriteMarker");
|
|
BOOL fRet = FALSE;
|
|
BYTE szBuf[MAX_PATH];
|
|
SRstrEntryHdr *pEntHdr = (SRstrEntryHdr*)szBuf;
|
|
DWORD dwSize;
|
|
DWORD dwRes;
|
|
|
|
if ( m_hfLog == INVALID_HANDLE_VALUE )
|
|
{
|
|
ErrorTrace(0, "File is not opened...");
|
|
goto Exit;
|
|
}
|
|
|
|
pEntHdr->dwID = dwMarker;
|
|
pEntHdr->dwOpr = 0;
|
|
pEntHdr->dwRes = 0;
|
|
pEntHdr->dwErr = dwErr;
|
|
dwSize = sizeof(SRstrEntryHdr);
|
|
|
|
WRITEFILE_AND_VALIDATE( m_hfLog, szBuf, dwSize, dwRes, Exit );
|
|
|
|
fRet = TRUE;
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( fRet );
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
BOOL
|
|
CRestoreLogFile::IsValid()
|
|
{
|
|
TraceFunctEnter("CRestoreLogFile::IsValid");
|
|
TraceFunctLeave();
|
|
return( TRUE );
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
BOOL
|
|
CRestoreLogFile::Release()
|
|
{
|
|
TraceFunctEnter("CRestoreLogFile::Release");
|
|
Close();
|
|
delete this;
|
|
TraceFunctLeave();
|
|
return( TRUE );
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CRestoreLogFile operations
|
|
|
|
BOOL
|
|
CRestoreLogFile::Init()
|
|
{
|
|
TraceFunctEnter("CRestoreLogFile::Init");
|
|
BOOL fRet = FALSE;
|
|
|
|
// Construct internal file pathes
|
|
if ( ::ExpandEnvironmentStrings( s_cszLogFile, m_szLogFile, MAX_PATH ) == 0 )
|
|
{
|
|
LPCWSTR cszErr = ::GetSysErrStr();
|
|
ErrorTrace(0, "::ExpandEnvironmentString failed - %ls", cszErr);
|
|
goto Exit;
|
|
}
|
|
|
|
fRet = TRUE;
|
|
Exit:
|
|
TraceFunctLeave();
|
|
return( fRet );
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CreateRestoreLogFile function
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
BOOL
|
|
CreateRestoreLogFile( SRstrLogHdrV3 *pRPInfo, CRDIArray &aryDrv )
|
|
{
|
|
TraceFunctEnter("CreateRestoreLogFile");
|
|
BOOL fRet = FALSE;
|
|
LPCWSTR cszErr;
|
|
WCHAR szLogFile[MAX_PATH];
|
|
HANDLE hfLog = INVALID_HANDLE_VALUE;
|
|
SRstrLogHdrBase sHdr;
|
|
DWORD dwRes;
|
|
DWORD i;
|
|
|
|
// Construct internal file pathes
|
|
if ( ::ExpandEnvironmentStrings( s_cszLogFile, szLogFile, MAX_PATH ) == 0 )
|
|
{
|
|
cszErr = ::GetSysErrStr();
|
|
ErrorTrace(0, "::ExpandEnvironmentString failed - %ls", cszErr);
|
|
goto Exit;
|
|
}
|
|
|
|
// create log file, write header
|
|
hfLog = ::CreateFile( szLogFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_WRITE_THROUGH, NULL );
|
|
if ( hfLog == INVALID_HANDLE_VALUE )
|
|
{
|
|
cszErr = ::GetSysErrStr();
|
|
ErrorTrace(0, "::CreateFile failed - %ls", cszErr);
|
|
goto Exit;
|
|
}
|
|
|
|
sHdr.dwSig1 = RSTRLOG_SIGNATURE1;
|
|
sHdr.dwSig2 = RSTRLOG_SIGNATURE2;
|
|
sHdr.dwVer = RSTRLOG_VERSION;
|
|
WRITEFILE_AND_VALIDATE( hfLog, &sHdr, sizeof(SRstrLogHdrBase), dwRes, Exit );
|
|
WRITEFILE_AND_VALIDATE( hfLog, pRPInfo, sizeof(SRstrLogHdrV3), dwRes, Exit );
|
|
|
|
// write drive table information
|
|
for ( i = 0; i < pRPInfo->dwDrives; i++ )
|
|
{
|
|
if ( !aryDrv[i]->SaveToLog( hfLog ) )
|
|
goto Exit;
|
|
}
|
|
|
|
fRet = TRUE;
|
|
Exit:
|
|
if ( hfLog != INVALID_HANDLE_VALUE )
|
|
::CloseHandle( hfLog );
|
|
TraceFunctLeave();
|
|
return( fRet );
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// OpenRestoreLogFile function
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
BOOL
|
|
OpenRestoreLogFile( CRestoreLogFile **ppLogFile )
|
|
{
|
|
TraceFunctEnter("OpenRestoreLogFile");
|
|
BOOL fRet = FALSE;
|
|
CRestoreLogFile *pLogFile=NULL;
|
|
|
|
if ( ppLogFile == NULL )
|
|
{
|
|
ErrorTrace(0, "Invalid parameter, ppLogFile is NULL.");
|
|
goto Exit;
|
|
}
|
|
*ppLogFile = NULL;
|
|
|
|
pLogFile = new CRestoreLogFile;
|
|
if ( pLogFile == NULL )
|
|
{
|
|
ErrorTrace(0, "Insufficient memory...");
|
|
goto Exit;
|
|
}
|
|
|
|
if ( !pLogFile->Open() )
|
|
goto Exit;
|
|
|
|
*ppLogFile = pLogFile;
|
|
|
|
fRet = TRUE;
|
|
Exit:
|
|
if ( !fRet )
|
|
SAFE_RELEASE(pLogFile);
|
|
TraceFunctLeave();
|
|
return( fRet );
|
|
}
|
|
|
|
|
|
// end of file
|