IDiaSession::getFunctionFragments_RVA
Récupère les adresses et les longueurs des fragments discontigués pour la fonction au niveau de l’adresse virtuelle relative (RVA) spécifiée.
Syntaxe
HRESULT getFunctionFragments_RVA(
DWORD rvaFunc,
DWORD cbFunc,
DWORD cFragments,
DWORD *pRvaFragment,
DWORD *pLenFragment
);
Paramètres
rvaFunc
[in] Adresse virtuelle relative de la fonction.
cbFunc
[in] Taille totale en octets de la fonction (autrement dit, la longueur de la fonction).
cFragments
[in] Nombre d’éléments alloués pour pRvaFragment
et pLenFragment
.
pRvaFragment
[out] Mémoire tampon de tableau pour recevoir les adresses virtuelles relatives de chaque fragment. Cela doit être au moins cFragments
long.
pLenFragment
[out] Mémoire tampon de tableau pour recevoir la longueur, en octets, de chaque fragment. Cela doit être au moins cFragments
long.
Valeur de retour
En cas de réussite, retourne S_OK
, sinon, retourne un code d'erreur.
Exemple
Cela montre comment récupérer l’adresse et la longueur d’une fonction via IDiaSymbol
, puis le nombre de fragments, récupérer le jeu de fragments de fonction, puis les imprimer sous forme de liste d’adresses de début et de fin.
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;
}