Share via


SceSvcAttachmentAnalyze の実装

SceSvcAttachmentAnalyze 関数は、セキュリティ データベースとサービスから構成情報を取得し、2 つの情報セットを比較してから、セキュリティ データベースの分析セクションを相違点で更新する必要があります。 これは、次のアルゴリズムを使用して確認できます。

SceSvcAttachmentAnalyze を実装するには

  1. セキュリティ情報とリターン コードを取得および設定するために必要な変数を定義します。
  2. セキュリティ データベースから構成情報を取得するには、コールバック構造で pfQueryInfo コールバック関数を呼び出します。
  3. サービスから対応する情報を取得します。
  4. サービスから取得した構成データと、セキュリティ データベースから取得した構成データを比較します。
  5. 情報が同じでない場合は、コールバック構造で pfSetInfo コールバック関数を呼び出してデータベースを更新します。
  6. 情報の取得に使用されるすべてのバッファーを解放します。 コールバック構造で pfFreeInfo コールバック関数を呼び出して、返されるデータベース情報に使用されるメモリを解放します。
  7. 拡張機能が分析ログ ファイルに追加するメッセージがある場合は、コールバック構造で pfLogInfo コールバック関数を呼び出します。
  8. 適切な SCESTATUS コードを 返します。

次の例は、 SceSvcAttachmentAnalyze の 1 つの可能な実装を示しています。 この例では、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;
}