Aracılığıyla paylaş


IDiaSession::getFunctionFragments_VA

Belirtilen sanal adresteki (VA) işlev için bitişik olmayan parçaların adreslerini ve uzunluklarını alır.

Sözdizimi

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

Parametre

vaFunc

[in] İşlevin sanal adresi.

cbFunc

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

cFragments

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

pVaFragment

[out] Her parçanın 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) {
   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;
}

Ayrıca bkz.