Доступ к реестру x64 из приложения x86

Автор Тема: Доступ к реестру x64 из приложения x86  (Прочитано 15887 раз)

0 Пользователей и 3 Гостей просматривают эту тему.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Доступ к реестру x64 из приложения x86
« Ответ #15 : 24-02-2014, 11:38:40 »
2. Еще: http://support.microsoft.com/kb/556009/ru
Хм... Как выяснилось, числовое значение ключа реестра (Platform ID) у меня содержит одно и то же значение что в Windows 7 x64, что в Windows XP SP3 x86: 0x01.
Отличаются только текстовое сообщение идентификатора процессора (ключ Identifier):

- Intel64 Family 6 Model 23 Stepping 10
- x86 Family 6 Model 26 Stepping 5


Согласно MSDN:
Цитировать
The above “x86” and “0x00000020(32)” indicate that the Operating System version is 32 bit.
Вот только никакого “0x00000020(32)” в x86 (виртуальная машинка VMWare) у меня нет, как выше мною уже было обозначено.

Причём в операционной системе x86 код
Код - C# [Выбрать]
  1. regAcad = parrentRegistry.OpenSubKey(ParrentAcadRegistryKey,
  2.         false, RegWow64Options.KEY_WOW64_64KEY);
возвращается не null (как я ожидал), а RegistryKey тот же, что и для
Код - C# [Выбрать]
  1. regAcad = parrentRegistry.OpenSubKey(ParrentAcadRegistryKey,
  2.         false, RegWow64Options.KEY_WOW64_32KEY);
Т.о. в операционной системе x86 одна и та же информация извлекается дважды (что так же не есть гуд).

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Доступ к реестру x64 из приложения x86
« Ответ #16 : 24-02-2014, 12:26:06 »
Переписал код следующим образом:
Код - C# [Выбрать]
  1. /// <summary>
  2. /// Проверка на то, является ли текущий операционная система 64-битной.
  3. /// </summary>
  4. /// <returns>true - текущая операционная система x64, иначе - false.</returns>
  5. public static Boolean Is64BitOS() {
  6.         Boolean isWow64 = false;
  7.         if ((Environment.OSVersion.Version.Major == 5 && Environment.OSVersion
  8.                 .Version.Minor >= 1) || Environment.OSVersion.Version.Major >= 6) {
  9.                 using (Process p = Process.GetCurrentProcess()) {
  10.                         Boolean retVal;
  11.                         if (!IsWow64Process(p.Handle, out retVal)) {
  12.                                 isWow64 = false;
  13.                         }
  14.                         isWow64 = retVal;
  15.                 }
  16.         }
  17.         else {
  18.                 isWow64 = false;
  19.         }
  20.  
  21.         Boolean is64BitProcess = (IntPtr.Size == 8);
  22.         Boolean is64BitOperatingSystem = is64BitProcess || isWow64;
  23.         return is64BitOperatingSystem;
  24. }
Корректно определяет разрядность операционной системы как в Windows 7 x64, так и в Windows XP SP3 x86, не зависимо от того, как откомпилирован код (x86, x64, AnyCPU).