Compartilhar via


Implementando SceSvcAttachmentAnalyze

A função SceSvcAttachmentAnalyze deve recuperar informações de configuração do banco de dados de segurança e do serviço, comparar os dois conjuntos de informações e atualizar a seção de análise do banco de dados de segurança com quaisquer diferenças. Você pode garantir isso usando o algoritmo a seguir.

Para implementar SceSvcAttachmentAnalyze

  1. Defina as variáveis necessárias para recuperar e definir as informações de segurança e retornar códigos.
  2. Chame a função de retorno de chamada pfQueryInfo na estrutura de retorno de chamada para recuperar informações de configuração do banco de dados de segurança.
  3. Recupere as informações correspondentes do serviço.
  4. Compare os dados de configuração recuperados do serviço com os recuperados do banco de dados de segurança.
  5. Se as informações não forem as mesmas, chame a função de retorno de chamada pfSetInfo na estrutura de retorno de chamada para atualizar o banco de dados.
  6. Libere todos os buffers usados para recuperar informações. Chame a função de retorno de chamada pfFreeInfo na estrutura de retorno de chamada para liberar a memória usada para obter informações de banco de dados retornadas.
  7. Se houver alguma mensagem que a extensão deseja adicionar ao arquivo de log de análise, chame a função de retorno de chamada pfLogInfo na estrutura de retorno de chamada.
  8. Retornar os códigos SCESTATUS apropriados.

O exemplo a seguir mostra uma possível implementação de SceSvcAttachmentAnalyze. Observe que, neste exemplo, as funções QueryConfigurationLine e CompareValue consultam respectivamente as informações do serviço e comparam esses valores com os recuperados do banco de dados de segurança. A implementação dessas funções não é mostrada.

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