Implémentation de SceSvcAttachmentAnalyze
La fonction SceSvcAttachmentAnalyze doit récupérer les informations de configuration de la base de données de sécurité et du service, comparer les deux ensembles d’informations, puis mettre à jour la section analyse de la base de données de sécurité avec les différences éventuelles. Pour ce faire, utilisez l’algorithme suivant.
Pour implémenter SceSvcAttachmentAnalyze
- Définissez les variables nécessaires pour récupérer et définir les informations de sécurité 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é.
- Récupérez les informations correspondantes à partir du service.
- Comparez les données de configuration récupérées à partir du service avec celles extraites de la base de données de sécurité.
- Si les informations ne sont pas les mêmes, appelez la fonction de rappel pfSetInfo dans la structure de rappel pour mettre à jour la base de données.
- Libérez toutes les mémoires tampons utilisées pour récupérer des informations. Appelez la fonction de rappel pfFreeInfo dans la structure de rappel pour libérer la mémoire utilisée pour les informations de base de données retourné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.
- Retourne les codes SCESTATUS appropriés .
L’exemple suivant montre une implémentation possible de SceSvcAttachmentAnalyze. Notez que dans cet exemple, les fonctions QueryConfigurationLine et CompareValue interrogent respectivement les informations du service et comparent ces valeurs à celles récupérées à partir de la base de données de sécurité. L’implémentation de ces fonctions n’est pas affichée.
#include <windows.h>
SCESTATUS WINAPI SceSvcAttachmentAnalyze (
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 information from security database.
///////////////////////////////////////////////////
do
{
retCode = (*(pSceCbInfo->pfQueryInfo))(
pSceCbInfo->sceHandle,
SceSvcConfigurationInfo,
NULL,
FALSE,
&pConfigInfo,
&EnumContext
);
if(retCode == SCESTATUS_SUCCESS && pConfigInfo != NULL)
{
ULONG i;
for(i = 0;i < pConfigInfo->Count; i++)
{
if(pConfigInfo->Line[I].Key == NULL)
continue;
//////////////////////////////////////////////
// Query service for corresponding key.
//////////////////////////////////////////////
QueryConfigurationLine(
pConfigInfo->Line[i].Key,
&SystemValue);
//////////////////////////////////////////////
// Compare values.
//////////////////////////////////////////////
CompareValue(
pConfigInfo->Line[i].Key,
SystemValue,
pConfigInfo->Line[i].Value,
&Result);
//////////////////////////////////////////////
// Write to security database if values are
// not equal.
//////////////////////////////////////////////
if(Result != NULL)
{
retCode = (*(pSceCbInfo->pfSetInfo))(pSceCbInfo->sceHandle,
SceSvcAnalysisInfo,
pConfigInfo->Line[i].Key,
TRUE,
Result);
if(retCode != SCESTATUS_SUCCESS)
{
//////////////////////////////////////////
// Add code to handle other return codes.
//////////////////////////////////////////
}
}
}
//////////////////////////////////////////////
// Free all buffers used to retrieve
// SceSvcFree frees memory allocated by call
// to SceSvcQueryQueryInfo.
/////////////////////////////////////////
(*(pSceCbInfo->pfFreeInfo)) (PVOID)pConfigInfo);
pConfigInfo = NULL;
}
} while (retCode == SCESTATUS_SUCCESS && pConfigInfo != NULL);
//////////////////////////////////////////////////
// If the return code is not SCESTATUS_SUCCESS, add code to
// set error message appropriately.
//////////////////////////////////////////////////
return retCode;
}