Share via


SceSvcAttachmentConfig の実装

SceSvcAttachmentConfig 関数は、セキュリティ データベースから情報を取得し、その情報を使用してサービスを構成する必要があります。

SceSvcAttachmentConfig を実装する場合は、すべての情報を取得してからサービスを構成するか、手順でサービスを取得して構成できます。 次のアルゴリズムは、すべての情報を取得し、サービスを構成します。

SceSvcAttachmentConfig を実装するには

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

次の例は、 SceSvcAttachmentConfig の 1 つの可能な実装を示しています。 この例では、ProcessConfigurationLine 関数によってサービス構成が設定されることに注意してください。 この関数の実装は表示されません。

SCESTATUS WINAPI SceSvcAttachmentConfig (
    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 configuration information and configure
      // system. 
      ////////////////////////////////////////////////////
      do
      {
            retCode = (*(pSceCbInfo->pfQueryInfo))( pSceCbInfo->sceHandle,
                                  SceSvcConfigurationInfo,
                                  NULL,
                                  FALSE,
                                  (PVOID *)&pConfigInfo,
                                  &EnumContext
                                 );
            if (retCode == SCESTATUS_SUCCESS && pConfigInfo != NULL)
            {
              ULONG i:
              //////////////////////////////////////////////////
              // Configure system.
              /////////////////////////////////////////////////
              for(i = 0; < pConfigInfo->Count; i++)
              {
                if(pConfigInfo->Line[i].Key == NULL) 
                    continue;
                ProcessConfigurationLine(pConfigInfo->Line[i]);
              }
      
      
              //////////////////////////////////////////////////
              // Free data returned.
              /////////////////////////////////////////////////
              (*(pSceCbInfo->pfFreeInfo)) ((PVOPID)pConfigInfo);
              pConfigInfo = NULL;
            }
        } while (retCode == SCESTATUS_SUCCESS && CountReturned > 0);
  
  
  ////////////////////////////////////////////////////
  // Add code for other return codes if retCode is 
  // not SCESTATUS_SUCCESS.
  ///////////////////////////////////////////////////
  return retCode;
}