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