Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Récupère les adresses et les longueurs des fragments discontigués pour la fonction à l’adresse virtuelle spécifiée (VA).
Syntaxe
HRESULT getFunctionFragments_VA(
ULONGLONG vaFunc,
DWORD cbFunc,
DWORD cFragments,
ULONGLONG *pVaFragment,
DWORD *pLenFragment
);
Paramètres
vaFunc
[in] Adresse virtuelle 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 pVaFragment et pLenFragment.
pVaFragment
[out] Mémoire tampon de tableau pour recevoir les adresses virtuelles 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
Si elle réussit, 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 l’ensemble des fragments de fonction, puis les imprimer sous forme de liste d’adresses de début et de fin.
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;
}