В примере ниже, программа конфигурации службы использует функцию OpenService, чтобы получить дескриптор с доступом SERVICE_QUERY_CONFIG к установленному объекту службы. Затем программа использует дескриптор объекта службы в функции QueryServiceConfig, чтобы извлечь текущую конфигурацию службы.
#include <windows.h>
#include <stdio.h>
BOOL GetSampleServiceConfig()
{
LPQUERY_SERVICE_CONFIG lpqscBuf;
LPSERVICE_DESCRIPTION lpqscBuf2;
DWORD dwBytesNeeded;
BOOL bSuccess=TRUE;
// Открываем дескриптор службы.
schService = OpenService(
schSCManager, // база данных SCManager
TEXT("Sample_Srv"), // название службы
SERVICE_QUERY_CONFIG); // нужен доступ QUERY
if (schService == NULL)
{
printf("OpenService failed (%d)", GetLastError());
return FALSE;
}
// Назначим буфер для информации о конфигурации.
lpqscBuf = (LPQUERY_SERVICE_CONFIG) LocalAlloc(
LPTR, 4096);
if (lpqscBuf == NULL)
{
return FALSE;
}
lpqscBuf2 = (LPSERVICE_DESCRIPTION) LocalAlloc(
LPTR, 4096);
if (lpqscBuf2 == NULL)
{
return FALSE;
}
// Получим информацию о конфигурации.
if (!QueryServiceConfig(
schService,
lpqscBuf,
4096,
&dwBytesNeeded) )
{
printf("QueryServiceConfig failed (%d)", GetLastError());
bSuccess = FALSE;
}
if (!QueryServiceConfig2(
schService,
SERVICE_CONFIG_DESCRIPTION,
lpqscBuf2,
4096,
&dwBytesNeeded) )
{
printf("QueryServiceConfig2 failed (%d)", GetLastError());
bSuccess = FALSE;
}
// Напечатаем информацию о конфигурации.
printf("\nSample_Srv configuration: \n");
printf(" Type: 0x%x\n", lpqscBuf->dwServiceType);
printf(" Start Type: 0x%x\n", lpqscBuf->dwStartType);
printf(" Error Control: 0x%x\n", lpqscBuf->dwErrorControl);
printf(" Binary path: %s\n", lpqscBuf->lpBinaryPathName);
if (lpqscBuf->lpLoadOrderGroup != NULL)
printf(" Load order group: %s\n", lpqscBuf->lpLoadOrderGroup);
if (lpqscBuf->dwTagId != 0)
printf(" Tag ID: %d\n", lpqscBuf->dwTagId);
if (lpqscBuf->lpDependencies != NULL)
printf(" Dependencies: %s\n", lpqscBuf->lpDependencies);
if (lpqscBuf->lpServiceStartName != NULL)
printf(" Start Name: %s\n", lpqscBuf->lpServiceStartName);
if (lpqscBuf2->lpDescription != NULL)
printf(" Description: %s\n", lpqscBuf2->lpDescription);
LocalFree(lpqscBuf);
LocalFree(lpqscBuf2);
return bSuccess;
} |