次の方法で共有


IDiaSession::getFunctionFragments_RVA

指定された相対仮想アドレス (RVA) にある関数の連続しないフラグメントのアドレスと長さを取得します。

構文

HRESULT getFunctionFragments_RVA(
    DWORD rvaFunc,
    DWORD cbFunc,
    DWORD cFragments,
    DWORD *pRvaFragment,
    DWORD *pLenFragment
);

パラメーター

rvaFunc

[in]関数の相対仮想アドレス。

cbFunc

[in]関数の合計サイズ (つまり、関数の長さ)。

cFragments

[in] pRvaFragmentpLenFragmentに割り当てられた要素の数。

pRvaFragment

[out]各フラグメントの相対仮想アドレスを受信する配列バッファー。 これは、少なくとも cFragments 長くする必要があります。

pLenFragment

[out]各フラグメントの長さをバイト単位で受け取る配列バッファー。 これは、少なくとも cFragments 長くする必要があります。

戻り値

成功した場合は、S_OK を返します。それ以外の場合は、エラー コードを返します。

ここでは、 IDiaSymbolを使用して関数のアドレスと長さを取得し、フラグメントの数を取得し、関数フラグメントのセットを取得し、開始アドレスと終了アドレスの一覧として出力する方法を示します。

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

関連項目