SceSvcAttachmentAnalyze 구현
SceSvcAttachmentAnalyze 함수는 보안 데이터베이스와 서비스에서 구성 정보를 검색하고, 두 가지 정보 집합을 비교한 다음, 보안 데이터베이스의 분석 섹션을 차이점으로 업데이트해야 합니다. 다음 알고리즘을 사용하여 이를 보장할 수 있습니다.
SceSvcAttachmentAnalyze를 구현하려면
- 보안 정보를 검색 및 설정하고 코드를 반환하는 데 필요한 변수를 정의합니다.
- 콜백 구조에서 pfQueryInfo 콜백 함수를 호출하여 보안 데이터베이스에서 구성 정보를 검색합니다.
- 서비스에서 해당 정보를 검색합니다.
- 서비스에서 검색된 구성 데이터를 보안 데이터베이스에서 검색된 구성 데이터와 비교합니다.
- 정보가 동일하지 않으면 콜백 구조에서 pfSetInfo 콜백 함수를 호출하여 데이터베이스를 업데이트합니다.
- 정보를 검색하는 데 사용되는 모든 버퍼를 해제합니다. 콜백 구조에서 pfFreeInfo 콜백 함수를 호출하여 반환된 데이터베이스 정보에 사용되는 메모리를 해제합니다.
- 확장이 분석 로그 파일에 추가하려는 메시지가 있는 경우 콜백 구조에서 pfLogInfo 콜백 함수를 호출합니다.
- 적절한 SCESTATUS 코드를 반환합니다.
다음 예제에서는 SceSvcAttachmentAnalyze의 한 가지 가능한 구현을 보여 줍니다. 이 예제에서는 QueryConfigurationLine 및 CompareValue 함수가 각각 서비스에서 정보를 쿼리하고 해당 값을 보안 데이터베이스에서 검색된 값과 비교합니다. 이러한 함수의 구현은 표시되지 않습니다.
#include <windows.h>
SCESTATUS WINAPI SceSvcAttachmentAnalyze (
IN PSCESVC_CALLBACK_INFO pSceCbInfo
)
{
////////////////////////////////////////////////////
// Define variables.
////////////////////////////////////////////////////
PSCESVC_CONFIGURATION_INFO pConfigInfo = NULL;
SCESTATUS retCode;
SCE_ENUMERATION_CONTEXT EnumContext = 0;
if ( pSceCbInfo == NULL ||
pSceCbInfo->sceHandle == NULL ||
pSceCbInfo->pfQueryInfo == NULL ||
pSceCbInfo->pfSetInfo == NULL ||
pSceCbInfo->pfFreeInfo == NULL )
{
return(SCESTATUS_INVALID_PARAMETER);
}
////////////////////////////////////////////////////
// Retrieve information from security database.
///////////////////////////////////////////////////
do
{
retCode = (*(pSceCbInfo->pfQueryInfo))(
pSceCbInfo->sceHandle,
SceSvcConfigurationInfo,
NULL,
FALSE,
&pConfigInfo,
&EnumContext
);
if(retCode == SCESTATUS_SUCCESS && pConfigInfo != NULL)
{
ULONG i;
for(i = 0;i < pConfigInfo->Count; i++)
{
if(pConfigInfo->Line[I].Key == NULL)
continue;
//////////////////////////////////////////////
// Query service for corresponding key.
//////////////////////////////////////////////
QueryConfigurationLine(
pConfigInfo->Line[i].Key,
&SystemValue);
//////////////////////////////////////////////
// Compare values.
//////////////////////////////////////////////
CompareValue(
pConfigInfo->Line[i].Key,
SystemValue,
pConfigInfo->Line[i].Value,
&Result);
//////////////////////////////////////////////
// Write to security database if values are
// not equal.
//////////////////////////////////////////////
if(Result != NULL)
{
retCode = (*(pSceCbInfo->pfSetInfo))(pSceCbInfo->sceHandle,
SceSvcAnalysisInfo,
pConfigInfo->Line[i].Key,
TRUE,
Result);
if(retCode != SCESTATUS_SUCCESS)
{
//////////////////////////////////////////
// Add code to handle other return codes.
//////////////////////////////////////////
}
}
}
//////////////////////////////////////////////
// Free all buffers used to retrieve
// SceSvcFree frees memory allocated by call
// to SceSvcQueryQueryInfo.
/////////////////////////////////////////
(*(pSceCbInfo->pfFreeInfo)) (PVOID)pConfigInfo);
pConfigInfo = NULL;
}
} while (retCode == SCESTATUS_SUCCESS && pConfigInfo != NULL);
//////////////////////////////////////////////////
// If the return code is not SCESTATUS_SUCCESS, add code to
// set error message appropriately.
//////////////////////////////////////////////////
return retCode;
}