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