Для определения версии ОС, установленной на вычислительной машине, можно использовать функцию GetVersionEx, которая определяет версию ОС и другую информацию о запущенной в текущий момент времени ОС. В качестве входного параметра используется указатель на структуру данных типа OSVERSIONINFO или OSVERSIONINFOEX (таблица 18), которая кроме тех полей что входят в структуру данных OSVERSIONINFO содержит дополнительные поля. Функция GetVersionEx существует как в Unicode-формате (в тексте программы вызов функции осуществляется как CALL GetVersionExW), так и в ANSI-формате (GetVersionExA).
Таблица 18 - Структура данных OSVERSIONINFOEX
Название поля | Тип в С | Тип в ассемблере | Назначение поля |
dwOSVersionInfoSize | DWORD | DD | Размер этой структуры данных в байтах |
dwMajorVersion | DWORD | DD | Номер версии ОС: 4 - NT4; 5 - XP, Server 2003; 6 - Vista, Server2008. |
dwMinorVersion | DWORD | DD | Номер модификации: 0 - у Vista, Server 2008, NT4.0; 1- у XP; 2 - у Server 2003 или XP Professional x64 |
dwBuildNumber | DWORD | DD | Номер сборки ОС |
dwPlatformId | DWORD | DD | Идентификатор платформы |
szCSDVersion[128] | TCHAR | db или dw | Строка заканчивающаяся нулем, показывающая последнее обновление ОС (ServicePack), установленное в системе. В зависимости от типа кодировки состоит либо из двухбайтных (Unicode), либо из однобайтных символов (ANSI). |
wServicePackMajor | WORD | DW | Версия установленного обновления в системе |
wServicePackMinor | WORD | DW | Модификация версии установленного обновления в системе |
wSuiteMask | WORD | DW | Битовая маска, определяющая какие блоки установлены в системе (установлены ли HOME-версии ОС, установлен ли Windows Home Server и т.п.). Более подробно см. в [Ошибка! Источник ссылки не найден.] |
wProductType | BYTE | DB | Такая информация как: является ли установленная ОС контроллером домена (значение параметра = 2), сервером (значение параметра = 3) или просто рабочей станцией (значение параметра = 1). |
wReserved | BYTE | DB | Зарезервировано |
Необходимо отметит, что перед тем, как вызывать функцию GetVersionEx необходимо установить соответствующее значение поля dwOSVersionInfoSize этой структуры.
При успешном выполнении функции GetVersionEx возвращается ненулевое значение.
Поскольку возможности ОС со временем могут расширяться с помощью установки динамических библиотек, определение версии ОС не является лучшим способом узнать, поддерживает ли установленная ОС ту или иную возможность. Поэтому, лучше использовать другие методы: например, попытаться загрузить динамическую библиотеку, в которой должна находиться необходимая функция и запустить эту функцию. Если попытка не удалась - значит, ОС не поддерживает данную возможность. Можно использовать какие-то другие функции (см. предыдущий раздел - не все ОС поддерживают некоторые функциональные возможности процессора, поэтому при попытке выполнить функцию IsProcessorFeaturePresent результат будет отрицательным) которые позволят определить, поддерживает ли данная конкретная ОС ту или иную возможность.