Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Recupera os endereços e comprimentos de fragmentos descontíguos para a função no endereço virtual relativo (RVA) especificado.
Sintaxe
HRESULT getFunctionFragments_RVA(
DWORD rvaFunc,
DWORD cbFunc,
DWORD cFragments,
DWORD *pRvaFragment,
DWORD *pLenFragment
);
Parâmetros
rvaFunc
[em] O endereço virtual relativo da função.
cbFunc
[em] O tamanho total em bytes da função (ou seja, o comprimento da função).
cFragments
[em] A contagem de elementos alocados para pRvaFragment
e pLenFragment
.
pRvaFragment
[saídas] Buffer de matriz para receber os endereços virtuais relativos de cada fragmento. Isto deve ser pelo menos cFragments
longo.
pLenFragment
[saídas] Buffer de matriz para receber o comprimento, em bytes, de cada fragmento. Isto deve ser pelo menos cFragments
longo.
Valor de retorno
Se for bem-sucedido, retorna S_OK
; caso contrário, retorna um código de erro.
Exemplo
Isso mostra como recuperar o endereço e o comprimento de uma função através de IDiaSymbol
, em seguida, o número de fragmentos, recuperar o conjunto de fragmentos de função e, em seguida, imprimi-los como uma lista de endereços iniciais e finais.
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;
}