Partager via


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

Voir aussi