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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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:

  1. STF_CD_PIDMODE - 1 char
  2. STF_CD_NAME or RegisteredOwner - 1..52 chars
  3. STF_CD_ORG or RegisteredOrganization- 1..52 chars
  4. 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[edit | edit source]

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[edit | edit source]

Actually the setup.lst is a Windows INI. There are two main groups: the Params group and the Files group.

Params group[edit | edit source]

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[edit | edit source]

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
Community content is available under CC-BY-SA unless otherwise noted.