in host/common/hostagenthelpers.cpp [1816:1958]
SVERROR UncompressFile( char *pszFilename )
{
HRESULT hr = S_OK;
PROCESS_INFORMATION ProcessInfo = { 0 };
STARTUPINFO StartupInfo = { 0 };
StartupInfo.cb = sizeof( StartupInfo );
char szUnzipExe[ SV_MAX_PATH ];
DWORD dwWaitReturn = 0;
DWORD dwResult = 0;
DWORD dwCount = 0;
CRegKey cregkey;
do
{
//
// We only uncompress the file if it ends with a '.gz' extension
//
if( endsWith( pszFilename, ".dat", false ) )
{
hr = S_FALSE;
break;
}
DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
DebugPrintf( "ENTERED UncompressFile()...\n" );
dwResult = cregkey.Open( HKEY_LOCAL_MACHINE,
SV_VALUE_NAME );
if( ERROR_SUCCESS != dwResult )
{
hr = HRESULT_FROM_WIN32( dwResult );
DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
DebugPrintf( hr, "FAILED cregkey.Open()... hr = %08X\n", hr );
break;
}
dwCount = sizeof( szUnzipExe );
dwResult = cregkey.QueryStringValue( "UncompressExe", szUnzipExe, &dwCount );
if( ERROR_SUCCESS != dwResult )
{
hr = HRESULT_FROM_WIN32( dwResult );
DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
DebugPrintf( hr, "FAILED cregkey.QueryValue()... hr = %08X\n", hr );
break;
}
char szArgs[ 2*SV_MAX_PATH ];
inm_strcpy_s( szArgs, ARRAYSIZE(szArgs), "\"" );
inm_strcat_s( szArgs, ARRAYSIZE(szArgs), szUnzipExe );
inm_strcat_s( szArgs, ARRAYSIZE(szArgs), "\"" );
inm_strcat_s( szArgs, ARRAYSIZE(szArgs), " " );
inm_strcat_s( szArgs, ARRAYSIZE(szArgs), "-f" );
inm_strcat_s( szArgs, ARRAYSIZE(szArgs), " " );
inm_strcat_s( szArgs, ARRAYSIZE(szArgs), " \"" );
inm_strcat_s( szArgs, ARRAYSIZE(szArgs), pszFilename );
inm_strcat_s( szArgs, ARRAYSIZE(szArgs), "\"" );
DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
DebugPrintf( "CALLING CreateProcess(%s)...\n", szArgs );
if( !CreateProcess( NULL, //szUnzipExe,
szArgs,
NULL,
NULL,
FALSE,
CREATE_DEFAULT_ERROR_MODE,
NULL,
NULL,
&StartupInfo,
&ProcessInfo ) )
{
hr = HRESULT_FROM_WIN32( GetLastError() );
DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
DebugPrintf( hr, "FAILED CreateProcess(%s)... hr = %08X\n", szArgs, hr );
break;
}
DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
DebugPrintf( "CALLING WaitForSingleObject()...\n" );
dwWaitReturn = WaitForSingleObject( ProcessInfo.hProcess, INFINITE );
if( WAIT_OBJECT_0 == dwWaitReturn )
{
//
// Check for the return code of the Uncompress. If it fails, quit.
//
DWORD dwProcessExitCode = 0;
if( !GetExitCodeProcess( ProcessInfo.hProcess, &dwProcessExitCode ) )
{
hr = HRESULT_FROM_WIN32( GetLastError() );
DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
DebugPrintf( hr, "FAILED GetExitCodeProcess()... hr = %08X\n", hr );
break;
}
else
{
if( 0 != dwProcessExitCode )
{
hr = E_FAIL;
DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
DebugPrintf( hr, "FAILED Uncompress... Error Code: %d... Exiting... hr = %08X\n", dwProcessExitCode, hr );
break;
}
else
{
DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
DebugPrintf( "Uncompress Successful...\n" );
}
}
}
else if( WAIT_ABANDONED == dwWaitReturn )
{
hr = E_FAIL;
DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
DebugPrintf( hr, "FAILED WaitForSingleObject()... hr = %08X\n", hr );
break;
}
else if( WAIT_FAILED == dwWaitReturn )
{
hr = HRESULT_FROM_WIN32( GetLastError() );
DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
DebugPrintf( hr, "FAILED WaitForSingleObject()... hr = %08X\n", hr );
break;
}
pszFilename[ strlen( pszFilename ) - 3 ] = '\0';
}
while( FALSE );
if( ( NULL != ProcessInfo.hProcess ) &&
( INVALID_HANDLE_VALUE != ProcessInfo.hProcess ) )
{
CloseHandle( ProcessInfo.hProcess );
}
if( ( NULL != ProcessInfo.hThread ) &&
( INVALID_HANDLE_VALUE != ProcessInfo.hThread ) )
{
CloseHandle( ProcessInfo.hThread );
}
return( hr );
}