Condividi tramite


Implementazione di SceSvcAttachmentConfig

La funzione SceSvcAttachmentConfig deve recuperare informazioni dal database di sicurezza e quindi usare tali informazioni per configurare il servizio.

Quando si implementa SceSvcAttachmentConfig, è possibile recuperare tutte le informazioni e quindi configurare il servizio o recuperare e configurare il servizio in passaggi. L'algoritmo seguente recupera tutte le informazioni e quindi configura il servizio.

Per implementare SceSvcAttachmentConfig

  1. Definire le variabili necessarie per recuperare informazioni e codici restituiti.
  2. Chiamare la funzione di callback pfQueryInfo nella struttura di callback per recuperare le informazioni di configurazione dal database di sicurezza.
  3. Configurare il sistema con le informazioni restituite.
  4. Chiamare la funzione di callback pfFreeInfo nella struttura di callback per liberare memoria usata per le informazioni restituite.
  5. Se si verifica un messaggio che l'estensione vuole aggiungere al file di log di analisi, chiamare la funzione di callback pfLogInfo nella struttura di callback.
  6. Restituire i codici SCESTATUS appropriati.

Nell'esempio seguente viene illustrata una possibile implementazione di SceSvcAttachmentConfig. Si noti che in questo esempio la funzione ProcessConfigurationLine imposta la configurazione del servizio. L'implementazione di questa funzione non viene visualizzata.

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