Działa w systemie Windows     WinVer 1.03           Kompilacja


Program do sprawdzania wersji systemu Windows. Wykrywa 18 podstawowych wersji Windows
(od 3.1 do 11). Został napisany w języku C za pomocą darmowego środowiska "Open Watcom 1.9".
Występuje w dwóch wersjach:

Wersja 16-bitowa (Win16)
Działa w systemie Windows 3.1 i nowszym (procesor 086+), ale nie uruchomi się w żadnym systemie
64-bitowym (np. Windows XP Professional x64). Do sprawdzania wersji systemu, program używa
funkcji WinAPI o nazwie GetVersion(). Funkcja ta zwraca wartość typu DWORD:



Starsze słowo tej wartości zawiera numer wersji systemu MS-DOS: starszy bajt to wersja (major),
a młodszy to podwersja (minor). Młodsze słowo tej wartości zawiera numer wersji systemu Windows
(nie są to prawdziwe dane): starszy bajt to podwersja (minor), a młodszy to wersja (major).
Wersja systemu Windows jest określana na podstawie wersji (major) systemu MS-DOS
(starszy bajt w starszym słowie wartości DWORD zwracanej przez funkcję GetVersion()).

Po 38 linii kodu źródłowego, wartość zmiennej "vwin" określa wersję systemu Windows:

VWIN   WINDOWS   
 5
 6
 7
 8
NT/2000/XP/2003/Vista/2008/7/8/2012/10/2016/2019/2022/11
3.1/3.11
95/98
ME
inna - nieznana wersja lub nie można jej sprawdzić


Wersja 32-bitowa (Win32)
Działa w systemie Windows 95 i nowszym (procesor 386+). Do sprawdzania wersji systemu,
program używa funkcji WinAPI o nazwie GetVersionEx(). Standardowo funkcja ta wypełnia strukturę
OSVERSIONINFO, która zawiera informacje o systemie Windows: numer wersji (major), podwersji
(minor), kompilacji (build), typ platformy (Win3.1, Win32, WinNT) oraz dodatkowe informacje tekstowe
(np. "Dodatek Service Pack 2").
Jeśli program działa w systemie Windows NT 4.0 (SP6) lub nowszym, wypełniana jest rozszerzona
struktura OSVERSIONINFOEX. Oprócz wyżej wymienionych, zawiera ona dodatkowe informacje:
numer wersji (major) i podwersji (minor) dodatku Service Pack oraz typ zainstalowanego systemu
i innego oprogramowania.
System Windows jest rozpoznawany na podstawie jego numeru wersji (dwMajorVersion) i podwersji
(dwMinorVersion) ze struktury OSVERSIONINFO(EX). W przypadku systemu Windows NT 4.0 (SP6)
lub nowszego, wypełniona struktura OSVERSIONINFOEX zawiera również jego typ (wProductType),
który pozwala odróżnić edycję przeznaczoną dla komputerów (desktop) i serwerów (server).
Rozpoznawanie systemów Windows 10/11 i 2016/2019/2022 Server jest trudniejsze, bo każdy z nich
ma identyczny numer wersji i podwersji. Dlatego program korzysta dodatkowo z numeru kompilacji
(dwBuildNumber) ze struktury OSVERSIONINFOEX. Numery wszystkich znanych kompilacji systemów
Windows, znajdują się na tej stronie: https://betawiki.net/wiki/Microsoft_Windows.
Kolejnym utrudnieniem w przypadku systemów Windows 8.1/10/11 i 2012 R2/2016/2019/2022 Server
jest to, że domyślnie po wykonaniu funkcji GetVersionEx() nie zwracają one swojego numeru wersji/
podwersji, a jedynie numer wersji "6.2" systemu Windows 8/2012 Server. Aby rozwiązać ten problem,
należy dodać do programu plik "manifest", w którym znajdzie się informacja dla tych systemów, że jest
on z nimi kompatybilny. Plik ten zapisany w formacie XML wbudowałem w program jako zasób (reso-
urce). Zamiast tego można go też umieścić w tym samym katalogu razem z programem - musi mieć
identyczną nazwę jak program (z rozszerzeniem ".exe"), ale dodatkowo zakończoną wyrazem ".mani-
fest" ("WinVer.exe.manifest").

Po 210 linii kodu źródłowego, wartość zmiennej "vwin" określa wersję systemu Windows:

VWINWINDOWSROKWERSJA
1003.x19923.1
2009519954.0.950
3009819984.10.1998
400ME20004.90.3000
500NT19933.1(NT)
600200020005.0.3700(NT)
700XP20015.1.2600(NT)
750XP Pro x6420055.2.3790(NT)
8002003 Server20035.2.3790(NT)
8502003 Server R220055.2.3790(NT)
900Vista20066.0.6000(NT)
10002008 Server20086.0.6001(NT)
10502008 Server R220096.1.7600(NT)
1100720096.1.7600(NT)
1200820126.2.9200(NT)
12508.120136.3.9600(NT)
13002012 Server20126.2.9200(NT)
13502012 Server R2  20136.3.9600(NT)
140010201510.0.10240(NT)
15002016 Server201610.0.14393(NT)
16002019 Server201810.0.17763(NT)
17002022 Server202110.0.20348(NT)
1800   112021   10.0.22000  (NT)
 0 - nieznana wersja lub nie można jej sprawdzić


Głównym celem było stworzenie algorytmu rozpoznającego wersję systemu i dającego się zaimple-
mentować w dowolnej aplikacji dla Windows. Algorytm ten umożliwia dostosowanie działania aplikacji
(np. używanych funkcji WinAPI) w zależności od wersji systemu (wiele funkcji WinAPI nie jest dostęp-
nych w starszych wersjach Windows).

Znane problemy

  ILUSTRACJA  
OPIS
 W systemie Windows NT 4.0 ikony programu (małe i duże) są błędnie wyświetlane.
 Mają czarne tło zamiast przeźroczystego i pojawiają się na nich drobne artefakty
 (zbędne piksele). Problem dotyczy 16- i 32-bitowej wersji programu.
 W systemie Windows Vista okno 16-bitowej wersji programu jest błędnie wyświetlane. 
 Ma zmniejszone rozmiary o szerokość 5-pikselowej ramki, którą jest otoczone.
 W systemie Windows Vista/2008/7/8/2012/10/2016/2019/2022/11 ikona 16-bitowej
 wersji programu nie jest wyświetlana. Zamiast niej pojawia się systemowa ikona
 reprezentująca aplikacje (EXE).


Historia zmian:

1.03 - dodano rozpoznawanie systemu Windows 8.1/10/11 i 2012 R2/2016/2019/2022 Server.

1.02 - drobne zmiany w kodzie:
* dodanie przycisku do minimalizacji okna programu
* automatyczne zaznaczanie przycisku "Check" po aktywacji okna programu
* inne mniejsze poprawki

1.01 - drobne zmiany w kodzie:
* zamykanie programu komunikatem WM_DESTROY po kliknięciu przycisku "Quit"
* zamiana bloków poleceń warunkowych IF na SWITCH (mniejszy rozmiar)
* dodanie nawigacji za pomocą klawiatury w oknie programu
* zmiana formatu wyświetlania wersji systemu Windows

1.0 - pierwsza wersja programu.