Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Funkcja SceSvcAttachmentUpdate przyjmuje jako parametr zestaw dostarczonych informacji o konfiguracji. Następnie pobiera informacje z bazy danych zabezpieczeń, oblicza nową konfigurację podstawową przy użyciu podanych informacji o konfiguracji, oblicza nowe informacje analityczne na podstawie informacji o bazie danych i dostarczonych informacji o konfiguracji oraz aktualizuje bazę danych przy użyciu nowych podstawowych informacji o konfiguracji i analizie. Można zaimplementować SceSvcAttachmentUpdate przy użyciu następującego algorytmu.
Aby zaimplementować SceSvcAttachmentUpdate
Zdefiniuj zmienne potrzebne do pobierania informacji, ustawiania informacji i zwracania kodów.
Wywołaj funkcję wywołania zwrotnego pfQueryInfo w strukturze wywołania zwrotnego, aby pobrać bieżące informacje o konfiguracji z bazy danych zabezpieczeń.
Porównaj wartości:
- Jeśli dane będą się różnić, wywołaj funkcję wywołania zwrotnego pfSetInfo w strukturze wywołania zwrotnego, aby zaktualizować dane konfiguracji w bazie danych.
- Jeśli dane są takie same, wywołaj funkcję wywołania zwrotnego pfSetInfo w strukturze wywołania zwrotnego, aby zaktualizować dane analizy w bazie danych.
Powtarzaj, dopóki wszystkie dane nie będą przetwarzane.
Poniższy przykład przedstawia jedną z możliwych implementacji 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;
}
}
}