Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ruft die Adressen und Längen nicht zusammenhängender Fragmente für die Funktion an der angegebenen relativen virtuellen Adresse (RVA) ab.
Syntax
HRESULT getFunctionFragments_RVA(
DWORD rvaFunc,
DWORD cbFunc,
DWORD cFragments,
DWORD *pRvaFragment,
DWORD *pLenFragment
);
Parameter
rvaFunc
[in] Die relative 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 pRvaFragment und pLenFragmentzugeordnet sind.
pRvaFragment
[out] Arraypuffer zum Empfangen der relativen virtuellen Adressen jedes Fragments. 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_OKzurückgegeben; andernfalls wird ein Fehlercode zurückgegeben.
Beispiel
Hier erfahren Sie, wie Sie die Adresse und Länge einer Funktion über IDiaSymbolabrufen, 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) {
DWORD rvaStart = 0;
ULONGLONG cbFunc = 0;
HRESULT hr = pFunc->get_relativeVirtualAddress(&rvaStart);
if (FAILED(hr)) {
return hr;
}
hr = pFunc->get_length(&cbFunc);
if (FAILED(hr)) {
return hr;
}
DWORD cFragments = 0;
hr = pSession->getNumberOfFunctionFragments_RVA(rvaStart, (DWORD) cbFunc, &cFragments);
if (FAILED(hr)) {
return hr;
}
DWORD * rgRVA = new (std::nothrow) DWORD[cFragments];
if (rgRVA == nullptr) {
return E_OUTOFMEMORY;
}
DWORD * rgLen = new (std::nothrow) DWORD[cFragments];
if (rgLen == nullptr) {
delete[] rgRVA;
return E_OUTOFMEMORY;
}
hr = pSession->getFunctionFragments_RVA(rvaStart, (DWORD) cbFunc, cFragments, rgRVA, rgLen);
if (FAILED(hr)) {
delete[] rgRVA;
delete[] rgLen;
return hr;
}
for (DWORD i = 0; i < cFragments; i++) {
printf(" %08X -- %08X\n", rgRVA[i], rgRVA[i] + rgLen[i] - 1);
}
delete [] rgRVA;
delete [] rgLen;
return S_OK;
}