Condividi tramite


Implementazione di SceSvcAttachmentAnalyze

La funzione SceSvcAttachmentAnalyze deve recuperare le informazioni di configurazione dal database di sicurezza e dal servizio, confrontare i due set di informazioni e quindi aggiornare la sezione analisi del database di sicurezza con eventuali differenze. È possibile assicurarsi di usare l'algoritmo seguente.

Per implementare SceSvcAttachmentAnalyze

  1. Definire le variabili necessarie per recuperare e impostare le informazioni di sicurezza e i codici restituiti.
  2. Chiamare la funzione di callback pfQueryInfo nella struttura di callback per recuperare le informazioni di configurazione dal database di sicurezza.
  3. Recuperare le informazioni corrispondenti dal servizio.
  4. Confrontare i dati di configurazione recuperati dal servizio con quello recuperato dal database di sicurezza.
  5. Se le informazioni non sono uguali, chiamare la funzione di callback pfSetInfo nella struttura di callback per aggiornare il database.
  6. Liberare tutti i buffer usati per recuperare informazioni. Chiamare la funzione di callback pfFreeInfo nella struttura di callback per liberare memoria usata per informazioni sul database restituite.
  7. Se si verifica un messaggio che l'estensione vuole aggiungere al file di log di analisi, chiamare la funzione di callback pfLogInfo nella struttura di callback.
  8. Restituire i codici SCESTATUS appropriati.

Nell'esempio seguente viene illustrata una possibile implementazione di SceSvcAttachmentAnalyze. Si noti che in questo esempio le funzioni QueryConfigurationLine e CompareValue eseguono rispettivamente query sulle informazioni sul servizio e confrontano tali valori con quelli recuperati dal database di sicurezza. L'implementazione di queste funzioni non viene visualizzata.

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