Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Mengambil alamat dan panjang fragmen yang tidak disinggung untuk fungsi pada alamat virtual (VA) yang ditentukan.
Sintaksis
HRESULT getFunctionFragments_VA(
ULONGLONG vaFunc,
DWORD cbFunc,
DWORD cFragments,
ULONGLONG *pVaFragment,
DWORD *pLenFragment
);
Parameter
vaFunc
[di] Alamat virtual fungsi.
cbFunc
[di] Ukuran total dalam byte fungsi (yaitu, panjang fungsi).
cFragments
[di] Jumlah elemen yang dialokasikan untuk pVaFragment dan pLenFragment.
pVaFragment
[out] Buffer array untuk menerima alamat virtual setiap fragmen. Ini harus setidaknya cFragments panjang.
pLenFragment
[out] Buffer array untuk menerima panjang, dalam byte, dari setiap fragmen. Ini harus setidaknya cFragments panjang.
Mengembalikan Nilai
Jika berhasil, mengembalikan S_OK; jika tidak, mengembalikan kode kesalahan.
Contoh
Ini menunjukkan cara mengambil alamat dan panjang fungsi melalui IDiaSymbol, lalu jumlah fragmen, mengambil kumpulan fragmen fungsi lalu mencetaknya sebagai daftar alamat awal dan akhir.
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;
}