IDiaSession::getFunctionFragments_VA
Ruft die Adressen und Längen nicht zusammenhängender Fragmente für die Funktion an der angegebenen virtuellen Adresse (VA) ab.
Syntax
HRESULT getFunctionFragments_VA(
ULONGLONG vaFunc,
DWORD cbFunc,
DWORD cFragments,
ULONGLONG *pVaFragment,
DWORD *pLenFragment
);
Parameter
vaFunc
[in] Die virtuelle Adresse der Funktion.
cbFunc
[in] Die Gesamtgröße in Byte der Funktion (d. a. die Länge der Funktion).
cFragments
[in] Die Anzahl der elemente, die für pVaFragment
und pLenFragment
zugeordnet sind.
pVaFragment
[out] Arraypuffer, der die virtuellen Adressen jedes Fragments empfängt. Dies muss mindestens cFragments
lang sein.
pLenFragment
[out] Arraypuffer, der die Länge jedes Fragments in Byte empfängt. Dies muss mindestens cFragments
lang sein.
Rückgabewert
Wenn dies erfolgreich ist, wird S_OK
zurückgegeben; andernfalls wird ein Fehlercode zurückgegeben.
Beispiel
Hier erfahren Sie, wie Sie die Adresse und Länge einer Funktion über IDiaSymbol
abrufen, dann die Anzahl der Fragmente abrufen, den Satz von Funktionsfragmenten abrufen und diese dann als Liste der Start- und Endadressen drucken.
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;
}