in host/common/hostagenthelpers.cpp [1192:1354]
HRESULT ProcessAndApplyDeltaFile( char const* filename,
HANDLE handleVolume,
SV_FileList *pCurSV_FileList) //Used for transmitting status to the SV box
{
HRESULT hr = S_OK;
SVD_PREFIX prefix = { 0 };
char* buffer = NULL;
unsigned bufferSize = 0;
FILE* file = NULL;
BOOL bFixInvalidFile = FALSE;
do
{
DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
DebugPrintf( "ENTERED ProcessAndApplyDeltaFile()...\n" );
DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
DebugPrintf( "CALLING fopen()...\n" );
file = fopen( filename, "rb" );
if( NULL == file )
{
hr = E_INVALIDARG;
DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
DebugPrintf( hr, "FAILED ProcessAndApplyDeltaFile(%s)... hr = %08X\n", filename, hr );
break;
}
while( TRUE )
{
if( 1 != fread( &prefix, sizeof( prefix ), 1, file ) )
{
break;
}
switch( prefix.tag )
{
default:
hr = E_FAIL;
DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
DebugPrintf( "FAILED Invalid Tag... (0x%08X) %s\n", prefix.tag, filename );
if( 0x1000 == prefix.tag && !bFixInvalidFile )
{
DebugPrintf( "WARNING Attempting fixup %s\n", filename );
fseek( file, 0, SEEK_SET );
bFixInvalidFile = TRUE;
hr = S_OK;
}
//assert( !"Invalid Tag" );
break;
case SVD_TAG_HEADER1:
DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
DebugPrintf( "Got SVD_TAG_HEADER1...\n" );
if( ( prefix.count*sizeof( SVD_HEADER1 ) ) > bufferSize )
{
delete [] buffer;
INM_SAFE_ARITHMETIC(bufferSize = prefix.count*InmSafeInt<size_t>::Type(sizeof( SVD_HEADER1 )), INMAGE_EX(prefix.count)(sizeof( SVD_HEADER1 )))
buffer = new char[ bufferSize];
if( NULL == buffer )
{
break;
}
}
if( 1 != fread( buffer,
prefix.count*sizeof( SVD_HEADER1 ),
1,
file ) )
{
break;
}
hr = OnHeader( (SVD_HEADER1*) buffer,
prefix.count*sizeof( SVD_HEADER1 ) );
break;
case SVD_TAG_TIME_STAMP_OF_FIRST_CHANGE:
//__asm int 3 ;
DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
DebugPrintf( "Got SVD_TAG_TIME_STAMP_OF_FIRST_CHANGE...\n" );
if ( 0 != fseek(file, prefix.count*sizeof( SVD_TIME_STAMP ), SEEK_CUR) )
{
hr = E_FAIL ;
break ;
}
break;
case SVD_TAG_USER:
DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
DebugPrintf( "Got SVD_USER_DEFINED_TAG...\n" );
assert(prefix.count == 1);
if ( 0 != fseek(file, prefix.Flags, SEEK_CUR) )
{
hr = E_FAIL;
break;
}
break;
case SVD_TAG_LENGTH_OF_DRTD_CHANGES:
DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
DebugPrintf( "Got SVD_TAG_LENGTH_OF_DRTD_CHANGE...\n" );
if ( 0 != fseek(file, prefix.count*sizeof(ULARGE_INTEGER ), SEEK_CUR) )
{
hr = E_FAIL ;
break ;
}
break;
case SVD_TAG_DIRTY_BLOCK_DATA:
DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
DebugPrintf( "Got SVD_TAG_DIRTY_BLOCK_DATA...\n" );
DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
DebugPrintf( "CALLING OnDirtyBlockData()...\n" );
if( bFixInvalidFile )
{
prefix.count++;
bFixInvalidFile = FALSE;
}
hr = OnDirtyBlockData( file,
handleVolume,
pCurSV_FileList, //Used for transmitting status to the SV box
prefix.count);
break;
case SVD_TAG_TIME_STAMP_OF_LAST_CHANGE :
DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
DebugPrintf( "Got SVD_TAG_TIME_STAMP_OF_LAST_CHANGE...\n" );
if ( 0 != fseek(file, sizeof( SVD_TIME_STAMP ), SEEK_CUR ) )
{
hr = E_FAIL ;
// break ;
}
break;
}
if( FAILED( hr ) )
{
break;
}
}
if( FAILED( hr ) )
{
DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
DebugPrintf( hr, "FAILED ProcessAndApplyDeltaFile()... hr = %08X\n", hr );
break;
}
}
while( FALSE );
if( NULL != file )
{
fclose( file );
}
delete [] buffer;
return( hr );
}