15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


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

Следующий пример открывает дескриптор сервиса при помощи функции 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);
}