Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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;
}