Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Hämtar adresserna och längden på sammanhängande fragment för funktionen vid den angivna virtuella adressen (VA).
Syntax
HRESULT getFunctionFragments_VA(
ULONGLONG vaFunc,
DWORD cbFunc,
DWORD cFragments,
ULONGLONG *pVaFragment,
DWORD *pLenFragment
);
Parametrar
vaFunc
[i] Funktionens virtuella adress.
cbFunc
[i] Den totala storleken i byte för funktionen (det vill: funktionens längd).
cFragments
[i] Antalet element som allokerats för pVaFragment och pLenFragment.
pVaFragment
[ut] Matrisbuffert för att ta emot de virtuella adresserna för varje fragment. Detta måste vara minst cFragments långt.
pLenFragment
[ut] Matrisbuffert för att ta emot längden i byte för varje fragment. Detta måste vara minst cFragments långt.
Returvärde
Om det lyckas returnerar S_OK; annars returneras en felkod.
Exempel
Detta visar hur du hämtar adressen och längden på en funktion via IDiaSymbol, sedan antalet fragment, hämtar uppsättningen funktionsfragment och sedan skriver ut dem som en lista över start- och slutadresser.
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;
}