共用方式為


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