Поделиться через


Реализация SceSvcAttachmentAnalyze

Функция SceSvcAttachmentAnalyze должна получить сведения о конфигурации из базы данных безопасности и службы, сравнить два набора данных, а затем обновить раздел анализа базы данных безопасности с любыми различиями. Это можно сделать с помощью следующего алгоритма.

Реализация SceSvcAttachmentAnalyze

  1. Определите переменные, необходимые для получения и задания кодов возврата и сведений о безопасности.
  2. Вызовите функцию обратного вызова pfQueryInfo в структуре обратного вызова, чтобы получить сведения о конфигурации из базы данных безопасности.
  3. Получение соответствующих сведений из службы.
  4. Сравните данные конфигурации, полученные из службы, с данными, полученными из базы данных безопасности.
  5. Если сведения не совпадают, вызовите функцию обратного вызова pfSetInfo в структуре обратного вызова, чтобы обновить базу данных.
  6. Освободите все буферы, используемые для получения сведений. Вызовите функцию обратного вызова pfFreeInfo в структуре обратного вызова, чтобы освободить память, используемую для возвращаемых сведений о базе данных.
  7. Если есть сообщение, которое расширение хочет добавить в файл журнала анализа, вызовите функцию обратного вызова pfLogInfo в структуре обратного вызова.
  8. Возвращает соответствующие коды SCESTATUS .

В следующем примере показана одна возможная реализация SceSvcAttachmentAnalyze. Обратите внимание, что в этом примере функции QueryConfigurationLine и CompareValue соответственно запрашивают сведения из службы и сравнивают эти значения с значениями, полученными из базы данных безопасности. Реализация этих функций не отображается.

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