Aracılığıyla paylaş


IDiaSession::getFunctionFragments_RVA

belirtilen göreli sanal adreste (RVA) işlev için bitişik olmayan parçaların adreslerini ve uzunluklarını alır.

Sözdizimi

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

Parametre

rvaFunc

[in] İşlevin göreli sanal adresi.

cbFunc

[in] İşlevin bayt cinsinden toplam boyutu (işlevin uzunluğu).

cFragments

[in] pRvaFragment ve pLenFragmentiçin ayrılan öğelerin sayısı.

pRvaFragment

[out] Her parçanın göreli sanal adreslerini almak için dizi arabelleği. Bu en az cFragments uzun olmalıdır.

pLenFragment

[out] Her parçanın uzunluğunu bayt cinsinden almak için dizi arabelleği. Bu en az cFragments uzun olmalıdır.

Dönüş Değeri

Başarılı olursa, S_OKdöndürür; aksi takdirde bir hata kodu döndürür.

Örnek

Bu, IDiaSymbolaracılığıyla bir işlevin adresini ve uzunluğunun nasıl alınıp parça sayısının alınıp işlev parçaları kümesinin alınıp başlangıç ve bitiş adreslerinin listesi olarak yazdırılacağını gösterir.

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

Ayrıca bkz.