Поделиться через


Реализация 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;
}