Delen via


IDiaSession::getFunctionFragments_RVA

Haalt de adressen en lengten van discueuze fragmenten voor de functie op het opgegeven relatieve virtuele adres (RVA) op.

Syntaxis

HRESULT getFunctionFragments_RVA(
    DWORD rvaFunc,
    DWORD cbFunc,
    DWORD cFragments,
    DWORD *pRvaFragment,
    DWORD *pLenFragment
);

Parameters

rvaFunc

[in] Het relatieve virtuele adres van de functie.

cbFunc

[in] De totale grootte in bytes van de functie (dat wil gezegd de lengte van de functie).

cFragments

[in] Het aantal elementen dat is toegewezen voor pRvaFragment en pLenFragment.

pRvaFragment

[uit] Matrixbuffer om de relatieve virtuele adressen van elk fragment te ontvangen. Dit moet ten minste cFragments lang zijn.

pLenFragment

[uit] Matrixbuffer voor het ontvangen van de lengte, in bytes, van elk fragment. Dit moet ten minste cFragments lang zijn.

Retourwaarde

Als dit lukt, wordt S_OKgeretourneerd; retourneert anders een foutcode.

Voorbeeld

Dit laat zien hoe u het adres en de lengte van een functie ophaalt via IDiaSymbol, vervolgens het aantal fragmenten, de set functiefragmenten ophaalt en deze vervolgens afdrukt als een lijst met begin- en eindadressen.

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

Zie ook