다음을 통해 공유


IDiaSession::getFunctionFragments_RVA

지정된 RVA(상대 가상 주소)에서 함수에 대한 불협화음 조각의 주소와 길이를 검색합니다.

구문

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

매개 변수

rvaFunc

[in] 함수의 상대 가상 주소입니다.

cbFunc

[in] 함수의 총 크기(즉, 함수의 길이)입니다.

cFragments

[in] 할당된 pRvaFragment 요소 수 및 pLenFragment.

pRvaFragment

[out] 각 조각의 상대 가상 주소를 수신하는 배열 버퍼입니다. 이 값은 적어도 cFragments 길어야 합니다.

pLenFragment

[out] 각 조각의 길이(바이트)를 수신하는 배열 버퍼입니다. 이 값은 적어도 cFragments 길어야 합니다.

Return Value

성공하면 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;
}

참고 항목