实现 SceSvcAttachmentConfig

SceSvcAttachmentConfig 函数必须从安全数据库中检索信息,然后使用该信息配置服务。

实现 SceSvcAttachmentConfig 时,可以检索所有信息,然后配置服务,也可以分步检索和配置服务。 以下算法检索所有信息,然后配置服务。

实现 SceSvcAttachmentConfig

  1. 定义检索信息和返回代码所需的变量。
  2. 在回调结构中调用 pfQueryInfo 回调函数,以从安全数据库中检索配置信息。
  3. 使用返回的信息配置系统。
  4. 在回调结构中调用 pfFreeInfo 回调函数,以释放用于返回信息的内存。
  5. 如果扩展想要添加到分析日志文件中的任何消息,请在回调结构中调用 pfLogInfo 回调函数。
  6. 返回相应的 SCESTATUS 代码。

以下示例演示 SceSvcAttachmentConfig 的一个可能实现。 请注意,在此示例中,函数 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;
}