SVERROR UncompressFile()

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 );
}