HRESULT RemoteDebuggerProxy::GetThreadContext(
    ICoreProcess* process, ICoreThread* thread, IRegisterSet*& regSet )
{
    _ASSERT( process != NULL );
    _ASSERT( thread != NULL );
    if ( process == NULL || thread == NULL )
        return E_INVALIDARG;

    if ( process->GetProcessType() != CoreProcess_Remote
            || thread->GetProcessType() != CoreProcess_Remote )
        return E_INVALIDARG;

    HRESULT hr = S_OK;
    ArchData* archData = process->GetArchData();
    ArchThreadContextSpec contextSpec;
    UniquePtr<BYTE[]> context;

    archData->GetThreadContextSpec( contextSpec );

    context.Attach( new BYTE[ contextSpec.Size ] );
    if ( context.IsEmpty() )
        return E_OUTOFMEMORY;

    hr = GetThreadContextNoException( process, thread, GetContextHandle(), contextSpec, context.Get() );
    if ( FAILED( hr ) )
        return hr;

    hr = archData->BuildRegisterSet( context.Get(), contextSpec.Size, regSet );
    if ( FAILED( hr ) )
        return hr;

    return S_OK;
}