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