Partager via


Implémentation de SceSvcAttachmentConfig

La fonction SceSvcAttachmentConfig doit récupérer des informations de la base de données de sécurité, puis utiliser ces informations pour configurer le service.

Lors de l’implémentation de SceSvcAttachmentConfig, vous pouvez récupérer toutes les informations, puis configurer le service, ou récupérer et configurer le service en plusieurs étapes. L’algorithme suivant récupère toutes les informations, puis configure le service.

Pour implémenter SceSvcAttachmentConfig

  1. Définissez les variables nécessaires pour récupérer des informations et retourner des codes.
  2. Appelez la fonction de rappel pfQueryInfo dans la structure de rappel pour récupérer les informations de configuration de la base de données de sécurité.
  3. Configurez le système avec les informations retournées.
  4. Appelez la fonction de rappel pfFreeInfo dans la structure de rappel pour libérer la mémoire utilisée pour les informations retournées.
  5. Si l’extension souhaite ajouter un message au fichier journal d’analyse, appelez la fonction de rappel pfLogInfo dans la structure de rappel.
  6. Retournez les codes SCESTATUS appropriés.

L’exemple suivant montre une implémentation possible de SceSvcAttachmentConfig. Notez que dans cet exemple, la fonction ProcessConfigurationLine définit la configuration du service. L’implémentation de cette fonction n’est pas affichée.

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