Bagikan melalui


IDiaSession::getFunctionFragments_RVA

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

Lihat juga