Получение информации о конфигурации сервиса

Следующий пример открывает дескриптор сервиса при помощи функции OpenService с правом SERVICE_QUERY_CONFIG, а затем в функции QueryServiceConfig использует этот дескриптор, чтобы получить текущие настройки сервиса.
VOID GetSampleServiceConfig()
{
LPQUERY_SERVICE_CONFIG lpqscBuf;
LPSERVICE_DESCRIPTION lpqscBuf2;
DWORD dwBytesNeeded;

// Открываем дескриптор сервиса.

schService = OpenService(
schSCManager, // база данных SCManager
"Sample_Srv", // имя сервиса
SERVICE_QUERY_CONFIG); // нужно только получить
if (schService == NULL)
MyErrorExit("OpenService");

// Выделяем буфер для информации о настройках сервиса.

lpqscBuf = (LPQUERY_SERVICE_CONFIG) LocalAlloc(
LPTR, 4096);
if (lpqscBuf == NULL)
MyErrorExit("LocalAlloc");

lpqscBuf2 = (LPSERVICE_DESCRIPTION) LocalAlloc(
LPTR, 4096);
if (lpqscBuf2 == NULL)
MyErrorExit("LocalAlloc");

// Получаем настройки сервиса.

if (! QueryServiceConfig(
schService,
lpqscBuf,
4096,
&dwBytesNeeded) )
{
MyErrorExit("QueryServiceConfig");
}

if (! QueryServiceConfig2(
schService,
SERVICE_CONFIG_DESCRIPTION,
lpqscBuf2,
4096,
&dwBytesNeeded) )
{
MyErrorExit("QueryServiceConfig2");
}

// Распечатываем настройки сервиса.

printf("\nSample_Srv configuration: \n");
printf(" Тип: 0x%x\n", lpqscBuf->dwServiceType);
printf(" Тип запуска: 0x%x\n", lpqscBuf->dwStartType);
printf(" Контроль ошибок: 0x%x\n", lpqscBuf->dwErrorControl);
printf(" Путь сервиса: %s\n", lpqscBuf->lpBinaryPathName);

if (lpqscBuf->lpLoadOrderGroup != NULL)
printf(" Группа: %s\n", lpqscBuf->lpLoadOrderGroup);
if (lpqscBuf->dwTagId != 0)
printf(" Идентификатор в группе: %d\n", lpqscBuf->dwTagId);
if (lpqscBuf->lpDependencies != NULL)
printf(" Зависимости: %s\n", lpqscBuf->lpDependencies);
if (lpqscBuf->lpServiceStartName != NULL)
printf(" Имя: %s\n", lpqscBuf->lpServiceStartName);
if (lpqscBuf2->lpDescription != NULL)
printf(" Описание: %s\n", lpqscBuf2->lpDescription);

LocalFree(lpqscBuf);
LocalFree(lpqscBuf2);