IDiaSession::getFunctionFragments_VA
지정된 VA(가상 주소)에서 함수에 대한 불협화음 조각의 주소와 길이를 검색합니다.
구문
HRESULT getFunctionFragments_VA(
ULONGLONG vaFunc,
DWORD cbFunc,
DWORD cFragments,
ULONGLONG *pVaFragment,
DWORD *pLenFragment
);
매개 변수
vaFunc
[in] 함수의 가상 주소입니다.
cbFunc
[in] 함수의 총 크기(즉, 함수의 길이)입니다.
cFragments
[in] 할당된 pVaFragment
요소 수 및 pLenFragment
.
pVaFragment
[out] 각 조각의 가상 주소를 수신하는 배열 버퍼입니다. 이 값은 적어도 cFragments
길어야 합니다.
pLenFragment
[out] 각 조각의 길이(바이트)를 수신하는 배열 버퍼입니다. 이 값은 적어도 cFragments
길어야 합니다.
Return Value
성공하면 S_OK
를 반환하고, 실패하면 오류 코드를 반환합니다.
예시
이를 통해 IDiaSymbol
함수의 주소와 길이를 검색한 다음 조각 수를 검색하고 함수 조각 집합을 검색한 다음 시작 및 끝 주소 목록으로 인쇄하는 방법을 보여 줍니다.
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;
}