Bagikan melalui


IDiaSession::getFunctionFragments_VA

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

Lihat juga