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

另请参阅