How Windows 98 Supported Setup.exe Installers
In Microsoft Windows 98, installing software via a
Setup.exe file relied on a hybrid architecture that bridged
16-bit DOS/Windows legacy code with modern 32-bit Windows operating
system features. This article explains how Windows 98 executed these
installers, how third-party installer engines orchestrated file
extraction, how the operating system registered libraries and tracked
modifications in the Windows Registry, and how the OS replaced locked
system files through reboots.
Execution and Binary Compatibility
When a user ran Setup.exe in Windows 98, the operating
system's loader examined the executable header to determine its
architecture. Windows 98 provided native backward compatibility,
allowing Setup.exe to run whether it was compiled as a
16-bit New Executable (NE) from the Windows 3.1 era or a 32-bit Portable
Executable (PE) designed for the Win32 API. If the installer was a
legacy 16-bit application, Windows 98 executed it within the Win16
subsystem (Win16 on Win32, running under a shared virtual machine),
while 32-bit installers ran in their own protected address spaces.
Third-Party Installation Frameworks
Setup.exe was rarely an independent executable; it
typically served as a bootstrap loader for dedicated installation
frameworks such as InstallShield, Wise Solutions, or Microsoft ACME
Setup. Upon launch, Setup.exe unpacked compressed archive
files (such as .CAB files or proprietary data archives)
into the system's temporary directory (C:\WINDOWS\TEMP).
The bootstrap program then initialized the main setup script, presented
graphical wizard interfaces to the user, and handled hardware or system
requirement checks before moving files to user-defined destinations,
such as C:\Program Files.
File Deployment and Version Checking
Windows 98 provided standard Win32 file manipulation APIs to assist
installers in file transfer and version verification. When copying
shared Dynamic Link Libraries (DLLs) to C:\WINDOWS\SYSTEM,
installers utilized system version APIs (GetFileVersionInfo
and VerQueryValue) to compare the version of the file being
installed against existing files. This was intended to prevent older
files from overwriting newer ones, an issue commonly known as "DLL
Hell." If an installer encountered a locked or in-use system file, it
scheduled a file replacement operation.
Delayed File Replacement via WININIT.INI
Because Windows 98 did not allow running processes or in-use
operating system DLLs to be directly overwritten while the GUI was
active, it utilized a delayed replacement mechanism. Installers wrote
queued file moves and deletions to an initialization file named
WININIT.INI, located in the C:\WINDOWS
directory. When the installer prompted the user to restart the PC,
real-mode MS-DOS processed WININIT.INI during system
startup before the Windows 98 graphical shell loaded, executing the file
transfers without lock conflicts and then deleting the initialization
file.
Registry Integration and Component Registration
Throughout the installation process, Setup.exe
interacted with the Windows 98 Registry to persist configuration data.
Installers created paths under HKEY_LOCAL_MACHINE\Software
and HKEY_CURRENT_USER\Software to store application
settings. For component-based software, the installer registered COM
(Component Object Model) components and ActiveX controls by calling the
exported DllRegisterServer entry point within DLL and OCX
files, often utilizing the system utility REGSVR32.EXE.
Add/Remove Programs and Shell Integration
To ensure the software could be managed by the user, Windows 98
required installers to register uninstallation strings. The
Setup.exe routine generated shortcut files
(.LNK) inside the
C:\WINDOWS\Start Menu\Programs directory via the
IShellLink COM interface and created a subkey under
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall.
This registry key stored values such as DisplayName and
UninstallString, which populated the application inside the
"Add/Remove Programs" applet in the Windows 98 Control Panel, allowing
users to remove the software using its bundled uninstaller.