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