SceSvcAttachmentUpdate の実装
SceSvcAttachmentUpdate 関数は、指定された構成情報のセットをパラメーターとして受け取ります。 次に、セキュリティ データベースから情報を取得し、指定された構成情報を使用して新しい基本構成を計算し、データベース情報と指定された構成情報に基づいて新しい分析情報を計算し、新しい基本構成と分析情報を使用してデータベースを更新します。 SceSvcAttachmentUpdate は、次のアルゴリズムを使用して実装できます。
SceSvcAttachmentUpdate を実装するには
情報の取得、情報の設定、リターン コードに必要な変数を定義します。
コールバック構造で pfQueryInfo コールバック関数を呼び出して、セキュリティ データベースから現在の構成情報を取得します。
値を比較します。
- データが異なる場合は、コールバック構造で pfSetInfo コールバック関数を呼び出して、データベース内の構成データを更新します。
- データが同じ場合は、コールバック構造で pfSetInfo コールバック関数を呼び出して、データベース内の分析データを更新します。
すべてのデータが処理されるまで繰り返します。
次の例は、 SceSvcAttachmentUpdate の 1 つの可能な実装を示しています。
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;
}
}
}