IDiaSession::getFunctionFragments_VA
指定された仮想アドレス (VA) にある関数の連続しないフラグメントのアドレスと長さを取得します。
構文
HRESULT getFunctionFragments_VA(
ULONGLONG vaFunc,
DWORD cbFunc,
DWORD cFragments,
ULONGLONG *pVaFragment,
DWORD *pLenFragment
);
パラメーター
vaFunc
[in]関数の仮想アドレス。
cbFunc
[in]関数の合計サイズ (つまり、関数の長さ)。
cFragments
[in]pVaFragment
および pLenFragment
に割り当てられた要素の数。
pVaFragment
[out]各フラグメントの仮想アドレスを受信する配列バッファー。 これは、少なくとも cFragments
長くする必要があります。
pLenFragment
[out]各フラグメントの長さをバイト単位で受け取る配列バッファー。 これは、少なくとも cFragments
長くする必要があります。
戻り値
成功した場合は、S_OK
を返します。それ以外の場合は、エラー コードを返します。
例
ここでは、IDiaSymbol
を使用して関数のアドレスと長さを取得し、フラグメントの数を取得し、関数フラグメントのセットを取得し、開始アドレスと終了アドレスの一覧として出力する方法を示します。
HRESULT PrintFunctionFragments(CComPtr<IDiaSymbol> pFunc) {
ULONGLONG vaStart = 0;
ULONGLONG cbFunc = 0;
HRESULT hr = pFunc->get_relativeVirtualAddress(&vaStart);
if (FAILED(hr)) {
return hr;
}
hr = pFunc->get_length(&cbFunc);
if (FAILED(hr)) {
return hr;
}
DWORD cFragments = 0;
hr = pSession->getNumberOfFunctionFragments_VA(vaStart, (DWORD) cbFunc, &cFragments);
if (FAILED(hr)) {
return hr;
}
ULONGLONG * rgVA = new (std::nothrow) ULONGLONG[cFragments];
if (rgVA == nullptr) {
return E_OUTOFMEMORY;
}
DWORD * rgLen = new (std::nothrow) DWORD[cFragments];
if (rgLen == nullptr) {
delete[] rgVA;
return E_OUTOFMEMORY;
}
hr = pSession->getFunctionFragments_VA(vaStart, (DWORD) cbFunc, cFragments, rgVA, rgLen);
if (FAILED(hr)) {
delete[] rgVA;
delete[] rgLen;
return hr;
}
for (DWORD i = 0; i < cFragments; i++) {
printf(" %016llX -- %016llX\n", rgVA[i], rgVA[i] + rgLen[i] - 1);
}
delete [] rgVA;
delete [] rgLen;
return S_OK;
}