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 relatif (RVA) yang ditentukan.
Sintaksis
HRESULT getFunctionFragments_RVA(
DWORD rvaFunc,
DWORD cbFunc,
DWORD cFragments,
DWORD *pRvaFragment,
DWORD *pLenFragment
);
Parameter
rvaFunc
[di] Alamat virtual relatif fungsi.
cbFunc
[di] Ukuran total dalam byte fungsi (yaitu, panjang fungsi).
cFragments
[di] Jumlah elemen yang dialokasikan untuk pRvaFragment dan pLenFragment.
pRvaFragment
[out] Buffer array untuk menerima alamat virtual relatif dari 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) {
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;
}