Microsoft ACME Setup is the name of the software installation tool that was used with some of the first versions of Microsoft software, including Microsoft Office (until Office 2000, which uses Windows Installer), Microsoft Visual Studio 6.0, and other similar products. It has been superseded by the Windows Installer platform.
It uses a text-based file format ending in .STF (examples include acmsetup.stf, setup.stf) to store setup commands. It also requires the files "SETUP.TDF" and "SETUP.INI" in order to run.
Alongside the ACME setup program, there is usually also a bootstrapper program included. While the ACME setup executable is usually named ACMSETUP.EXE, the bootstrapper program is usually called SETUP.EXE and is featured alongside a plain-text SETUP.LST file which tells the bootstrapper which files to copy to a temporary directory before launching the installation.
Commandline Arguments[]
Arg | Param | size | Description |
---|---|---|---|
/T | tablefile | 260 | Specifies the STF filename: the default is <base>.stf,
unc path and local path allowed |
/S or /Z | srcdir | 260 | Specifies location of source files |
/C | PID | 22 | 01234OEM89012345678Z
'Z'_20 is mod 7 Check digit for the 5to19-'89012345678'-part |
/K | CDKey | 12 | 0123456789 10-digit, in quotes without dashes |
/N | Name | 54 | UserName |
/O | Orga | 54 | Organization name (in quotes) |
/Y | Install without copying files | ||
/V | Avoid marker file in SystemDirectory with first installed timestamp (LastWriteTime)
Same Flag is also set in Administrator mode | ||
/B | [1|2] | 2 | Suppress choosing installation type /B1 first button, /B2 second... |
/Q | [0|1|T] | 2 | Quiet/batch install mode '0'
'1' hides exit dialog 'T' hides all display |
/A | Administrator mode | ||
/F | Floppy mode (default) | ||
/M | licensesCount | 20 | Maintenance mode.
ID is IntNumber form 0..25000. Only used in .rsrc/Dialog/3006. An good to indicated that you have hold a valid license for <ID> copies of <the Product> |
/R | Reinstall | ||
/U[A] | Uninstall /UA also remove shared components | ||
/G[+|C] | filename | Create logfile of installation activity
'+' AppendToLog 'C' LogErrors | |
/X | filename | 260 | Network logfile. Must be a unc path. |
Example:
d:\setup\acmsetup /t d:\setup\vs98ent.stf /s d:\
Setup table file (STF) format[]
The basic file format is simply a series of tab-delimited data; importing it into a spreadsheet program like LibreOffice Calc and specifying the tab character as the delimiter should make the content more readable.
Like the Windows INI format, the STF format can be thought of as having properties (but not groups). Observed properties are described below. If you observe a property not listed here, please add it to the list even if you don't know what it does; someone might see it and figure it out.
Header[]
A series of properties and their respective values comes first. The ACMSetup (3.1.8043) 'knows' 42 properties. Id is just usefull at the time of reverse engieering. Type is as well not very useful. Well str is made for 260 input chars.
Property name | id | Type | Description |
---|---|---|---|
App Name | 1 | Str | The name of the application that is being installed. |
App Version | 2 | Str | The version number of the application that is being installed. |
Frame Bitmap | 3 | Str |
"filename, x, y" where filename is the name of a DLL that contains a bitmap resource, x and y are the bitmap's distance from the top and left corner of the screen, respectively. These values are in pixels. |
Frame Caption | 4 | Str | The text displayed in the title bar of the background window, as well as in some messages in dialog boxes. |
Dialog Caption Base | 5 | Str | The text displayed in the title bar of the foreground window, as well as in most messages in dialog boxes. SymbolName: STF_PRODNAME |
Usage String | 6 | Str | The text to print on the command-line when someone attempts to execute the program in an unsupported way. |
About Box String | 7 | Str | The text displayed in the About dialog (right-click the background window's title bar and click About) |
Check Modules[2|3|4] | 8
22 24 |
Str | A comma-separated list of window caption or window class names. If a window with one of the given class names is running, the software might not install or might run into problems installing.
Example: OMain,Microsoft Access, msaccess,MS Access |
Source Directory | 9 | Str | Checked via mssetup.dll!ValidFilePath()Commandline argument: /s |
MSAPPS Mode | 10 | Int32 | shared | local | user-choice Usually "local" |
MSAPPS Connect | 11 | Int32 | drive | server Usually "server" |
MSAPPS Network [Server|Drive|Path] | 12
13 14 |
Str | MSAPPS Network Drive is some path X:\... Upper Case on first letter enforce |
Inf Parser | 17 | Str |
Optional. Allows you to specify a custom action DLL that is used to parse your INF file. Only observed in the Office 97 installation disc. It takes a quoted string: "[DLL file name],[function name],""[app title]""" ValidFilePath / LoadLibrary / GetProcAddress is used to validate. |
Inf File Name | 15 | Str | The file name of the INF file that is associated with this Setup application. ".INF" postfix enforced. |
Help File Name | 16 | Str | The file name of the HLP file that provides more details on installation. |
Setup Status[2] | 18 | Str | |
Maximum Object ID | 19 | Int32 | The last object ID that is present in the objects table (see below).
via atoi(). Must be bigger than 0. |
Admin Mode Root Object ID | 20 | dotInts | The ID of the first command to run when in admin mode.
Looks like this: "6 : 1 2 3" Commandline argument: /a - Administrator mode |
Floppy Mode Root Object ID | 21 | dotInts | The ID of the first command to run when in floppy mode.
Commandline argument: /f - Floppy mode (= default ) |
Network Mode Root Object ID | 22 | dotInts | The ID of the first command to run when in network mode. |
Maintenance Mode Root Object ID | 23 | dotInts | The ID of the first command to run when in maintenance mode.
Commandline argument: /m - Maintenance mode |
Network Maintenance Mode Root Object ID | 24 | dotInts | The ID of the first command to run when in network maintenance mode. |
Batch Mode Root Object ID | 25 | dotInts | The ID of the first command to run when in batch installation mode.
Commandline argument: /q Quiet Mode / batch mode /q1 suppresses exit dialog /qt all the UI |
No Long File Names | 26 | IntFlag | No parameters its presence enables the flag. Calls SuppressLongFileNames() |
Suppress Copy Disincentive Dialogs | 27 | bitFlag | Presumably commands the installation program to suppress dialogs related to copy protection/antipiracy. Had no affect on the sample apps tested.
Shares flaglocation with Suppress 'Serial Number Dialog' FlagOffset:0x8 |
Suppress Serial Number Dialog | 28 | bitFlag | Presumably commands the installation program to skip prompting for a license number when installing. Has no affect on the sample apps tested.
FlagOffset:0x10 |
Install Date | 29 | 2xInt16 | The date this application was last installed on the user's computer.
Length is 19, 6 Numbers via atoi. Format is probaly: "31.12.1980 13:59:00" |
Setup Version | 30 | str_208h | The version of ACMSETUP.EXE needed to read this file.
Example: "3.1.0.1918" Input is parsed with this formatstring: %1d.%02d.%1d.%4.4d |
Launch Registration Wizard | 31 | int32 | Launches the Windows 95 Product Registration Wizard via PRODINV.DLL!RegProductSearch |
IME Control Available | 32 | IntFlag | |
Disable OODS Install Now Button | 33 | IntFlag | |
Network Log Location | 35 | str | Checked via mssetup.dll!ValidFilePath()/x - Network logfile |
Inf Mode | 39 | IntFlag | Optional. |
[ NoShared | No ] Reinstall | 40
41 |
IntFlag |
Determines what action to take on shared files. Observed "Reinstall". |
ObjID | 42 | - | See "Object list table" below |
Object list[]
The object list is actually a rather large text-based list of commands. It starts with a tab-delimited line describing each of the values, and then treats each following line as a command. The list of commands are defined below.
Command | Description |
---|---|
ObjID | Integer. The numerical value of this object. Usually assigned in the order they are defined in the file. |
Install During Batch Mode | Boolean. Yes/no value that indicates whether this particular command is executed during batch installation. |
Title | String. The title of this action. Mostly used for commenting |
Descr | String. Description of this action. |
Type | String. Type for data. |
Data | Action-dependent data associated with this command |
BMP Id | |
Vital | |
Shared | |
Dir Chang | |
Dest Dir | |
Check Dir | |
Installed By Us | |
Install Data | |
Install Dest Dir |
An example object list in a SETUP.STF file might look like this:
ObjID Install During Batch Mode Title Descr Type Data BMP Id Vital Shared Dir Chang Dest Dir Check Dir Installed By Us 1 Microsoft Office Professional Microsoft Office Professional AppSearch """%p\MSOffice""<%p\Microsoft Office>, , ,176,,yes,4 5" 2 AppSearch "c:\MSOffice, , ,176,,yes,4 5" 3 Microsoft Office Professional CustomAction "setupres.dll, AddAppSrch, ""Not Required, c:\MSOffice, MSOFFICE.EXE, 95.02.03.2, 4"" " 4 SearchReg "CLASSES, MSToolbar\MSOffice"
Setup.ini[]
The setup.ini is no real ini it is a properitary format. It is labeled inside ACMSetup as STF_CD_TRIGGER. It is always 149 bytes long and contains these 4 values:
- STF_CD_PIDMODE - 1 char
- STF_CD_NAME or RegisteredOwner - 1..52 chars
- STF_CD_ORG or RegisteredOrganization- 1..52 chars
- STF_CD_SER or Serial Number- 20 chars
Expect for the STF_CD_SER the value are lightly encrypted. Here is a decrypter in Python:
# Vs6sp6B - setup.ini : Visual Basic 6 SP3 (2000) data = b'Jj\x1f\x10&\x0fJ~K\x10&\x0fJ~Rjc&J~Rjc\x1e6,Rjc\x1e6 $\x0bM\x1e6 $\x0b]SI $\x0b]SrJJ<]SrJJ?0,rJJ?0\x06/j[?0\x06/j^rJ\x06/j^rJC>=^rJC>\x16\x00/JC>\x16\x00\x04+}I\x16\x00\x04+}sRIj+}sRjj\x1f.sRjj\x1f\x10&\x00' ### Decrypting data... # 1 descramble bytes (i = 127 + 17 * i) i = len(data) - 1 ; descrambled = bytearray() for dummy in range( len(data) ): i = (i + 0x11 ) & 0b1111111 descrambled.append ( data [i] ) # 2 Xor bytes dec = bytearray() for (byte1, byte2) in zip( descrambled, descrambled[1:] ): dec.append (byte1 ^ byte2) # 3 reverse Array dec = dec[::-1] print ("Decrypted data [", hex(len(dec)),"]:\n", dec)
# >>> Decrypted data [0x7f] : 'Ifefeegegtfgqkl LtRrBceHabCT AhlenNLtRrBceHabCT AhlenNLtRrBceHabCT AhlenNLtRrBceHabCT AhlenNLtRrBceHabCT AhlenNLtRrBceHabCT Ah'
Full online runable version of this script.
It is sets the initialisation values for the registration dialog. The most important and so far only used value is PIDMODE.
PID | Description | Used for Product | SER | Notes |
---|---|---|---|---|
O | OEM | |||
I | Retail | Microsoft Office 97 | 535010-000-000000-00000 | Triggers CD-Key Dialog |
E | ||||
M | Word Viewer 97 | 52494-000-0000000-00000 | ||
D | Enterprise | MSDN
Visual Studio 6 Enterprise Visual Basic 6 SP3 |
51210-335-0000007-00000
84075-335-0000007-00000 00018-099-0000007-00000 |
|
S | ||||
N | ||||
U | Unset | used as init by setup |
Setup.tdf[]
setup.tdf is used to write back the data entered in the registration dialog to the floppydisk or harddisk that were entered in the registration dialog.
Setup bootstrapper (LST) format[]
Actually the setup.lst is a Windows INI. There are two main groups: the Params group and the Files group.
Params group[]
This group has been observed as "Windows 95 Params" and "NT3.51 Intel Params",
Depending on the version (Kernel.dll!GETVERSION) setup.exe choose between these:
[Win3.x Params] | [Windows 95 Params] | [NT Alpha Params] | [NT Mips Params] | [NT PPC Params] | [NT Intel Params] | [NT3.51 Intel Params]
. The properties in this group are the same no matter what the group name is, as long as it ends in "Params".
Property name | Description |
---|---|
WndTitle | The title of the "please wait" dialog that displays while the program prepares installation. This is usually the name of the application being installed. |
WndMess | The message displayed in the dialog. This is usually something like "Starting [app name] Setup, please wait..." |
TmpDirSize | The amount of memory, in bytes, to allocate for the temporary directory. |
TmpDirName | The name of the temporary directory where the files will be placed. |
CmdLine | The command line to execute by setup via WINEXEC. This is usually "acmsetup"; in cases where the STF file name isn't the same as the setup EXE file name use "acmsetup /T [STF file name]". It's a sprintf format string and requires two times '%s' what is a placehold for a string. The first %s is replace by the current path/ path containig the *.stf. The second %s is replaced by the commandline arguments passed to Setup.exe. |
DrvModName | Should be "ACMSETUP" |
DrvWinClass | Should be "Stuff-Shell" Setup uses FINDWINDOW("Stuff-Shell") to check if it is already running and quits if that check is positive. |
CabinetFile | Presumably the name of the cabinet file from which the installation files are unpacked, but this property has also been observed on a CD-ROM in which the installation files were placed directly on the disc. |
Require31 | The message to display when the operating system is not supported. Usually something like "This program requires Windows 95 or higher." |
InsertCDMsg | The message to display when an additional CD-ROM is needed to complete the installation. Usually "Please insert your [app name] CD 1". |
InsertDiskMsg | The message to display when an additional floppy disk is needed to complete the installation. Usually "Please insert your [app name] Disk 1". |
Background | leave empty Passed on to ACMSETUP via "/b1" |
BkgWinClass | leave empty Used by Setup to find out via findwindow when acmsetup has finished. Passed on to ACMSETUP via "/c" |
Files group[]
This group has been observed as "Windows 95 Files" and "NT3.51 Intel Files", although more variations likely exist. The properties in this group aren't really properties; they are mappings between the source file name and the destination file name. For example, if your source media has a folder called SOURCE and one of the files that would be copied is called COPYME, your SETUP.LST file might look somewhat like this:
[Windows 95 Files] SOURCE\COPYME = COPYME