Проблемы с получением настроек глобального профиля (отображаемых в панели управления Nvidia) с помощью NVAPI SDK

Я хочу использовать NVAPI SDK от NVIDIA, чтобы получить все настройки, отображаемые в профиле Global 3D-настроек панели управления NVIDIA.

введите здесь описание изображения

Справочная документация находится здесь: API настроек драйвера NVAPI (DRS)< /а>

Источник

Вот что у меня есть на данный момент, в основном основанное на образцах, которые я нашел в Интернете:

#include <Windows.h>
#include <string>
#include "nvapi.h"
#include "NvApiDriverSettings.h"

NvDRSSessionHandle _session;
NvDRSProfileHandle _profile;

int main()
{
    if (NvAPI_Initialize() != NVAPI_OK)
        throw std::runtime_error("NvAPI: NvAPI can't be initialized");

    if (NvAPI_DRS_CreateSession(&_session) != NVAPI_OK)
        throw std::runtime_error("NvAPI: Can't create NvAPI session");
    if (NvAPI_DRS_LoadSettings(_session) != NVAPI_OK)
        throw std::runtime_error("NvAPI: Can't load system settings");

    if (NvAPI_DRS_GetCurrentGlobalProfile(_session, &_profile) != NVAPI_OK)
        throw std::runtime_error("NvAPI: Can't get global profile");

    NVDRS_PROFILE profileInformation = {0};
    profileInformation.version = NVDRS_PROFILE_VER;
    if (NvAPI_DRS_GetProfileInfo(_session, _profile, &profileInformation) != NVAPI_OK)
        throw std::runtime_error("NvAPI: Can't get current global profile information");

    if(profileInformation.numOfSettings> 0)
    {
        NVDRS_SETTING* setArray = new NVDRS_SETTING[profileInformation.numOfSettings];
        NvU32 numSetRead = profileInformation.numOfSettings,i;
        setArray[0].version = NVDRS_SETTING_VER;
        if (NvAPI_DRS_EnumSettings(_session, _profile, 0, &numSetRead, setArray) != NVAPI_OK)
            throw std::runtime_error("NvAPI: Can't get profile setting enum");

        for(i=0; i<numSetRead; i++)
        {
            if(setArray[i].settingLocation!=NVDRS_CURRENT_PROFILE_LOCATION)
            {
                continue;
            }
            NvAPI_DRS_GetSettingNameFromId(setArray[i].settingId, &setArray[i].settingName);
            wprintf(L"Setting Name: %s\n", setArray[i].settingName);
            printf("Setting ID: %X\n", setArray[i].settingId);
            printf("Predefined? : %d\n", setArray[i].isCurrentPredefined);
            switch(setArray[i].settingType)
            {
            case NVDRS_DWORD_TYPE:
                printf("Setting Value: %X\n", setArray[i].u32CurrentValue);
                break;
            case NVDRS_BINARY_TYPE:
                {
                    unsigned int len;
                    printf("Setting Binary (length=%d) :", setArray[i].binaryCurrentValue.valueLength);
                    for(len=0; len<setArray[i].binaryCurrentValue.valueLength; len++)
                    {
                        printf(" %02x", setArray[i].binaryCurrentValue.valueData[len]);
                    }
                    printf("\n");
                }
                break;
            case NVDRS_WSTRING_TYPE:
                wprintf(L"Setting Value: %s\n", setArray[i].wszCurrentValue);
                break;
            }
        }
    }
    printf("\n");
    // Clean up
    NvAPI_DRS_DestroySession(_session);
    _session = 0;
    return 0;
}

Консольный вывод

Это вывод, который я сейчас получаю:

Setting Name: Vertical Sync Tear Control
Setting ID: 5A375C
Predefined? : 0
Setting Value: 96861077
Setting Name: Vertical Sync
Setting ID: A879CF
Predefined? : 0
Setting Value: 8416747
Setting Name: ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
Setting ID: 80303A19
Predefined? : 1
Setting Value: 1
Setting Name: ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
Setting ID: 80857A28
Predefined? : 1
Setting Value: 1
Setting Name: ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
Setting ID: 809D5F60
Predefined? : 1
Setting Value: 1

