Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Lekéri a függvény különálló töredékeinek címét és hosszát a megadott virtuális címen (VA).
Szintaxis
HRESULT getFunctionFragments_VA(
ULONGLONG vaFunc,
DWORD cbFunc,
DWORD cFragments,
ULONGLONG *pVaFragment,
DWORD *pLenFragment
);
Paraméterek
vaFunc
[in] A függvény virtuális címe.
cbFunc
[in] A függvény bájtban megadott teljes mérete (azaz a függvény hossza).
cFragments
[in] A pVaFragment és pLenFragmentlefoglalt elemek száma.
pVaFragment
[kifelé] Tömbpuffer az egyes töredékek virtuális címeinek fogadásához. Ennek legalább cFragments hosszúnak kell lennie.
pLenFragment
[kifelé] Tömbpuffer az egyes töredékek hosszának bájtban való fogadásához. Ennek legalább cFragments hosszúnak kell lennie.
Visszaadott érték
Ha sikeres, S_OK; ellenkező esetben egy hibakódot ad vissza.
Példa
Ez azt mutatja be, hogyan lehet lekérni egy függvény címét és hosszát IDiaSymbol, majd a töredékek számát, lekérni a függvénytöredékek készletét, majd kinyomtatni őket a kezdő- és végpontcímek listájaként.
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;
}