Partager via


IDiaSession ::getFunctionFragments_VA

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;
}

Voir aussi