//
// taken from PSDK Feb 2003 - "Getting the System version"
// (ms-help://MS.PSDK.1033/sysinfo/base/getting_the_system_version.htm)
//
function GetWinVersion:
string;
var
osvi : TOSVersionInfo;
bOsVersionInfoEx : boolean;
key : HKEY;
szProductType :
array[0..79]
of char;
dwBuflen : dword;
begin
// Try calling GetVersionEx using the OSVERSIONINFOEX structure.
// If that fails, try using the OSVERSIONINFO structure.
ZeroMemory(@osvi,sizeof(TOSVersionInfo));
osvi.dwOSVersionInfoSize := sizeof(TOSVersionInfo);
bOsVersionInfoEx := GetVersionEx(osvi);
if(
not bOsVersionInfoEx)
then begin
osvi.dwOSVersionInfoSize := VERSIONINFOSIZE;
if(
not GetVersionEx(osvi))
then begin
Result := '
Fehler bei der Ermittlung der Windows-Version';
exit;
end;
end;
case osvi.dwPlatformId
of
// Test for the Windows NT product family.
VER_PLATFORM_WIN32_NT:
begin
// Test for the specific product family.
if(osvi.dwMajorVersion = 5)
and (osvi.dwMinorVersion = 2)
then
Result := '
Microsoft Windows Server 2003 family, ';
if(osvi.dwMajorVersion = 5)
and (osvi.dwMinorVersion = 1)
then
Result := '
Microsoft Windows XP ';
if(osvi.dwMajorVersion = 5)
and (osvi.dwMinorVersion = 0)
then
Result := '
Microsoft Windows 2000 ';
if(osvi.dwMajorVersion <= 4)
then
Result := '
Microsoft Windows NT ';
// Test for specific product on Windows NT 4.0 SP6 and later.
if(bOsVersionInfoEx)
then begin
// Test for the workstation type.
if(osvi.wProductType = VER_NT_WORKSTATION)
then begin
if(osvi.dwMajorVersion = 4)
then
Result := Result + '
Workstation 4.0 '
else if(osvi.wSuiteMask
and VER_SUITE_PERSONAL <> 0)
then
Result := Result + '
Home Edition '
else
Begin // Unterscheidung zw. MCE und Prof.
if GetSystemMetrics(SM_MEDIACENTER) <> 0
then
Result := Result + '
Media Center Edition '
else
Result := Result + '
Professional ';
End;
end
// Test for the server type.
else if(osvi.wProductType = VER_NT_SERVER)
then begin
if(osvi.dwMajorVersion = 5)
and
(osvi.dwMinorVersion = 2)
then
begin // Win 2003
if(osvi.wSuiteMask
and VER_SUITE_DATACENTER <> 0)
then
Result := Result + '
Datacenter Edition '
else if(osvi.wSuiteMask
and VER_SUITE_ENTERPRISE <> 0)
then
Result := Result + '
Enterprise Edition '
else if(osvi.wSuiteMask = VER_SUITE_BLADE)
then
Result := Result + '
Web Edition '
else
Result := Result + '
Standard Edition ';
end // Win 2000
else if(osvi.dwMajorVersion = 5)
and
(osvi.dwMinorVersion = 0)
then
begin
if(osvi.wSuiteMask
and VER_SUITE_DATACENTER <> 0)
then
Result := Result + '
Datacenter Server '
else if(osvi.wSuiteMask
and VER_SUITE_ENTERPRISE <> 0)
then
Result := Result + '
Advanced Server '
else
Result := Result + '
Server ';
end
else begin // Windows NT 4.0
if(osvi.wSuiteMask
and VER_SUITE_ENTERPRISE <> 0)
then
Result := Result + '
Server 4.0, Enterprise Edition '
else
Result := Result + '
Server 4.0 ';
end;
end
end
// Test for specific product on Windows NT 4.0 SP5 and earlier
else begin
dwBufLen := sizeof(szProductType);
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
'
SYSTEM\CurrentControlSet\Control\ProductOptions',0,
KEY_QUERY_VALUE,key) = ERROR_SUCCESS)
then
try
ZeroMemory(@szProductType,sizeof(szProductType));
if(RegQueryValueEx(key,'
ProductType',
nil,
nil,
@szProductType,@dwBufLen) <> ERROR_SUCCESS)
or
(dwBufLen > sizeof(szProductType))
then
ZeroMemory(@szProductType,sizeof(szProductType));
finally
RegCloseKey(key);
end;
if(lstrcmpi('
WINNT',szProductType) = 0)
then
Result := Result + '
Workstation ';
if(lstrcmpi('
LANMANNT',szProductType) = 0)
then
Result := Result + '
Server ';
if(lstrcmpi('
SERVERNT',szProductType) = 0)
then
Result := Result + '
Advanced Server ';
Result := Format('
%s%d.%d',[Result,osvi.dwMajorVersion,
osvi.dwMinorVersion]);
end;
// Display service pack (if any) and build number.
if(osvi.dwMajorVersion = 4)
and
(lstrcmpi(osvi.szCSDVersion,'
Service Pack 6') = 0)
then
begin
// Test for SP6 versus SP6a.
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
'
SOFTWARE\Microsoft\Windows NT\CurrentVersion\Hotfix\Q246009',
0,KEY_QUERY_VALUE,key) = ERROR_SUCCESS)
then
Result := Format('
%sService Pack 6a (Build %d)',[Result,
osvi.dwBuildNumber
and $ffff])
else
// Windows NT 4.0 prior to SP6a
Result := Format('
%s%s (Build %d)',[Result,
osvi.szCSDVersion,osvi.dwBuildNumber
and $ffff]);
RegCloseKey(key);
end
// Windows NT 3.51 and earlier or Windows 2000 and later
else begin
Result := Format('
%s%s (Build %d)',[Result,
osvi.szCSDVersion,osvi.dwBuildNumber
and $ffff]);
end;
end;
// Test for the Windows 95 product family.
VER_PLATFORM_WIN32_WINDOWS:
begin
if(osvi.dwMajorVersion = 4)
and
(osvi.dwMinorVersion = 0)
then
begin
Result := '
Microsoft Windows 95 ';
if(osvi.szCSDVersion[0] = '
C')
or
(osvi.szCSDVersion[0] = '
B')
then Result := Result + '
OSR2 ';
end;
if(osvi.dwMajorVersion = 4)
and
(osvi.dwMinorVersion = 10)
then
begin
Result := '
Microsoft Windows 98 ';
if(osvi.szCSDVersion[0] = '
A')
then Result:= Result + '
SE ';
end;
if(osvi.dwMajorVersion = 4)
and
(osvi.dwMinorVersion = 90)
then
begin
Result := '
Microsoft Windows Millennium Edition';
end;
end;
VER_PLATFORM_WIN32s:
Result := '
Microsoft Win32s';
end;
end;