다음을 통해 공유


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