Leaked source code of windows server 2003
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

/******************************************************************************
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