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

Я хочу использовать NVIDIA SDK NVIDIA для получения всех настроек, представленных в глобальном профиле настроек 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?

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?

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

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

Другие вопросы по тегам