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