rubrapack Manual←↑→

33 Summary information

Every package has a stream \x05SummaryInformation (the first character is U+0005; the name is not packed). It is an OLE property set as specified in [MS-OLEPS]; Microsoft Learn ("Summary Information Stream Property Set") says which properties an installer package uses.

33.1 Layout [spec] [observed]#

u16  byte order      FFFE
u16  version         0 (msi.dll writes 0)
u32  OS field        msi.dll writes 0x00020206
16   CLSID           zero
u32  section count   1
16   FMTID           F29F85E0-4FF9-1068-AB91-08002B27B3D9, stored E0 85 9F F2 F9 4F 68 10 AB 91 08 00 2B 27 B3 D9
u32  section offset  48

section:
u32  section size
u32  property count
count x (u32 property id, u32 offset from the section start)
values, each padded to a multiple of 4 bytes:
  VT_I2 (2)        u32 type, i16 value, 2 bytes padding
  VT_I4 (3)        u32 type, i32 value
  VT_LPSTR (30)    u32 type, u32 byte count including the NUL, bytes, NUL, padding
  VT_FILETIME (64) u32 type, u64 100-ns intervals since 1601-01-01 UTC

33.2 Properties an installer package sets#

IdNameTypeValue
2TitleLPSTRe.g. Installation Database
3SubjectLPSTRproduct name
4AuthorLPSTRmanufacturer
5KeywordsLPSTRe.g. Installer
7TemplateLPSTR<platform>;<language id>: x64;1033, Arm64;1042, Intel;1033
9Revision NumberLPSTRthe package code: a GUID, new for every different package file
12, 13Create / Last Save timeFILETIMEoptional
14Page CountI4minimum installer version: 200 for x64 and x86, 500 for Arm64
15Word CountI4bit 1 = files are compressed (in cabinets); 2 for a normal package
18Creating ApplicationLPSTRany

33.3 The code page trap - keep summary strings ASCII [observed]#

Property 1 (CodePage, VT_I2) says how the LPSTR bytes are encoded. On Windows 11 25H2:

So: leave property 1 out and write every summary string in ASCII. Localized product names belong in the Property table (ProductName), which uses the database code page - and 65001 works there (see The MSI database inside the compound file).

33.4 Worked example: the tutorial's hello.msi#

The tutorial's first package: the stream is 336 bytes. Its header:

OffsetBytesFieldValue
0x00fe ffbyte order0xFFFE
0x0406 02 02 00OS0x00020206
0x1801 00 00 00section count1
0x1Ce0 85 9f f2 ...FMTIDF29F85E0-...
0x2C30 00 00 00section offset48
0x3020 01 00 00section size288
0x3409 00 00 00property count9

Then 9 pairs of (property id, offset), and the values:

PropertyOffsetTypeRaw bytesValue
20x80VT_LPSTR1e 00 00 00 16 00 00 00 49 6e 73 74 61 6c 6c 61 ...Installation Database
30xA0VT_LPSTR1e 00 00 00 06 00 00 00 48 65 6c 6c 6f 00Hello
40xB0VT_LPSTR1e 00 00 00 11 00 00 00 45 78 61 6d 70 6c 65 20 ...Example Software
50xCCVT_LPSTR1e 00 00 00 0a 00 00 00 49 6e 73 74 61 6c 6c 65 ...Installer
70xE0VT_LPSTR1e 00 00 00 09 00 00 00 78 36 34 3b 31 30 33 33 ...x64;1033
90xF4VT_LPSTR1e 00 00 00 27 00 00 00 7b 38 44 37 41 37 36 38 ...{8D7A7687-4BF3-8D46-8B4C-CA8BB13937CF}
140x124VT_I403 00 00 00 c8 00 00 00200
150x12CVT_I403 00 00 00 02 00 00 002
180x134VT_LPSTR1e 00 00 00 11 00 00 00 72 75 62 72 61 70 61 63 ...rubrapack 0.39.0

A string value is its type (30), its byte count including the NUL, the bytes, the NUL, and padding to a multiple of 4. Property 9, the package code, is derived from the content under --reproducible; without it every build gets a new one.