Dela via


IDiaSession::getFunctionFragments_VA

Hämtar adresserna och längden på sammanhängande fragment för funktionen vid den angivna virtuella adressen (VA).

Syntax

HRESULT getFunctionFragments_VA(
    ULONGLONG vaFunc,
    DWORD cbFunc,
    DWORD cFragments,
    ULONGLONG *pVaFragment,
    DWORD *pLenFragment
);

Parametrar

vaFunc

[i] Funktionens virtuella adress.

cbFunc

[i] Den totala storleken i byte för funktionen (det vill: funktionens längd).

cFragments

[i] Antalet element som allokerats för pVaFragment och pLenFragment.

pVaFragment

[ut] Matrisbuffert för att ta emot de virtuella adresserna för varje fragment. Detta måste vara minst cFragments långt.

pLenFragment

[ut] Matrisbuffert för att ta emot längden i byte för varje fragment. Detta måste vara minst cFragments långt.

Returvärde

Om det lyckas returnerar S_OK; annars returneras en felkod.

Exempel

Detta visar hur du hämtar adressen och längden på en funktion via IDiaSymbol, sedan antalet fragment, hämtar uppsättningen funktionsfragment och sedan skriver ut dem som en lista över start- och slutadresser.

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

Se även