Проблема

Названия некоторых настроек не отображаются правильно (???...), и большинство из них, похоже, отсутствуют (окружающая окклюзия, анизотропия, управление питанием и т. д.).

Я получаю неправильный профиль или он неправильно инициализирован?

Похожие вопросы

Некоторые вопросы:

  • Есть ли принципиальная разница между NvAPI_DRS_GetCurrentGlobalProfile и NvAPI_DRS_GetBaseProfile? Кажется, они должны делать то же самое.
  • Действительно ли текущий глобальный профиль соответствует глобальным параметрам, которые я вижу, когда открываю панель управления NVIDIA?

person HEADLESS_0NE    schedule 20.04.2017    source источник


Ответы (2)


В вашем массиве есть неинициализированная память

NVDRS_SETTING* setArray = new NVDRS_SETTING[profileInformation.numOfSettings];

и это означает, что вы можете найти в нем любые данные (отсюда и недопустимые строки, которые вы печатаете).

Либо рассмотрите возможность нулевой инициализации

NVDRS_SETTING*setArray = new NVDRS_SETTING[profileInformation.numOfSettings];
// Remember `setArray` is a pointer
memset(setArray, 0, sizeof(*setArray) * profileInformation.numOfSettings);

или используйте std::vector, который в этом случае также будет инициализировать ваши структуры нулями (хотя наличие явного конструктора для выполнения этой работы сделало бы все проще и надежнее).

Наконец, рассмотрите возможность пропуска недопустимых записей, вы также можете пропустить недопустимые именованные записи (которые теперь вы можете надежно обнаружить)

if (setArray[i].settingName[0] == 0x00)
  continue;

  • Есть ли принципиальная разница между NvAPI_DRS_GetCurrentGlobalProfile и NvAPI_DRS_GetBaseProfile? Кажется, они должны делать то же самое.

Из руководства по NVAPI.

Базовый профиль — это профиль, который существует всегда и не связан с конкретным приложением. Настройки базового профиля автоматически применяются ко всем процессам в системе.

Профиль без приложений называется глобальным профилем. Настройки глобального профиля применяются ко всем процессам в системе, но только в том случае, если этот профиль выбран в качестве текущего глобального профиля в системе.

поэтому в вашем случае это может быть, но не в том случае, если вы установите другой текущий глобальный профиль (см. NvAPI_DRS_SetCurrentGlobalProfile).

  • Действительно ли текущий глобальный профиль соответствует глобальным параметрам, которые я вижу, когда открываю панель управления NVIDIA?

В большинстве случаев многие другие расширенные настройки скрыты в панели управления, но доступны через код и/или другие расширенные инструменты. Еще более глубокий уровень может заключаться в использовании недокументированных функций, но вы можете многое сломать, если не знаете, что делаете.

person Marco A.    schedule 27.04.2017
comment
Большое спасибо за твою помощь. То, что вы предложили, кажется, работает, однако оно возвращает только две настройки: Vertical Sync Tear Control и Vertical Sync. Почему он не возвращает другие параметры настройки, такие как Maximum Pre-rendered frames, Ambient Occlusion и т. д., которые видны в глобальном профиле панели управления GUI? - person HEADLESS_0NE; 01.05.2017
comment
@HEADLESS_0NE Добавляет ли удаление пропуска NVDRS_CURRENT_PROFILE_LOCATION глобальные/базовые настройки? - person Marco A.; 01.05.2017
comment
Я закомментировал оператор if, который пропускает NVDRS_CURRENT_PROFILE_LOCATION, и дает тот же результат, только перебирая Vertical Sync и Vertical Sync Tear Control. - person HEADLESS_0NE; 01.05.2017
comment
Получаете ли вы другие результаты с моей стороны с моим образцом кода? - person HEADLESS_0NE; 01.05.2017

setArray[i].settingName имеет тип массива unsigned short. Я считаю, что проблема заключается в преобразовании его в char * (с wprintf и %s ).

person Heyji    schedule 25.04.2017