Freigeben über


IDiaSession::getFunctionFragments_VA

Ruft die Adressen und Längen nicht zusammenhängender Fragmente für die Funktion an der angegebenen virtuellen Adresse (VA) ab.

Syntax

HRESULT getFunctionFragments_VA(
    ULONGLONG vaFunc,
    DWORD cbFunc,
    DWORD cFragments,
    ULONGLONG *pVaFragment,
    DWORD *pLenFragment
);

Parameter

vaFunc

[in] Die virtuelle Adresse der Funktion.

cbFunc

[in] Die Gesamtgröße in Byte der Funktion (d. a. die Länge der Funktion).

cFragments

[in] Die Anzahl der elemente, die für pVaFragment und pLenFragmentzugeordnet sind.

pVaFragment

[out] Arraypuffer, der die virtuellen Adressen jedes Fragments empfängt. Dies muss mindestens cFragments lang sein.

pLenFragment

[out] Arraypuffer, der die Länge jedes Fragments in Byte empfängt. Dies muss mindestens cFragments lang sein.

Rückgabewert

Wenn dies erfolgreich ist, wird S_OKzurückgegeben; andernfalls wird ein Fehlercode zurückgegeben.

Beispiel

Hier erfahren Sie, wie Sie die Adresse und Länge einer Funktion über IDiaSymbolabrufen, dann die Anzahl der Fragmente abrufen, den Satz von Funktionsfragmenten abrufen und diese dann als Liste der Start- und Endadressen drucken.

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

Siehe auch