Функция, возвращающая 0, работает, возвращая> 0, приведет к сбою программы - PullRequest
0 голосов
/ 27 сентября 2019

Я выполняю вызов функции в операторе if

if (function(...)) {
    do some stuff...
} else {
    do something else...
}

. Проблема в том, что когда функция возвращает 0, блок else { ... } выполняется отлично, но если функция возвращает что-то> 0программа завершится сбоем.

рассматриваемая функция:

BOOL fnCheckRegistryKeyW(
    _In_ LPCWSTR lpSubKey,
    _In_ LPCWSTR lpValueName,
    _In_ DWORD dwEType,
    _In_ BYTE bEValue
) {
    HKEY hKey;
    DWORD dwType;
    BYTE bValue;
    DWORD dwlen = sizeof(DWORD);
    BOOL bReturn = FALSE;

    LSTATUS lsRKey = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpSubKey, 0, KEY_READ | KEY_WOW64_32KEY, &hKey);
    if (!lsRKey) {
        LSTATUS lsRVal = RegQueryValueEx(hKey, lpValueName, 0, &dwType, (PBYTE)&bValue, &dwlen);
        if (!lsRVal) {
            if (dwType == dwEType && bValue == bEValue) {
                RegCloseKey(hKey);
                return TRUE;
            } else {

            }
        } else {

        }
    } else {

    }

    // If HKLM can't be read try HKCU
    hKey = NULL;
    lsRKey = RegOpenKeyEx(HKEY_CURRENT_USER, lpSubKey, 0, KEY_READ | KEY_WOW64_32KEY, &hKey);
    if (!lsRKey) {
        LSTATUS lsRVal = RegQueryValueEx(hKey, lpValueName, 0, &dwType, (PBYTE)&bValue, &dwlen);
        if (!lsRVal) {
            if (dwType == dwEType && bValue == bEValue) {
                RegCloseKey(hKey);
                return TRUE;
            } else {

            }
        } else {

        }
    } else {

    }

    RegCloseKey(hKey);
    return FALSE;
}

Сама функция работает нормально, но она завершает работу программы, как только она возвращает значение> 0, и из-за этогокодовый блок внутри оператора if не выполняется.

1 Ответ

0 голосов
/ 27 сентября 2019

Вы передаете указатель на один BYTE в качестве буфера для RegQueryValueEx() для записи, но вы устанавливаете dwLen в sizeof(DWORD) (4), что позволяет RegQueryValueEx() записывать до 4 байтовв буфер, который может содержать только 1 байт.Вам нужно изменить bValue с BYTE на DWORD или же вместо dwLen на sizeof(BYTE) (1).

В противном случае, динамически выделять буфер.Вызовите RegQueryValueEx() один раз с параметром lpData, установленным в NULL, затем выделите буфер, используя размер байта, указанный в выводе, затем снова вызовите RegQueryValueEx() с этим буфером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...