Почему RegSaveKey () завершается ошибкой с кодом ошибки 5 (доступ запрещен), если ключ для сохранения - HKEY_LOCAL_MACHINE? - PullRequest
0 голосов
/ 28 мая 2018

Этот вопрос не зависит от используемого языка программирования.

Протестировано в Windows 7 SP1 и Windows 10 версии 1803.

Симптомы

RegSaveKey () завершается с ошибкой с кодом 5 ( доступ запрещен ), если ключ для сохранения является HKEY_LOCAL_MACHINE.

Эта ошибка не возникает, если указан подраздел, например HKEY_LOCAL_MACHINE\SYSTEM.

Эта ошибка также не возникает, если ключ HKEY_CURRENT_USER.

Первый образец

Здесь я использую AutoIt для быстрой записи образца кода, которые воспроизводят ошибку.Я также скомпилировал пример кода в .EXE, чтобы люди могли легко разобраться в проблеме.

Второй пример

REG.EXE , который является встроенной в WindowsУ инструмента , написанного с использованием Visual C ++ (поэтому теги включают C), есть точно такая же проблема, как упомянуто выше.Это неудивительно, поскольку, согласно моему исследованию, команда REG.EXE SAVE фактически использует недокументированную NtSaveKey () .Кстати, RegSaveKey () внутренне выполняет вызов NtSaveKey () .

REG.EXE SAVE "HKLM" "HKLM.hiv" /Y

Вышеприведенная команда завершается с ошибкой «Доступ запрещен»,Обратите внимание, что я запускаю команду как Администратор .

Вопрос

В чем причина этой ошибки?Есть ли способ заставить RegSaveKey () работать на HKEY_LOCAL_MACHINE (без указания подключа)?

Обновить

Мой дальнейший тест показывает, что regedit.exe имеет ту же проблему, что и упомянутая выше.

  • Не удается экспортировать HKEY_LOCAL_MACHINE в .HIV файл;однако экспорт в файл .REG завершается успешно.
  • Экспорт HKEY_LOCAL_MACHINE\<subkey> в файл .HIV завершается успешно.
  • Экспорт HKEY_CURRENT_USER в файл .HIV завершается успешно.
  • Экспорт HKEY_CURRENT_USER\<subkey> в файл .HIV выполнен успешно.

1 Ответ

0 голосов
/ 28 мая 2018

Все API, которые сохраняют раздел реестра для внутреннего использования, вызывают CmSaveKey.В исходном коде этой функции мы видим следующий блок кода в начале:

    //
    // Disallow attempts to "save" the master hive
    //
    Hive = KeyControlBlock->KeyHive;

    if (Hive == &CmpMasterHive->Hive) {
        return STATUS_ACCESS_DENIED;
    }

HKEY_LOCAL_MACHINE (т.е. "\ Registry \ Machine"") находится в главном улье, поэтому CmSaveKey возвращает STATUS_ACCESS_DENIED (0xc0000022) вызывающей стороне.Подсистема Windows преобразует этот код состояния в ERROR_ACCESS_DENIED (5).

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