Implémentation de SceSvcAttachmentConfig
La fonction SceSvcAttachmentConfig doit extraire 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 étapes. L’algorithme suivant récupère toutes les informations, puis configure le service.
Pour implémenter SceSvcAttachmentConfig
- Définissez les variables nécessaires pour récupérer les informations et les codes de retour.
- 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é.
- Configurez le système avec les informations renvoyées.
- Appelez la fonction de rappel pfFreeInfo dans la structure de rappel pour libérer de la mémoire utilisée pour les informations renvoyées.
- S’il existe un message que l’extension souhaite ajouter au fichier journal d’analyse, appelez la fonction de rappel pfLogInfo dans la structure de rappel.
- Retournez les codes SCESTATUS appropriés.
L’exemple suivant illustre 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;
}