// Internal Worker for GetStackWalkCurrentContext(). void DacDbiInterfaceImpl::GetStackWalkCurrentContext(StackFrameIterator * pIter, DT_CONTEXT * pContext) { // convert the current REGDISPLAY to a CONTEXT CrawlFrame * pCF = &(pIter->m_crawl); UpdateContextFromRegDisp(pCF->GetRegisterSet(), reinterpret_cast<T_CONTEXT *>(pContext)); }
HRESULT STDMETHODCALLTYPE ClrDataStackWalk::GetContext( /* [in] */ ULONG32 contextFlags, /* [in] */ ULONG32 contextBufSize, /* [out] */ ULONG32 *contextSize, /* [size_is][out] */ BYTE contextBuf[ ]) { HRESULT status; if (contextSize) { *contextSize = ContextSizeForFlags(contextFlags); } if (!CheckContextSizeForFlags(contextBufSize, contextFlags)) { return E_INVALIDARG; } DAC_ENTER_SUB(m_dac); EX_TRY { if (!m_frameIter.IsValid()) { status = S_FALSE; } else { *(PT_CONTEXT)contextBuf = m_context; UpdateContextFromRegDisp(&m_regDisp, (PT_CONTEXT)contextBuf); status = S_OK; } } EX_CATCH { if (!DacExceptionFilter(GET_EXCEPTION(), m_dac, &status)) { EX_RETHROW; } } EX_END_CATCH(SwallowAllExceptions) DAC_LEAVE(); return status; }