
Итак, наше программное обеспечение используется одним из наших клиентов на устаревших версиях Windows, потому что они находятся в промышленной среде с изоляцией от внешнего мира, и у них есть Windows XP и куча старых серверов, которые являются единственными, что у них работает. Некоторые из них 64-битные.
Читая реестр, я заметил, что в некоторых случаях наше 32-разрядное приложение может фактически напрямую прочитать следующую запись в 64-разрядной версии Windows, что теоретически не должно быть возможным:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer
и извлечь номер версии из строкового значения «Версия».
Однако если мы создадим ключ на том же ПК
HKEY_LOCAL_MACHINE\SOFTWARE\Our Software
и добавим строковое значение, например «Последнее обслуживание», его невозможно будет прочитать.
Разрешения и права собственности такие же, как у записи IE, когда мы пытаемся добавить ее туда, но безрезультатно.
Конечно, работать с \\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Our Software\Last Service Date
этим можно, но почему, если некоторые другие вещи могут попасть в "нормальную" часть реестра и быть читаемыми, некоторые нет? Было бы проще и чище при извлечении данных из приложения, чтобы прочитать дату обслуживания, и критично, если она будет неправильно добавлена в стандартный HKEY_LOCAL_MACHINE по неосторожности.
Я что-то пропустил?
решение1
Вы столкнулись с Реестр перенаправитель:
Редиректор реестра изолирует 32- и 64-разрядные приложения, предоставляя отдельные логические представления определенных частей реестра на WOW64. Редиректор реестра перехватывает 32- и 64-разрядные вызовы реестра к соответствующим логическим представлениям реестра и сопоставляет их с соответствующим физическим местоположением реестра. Процесс перенаправления прозрачен для приложения. Поэтому 32-разрядное приложение может получать доступ к данным реестра, как если бы оно работало в 32-разрядной Windows, даже если данные хранятся в другом месте в 64-разрядной Windows.
Некоторые ключи реестра приложений, такие как HKEY_LOCAL_MACHINE\Software
всегда перенаправлены. Большинство кустов реестра не перенаправлены.
32/64-битная программа все равно может принудительно получить доступ к 64/32-битной версии реестра, включив в запрос специальные флаги, как описано в статье Доступ к альтернативному представлению реестра. Смотрите также Пример перенаправления реестра на WOW64.