Для определения версии ОС, установленной на вычислительной машине, можно использовать функцию 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 результат будет отрицательным) которые позволят определить, поддерживает ли данная конкретная ОС ту или иную возможность.