Есть ли способ проверить, является ли раздел реестра Windows энергозависимым (REG_OPTION_VOLATILE)? - PullRequest
3 голосов
/ 13 декабря 2010

В реестре Windows ключи могут быть созданы как энергозависимые - это означает, что энергозависимый ключ не выживет после перезагрузки ПК. После перезагрузки в реестре не будет обнаружено никаких следов такого ключа. Это указывается параметром REG_OPTION_VOLATILE API RegCreateKeyEx.

Мне нужно проверить, является ли определенный раздел реестра Windows энергозависимым или нет (создан с помощью REG_OPTION_VOLATILE).

Например, ключ может быть расположен в (HKLM \ Software \ MyCompany \ MyProgram \ KeyToBeChecked).

Похоже, нет прямых API-интерфейсов WIN, которые бы позволяли выполнять такого рода проверки.

Кто-нибудь знает, как это можно проверить?

Ответы [ 2 ]

3 голосов
/ 17 февраля 2013

Один из способов - попытаться создать энергонезависимый подраздел под проверяемым ключом, используя RegCreateKeyEx. Если ключ действительно нестабилен, то произойдет сбой с ошибкой ERROR_CHILD_MUST_BE_VOLATILE. Даже ShSetValue возвращает ERROR_CHILD_MUST_BE_VOLATILE при попытке установить значение в энергозависимой клавише.

2 голосов
/ 15 июня 2018

Начиная с win7 существуют недокументированные пути - нужно позвонить ZwQueryKey с KeyFlagsInformation.при этом мы можем запросить, является ли ключ изменчивым или нет, а также - является ли ключ символической ссылкой на другой ключ.код может выглядеть так:

struct KEY_CONTROL_FLAGS_INFO_W7  // KeyFlagsInformation for Win7
{
    ULONG ControlFlags[3];
};

#define KEY_CTRL_FL_W7_01__IS_VOLATILE                                 0x01
#define KEY_CTRL_FL_W7_01__SYM_LINK                                    0x02


    HKEY hKey;
    LSTATUS r = RegOpenKeyEx(HKEY_CURRENT_USER, 
        L"Volatile Environment", REG_OPTION_OPEN_LINK, KEY_READ, &hKey);
    if (r == NOERROR)
    {
        ULONG cb;
        KEY_CONTROL_FLAGS_INFO_W7 kcf;

        if (0 <= ZwQueryKey(hKey, KeyFlagsInformation, &kcf, sizeof(kcf), &cb))
        {
            if (kcf.ControlFlags[1] & KEY_CTRL_FL_W7_01__IS_VOLATILE)
            {
                DbgPrint("key is volatile\n");
            }

            if (kcf.ControlFlags[1] & KEY_CTRL_FL_W7_01__SYM_LINK)
            {
                DbgPrint("key is link\n");
            }
        }
        RegCloseKey(hKey);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...