Compartir a través de


IDiaSession::getFunctionFragments_VA

Recupera las direcciones y longitudes de fragmentos no ambiguos de la función en la dirección virtual especificada (VA).

Sintaxis

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

Parámetros

vaFunc

[in] Dirección virtual de la función.

cbFunc

[in] Tamaño total en bytes de la función (es decir, la longitud de la función).

cFragments

[in] Recuento de elementos asignados para pVaFragment y pLenFragment.

pVaFragment

[out] Búfer de matriz para recibir las direcciones virtuales de cada fragmento. Debe ser al menos cFragments largo.

pLenFragment

[out] Búfer de matriz para recibir la longitud, en bytes, de cada fragmento. Debe ser al menos cFragments largo.

Valor devuelto

Si se ejecuta correctamente, devuelve S_OK; de lo contrario, devuelve un código de error.

Ejemplo

Esto muestra cómo recuperar la dirección y la longitud de una función a través de IDiaSymbol, a continuación, el número de fragmentos, recuperar el conjunto de fragmentos de función y, a continuación, imprimirlos como una lista de direcciones iniciales y finales.

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

Consulte también