home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2001 September
/
Chip_2001-09_cd1.bin
/
zkuste
/
delphi
/
kompon
/
d2345
/
MSYSINFO.ZIP
/
Source
/
MSI_OS.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
2001-06-21
|
22KB
|
633 lines
{*******************************************************}
{ }
{ MiTeC System Information Component }
{ OS Detection Part }
{ version 5.6 for Delphi 3,4,5 }
{ }
{ Copyright ⌐ 1997,2001 Michal Mutl }
{ }
{*******************************************************}
{$INCLUDE MITEC_DEF.INC}
unit MSI_OS;
interface
uses
SysUtils, Windows, Classes;
type
TTimeZone = class(TPersistent)
private
FStdBias: integer;
FDayBias: integer;
FBias: integer;
FDisp: string;
FStd: string;
FDayStart: TDatetime;
FStdStart: TDatetime;
FDay: string;
FMap: string;
public
procedure GetInfo;
procedure Report(var sl :TStringList);
property MapID: string read FMap;
published
property DisplayName: string read FDisp write FDisp stored False;
property StandardName: string read FStd write FStd stored False;
property DaylightName: string read FDay write FDay stored False;
property DaylightStart: TDatetime read FDayStart write FDayStart stored False;
property StandardStart: TDatetime read FStdStart write FStdStart stored False;
property Bias: integer read FBias write FBias stored False;
property DaylightBias: integer read FDayBias write FDayBias stored False;
property StandardBias: integer read FStdBias write FStdBias stored False;
end;
const
VER_NT_WORKSTATION = $0000001;
VER_NT_DOMAIN_CONTROLLER = $0000002;
VER_NT_SERVER = $0000003;
VER_SUITE_SMALLBUSINESS = $0000002;
VER_SUITE_ENTERPRISE = $0000004;
VER_SUITE_BACKOFFICE = $0000008;
VER_SUITE_COMMUNICATIONS = $0000010;
VER_SUITE_TERMINAL = $0000020;
VER_SUITE_SMALLBUSINESS_RESTRICTED = $0000040;
VER_SUITE_EMBEDDEDNT = $0000080;
VER_SUITE_DATACENTER = $0000100;
type
POSVersionInfoEx = ^TOSVersionInfoEx;
TOSVersionInfoEx = record
dwOSVersionInfoSize: DWORD;
dwMajorVersion: DWORD;
dwMinorVersion: DWORD;
dwBuildNumber: DWORD;
dwPlatformId: DWORD;
szCSDVersion: array [0..127] of Char;
wServicePackMajor: Word;
wServicePackMinor: Word;
wSuiteMask: Word;
wProductType: Byte;
wReserved: Byte;
end;
TNtProductType = (ptUnknown, ptWorkStation, ptServer, ptAdvancedServer);
TNTSuite = (suSmallBusiness, suEnterprise, suBackOffice, suCommunications,
suTerminal, suSmallBusinessRestricted, suEmbeddedNT, suDataCenter);
TNTSuites = set of TNTSuite;
TNTSpecific = class(TPersistent)
private
FSPMinorVer: Word;
FSPMajorVer: Word;
FProduct: TNTProductType;
FSuites: TNTSuites;
public
procedure GetInfo;
procedure Report(var sl: TStringList);
procedure Report_InstalledSuites(var sl: TStringList);
published
property ProductType: TNTProductType read FProduct write FProduct stored False;
property InstalledSuites: TNTSuites read FSuites write FSuites stored False;
property ServicePackMajorVersion: Word read FSPMajorVer write FSPMajorVer stored False;
property ServicePackMinorVersion: Word read FSPMinorVer write FSPMinorVer stored False;
end;
TOperatingSystem = class(TPersistent)
private
FBuildNumber: integer;
FMajorVersion: integer;
FMinorVersion: integer;
FPlatform: string;
FCSD: string;
FVersion: string;
FRegUser: string;
FProductID: string;
FRegOrg: string;
FEnv: TStrings;
FDirs: TStrings;
FTZ: TTimeZone;
FNTSpec: TNTSpecific;
FProductKey: string;
FDVD: string;
protected
public
constructor Create;
destructor Destroy; override;
procedure GetInfo;
procedure Report(var sl :TStringList);
published
property MajorVersion :integer read FMajorVersion write FMajorVersion stored false;
property MinorVersion :integer read FMinorVersion write FMinorVersion stored false;
property BuildNumber :integer read FBuildNumber write FBuildNumber stored false;
property Platform :string read FPlatform write FPlatform stored false;
property Version :string read FVersion write FVersion stored false;
property CSD :string read FCSD write FCSD stored false;
property ProductID :string read FProductID write FProductID stored false;
property ProductKey :string read FProductKey write FProductKey stored False;
property RegisteredUser :string read FRegUser write FRegUser stored false;
property RegisteredOrg :string read FRegOrg write FRegOrg stored false;
property TimeZone :TTimeZone read FTZ write FTZ stored false;
property Environment :TStrings read FEnv write FEnv stored false;
property Folders: TStrings read FDirs write FDirs stored False;
property NTSpecific: TNTSpecific read FNTSpec write FNTSpec stored False;
property DVDRegion: string read FDVD write FDVD stored False;
end;
function GetVersionEx(lpVersionInformation: POSVersionInfoEx): BOOL; stdcall;
implementation
uses
ShlObj, Registry, MiTeC_Routines;
function GetVersionEx; external kernel32 name 'GetVersionExA';
{ TTimeZone }
type
TRegTimeZoneInfo = packed record
Bias: Longint;
StandardBias: Longint;
DaylightBias: Longint;
StandardDate: TSystemTime;
DaylightDate: TSystemTime;
end;
function GetTZDaylightSavingInfoForYear(
TZ: TTimeZoneInformation; year: word;
var DaylightDate, StandardDate: TDateTime;
var DaylightBias, StandardBias: longint): boolean;
begin
Result:=false;
try
if (TZ.DaylightDate.wMonth <> 0) and
(TZ.StandardDate.wMonth <> 0) then begin
DaylightDate:=DSTDate2Date(TZ.DaylightDate,year);
StandardDate:=DSTDate2Date(TZ.StandardDate,year);
DaylightBias:=TZ.Bias+TZ.DaylightBias;
StandardBias:=TZ.Bias+TZ.StandardBias;
Result:=true;
end;
except
end;
end;
function CompareSysTime(st1, st2: TSystemTime): integer;
begin
if st1.wYear<st2.wYear then
Result:=-1
else
if st1.wYear>st2.wYear then
Result:=1
else
if st1.wMonth<st2.wMonth then
Result:=-1
else
if st1.wMonth>st2.wMonth then
Result:=1
else
if st1.wDayOfWeek<st2.wDayOfWeek then
Result:=-1
else
if st1.wDayOfWeek>st2.wDayOfWeek then
Result:=1
else
if st1.wDay<st2.wDay then
Result:=-1
else
if st1.wDay>st2.wDay then
Result:=1
else
if st1.wHour<st2.wHour then
Result:=-1
else
if st1.wHour>st2.wHour then
Result:=1
else
if st1.wMinute<st2.wMinute then
Result:=-1
else
if st1.wMinute>st2.wMinute then
Result:=1
else
if st1.wSecond<st2.wSecond then
Result:=-1
else
if st1.wSecond>st2.wSecond then
Result:=1
else
if st1.wMilliseconds<st2.wMilliseconds then
Result:=-1
else
if st1.wMilliseconds>st2.wMilliseconds then
Result:=1
else
Result:=0;
end;
function IsEqualTZ(tz1, tz2: TTimeZoneInformation): boolean;
begin
Result:=(tz1.Bias=tz2.Bias) and
(tz1.StandardBias=tz2.StandardBias) and
(tz1.DaylightBias=tz2.DaylightBias) and
(CompareSysTime(tz1.StandardDate,tz2.StandardDate)=0) and
(CompareSysTime(tz1.DaylightDate,tz2.DaylightDate)=0) and
(WideCharToString(tz1.StandardName)=WideCharToString(tz2.StandardName)) and
(WideCharToString(tz1.DaylightName)=WideCharToString(tz2.DaylightName));
end;
procedure TTimeZone.GetInfo;
var
TZKey: string;
RTZ: TRegTimeZoneInfo;
HomeTZ, RegTZ: TTimeZoneInformation;
y,m,d,i: Word;
sl: TStringList;
const
rkNTTimeZones = {HKEY_LOCAL_MACHINE\}'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones';
rk9xTimeZones = {HKEY_LOCAL_MACHINE\}'SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones';
rkTimeZone = {HKEY_LOCAL_MACHINE\}'SYSTEM\CurrentControlSet\Control\TimeZoneInformation';
rvTimeZone = 'StandardName';
begin
try
GetTimeZoneInformation(HomeTZ);
sl:=TStringList.Create;
with TRegistry.create do begin
rootkey:=HKEY_LOCAL_MACHINE;
if IsNT then
TZKey:=rkNTTimeZones
else
TZKey:=rk9xTimeZones;
if OpenKey(TZKey,False) then begin
GetKeyNames(sl);
CloseKey;
for i:=0 to sl.Count-1 do
if OpenKey(TZKey+'\'+sl[i],False) then begin
if GetDataSize('TZI')=SizeOf(RTZ) then begin
ReadBinaryData('TZI',RTZ,SizeOf(RTZ));
StringToWideChar(ReadString('Std'),@RegTZ.StandardName,SizeOf(RegTZ.StandardName) div SizeOf(WideChar));
StringToWideChar(ReadString('Dlt'),@RegTZ.DaylightName,SizeOf(RegTZ.DaylightName) div SizeOf(WideChar));
RegTZ.Bias:=RTZ.Bias;
RegTZ.StandardBias:=RTZ.StandardBias;
RegTZ.DaylightBias:=RTZ.DaylightBias;
RegTZ.StandardDate:=RTZ.StandardDate;
RegTZ.DaylightDate:=RTZ.DaylightDate;
if IsEqualTZ(HomeTZ,RegTZ) then begin
FDisp:=ReadString('Display');
try
FMap:=ReadString('MapID');
except
FMap:='';
end;
Break;
end;
end;
CloseKey;
end;
end;
Free;
end;
FBias:=HomeTZ.Bias;
FStd:=HomeTZ.StandardName;
FDay:=HomeTZ.DaylightName;
DecodeDate(Date,y,m,d);
GetTZDaylightSavingInfoForYear(HomeTZ,y,FDayStart,FStdStart,FDayBias,FStdBias);
sl.Free;
except
on e:Exception do begin
MessageBox(0,PChar(e.message),'TTimeZone.GetInfo',MB_OK or MB_ICONERROR);
end;
end;
end;
procedure TTimeZone.Report(var sl: TStringList);
begin
with sl do begin
Add('[Time Zone]');
Add(Format('TimeZone=%s',[DisplayName]));
Add(Format('StdName=%s',[DateTimeToStr(StandardStart)]));
Add(Format('StdBias=%d',[StandardBias]));
Add(Format('DlghtName=%s',[DateTimeToStr(DaylightStart)]));
Add(Format('DlghtBias=%d',[DaylightBias]));
end;
end;
{ TOperatingSystem }
constructor TOperatingSystem.Create;
begin
inherited;
FEnv:=TStringList.Create;
FDirs:=TStringList.Create;
FTZ:=TTimeZone.Create;
FNTSpec:=TNTSpecific.Create;
end;
destructor TOperatingSystem.Destroy;
begin
FEnv.Free;
FDirs.Free;
FTZ.Free;
FNTSpec.Free;
inherited;
end;
procedure TOperatingSystem.GetInfo;
var
OS :TOSVersionInfo;
OK: Boolean;
p: pchar;
n: DWORD;
WinH: HWND;
s: string;
const
rkOSInfo95 = {HKEY_LOCAL_MACHINE\}'SOFTWARE\Microsoft\Windows\CurrentVersion';
rkOSInfoNT = {HKEY_LOCAL_MACHINE\}'SOFTWARE\Microsoft\Windows NT\CurrentVersion';
rkSP6a = {HKEY_LOCAL_MACHINE\}'SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Hotfix\Q246009';
rvInstalled = 'Installed';
rvVersionName95 = 'Version';
rvVersionNameNT = 'CurrentType';
rvRegOrg = 'RegisteredOrganization';
rvRegOwn = 'RegisteredOwner';
rvProductID = 'ProductID';
rvProductKey = 'ProductKey';
rvDVD = 'DVD_Region';
cUserProfile = 'USERPROFILE';
cUserProfileReg = {HKEY_CURRENT_USER\}'Software\Microsoft\Windows\CurrentVersion\ProfileList';
cUserProfileRec = {HKEY_CURRENT_USER\}'SOFTWARE\Microsoft\Windows\CurrentVersion\ProfileReconciliation';
cProfileDir = 'ProfileDirectory';
begin
try
FDirs.Clear;
TimeZone.GetInfo;
NTSpecific.GetInfo;
ZeroMemory(@OS,SizeOf(OS));
OS.dwOSVersionInfoSize:=SizeOf(OS);
Windows.GetVersionEx(OS);
MajorVersion:=OS.dwMajorVersion;
MinorVersion:=OS.dwMinorVersion;
BuildNumber:=word(OS.dwBuildNumber);
case OS.dwPlatformId of
VER_PLATFORM_WIN32s :Platform:='Windows 3.1x';
VER_PLATFORM_WIN32_WINDOWS :Platform:='Windows 9x';
VER_PLATFORM_WIN32_NT :Platform:='Windows NT';
end;
CSD:=strpas(OS.szCSDVersion);
Version:='';
RegisteredUser:='';
RegisteredOrg:='';
ProductID:='';
with TRegistry.create do begin
rootkey:=HKEY_LOCAL_MACHINE;
if IsNT then
OK:=OpenKey(rkOSInfoNT,False)
else
OK:=OpenKey(rkOSInfo95,False);
if OK then begin
if isnt then begin
if ValueExists(rvVersionNameNT) then
Version:=ReadString(rvVersionNameNT);
end else
if ValueExists(rvVersionName95) then
Version:=ReadString(rvVersionName95);
if ValueExists(rvRegOrg) then
RegisteredOrg:=ReadString(rvRegOrg);
if ValueExists(rvRegOwn) then
RegisteredUser:=ReadString(rvRegOwn);
if ValueExists(rvProductID) then
ProductID:=ReadString(rvProductID);
if ValueExists(rvProductKey) then
ProductKey:=ReadString(rvProductKey);
if ValueExists(rvDVD) then
DVDRegion:=ReadString(rvDVD);
FDirs.Add('CommonFiles='+ReadString('CommonFilesDir'));
FDirs.Add('ProgramFiles='+ReadString('ProgramFilesDir'));
FDirs.Add('Device='+ReadString('DevicePath'));
FDirs.Add('OtherDevice='+ReadString('OtherDevicePath'));
FDirs.Add('Media='+ReadString('MediaPath'));
FDirs.Add('Config='+ReadString('ConfigPath'));
FDirs.Add('Wallpaper='+ReadString('WallPaperDir'));
CloseKey;
if IsNT then begin
if CSD='Service Pack 6' then
if OpenKey(rkSP6a,False) then begin
if ValueExists(rvInstalled) then
if ReadInteger(rvInstalled)=1 then
CSD:='Service Pack 6a';
CloseKey;
end;
end;
end;
Free;
end;
n:=MAX_PATH;
p:=StrAlloc(n);
GetWindowsDirectory(p,n);
FDirs.Add('Windows='+StrPas(p));
GetSystemDirectory(p,n);
FDirs.Add('System='+StrPas(p));
GetTempPath(n,p);
FDirs.Add('Temp='+StrPas(p));
StrDispose(p);
WinH:=GetDesktopWindow;
FDirs.Add('AppData='+GetSpecialFolder(WinH,CSIDL_APPDATA));
FDirs.Add('CommonDesktopDir='+GetSpecialFolder(WinH,CSIDL_COMMON_DESKTOPDIRECTORY));
FDirs.Add('CommonAltStartUp='+GetSpecialFolder(WinH,CSIDL_COMMON_ALTSTARTUP));
FDirs.Add('RecycleBin='+GetSpecialFolder(WinH,CSIDL_BITBUCKET));
FDirs.Add('CommonPrograms='+GetSpecialFolder(WinH,CSIDL_COMMON_PROGRAMS));
FDirs.Add('CommonStartMenu='+GetSpecialFolder(WinH,CSIDL_COMMON_STARTMENU));
FDirs.Add('CommonStartup='+GetSpecialFolder(WinH,CSIDL_COMMON_STARTUP));
FDirs.Add('CommonFavorites='+GetSpecialFolder(WinH,CSIDL_COMMON_FAVORITES));
FDirs.Add('Cookies='+GetSpecialFolder(WinH,CSIDL_COOKIES));
FDirs.Add('Controls='+GetSpecialFolder(WinH,CSIDL_CONTROLS));
FDirs.Add('Desktop='+GetSpecialFolder(WinH,CSIDL_DESKTOP));
FDirs.Add('DesktopDir='+GetSpecialFolder(WinH,CSIDL_DESKTOPDIRECTORY));
FDirs.Add('Favorites='+GetSpecialFolder(WinH,CSIDL_FAVORITES));
FDirs.Add('Drives='+GetSpecialFolder(WinH,CSIDL_DRIVES));
FDirs.Add('Fonts='+GetSpecialFolder(WinH,CSIDL_FONTS));
FDirs.Add('History='+GetSpecialFolder(WinH,CSIDL_HISTORY));
FDirs.Add('Internet='+GetSpecialFolder(WinH,CSIDL_INTERNET));
FDirs.Add('InternetCache='+GetSpecialFolder(WinH,CSIDL_INTERNET_CACHE));
FDirs.Add('NetWork='+GetSpecialFolder(WinH,CSIDL_NETWORK));
FDirs.Add('NetHood='+GetSpecialFolder(WinH,CSIDL_NETHOOD));
FDirs.Add('MyDocuments='+GetSpecialFolder(WinH,CSIDL_PERSONAL));
FDirs.Add('PrintHood='+GetSpecialFolder(WinH,CSIDL_PRINTHOOD));
FDirs.Add('Printers='+GetSpecialFolder(WinH,CSIDL_PRINTERS));
FDirs.Add('Programs='+GetSpecialFolder(WinH,CSIDL_PROGRAMS));
FDirs.Add('Recent='+GetSpecialFolder(WinH,CSIDL_RECENT));
FDirs.Add('SendTo='+GetSpecialFolder(WinH,CSIDL_SENDTO));
FDirs.Add('StartMenu='+GetSpecialFolder(WinH,CSIDL_STARTMENU));
FDirs.Add('StartUp='+GetSpecialFolder(WinH,CSIDL_STARTUP));
FDirs.Add('Templates='+GetSpecialFolder(WinH,CSIDL_TEMPLATES));
s:=ReverseStr(FDirs.Values['Desktop']);
s:=ReverseStr(Copy(s,Pos('\',s)+1,255));
FDirs.Add('Profile='+s);
FEnv.Clear;
GetEnvironment(FEnv);
except
on e:Exception do begin
MessageBox(0,PChar(e.message),'TOperatingSystem.GetInfo',MB_OK or MB_ICONERROR);
end;
end;
end;
procedure TOperatingSystem.Report(var sl: TStringList);
begin
with sl do begin
Add('[Operating System]');
Add(Format('Platform=%s',[Platform]));
Add(Format('VersionName=%s',[Version]));
Add(Format('Version=%d.%d',[MajorVersion,MinorVersion]));
Add(Format('BuildNumber=%d',[BuildNumber]));
Add(Format('CSD=%s',[CSD]));
Add(Format('ProductID=%s',[ProductID]));
Add(Format('ProductKey=%s',[ProductKey]));
Add(Format('RegUser=%s',[RegisteredUser]));
Add(Format('RegOrganization=%s',[RegisteredOrg]));
Add(Format('DVDRegion=%s',[DVDRegion]));
NTSpecific.Report(sl);
Add('[Environment]');
AddStrings(Environment);
Add('[Folders]');
AddStrings(Folders);
TimeZone.Report(sl);
end;
end;
{ TNTSpecific }
procedure TNTSpecific.GetInfo;
var
VersionInfo: TOSVersionInfoEx;
OS :TOSVersionInfo;
s: string;
const
rkProductTypeNT = {HKEY_LOCAL_MACHINE\}'System\CurrentControlSet\Control\ProductOptions';
rvProductType = 'ProductType';
begin
try
ZeroMemory(@OS,SizeOf(OS));
OS.dwOSVersionInfoSize:=SizeOf(OS);
Windows.GetVersionEx(OS);
if (OS.dwPlatformId=VER_PLATFORM_WIN32_NT) and (OS.dwMajorVersion=5) then begin
ZeroMemory(@VersionInfo,SizeOf(VersionInfo));
VersionInfo.dwOSVersionInfoSize:=SizeOf(VersionInfo);
if GetVersionEx(@VersionInfo) then begin
case VersionInfo.wProductType of
VER_NT_WORKSTATION: FProduct:=ptWorkStation;
VER_NT_DOMAIN_CONTROLLER: FProduct:=ptAdvancedServer;
VER_NT_SERVER: FProduct:=ptServer;
end;
FSuites:=[];
if VersionInfo.wSuiteMask and VER_SUITE_SMALLBUSINESS=VER_SUITE_SMALLBUSINESS then
FSuites:=FSuites+[suSmallBusiness];
if VersionInfo.wSuiteMask and VER_SUITE_ENTERPRISE=VER_SUITE_ENTERPRISE then
FSuites:=FSuites+[suEnterprise];
if VersionInfo.wSuiteMask and VER_SUITE_BACKOFFICE=VER_SUITE_BACKOFFICE then
FSuites:=FSuites+[suBackOffice];
if VersionInfo.wSuiteMask and VER_SUITE_COMMUNICATIONS=VER_SUITE_COMMUNICATIONS then
FSuites:=FSuites+[suCommunications];
if VersionInfo.wSuiteMask and VER_SUITE_TERMINAL=VER_SUITE_TERMINAL then
FSuites:=FSuites+[suTerminal];
if VersionInfo.wSuiteMask and VER_SUITE_SMALLBUSINESS_RESTRICTED=VER_SUITE_SMALLBUSINESS_RESTRICTED then
FSuites:=FSuites+[suSmallBusinessRestricted];
if VersionInfo.wSuiteMask and VER_SUITE_EMBEDDEDNT=VER_SUITE_EMBEDDEDNT then
FSuites:=FSuites+[suEmbeddedNT];
if VersionInfo.wSuiteMask and VER_SUITE_DATACENTER=VER_SUITE_DATACENTER then
FSuites:=FSuites+[suDataCenter];
FSPMajorVer:=VersionInfo.wServicePackMajor;
FSPMinorVer:=VersionInfo.wServicePackMinor;
end;
end;
if FProduct=ptUnknown then
with TRegistry.Create do begin
if OpenKey(rkProductTypeNT,False) then begin
s:=ReadString(rvProductType);
if s='WinNT' then
FProduct:=ptWorkStation
else
if s='ServerNT' then
FProduct:=ptServer
else
if s='LanmanNT' then
FProduct:=ptAdvancedServer;
CloseKey;
end;
Free;
end;
except
on e:Exception do begin
MessageBox(0,PChar(e.message),'TNTSpecific.GetInfo',MB_OK or MB_ICONERROR);
end;
end;
end;
procedure TNTSpecific.Report(var sl: TStringList);
begin
with sl do begin
Add('[NT Specific]');
case ProductType of
ptUnknown: Add('ProductType=Unknown');
ptWorkStation: Add('ProductType=Workstation');
ptServer: Add('ProductType=Server');
ptAdvancedServer: Add('ProductType=Advanced Server');
end;
Report_InstalledSuites(sl);
Add(Format('ServicePackMajorVersion=%d',[ServicePackMajorVersion]));
Add(Format('ServicePackMinorVersion=%d',[ServicePackMinorVersion]));
end;
end;
procedure TNTSpecific.Report_InstalledSuites(var sl: TStringList);
begin
with sl do begin
Add(Format('Microsoft Small Business Server=%d',
[integer(suSmallBusiness in InstalledSuites)]));
Add(Format('Windows 2000 Advanced Server=%d',
[integer(suEnterprise in InstalledSuites)]));
Add(Format('Microsoft BackOffice Components=%d',
[integer(suBackOffice in InstalledSuites)]));
Add(Format('Communications=%d',
[integer(suCommunications in InstalledSuites)]));
Add(Format('Terminal Services=%d',
[integer(suSmallBusiness in InstalledSuites)]));
Add(Format('Microsoft Small Business Server with the restrictive client license in force=%d',
[integer(suSmallBusinessRestricted in InstalledSuites)]));
Add(Format('Terminal Services=%d',
[integer(suSmallBusiness in InstalledSuites)]));
Add(Format('Embedded NT=%d',
[integer(suEmbeddedNT in InstalledSuites)]));
Add(Format('Windows 2000 Datacenter Server=%d',
[integer(suDataCenter in InstalledSuites)]));
end;
end;
end.