Реализация SceSvcAttachmentConfig
Функция SceSvcAttachmentConfig должна получить сведения из базы данных безопасности, а затем использовать эти сведения для настройки службы.
При реализации SceSvcAttachmentConfig можно либо получить все сведения, а затем настроить службу, либо получить и настроить службу в шагах. Следующий алгоритм извлекает все сведения, а затем настраивает службу.
Реализация SceSvcAttachmentConfig
- Определите переменные, необходимые для получения сведений и кодов возврата.
- Вызовите функцию обратного вызова pfQueryInfo в структуре обратного вызова, чтобы получить сведения о конфигурации из базы данных безопасности.
- Настройте в системе возвращаемые сведения.
- Вызовите функцию обратного вызова pfFreeInfo в структуре обратного вызова, чтобы освободить память, используемую для возвращаемых сведений.
- Если есть сообщение, которое расширение хочет добавить в файл журнала анализа, вызовите функцию обратного вызова pfLogInfo в структуре обратного вызова.
- Возвращает соответствующие коды SCESTATUS .
В следующем примере показана одна возможная реализация SceSvcAttachmentConfig. Обратите внимание, что в этом примере функция ProcessConfigurationLine задает конфигурацию службы. Реализация этой функции не показана.
SCESTATUS WINAPI SceSvcAttachmentConfig (
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 configuration information and configure
// system.
////////////////////////////////////////////////////
do
{
retCode = (*(pSceCbInfo->pfQueryInfo))( pSceCbInfo->sceHandle,
SceSvcConfigurationInfo,
NULL,
FALSE,
(PVOID *)&pConfigInfo,
&EnumContext
);
if (retCode == SCESTATUS_SUCCESS && pConfigInfo != NULL)
{
ULONG i:
//////////////////////////////////////////////////
// Configure system.
/////////////////////////////////////////////////
for(i = 0; < pConfigInfo->Count; i++)
{
if(pConfigInfo->Line[i].Key == NULL)
continue;
ProcessConfigurationLine(pConfigInfo->Line[i]);
}
//////////////////////////////////////////////////
// Free data returned.
/////////////////////////////////////////////////
(*(pSceCbInfo->pfFreeInfo)) ((PVOPID)pConfigInfo);
pConfigInfo = NULL;
}
} while (retCode == SCESTATUS_SUCCESS && CountReturned > 0);
////////////////////////////////////////////////////
// Add code for other return codes if retCode is
// not SCESTATUS_SUCCESS.
///////////////////////////////////////////////////
return retCode;
}