Compartir a través de


Implementación de SceSvcAttachmentAnalyze

La función SceSvcAttachmentAnalyze debe recuperar la información de configuración de la base de datos de seguridad y el servicio, comparar los dos conjuntos de información y, a continuación, actualizar la sección de análisis de la base de datos de seguridad con cualquier diferencia. Puede asegurarse de ello mediante el siguiente algoritmo.

Para implementar SceSvcAttachmentAnalyze

  1. Defina las variables necesarias para recuperar y establecer la información de seguridad y los códigos de retorno.
  2. Llame a la función de devolución de llamada pfQueryInfo en la estructura de devolución de llamada para recuperar la información de configuración de la base de datos de seguridad.
  3. Recupere la información correspondiente del servicio.
  4. Compare los datos de configuración recuperados del servicio con los recuperados de la base de datos de seguridad.
  5. Si la información no es la misma, llame a la función de devolución de llamada pfSetInfo en la estructura de devolución de llamada para actualizar la base de datos.
  6. Libere todos los búferes usados para recuperar información. Llame a la función de devolución de llamada pfFreeInfo en la estructura de devolución de llamada para liberar memoria usada para la información de base de datos devuelta.
  7. Si hay algún mensaje que la extensión quiera agregar al archivo de registro de análisis, llame a la función de devolución de llamada pfLogInfo en la estructura de devolución de llamada.
  8. Devuelve los códigos SCESTATUS adecuados.

En el ejemplo siguiente se muestra una posible implementación de SceSvcAttachmentAnalyze. Tenga en cuenta que, en este ejemplo, las funciones QueryConfigurationLine y CompareValue consultan respectivamente información del servicio y comparan esos valores con los recuperados de la base de datos de seguridad. No se muestra la implementación de estas funciones.

#include <windows.h>

SCESTATUS WINAPI SceSvcAttachmentAnalyze (
    IN PSCESVC_CALLBACK_INFO pSceCbInfo
)
{
  
    ////////////////////////////////////////////////////
    // Define variables.
    ////////////////////////////////////////////////////
    PSCESVC_CONFIGURATION_INFO     pConfigInfo = NULL;
    SCESTATUS                      retCode;
    SCE_ENUMERATION_CONTEXT        EnumContext = 0;
  
  

    if ( pSceCbInfo == NULL ||
         pSceCbInfo->sceHandle == NULL ||
         pSceCbInfo->pfQueryInfo == NULL ||
         pSceCbInfo->pfSetInfo == NULL ||
         pSceCbInfo->pfFreeInfo == NULL ) 
    {
        return(SCESTATUS_INVALID_PARAMETER);
    }


  ////////////////////////////////////////////////////
  // Retrieve information from security database.
  ///////////////////////////////////////////////////
    do
    {
        retCode =  (*(pSceCbInfo->pfQueryInfo))(
                              pSceCbInfo->sceHandle,
                              SceSvcConfigurationInfo,
                              NULL,
                              FALSE,
                              &pConfigInfo,
                              &EnumContext
                              );
        if(retCode == SCESTATUS_SUCCESS && pConfigInfo != NULL)
        {
          ULONG i;
          for(i = 0;i < pConfigInfo->Count; i++)
          {
            if(pConfigInfo->Line[I].Key == NULL) 
                continue;
        
        //////////////////////////////////////////////
        // Query service for corresponding key.
        //////////////////////////////////////////////
            QueryConfigurationLine(
                               pConfigInfo->Line[i].Key,
                               &SystemValue);
        
        //////////////////////////////////////////////
        // Compare values.
        //////////////////////////////////////////////
            CompareValue(
                     pConfigInfo->Line[i].Key,
                     SystemValue,
                     pConfigInfo->Line[i].Value,
                     &Result);
        
        //////////////////////////////////////////////
        // Write to security database if values are 
        // not equal.
        //////////////////////////////////////////////
            if(Result != NULL)
            {
              retCode =  (*(pSceCbInfo->pfSetInfo))(pSceCbInfo->sceHandle,
                                      SceSvcAnalysisInfo,
                                      pConfigInfo->Line[i].Key,
                                      TRUE,
                                      Result);
              if(retCode != SCESTATUS_SUCCESS)
              {
                //////////////////////////////////////////
                // Add code to handle other return codes.
                //////////////////////////////////////////
              }
            }
        }
      
          //////////////////////////////////////////////
          // Free all buffers used to retrieve 
          // SceSvcFree frees memory allocated by call 
          // to SceSvcQueryQueryInfo. 
          /////////////////////////////////////////
        (*(pSceCbInfo->pfFreeInfo)) (PVOID)pConfigInfo);
          pConfigInfo = NULL;
    }
  } while (retCode == SCESTATUS_SUCCESS && pConfigInfo != NULL);
  
  
  //////////////////////////////////////////////////
  // If the return code is not SCESTATUS_SUCCESS, add code to 
  // set error message appropriately.
  //////////////////////////////////////////////////
  return retCode;
}