Реализация SceSvcAttachmentUpdate
Функция SceSvcAttachmentUpdate принимает в качестве параметра набор предоставленных сведений о конфигурации. Затем он извлекает сведения из базы данных безопасности, вычисляет новую базовую конфигурацию, используя предоставленные сведения о конфигурации, вычисляет новые аналитические сведения на основе данных базы данных и предоставленных сведений о конфигурации и обновляет базу данных с помощью новой базовой конфигурации и аналитических сведений. SceSvcAttachmentUpdate можно реализовать с помощью следующего алгоритма.
Реализация SceSvcAttachmentUpdate
Определите переменные, необходимые для получения сведений, задания сведений и кодов возврата.
Вызовите функцию обратного вызова pfQueryInfo в структуре обратного вызова, чтобы получить сведения о текущей конфигурации из базы данных безопасности.
Сравните значения:
- Если данные отличаются, вызовите функцию обратного вызова pfSetInfo в структуре обратного вызова, чтобы обновить данные конфигурации в базе данных.
- Если данные совпадают, вызовите функцию обратного вызова pfSetInfo в структуре обратного вызова, чтобы обновить данные анализа в базе данных.
Повторяйте, пока не будут обработаны все данные.
В следующем примере показана одна возможная реализация SceSvcAttachmentUpdate.
SCESTATUS WINAPI SceSvcAttachmentUpdate (
IN PSCESVC_CALLBACK_INFO pSceCbInfo,
IN SCESVC_CONFIGURATION_INFO *ServiceInfo
)
{
////////////////////////////////////////////////////
// Define variables.
////////////////////////////////////////////////////
SCESTATUS retCode;
SCE_ENUMERATION_CONTEXT EnumContext = 0;
if ( pSceCbInfo == NULL ||
pSceCbInfo->sceHandle == NULL ||
pSceCbInfo->pfQueryInfo == NULL ||
pSceCbInfo->pfSetInfo == NULL ||
pSceCbInfo->pfFreeInfo == NULL ||
ServiceInfo == NULL )
{
return(SCESTATUS_INVALID_PARAMETER);
}
////////////////////////////////////////////////////
// Process supplied configuration information.
////////////////////////////////////////////////////
for (int i = 0; i < ServiceInfo->Count; i++)
{
retCode = (*(pSceCbInfo->pfQueryInfo))( pSceCbInfo->sceHandle,
SceSvcConfigurationInfo,
ServiceInfo->Line[I].Key,
TRUE,
(PVOID *)&pConfigInfo,
&EnumContext
);
if(retCode != SCESTATUS_SUCCESS &&
retCode != SCESTATUS_RECORD_NOT_FOUND)
{
////////////////////////////////////////////////
// Add code to handle errors
////////////////////////////////////////////////
break;
}
//////////////////////////////////////////////////
// If the supplied key is NULL, delete corresponding
// key from configuration information and update
// analysis information if needed.
//////////////////////////////////////////////////
if(ServiceInfo->Line[I].Value == NULL)
{
if(retCode == SCESTATUS_SUCCESS)
{
EnumContext = 0;
retCode = (*(pSceCbInfo->pfQueryInfo))( pSceCbInfo->sceHandle,
SceSvcAnalysisInfo,
ServiceInfo->Line [i].Key,
TRUE,
(PVOID *)&pAnalInfo,
&EnumContext
);
if(retCode == SCESTATUS_RECORD_NOT_FOUND)
{
////////////////////////////////////////////
// Analysis information for key was not found.
// Update analysis information to include
// deleted key.
/////////////////////////////////////////////
UpdateInfo->Count = 1;
UpdateInfo->Line = &UpdateLine;
UpdateLine.Key = pConfigInfo->Line[0].Key;
UpdateLine.Value = (PBYTE)pConfigInfo->Line[0].Value;
retCode = (*(pSceCbInfo->pfSetInfo))( pSceCbInfo->sceHandle,
SceSvcAnalysisInfo,
NULL,
TRUE,
&UpdateInfo
);
if(retCode != SCESTATUS_SUCCESS)
{
//////////////////////////////////////////
// Add code for error return codes.
//////////////////////////////////////////
}
}
else if (retCode == SCESTATUS_SUCCESS)
{
////////////////////////////////////////////
// Add code to delete configuration (analysis
// information is already in place.
////////////////////////////////////////////
}
else
{
//////////////////////////////////////////
// Add code for error return codes.
//////////////////////////////////////////
}
//////////////////////////////////////////////
// Delete key.
//////////////////////////////////////////////
retCode = (*(pSceCbInfo->pfSetInfo))( pSceCbInfo->sceHanlde,
SceSvcConfigurationInfo,
ServiceInfo->Line[I].Key,
TRUE,
NULL
);
if(retCode != SCESTATUS_SUCCESS)
{
//////////////////////////////////////////
// Add code for error return codes.
//////////////////////////////////////////
}
}
else
{
/////////////////////////////////////////////////
// Supplied value is non-NULL; therefore. compare
// with current analysis information. If both are
// the same, delete current analysis. If they are
// not the same, update security database with new
// value.
//////////////////////////////////////////
}
//////////////////////////////////////////////////
// Free data returned.
/////////////////////////////////////////////////
(*(pSceCbInfo->pfFreeInfo))(pConfigInfo);
pConfigInfo = NULL;
(*(pSceCbInfo->pfSetInfo))(pAnalInfo);
pAnalInfo = NULL;
////////////////////////////////////////////////////
// Add code for other return codes if retCode is
// not SCESTATUS_SUCCESS.
///////////////////////////////////////////////////
return retCode;
}
}
}