xref: /freebsd/contrib/file/magic/Magdir/msdos (revision ae316d1d1cffd71ab7751f94e10118777a88e027)
1b6cee71dSXin LI
2b6cee71dSXin LI#------------------------------------------------------------------------------
3*ae316d1dSXin LI# $File: msdos,v 1.208 2024/08/27 18:50:57 christos Exp $
4b6cee71dSXin LI# msdos:  file(1) magic for MS-DOS files
5b6cee71dSXin LI#
6b6cee71dSXin LI
7b6cee71dSXin LI# .BAT files (Daniel Quinlan, quinlan@yggdrasil.com)
8b6cee71dSXin LI# updated by Joerg Jenderek at Oct 2008,Apr 2011
9b6cee71dSXin LI0	string/t	@
10b6cee71dSXin LI>1	string/cW	\ echo\ off	DOS batch file text
11b6cee71dSXin LI!:mime	text/x-msdos-batch
1248c779cdSXin LI!:ext	bat
13b6cee71dSXin LI>1	string/cW	echo\ off	DOS batch file text
14b6cee71dSXin LI!:mime	text/x-msdos-batch
1548c779cdSXin LI!:ext	bat
16b6cee71dSXin LI>1	string/cW	rem		DOS batch file text
17b6cee71dSXin LI!:mime	text/x-msdos-batch
1848c779cdSXin LI!:ext	bat
19b6cee71dSXin LI>1	string/cW	set\ 		DOS batch file text
20b6cee71dSXin LI!:mime	text/x-msdos-batch
2148c779cdSXin LI!:ext	bat
22b6cee71dSXin LI
23b6cee71dSXin LI
24b6cee71dSXin LI# OS/2 batch files are REXX. the second regex is a bit generic, oh well
25b6cee71dSXin LI# the matched commands seem to be common in REXX and uncommon elsewhere
26b6cee71dSXin LI100	search/0xffff   rxfuncadd
27b6cee71dSXin LI>100	regex/c =^[\ \t]{0,10}call[\ \t]{1,10}rxfunc	OS/2 REXX batch file text
28b6cee71dSXin LI100	search/0xffff   say
29b6cee71dSXin LI>100	regex/c =^[\ \t]{0,10}say\ ['"]			OS/2 REXX batch file text
30b6cee71dSXin LI
31b6cee71dSXin LI
32b6cee71dSXin LI# Tests for various EXE types.
33b6cee71dSXin LI#
3443a5ec4eSXin LI# Many of the compressed formats were extracted from IDARC 1.23 source code.
35b6cee71dSXin LI#
36898496eeSXin LI# e_magic
37b6cee71dSXin LI0	string/b	MZ
38898496eeSXin LI#	TODO
39898496eeSXin LI# FLT:	Syntrillium CoolEdit Filter		https://en.wikipedia.org/wiki/Adobe_Audition
40898496eeSXin LI# FMX64:FileMaker Pro 64-bit plug-in		https://en.wikipedia.org/wiki/FileMaker
41898496eeSXin LI# FMX:	FileMaker Pro 32-bit plug-in		https://en.wikipedia.org/wiki/FileMaker
42898496eeSXin LI# FOD:	WIFE Font Driver
43898496eeSXin LI# GAU:	MS Flight Simulator Gauge
44898496eeSXin LI# IFS:	OS/2 Installable File System		https://en.wikipedia.org/wiki/OS/2
45898496eeSXin LI# MEXW32:MATLAB Windows 32bit compiled function	https://en.wikipedia.org/wiki/MATLAB
46898496eeSXin LI# MEXW64:MATLAB Windows 64bit compiled function	https://en.wikipedia.org/wiki/MATLAB
47898496eeSXin LI# MLL:	Maya plug-in (generic)	       		http://en.wikipedia.org/wiki/Autodesk_Maya
48898496eeSXin LI# PFL:	PhotoFilter plugin			http://photofiltre.free.fr
49898496eeSXin LI# 8*:	PhotoShop plug-in (generic)		http://www.adobe.com/products/photoshop/main.html
50898496eeSXin LI# PLG:	Aston Shell plugin			http://www.astonshell.com/
51898496eeSXin LI# QLB:	Microsoft Basic Quick library		https://en.wikipedia.org/wiki/QuickBASIC
52898496eeSXin LI# SKL:	WinLIFT skin				http://www.zapsolution.com/winlift/index.htm
53898496eeSXin LI# TBK:	Asymetrix ToolBook application		http://www.toolbook.com
54898496eeSXin LI# TBP:	The Bat! plugin	   			http://www.ritlabs.com
55898496eeSXin LI# UPC:	Ultimate Paint Graphics Editor plugin	http://ultimatepaint.j-t-l.com
56898496eeSXin LI# XFM:	Syntrillium Cool Edit Transform Effect	bad http://www.cooledit.com
57898496eeSXin LI# XPL:	X-Plane plugin	      			http://www.xsquawkbox.net/xpsdk/
58898496eeSXin LI# ZAP:	ZoneLabs Zone Alarm data		http://www.zonelabs.com
59898496eeSXin LI#
60898496eeSXin LI# NEXT LINES FOR DEBUGGING!
61898496eeSXin LI# e_cblp; bytes on last page of file
62898496eeSXin LI# e_cp; pages in file
63898496eeSXin LI#>4		uleshort	x	\b, e_cp 0x%x
64898496eeSXin LI# e_lfanew; file address of new exe header
65898496eeSXin LI#>0x3c		ulelong		x	\b, e_lfanew 0x%x
66898496eeSXin LI# e_lfarlc; address of relocation table
67898496eeSXin LI#>0x18		uleshort	x	\b, e_lfarlc=0x%x
68898496eeSXin LI# e_ovno; overlay number. If zero, this is the main executable foo
69898496eeSXin LI#>0x1a		uleshort	!0	\b, e_ovno 0x%x
70898496eeSXin LI#>0x1C		ubequad		!0	\b, e_res 0x%16.16llx
71898496eeSXin LI# e_oemid; often 0
72898496eeSXin LI#>0x24		uleshort	!0	\b, e_oemid 0x%x
73898496eeSXin LI# e_oeminfo; typically zeroes, but 13Dh (WORDSTAR.CNV WPFT5.CNV) 143h (WRITWIN.CNV)
74898496eeSXin LI# 1A3h (DBASE.CNV LOTUS123.CNV RFTDCA.CNV WORDDOS.CNV WORDMAC.CNV WORDWIN1.CNVXLBIFF.CNV)
75898496eeSXin LI#>0x26		uleshort	!0	\b, e_oeminfo 0x%x
76898496eeSXin LI#  e_res2; typically zeroes, but 000006006F082D2Ah SCSICFG.EXE 00009A0300007C03h de.exe
77898496eeSXin LI# 0000CA0000000002h country.exe dosxmgr.exe 421E0A00421EA823h QMC.EXE
78898496eeSXin LI#>0x28		ubequad		!0	\b, e_res2 0x%16.16llx
79898496eeSXin LI# https://web.archive.org/web/20171116024937/http://www.ctyme.com/intr/rb-2939.htm#table1593
80898496eeSXin LI# https://github.com/uxmal/reko/blob/master/src/ImageLoaders/MzExe/ExeImageLoader.cs
81898496eeSXin LI# new exe header magic like: PE NE LE LX W3 W4
82898496eeSXin LI# no examples found for ZM DL MP P2 P3
83898496eeSXin LI#>(0x3c.l)	string		x	\b, at [0x3c] %.2s
84898496eeSXin LI#>(0x3c.l)	ubelong		x	\b, at [0x3c] %#8.8x
85898496eeSXin LI#>(0x3c.l+4)	ubelong		x	\b, at [0x3c+4] %#8.8x
86898496eeSXin LI#
87898496eeSXin LI# Most non-DOS MZ-executable extensions have the relocation table more than 0x40 bytes into the file.
88898496eeSXin LI# http://www.mitec.cz/Downloads/EXE.zip/EXE64.exe	e_lfarlc=0x8ead
89898496eeSXin LI# OS/2 ECS\INSTALL\DETECTEI\PCISCAN.EXE			e_lfarlc=0x1c
90898496eeSXin LI# some EFI apps Shell_Full.efi ext4_x64_signed.efi	e_lfarlc=0
91898496eeSXin LI# Icon library WORD60.ICL				e_lfarlc=0
92898496eeSXin LI# Microsoft compiled help format 2.0 WINWORD.DEV.HXS	e_lfarlc=0
93898496eeSXin LI>0x18	uleshort <0x40
94898496eeSXin LI# check magic of new second header
95898496eeSXin LI# skip Portable Executable (PE) with low e_lfarlc here, because handled later
96898496eeSXin LI# like: ext4_x64_signed.efi Shell_Full.efi WINWORD.DEV.HXS
97*ae316d1dSXin LI>>(0x3c.l)		string		!PE\0\0	MS-DOS executable
98*ae316d1dSXin LI# NE executable with low e_lfarlc like: WORD60.ICL
99*ae316d1dSXin LI# This is Icon Manager (IM) by Impact Software format, based on NE version 5 with cleared NE version and e_lfarlc fields
100*ae316d1dSXin LI# It can be parsed/loaded as NE version 5 binary just by skipping e_lfarlc and NE version checks
101*ae316d1dSXin LI# ICL:	Icons Library 16-bit			http://fileformats.archiveteam.org/wiki/Icon_library
102*ae316d1dSXin LI>>(0x3c.l-0x02)		string		IMNE	\b, NE
103*ae316d1dSXin LI>>>(0x3c.l+0x02)	ubyte		x	\b version %u
104*ae316d1dSXin LI>>>(0x3c.l+0x36)	byte		2	for MS Windows
105*ae316d1dSXin LI>>>>(0x3c.l+0x3E)	ushort		!0
106*ae316d1dSXin LI>>>>>(0x3c.l+0x3F)	ubyte		x	%u
107*ae316d1dSXin LI>>>>>(0x3c.l+0x3E)	ubyte		x	\b.%02u
108*ae316d1dSXin LI>>>(0x3c.l+0x02)	ubyte		x	(Icon Library, Icon Manager by Impact Software)
109*ae316d1dSXin LI!:ext		icl
110*ae316d1dSXin LI# handle LX executable with low e_lfarlc like: PCISCAN.EXE
111*ae316d1dSXin LI>>(0x3c.l)	string	LX	\b, LX
112*ae316d1dSXin LI>>>(0x3c.l+0x2)	uleshort	=0x0000
113*ae316d1dSXin LI>>>>(0x3c.l)	use		lx-executable
114*ae316d1dSXin LI# no examples found for big endian variant
115*ae316d1dSXin LI>>>(0x3c.l+0x2)	uleshort	=0x0101
116*ae316d1dSXin LI>>>>(0x3c.l)	use		\^lx-executable
117*ae316d1dSXin LI# no examples found for PDP-11 endian variant
118*ae316d1dSXin LI>>>(0x3c.l+0x2)	uleshort	=0x0100
119*ae316d1dSXin LI# PDP-11-endian is not supported by magic "use" keyword yet
120*ae316d1dSXin LI# no examples found for other endian variants
121*ae316d1dSXin LI>>>0		default		x
122*ae316d1dSXin LI# other endianity is not supported by magic "use" keyword
123b6cee71dSXin LI
124b6cee71dSXin LI# Maybe it's a PE?
125898496eeSXin LI# URL:		http://fileformats.archiveteam.org/wiki/Portable_Executable
126898496eeSXin LI# Reference:	https://docs.microsoft.com/de-de/windows/win32/debug/pe-format
127d38c30c0SXin LI>(0x3c.l)	string		PE\0\0	PE
128898496eeSXin LI!:mime	application/vnd.microsoft.portable-executable
129898496eeSXin LI# https://docs.microsoft.com/de-de/windows/win32/debug/pe-format#characteristics
130898496eeSXin LI# DLL Characteristics
131898496eeSXin LI#>>(0x3c.l+22)	uleshort	x	\b, CHARACTERISTICS %#4.4x,
132898496eeSXin LI# 0x0200~IMAGE_FILE_DEBUG_STRIPPED Debugging information is removed from the image file
133898496eeSXin LI# 0x1000~IMAGE_FILE_SYSTEM The image file is a system file, not a user program.
134898496eeSXin LI# 0x2000~IMAGE_FILE_DLL The image file is a dynamic-link library (DLL)
135d38c30c0SXin LI>>(0x3c.l+24)	leshort		0x010b	\b32 executable
136898496eeSXin LI# https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#windows-subsystem
137898496eeSXin LI#>>>(0x3c.l+92)	leshort		x	\b, SUBSYSTEM %u
138d38c30c0SXin LI>>(0x3c.l+24)	leshort		0x020b	\b32+ executable
139898496eeSXin LI#>>>(0x3c.l+92)	leshort		x	\b, SUBSYSTEM %u
140*ae316d1dSXin LI# ROM image is without DOS MZ header and without PE\0\0 signature
141*ae316d1dSXin LI#>>(0x3c.l+24)	leshort		0x0107	ROM image
142*ae316d1dSXin LI>>(0x3c.l+24)	default		x	with unknown signature
14343a5ec4eSXin LI>>>&0 		leshort		x	%#x
144*ae316d1dSXin LI
145*ae316d1dSXin LI## Start of the subsystem switch
146*ae316d1dSXin LI>>(0x3c.l+92)	clear		x
147*ae316d1dSXin LI
148898496eeSXin LI# 0~IMAGE_SUBSYSTEM_UNKNOWN An unknown subsystem
149*ae316d1dSXin LI>>(0x3c.l+92)	leshort		0
150*ae316d1dSXin LI# WINE https://www.winehq.org/ DLL libraries without subsystem, some examples:
151*ae316d1dSXin LI# fakedlls/l3codeca.acm fakedlls/msadp32.acm fakedlls/inetcpl.cpl fakedlls/inetcpl.cpl fakedlls/kernel32.dll fakedlls/user32.dll fakedlls/gdi32.dll
152*ae316d1dSXin LI# fakedlls/winex11.drv fakedlls/winspool.drv fakedlls/gphoto2.ds fakedlls/sane.ds fakedlls/ntoskrnl.exe fakedlls/dhtmled.ocx fakedlls/hhctrl.ocx
153*ae316d1dSXin LI# fakedlls/hidclass.sys fakedlls/mshtml.tlb fakedlls/stdole32.tlb fakedlls/vwin32.vxd fakedlls/vmm.vxd
154*ae316d1dSXin LI>>>0x40		string		Wine\ placeholder\ DLL	for WINE stub (DLL)
155*ae316d1dSXin LI!:ext	acm/cpl/dll/drv/ds/exe/ocx/sys/tlb/vxd
156*ae316d1dSXin LI>>>0x40		string		Wine\ builtin\ DLL	for WINE (DLL)
157*ae316d1dSXin LI!:ext	acm/cpl/dll/drv/ds/exe/ocx/sys/tlb/vxd
158*ae316d1dSXin LI>>>0		default		x
159898496eeSXin LI# Summary:	Microsoft compiled help *.HXS format 2.0
160898496eeSXin LI# URL:		https://en.wikipedia.org/wiki/Microsoft_Help_2
161898496eeSXin LI# Reference:	http://www.russotto.net/chm/itolitlsformat.html
162898496eeSXin LI#		https://mark0.net/download/triddefs_xml.7z/defs/h/hxs.trid.xml
163*ae316d1dSXin LI# Note:		Microsoft compiled help format contains 2 PE32 sections (.rsrc, .its) for Intel i386;
164*ae316d1dSXin LI#		The help content is appended after the PE32 binary and starts with ITOLITLS string;
165*ae316d1dSXin LI#		End of the PE32 binary is immediately after the .its section.
166*ae316d1dSXin LI#		verified by command like:
167*ae316d1dSXin LI#		`pelook.exe -d WINWORD.HXS & pelook.exe -h WINWORD.HXS`
168*ae316d1dSXin LI#		`objdump -p -s WINWORD.HXS`
169*ae316d1dSXin LI#		`readpe WINWORD.HXS`
170*ae316d1dSXin LI>>>>(0x3c.l+6)		uleshort	=2
171*ae316d1dSXin LI# Second section for these binaries starts at fixed offset 288 (size of PE signature + size of COFF header + size
172*ae316d1dSXin LI# of PE32 optional header with all data dirs + size of first .rsrc section header = 4 + 20 + 96+8*16 + 40 = 288)
173*ae316d1dSXin LI>>>>>(0x3c.l+288)	string/b	.its\0\0\0\0
174*ae316d1dSXin LI# Read start+length of .its section and just after it
175*ae316d1dSXin LI>>>>>>(&4.l+(-4))	string		ITOLITLS	\b, Microsoft compiled help format 2.0
176898496eeSXin LI!:ext	hxs
177*ae316d1dSXin LI# Fallback for any unrecognized binary with Unknown subsystem 0
178*ae316d1dSXin LI>>>>>>0		default		x	for Unknown subsystem 0
179*ae316d1dSXin LI>>>>>0		default		x	for Unknown subsystem 0
180*ae316d1dSXin LI>>>>0		default		x	for Unknown subsystem 0
181*ae316d1dSXin LI
182898496eeSXin LI# 1~IMAGE_SUBSYSTEM_NATIVE device drivers and native Windows processes
183d38c30c0SXin LI>>(0x3c.l+92)	leshort		1
184*ae316d1dSXin LI# WINE https://www.winehq.org/: fakedlls/fltmgr.sys fakedlls/mountmgr.sys fakedlls/scsiport.sys fakedlls/winebus.sys fakedlls/winehid.sys
185*ae316d1dSXin LI>>>0x40		string		Wine\ placeholder\ DLL	for WINE stub
186*ae316d1dSXin LI>>>0x40		string		Wine\ builtin\ DLL	for WINE
187*ae316d1dSXin LI>>>0		default		x	for MS Windows
188*ae316d1dSXin LI>>>>(0x3c.l+72)	leshort		x	%u
189*ae316d1dSXin LI>>>>(0x3c.l+74)	leshort		x	\b.%02u
190*ae316d1dSXin LI# Native PEs are used by:
191*ae316d1dSXin LI# - NT kernel DLLs: hal.dll, kdcom.dll, pshed.dll, bootvid.dll, ...
192*ae316d1dSXin LI# - NT kernel images: ntoskrnl.exe, ntkrnlmp.exe, ntkrnlpa.exe, ntkrpamp.exe
193*ae316d1dSXin LI# - NT kernel drivers: Windows/System32/drivers/*.sys
194*ae316d1dSXin LI# - NT native userspace DLLs: ntdll.dll, ...
195*ae316d1dSXin LI# - NT native userspace executables: smss.exe, csrss.exe, autochk.exe, ...
196*ae316d1dSXin LI# TODO: write rule to distinguish between Kernel and Native processes
197*ae316d1dSXin LI#       (the only way to do this is based on the presence of ntoskrnl.exe in import table)
198d38c30c0SXin LI>>>(0x3c.l+22)	leshort&0x2000	>0	(native)
19948c779cdSXin LI!:ext	dll/sys
200d38c30c0SXin LI>>>(0x3c.l+22)	leshort&0x2000	0	(native)
20148c779cdSXin LI!:ext	exe/sys
202*ae316d1dSXin LI
203898496eeSXin LI# 2~IMAGE_SUBSYSTEM_WINDOWS_GUI	The Windows graphical user interface (GUI) subsystem
204d38c30c0SXin LI>>(0x3c.l+92)	leshort		2
205*ae316d1dSXin LI# WINE https://www.winehq.org/: fakedlls/clock.exe fakedlls/control.exe fakedlls/explorer.exe fakedlls/notepad.exe
206*ae316d1dSXin LI>>>0x40		string		Wine\ placeholder\ DLL	for WINE stub
207*ae316d1dSXin LI>>>0x40		string		Wine\ builtin\ DLL	for WINE
208*ae316d1dSXin LI>>>0		default		x	for MS Windows
209*ae316d1dSXin LI>>>>(0x3c.l+72)	leshort		x	%u
210*ae316d1dSXin LI>>>>(0x3c.l+74)	leshort		x	\b.%02u
211*ae316d1dSXin LI>>>(0x3c.l+22)	leshort&0x2000	>0	(DLL)
21248c779cdSXin LI# These could probably be at least partially distinguished from one another by
21348c779cdSXin LI# looking for specific exported functions.
21448c779cdSXin LI# CPL: Control Panel item
21548c779cdSXin LI# TLB: Type library
21648c779cdSXin LI# OCX: OLE/ActiveX control
21748c779cdSXin LI# ACM: Audio compression manager codec
21848c779cdSXin LI# AX: DirectShow source filter
21948c779cdSXin LI# IME: Input method editor
22048c779cdSXin LI!:ext	dll/cpl/tlb/ocx/acm/ax/ime
221d38c30c0SXin LI>>>(0x3c.l+22)	leshort&0x2000	0	(GUI)
22248c779cdSXin LI# Screen savers typically include code from the scrnsave.lib static library, but
22348c779cdSXin LI# that's not guaranteed.
22448c779cdSXin LI!:ext	exe/scr
225*ae316d1dSXin LI
226898496eeSXin LI# 3~IMAGE_SUBSYSTEM_WINDOWS_CUI	The Windows character subsystem
227d38c30c0SXin LI>>(0x3c.l+92)	leshort		3
228*ae316d1dSXin LI# WINE https://www.winehq.org/: fakedlls/cacls.exe fakedlls/cmd.exe fakedlls/expand.exe fakedlls/net.exe fakedlls/reg.exe
229*ae316d1dSXin LI>>>0x40		string		Wine\ placeholder\ DLL	for WINE stub
230*ae316d1dSXin LI>>>0x40		string		Wine\ builtin\ DLL	for WINE
231*ae316d1dSXin LI>>>0		default		x	for MS Windows
232*ae316d1dSXin LI>>>>(0x3c.l+72)	leshort		x	%u
233*ae316d1dSXin LI>>>>(0x3c.l+74)	leshort		x	\b.%02u
234*ae316d1dSXin LI>>>(0x3c.l+22)	leshort&0x2000	>0	(DLL)
23548c779cdSXin LI!:ext	dll/cpl/tlb/ocx/acm/ax/ime
236d38c30c0SXin LI>>>(0x3c.l+22)	leshort&0x2000	0	(console)
23748c779cdSXin LI!:ext	exe/com
238*ae316d1dSXin LI
239*ae316d1dSXin LI# 4~Old Windows CE subsystem (never used)
240*ae316d1dSXin LI#>>(0x3c.l+92)	leshort		4	for MS Windows CE OLD
241*ae316d1dSXin LI
242898496eeSXin LI# 5~IMAGE_SUBSYSTEM_OS2_CUI The OS/2 character subsystem
243*ae316d1dSXin LI# Not used in image files, constant used only in in-memory structures of OS/2 subsystem as part of Windows NT
244*ae316d1dSXin LI#>>(0x3c.l+92)	leshort		5	for OS/2
245*ae316d1dSXin LI
246898496eeSXin LI# NO Windows Subsystem number 6!
247*ae316d1dSXin LI#>>(0x3c.l+92)	leshort		6	for Unknown subsystem 6
248*ae316d1dSXin LI
249898496eeSXin LI# 7~IMAGE_SUBSYSTEM_POSIX_CUI The Posix character subsystem
250*ae316d1dSXin LI>>(0x3c.l+92)	leshort		7	for POSIX
251*ae316d1dSXin LI>>>(0x3c.l+72)	leshort		x	%u
252*ae316d1dSXin LI>>>(0x3c.l+74)	leshort		x	\b.%02u
253*ae316d1dSXin LI>>>(0x3c.l+22)	leshort&0x2000	>0	(DLL)
254898496eeSXin LI# like: PSXDLL.DLL
255898496eeSXin LI!:ext	dll
256*ae316d1dSXin LI>>>(0x3c.l+22)	leshort&0x2000	0	(EXE)
257898496eeSXin LI# like: PAX.EXE
258898496eeSXin LI!:ext	exe
259*ae316d1dSXin LI
260898496eeSXin LI# 8~IMAGE_SUBSYSTEM_NATIVE_WINDOWS Native Win9x driver
261*ae316d1dSXin LI# Win9x never used subsystem 8, all Win9x drivers are either LE/VXD or PE with native (1) subsystem
262*ae316d1dSXin LI# MSVC4 LINK.EXE can create PE binary for subsystem 8 by /SUBSYSTEM:MMOSA flag
263*ae316d1dSXin LI# MMOSA refers to Native Win32E (embedded) API, mentioned at:
264*ae316d1dSXin LI# https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr-97-18.doc
265*ae316d1dSXin LI#>>(0x3c.l+92)	leshort		8	for Win9x/MMOSA
266898496eeSXin LI# GRR: No examples found by Joerg Jenderek
267*ae316d1dSXin LI
268898496eeSXin LI# 9~IMAGE_SUBSYSTEM_WINDOWS_CE_GUI Windows CE
269*ae316d1dSXin LI>>(0x3c.l+92)	leshort		9
270*ae316d1dSXin LI# WINE https://www.winehq.org/
271*ae316d1dSXin LI>>>0x40		string		Wine\ placeholder\ DLL	for WINE stub
272*ae316d1dSXin LI>>>0x40		string		Wine\ builtin\ DLL	for WINE
273*ae316d1dSXin LI>>>0		default		x	for MS Windows CE
274*ae316d1dSXin LI>>>>(0x3c.l+72)	leshort		x	%u
275*ae316d1dSXin LI>>>>(0x3c.l+74)	leshort		x	\b.%02u
276*ae316d1dSXin LI>>>(0x3c.l+22)	leshort&0x2000	>0	(DLL)
277898496eeSXin LI# like: MCS9900Ce50.dll Mosiisr99x.dll TMCGPS.DLL
278898496eeSXin LI!:ext	dll
279*ae316d1dSXin LI>>>(0x3c.l+22)	leshort&0x2000	0	(EXE)
280898496eeSXin LI# like: NNGStart.exe navigator.exe
281898496eeSXin LI!:ext	exe
282*ae316d1dSXin LI
283898496eeSXin LI# 10~IMAGE_SUBSYSTEM_EFI_APPLICATION An Extensible Firmware Interface (EFI) application
284*ae316d1dSXin LI>>(0x3c.l+92)	leshort		10	for EFI (application)
285898496eeSXin LI# like: bootmgfw.efi grub.efi gdisk_x64.efi Shell_Full.efi shim.efi syslinux.efi
286898496eeSXin LI!:ext	efi
287*ae316d1dSXin LI
288898496eeSXin LI# 11~IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER An EFI driver with boot services
289*ae316d1dSXin LI>>(0x3c.l+92)	leshort		11	for EFI (boot service driver)
290898496eeSXin LI# like: ext2_x64_signed.efi Fat_x64.efi iso9660_x64_signed.efi
291898496eeSXin LI!:ext	efi
292*ae316d1dSXin LI
293*ae316d1dSXin LI# 12~IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER An EFI driver with run-time services
294*ae316d1dSXin LI>>(0x3c.l+92)	leshort		12	for EFI (runtime driver)
295898496eeSXin LI# no sample found
296898496eeSXin LI!:ext	efi
297*ae316d1dSXin LI
298898496eeSXin LI# 13~IMAGE_SUBSYSTEM_EFI_ROM An EFI ROM image
299*ae316d1dSXin LI>>(0x3c.l+92)	leshort		13	for EFI (ROM)
300898496eeSXin LI# no sample found
301898496eeSXin LI!:ext	efi
302*ae316d1dSXin LI
303898496eeSXin LI# 14~IMAGE_SUBSYSTEM_XBOX XBOX
304*ae316d1dSXin LI>>(0x3c.l+92)	leshort		14	for XBOX
305898496eeSXin LI#!:ext	foo-xbox
306*ae316d1dSXin LI
307898496eeSXin LI# NO Windows Subsystem number 15!
308*ae316d1dSXin LI#>>(0x3c.l+92)	leshort		15	for Unknown subsystem 15
309*ae316d1dSXin LI
310898496eeSXin LI# 16~IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION Windows boot application
311*ae316d1dSXin LI>>(0x3c.l+92)	leshort		16	for MS Windows
312*ae316d1dSXin LI>>>(0x3c.l+72)	leshort		x	%u
313*ae316d1dSXin LI>>>(0x3c.l+74)	leshort		x	\b.%02u
314*ae316d1dSXin LI>>>(0x3c.l+22)	leshort&0x2000	>0	(boot DLL)
315898496eeSXin LI# like: bootvhd.dll bootuwf.dll hvloader.dll tcbloader.dll bootspaces.dll
316898496eeSXin LI!:ext	dll
317*ae316d1dSXin LI>>>(0x3c.l+22)	leshort&0x2000	0	(boot application)
318898496eeSXin LI# like: bootmgr.efi memtest.efi shellx64.efi memtest.exe winload.exe winresume.exe bootvhd.dll hvloader.dll
319898496eeSXin LI!:ext	efi/exe
320*ae316d1dSXin LI
321*ae316d1dSXin LI>>(0x3c.l+92)	default		x
322*ae316d1dSXin LI>>>&0		leshort		x	for Unknown subsystem %#x
323*ae316d1dSXin LI## End of the subsystem switch
324*ae316d1dSXin LI
325*ae316d1dSXin LI>>(0x3c.l+4)	clear		x	\b,
326*ae316d1dSXin LI>>(0x3c.l+4)	use		display-coff-processor
327*ae316d1dSXin LI
328d38c30c0SXin LI>>(0x3c.l+22)	leshort&0x0200	>0	(stripped to external PDB)
329d38c30c0SXin LI>>(0x3c.l+22)	leshort&0x1000	>0	system file
330*ae316d1dSXin LI
331*ae316d1dSXin LI# Check for presence of COM Runtime descriptor
332d38c30c0SXin LI>>(0x3c.l+24)	leshort		0x010b
333*ae316d1dSXin LI>>>(0x3c.l+116)	leshort	>14
334*ae316d1dSXin LI>>>>(0x3c.l+232) lelong	>0	Mono/.Net assembly
335d38c30c0SXin LI>>(0x3c.l+24)	leshort		0x020b
336*ae316d1dSXin LI>>>(0x3c.l+132)	leshort	>14
337*ae316d1dSXin LI>>>>(0x3c.l+248) lelong	>0	Mono/.Net assembly
338b6cee71dSXin LI
339b6cee71dSXin LI# hooray, there's a DOS extender using the PE format, with a valid PE
340b6cee71dSXin LI# executable inside (which just prints a message and exits if run in win)
341*ae316d1dSXin LI# FIXME: Find sample of such executable for investigation. In was introduced
342*ae316d1dSXin LI# in file version 4.14 with following check:
343*ae316d1dSXin LI# "(8.s*16) string 32STUB for MS-DOS, 32rtm DOS extender"
344*ae316d1dSXin LI# "(8.s*16) string !32STUB for MS Windows"
345*ae316d1dSXin LI# But that check is too generic and had lot of false positives. 32STUB/32rtm
346*ae316d1dSXin LI# sounds like Borland DOS extender with PE loader and Windows emulation which
347*ae316d1dSXin LI# can be injected into any valid Windows PE binary.
348*ae316d1dSXin LI# So it is needed to look at the sample of such executable and check for
349*ae316d1dSXin LI# subsystem or cpu/machine.
350*ae316d1dSXin LI
351*ae316d1dSXin LI# Detect embedded DOS extenders
352*ae316d1dSXin LI>>(8.s*16)		string		32STUB
353*ae316d1dSXin LI# BRC32.EXE, TLINK32.EXE or TASM32.EXE from TASM 5.0
354*ae316d1dSXin LI>>>(8.s*16)		search/0x50	32rtm-stub\ for\ PE\ files	\b, Borland 32rtm DOS extender (stub)
355*ae316d1dSXin LI# CL.EXE or LINK.EXE from MS Visual C++ 1.x
356*ae316d1dSXin LI>>(8.s*16)		search/0x50	Phar\ Lap\ Software,\ Inc.	\b, Phar Lap TNT DOS extender
357*ae316d1dSXin LI# ulink.exe
358*ae316d1dSXin LI>>(8.s*16)		search/0x200	Can't\ find\ DOSWIN32.RTM	\b, DosWin32 DOS extender (stub)
359*ae316d1dSXin LI>>(8.s*16)		search/0x4000	Stub\ failed\ to\ find\ DOS/4G\ extender.	\b, DOS/4G DOS extender (stub)
360*ae316d1dSXin LI# LOADPEX.BIN and HDLD32.BIN
361*ae316d1dSXin LI# x86 jmp near relative (0xe9 0x?? 0x??) + string "MI" (0x4d 0x49)
362*ae316d1dSXin LI>>(8.s*16)		ulequad&0xffff0000ff	=0x494d0000e9	\b, HX DOS extender (embedded with DPMI host)
363*ae316d1dSXin LI>>(8.s*16)		ulequad&0xffff0000ff	!0x494d0000e9
364*ae316d1dSXin LI# DPMIST32.BIN
365*ae316d1dSXin LI>>>(8.s*16)		search/0x200	cannot\ find\ loader\ DPMILD32.EXE	\b, HX DOS extender (stub)
366*ae316d1dSXin LI# LOADPE.BIN
367*ae316d1dSXin LI>>>(8.s*16)		search/0x600	PATH=HDPMI32.EXE	\b, HX DOS extender (embedded without DPMI host)
368*ae316d1dSXin LI# DPMILD32.BIN
369*ae316d1dSXin LI>>>(8.s*16)		search/0x4000	DPMILD32:	\b, HX DOS extender (embedded without DPMI host)
370*ae316d1dSXin LI
371d38c30c0SXin LI>>(0x3c.l+0xf8)		string		UPX0 \b, UPX compressed
372d38c30c0SXin LI>>(0x3c.l+0xf8)		search/0x140	PEC2 \b, PECompact2 compressed
373d38c30c0SXin LI>>(0x3c.l+0xf8)		search/0x140	UPX2
374d38c30c0SXin LI>>>(&0x10.l+(-4))	string		PK\3\4 \b, ZIP self-extracting archive (Info-Zip)
375d38c30c0SXin LI>>(0x3c.l+0xf8)		search/0x140	.idata
376d38c30c0SXin LI>>>(&0xe.l+(-4))	string		PK\3\4 \b, ZIP self-extracting archive (Info-Zip)
377d38c30c0SXin LI>>>(&0xe.l+(-4))	string		ZZ0 \b, ZZip self-extracting archive
378d38c30c0SXin LI>>>(&0xe.l+(-4))	string		ZZ1 \b, ZZip self-extracting archive
379d38c30c0SXin LI>>(0x3c.l+0xf8)		search/0x140	.rsrc
380d38c30c0SXin LI>>>(&0x0f.l+(-4))	string		a\\\4\5 \b, WinHKI self-extracting archive
381d38c30c0SXin LI>>>(&0x0f.l+(-4))	string		Rar! \b, RAR self-extracting archive
382d38c30c0SXin LI>>>(&0x0f.l+(-4))	search/0x3000	MSCF \b, InstallShield self-extracting archive
383d38c30c0SXin LI>>>(&0x0f.l+(-4))	search/32	Nullsoft \b, Nullsoft Installer self-extracting archive
384d38c30c0SXin LI>>(0x3c.l+0xf8)		search/0x140	.data
385d38c30c0SXin LI>>>(&0x0f.l)		string		WEXTRACT \b, MS CAB-Installer self-extracting archive
386d38c30c0SXin LI>>(0x3c.l+0xf8)		search/0x140	.petite\0 \b, Petite compressed
387d38c30c0SXin LI>>>(0x3c.l+0xf7)	byte		x
388d38c30c0SXin LI>>>>(&0x104.l+(-4))	string		=!sfx! \b, ACE self-extracting archive
389d38c30c0SXin LI>>(0x3c.l+0xf8)		search/0x140	.WISE \b, WISE installer self-extracting archive
390d38c30c0SXin LI>>(0x3c.l+0xf8)		search/0x140	.dz\0\0\0 \b, Dzip self-extracting archive
391d38c30c0SXin LI>>&(0x3c.l+0xf8)	search/0x100	_winzip_ \b, ZIP self-extracting archive (WinZip)
392d38c30c0SXin LI>>&(0x3c.l+0xf8)	search/0x100	SharedD \b, Microsoft Installer self-extracting archive
393d38c30c0SXin LI>>0x30			string		Inno \b, InnoSetup self-extracting archive
394898496eeSXin LI# NumberOfSections; Normal Dynamic Link libraries have a few sections for code, data and resource etc.
395898496eeSXin LI# PE used as container have less sections
396898496eeSXin LI>>(0x3c.l+6)	leshort			>1	\b, %u sections
397898496eeSXin LI# do not display for 1 section to get output like in version 5.43 and to keep output columns low
398898496eeSXin LI#>>(0x3c.l+6)	leshort			=1	\b, %u section
399d38c30c0SXin LI
400d38c30c0SXin LI# If the relocation table is 0x40 or more bytes into the file, it's definitely
401d38c30c0SXin LI# not a DOS EXE.
402898496eeSXin LI>0x18	uleshort	>0x3f
403b6cee71dSXin LI
404b6cee71dSXin LI# Hmm, not a PE but the relocation table is too high for a traditional DOS exe,
405b6cee71dSXin LI# must be one of the unusual subformats.
406b6cee71dSXin LI>>(0x3c.l) string !PE\0\0 MS-DOS executable
407898496eeSXin LI#!:mime	application/x-dosexec
408b6cee71dSXin LI
409b6cee71dSXin LI>>(0x3c.l)		string		NE \b, NE
410898496eeSXin LI#!:mime	application/x-dosexec
411898496eeSXin LI!:mime	application/x-ms-ne-executable
412*ae316d1dSXin LI>>>(0x3c.l+0x02)	ubyte		x	\b version %u
413*ae316d1dSXin LI>>>(0x3c.l+0x02)	ubyte		>5
414*ae316d1dSXin LI>>>>(0x3c.l+0x03)	ubyte		x	\b.%02u
415898496eeSXin LI# FOR DEBUGGING!
416898496eeSXin LI# Reference:	https://wiki.osdev.org/NE
417*ae316d1dSXin LI# Create time for NE version <5 in FAT12 format
418*ae316d1dSXin LI#>>>(0x3c.l+0x02)    ubyte        <5
419*ae316d1dSXin LI#>>>>(0x3c.l+0x08)    ulelong        !0    \b, Created at
420*ae316d1dSXin LI#>>>>>(0x3c.l+0x0a)    lemsdosdate    x    %s
421*ae316d1dSXin LI#>>>>>(0x3c.l+0x08)    lemsdostime    x    %s
422898496eeSXin LI# ProgFlags; Program flags, bitmapped
423898496eeSXin LI#>>>(0x3c.l+0x0C)	ubyte		x	\b, ProgFlags 0x%2.2x
424*ae316d1dSXin LI# >>>(0x3c.l+0x0c)	ubyte&0x03	=0	\b, no automatic data segment
425898496eeSXin LI# >>>(0x3c.l+0x0c)	ubyte&0x03	=1	\b, single shared
426898496eeSXin LI# >>>(0x3c.l+0x0c)	ubyte&0x03	=2	\b, multiple
427898496eeSXin LI# >>>(0x3c.l+0x0c)	ubyte&0x03	=3	\b, (null)
428*ae316d1dSXin LI# >>>(0x3c.l+0x0c)	ubyte		&0x04	\b, Per-Process Library Initialization OR real mode only
429898496eeSXin LI# >>>(0x3c.l+0x0c)	ubyte		&0x08	\b, Protected mode only
430*ae316d1dSXin LI# >>>(0x3c.l+0x0c)	ubyte		&0x10	\b, 8086 instructions in OS/2 app OR LIM 3.2 EMS API in Win app
431*ae316d1dSXin LI# >>>(0x3c.l+0x0c)	ubyte		&0x20	\b, i286 instructions in OS/2 app OR each instance in separate EMS bank in Win app
432*ae316d1dSXin LI# >>>(0x3c.l+0x0c)	ubyte		&0x40	\b, i386 instructions in OS/2 app OR private GlobalAlloc above the EMS line in Win app
433*ae316d1dSXin LI# >>>(0x3c.l+0x0c)	ubyte		&0x80	\b, x87 floating point instructions
434898496eeSXin LI# ApplFlags; Application flags, bitmapped
435898496eeSXin LI# https://www.fileformat.info/format/exe/corion-ne.htm
436898496eeSXin LI#>>>(0x3c.l+0x0D)	ubyte		x	\b, ApplFlags 0x%2.2x
437898496eeSXin LI# Application type (bits 0-2); 1~Full screen (not aware of Windows/P.M. API)
438898496eeSXin LI# 2~Compatible with Windows/P.M. API 3~Uses Windows/P.M. API
439*ae316d1dSXin LI#>>>(0x3c.l+0x0D)	ubyte&0x07	=1	\b, Not compatiblr with Windows/P.M. API (full screen)
440*ae316d1dSXin LI#>>>(0x3c.l+0x0D)	ubyte&0x07	=2	\b, Compatible with Windows/P.M. API (console mode)
441*ae316d1dSXin LI#>>>(0x3c.l+0x0D)	ubyte&0x07	=3	\b, use Windows/P.M. API (window mode)
442*ae316d1dSXin LI#>>>(0x3c.l+0x0D)	ubyte		&0x08	\b, Bound OS/2 app OR application specific loader in Win app
443*ae316d1dSXin LI#>>>(0x3c.l+0x0D)	ubyte		&0x20	\b, Errors in image
444*ae316d1dSXin LI#>>>(0x3c.l+0x0D)	ubyte		&0x40	\b, Non-conforming OS/2 app OR private Win library above EMS line
445898496eeSXin LI# bit 7; DLL or driver (SS:SP info invalid, CS:IP points at FAR init routine called with AX handle
446898496eeSXin LI#>>>(0x3c.l+0x0D)	ubyte		&0x80	\b, DLL or driver
447898496eeSXin LI# AutoDataSegIndex; automatic data segment index like: 0 2 3 22
448898496eeSXin LI# zero if the SINGLEDATA and MULTIPLEDATA bits are cleared
449898496eeSXin LI#>>>(0x3c.l+0x0e)	uleshort	x	\b, AutoDataSegIndex %u
450898496eeSXin LI# InitHeapSize; intial local heap size like; 0 400h 1400h
451898496eeSXin LI# zero if there is no local allocation
452898496eeSXin LI#>>>(0x3c.l+0x10)	uleshort	!0	\b, InitHeapSize 0x%x
453898496eeSXin LI# InitStackSize; inital stack size like: 0 10h A00h 7D0h A8Ch FA0h 1000h 1388h
454898496eeSXin LI# 1400h (CBT) 1800h 2000h 2800h 2EE0h 2F3Ch 3258h 3E80h 4000h 4E20h 5000h 6000h
455898496eeSXin LI# 6D60h 8000h 40000h
456898496eeSXin LI# zero if the SS register value does not equal the DS register value
457898496eeSXin LI#>>>(0x3c.l+0x12)	uleshort	!0	\b, InitStackSize 0x%x
458898496eeSXin LI# EntryPoint; segment offset value of CS:IP like: 0 10000h 18A84h 11C1Ah 307F1h
459898496eeSXin LI#>>>(0x3c.l+0x14)	ulelong		!0 	\b, EntryPoint 0x%x
460898496eeSXin LI# InitStack; specifies the segment offset value of stack pointer SS:SP
461898496eeSXin LI# like: 0 20000h 160000h
462898496eeSXin LI#>>>(0x3c.l+0x18)	ulelong		!0	\b, InitStack 0x%x
463898496eeSXin LI# SegCount; number of segments in segment table like: 0 1 2 3 16h
464898496eeSXin LI#>>>(0x3c.l+0x1C)	uleshort	x	\b, SegCount 0x%x
465898496eeSXin LI# ModRefs; number of module references (DLLs) like; 0 1 3
466898496eeSXin LI#>>>(0x3c.l+0x1E)	uleshort	!0	\b, ModRefs %u
467898496eeSXin LI# NoResNamesTabSiz; size in bytes of non-resident names table
468898496eeSXin LI# like: Bh 16h B4h B9h 2Ch 18Fh 16AAh
469898496eeSXin LI#>>>(0x3c.l+0x20)	uleshort	x	\b, NoResNamesTabSiz 0x%x
470898496eeSXin LI# SegTableOffset; offset of Segment table like: 40h
471898496eeSXin LI#>>>(0x3c.l+0x22)	uleshort	!0x40	\b, SegTableOffset 0x%x
472898496eeSXin LI# ResTableOffset; offset of resources table like: 40h 50h 58h F0h
473898496eeSXin LI# 40h for most fonts likedos737.fon FMFONT.FOT but 60h for L1WBASE.FON
474898496eeSXin LI#>>>(0x3c.l+0x24)	uleshort	x 	\b, ResTableOffset 0x%x
475898496eeSXin LI# ResidNamTable; offset of resident names table
476898496eeSXin LI# like: 58h 5Ch 60h 68h 74h 98h 2E3h 2E7h 2F0h
477898496eeSXin LI#>>>(0x3c.l+0x26)	uleshort		x \b, ResidNamTable 0x%x
478898496eeSXin LI# ImportNameTable; offset of imported names table (array of counted strings, terminated with string of length 00h)
479898496eeSXin LI# like: 77h 7Eh 80h C6h A7h ACh 2F8h 3FFh
480898496eeSXin LI#>>>(0x3c.l+0x2a)	uleshort	x	\b, ImportNameTable 0x%x
481898496eeSXin LI# OffStartNonResTab; offset from start of file to non-resident names table
482898496eeSXin LI# like: 110h 11Dh 19Bh 1A5h 3F5h 4C8h 4EEh D93h
483898496eeSXin LI#>>>(0x3c.l+0x2c)	ulelong		x	\b, OffStartNonResTab 0x%x
484898496eeSXin LI# MovEntryCount; number of movable entry points like: 0 4 5 6 16 17 24 312 355 446
485898496eeSXin LI#>>>(0x3c.l+0x30)	uleshort	!0	\b, MovEntryCount %u
486898496eeSXin LI# FileAlnSzShftCnt; log2 of the segment sector size; 4~16 0~9~512 (default)
487898496eeSXin LI#>>>(0x3c.l+0x32)	uleshort	!9 	\b, FileAlnSzShftCnt %u
488898496eeSXin LI# nResTabEntries; number of resource table entries like: 0 2
489898496eeSXin LI#>>>(0x3c.l+0x34)	uleshort	!0	\b, nResTabEntries %u
490*ae316d1dSXin LI# Following fields are valid only for NE version 5+
491*ae316d1dSXin LI>>>(0x3c.l+0x02)	ubyte		>4
492*ae316d1dSXin LI# targOS; Target OS; 0~unspecified (OS/2 or Windows); detect it based on Windows-only flags and OS/2 specific import lib (DOSCALLS)
493898496eeSXin LI#>>>(0x3c.l+0x36)	byte		x TARGOS %x
494*ae316d1dSXin LI>>>>(0x3c.l+0x36)	byte		0
495*ae316d1dSXin LI# if windows version is specified then it is windows binary
496*ae316d1dSXin LI>>>>>(0x3c.l+0x3E)	ushort		!0 for MS Windows
497*ae316d1dSXin LI>>>>>>(0x3c.l+0x3F)	ubyte		x	%u
498*ae316d1dSXin LI>>>>>>(0x3c.l+0x3E)	ubyte		x	\b.%02u
499*ae316d1dSXin LI>>>>>>(0x3c.l+0x3F)	ubyte		<3
500*ae316d1dSXin LI>>>>>>>(0x3c.l+0x37)	byte&0x04	0	(real mode only)
501*ae316d1dSXin LI>>>>>>>(0x3c.l+0x37)	byte&0x04	!0	(real+protected mode)
502*ae316d1dSXin LI>>>>>>(0x3c.l+0x3E)	ushort		=0x0300
503*ae316d1dSXin LI>>>>>>>(0x3c.l+0x0c)	ubyte&0x08	0	(real+protected mode)
504*ae316d1dSXin LI>>>>>>>(0x3c.l+0x0c)	ubyte&0x08	!0	(protected mode only)
505*ae316d1dSXin LI>>>>>(0x3c.l+0x3E)	ushort		0
506*ae316d1dSXin LI>>>>>>(0x3c.l+0x2a)	leshort		0 for OS/2 1.x or MS Windows 1.x/2.x
507*ae316d1dSXin LI>>>>>>(0x3c.l+0x2a)	default		x
508*ae316d1dSXin LI# Binaries with DOSCALLS import library are for OS/2
509*ae316d1dSXin LI>>>>>>>&(&0.s-0x29)	search/512/C	\x08DOSCALLS for OS/2 1.x
510*ae316d1dSXin LI>>>>>>>(0x3c.l+0x2a)	default		x
511*ae316d1dSXin LI# Binaries with KERNEL, USER or GDI import library are for Windows
512*ae316d1dSXin LI# FIXME: names are prefixed by its length, but regex type does not support binary bytes
513*ae316d1dSXin LI>>>>>>>>&(&0.s-0x29)	regex/512/C	KERNEL|USER|GDI for MS Windows 1.x/2.x
514*ae316d1dSXin LI>>>>>>>>>(0x3c.l+0x37)	byte&0x04	0	(real mode only)
515*ae316d1dSXin LI>>>>>>>>>(0x3c.l+0x37)	byte&0x04	!0	(real+protected mode)
516*ae316d1dSXin LI# Binaries without any of those import library can be for any OS
517*ae316d1dSXin LI>>>>>>>>(0x3c.l+0x2a)	default		x for OS/2 1.x or MS Windows 1.x/2.x
518*ae316d1dSXin LI>>>>(0x3c.l+0x36)	byte		1 for OS/2 1.x
519*ae316d1dSXin LI>>>>(0x3c.l+0x36)	byte		2 for MS Windows
520898496eeSXin LI# expctwinver; expected Windows version (minor first) like:
521898496eeSXin LI# 0.0~DTM.DLL 203.4~Windows 1.03 GDI.EXE 2.1~TTY.DRV 3.0~dos737.fon FMFONT.FOT THREED.VBX 3.10~GDI.EXE 4.0~(ME) VGAFULL.3GR
522*ae316d1dSXin LI>>>>>(0x3c.l+0x3E)	ushort		!0
523*ae316d1dSXin LI>>>>>>(0x3c.l+0x3F)	ubyte		x	%u
524*ae316d1dSXin LI>>>>>>(0x3c.l+0x3E)	ubyte		x	\b.%02u
525*ae316d1dSXin LI# Empty version is is treated by Windows 3.x OS as Windows 2.01 version and by Windows 2.x OS as Windows 1.01 version
526*ae316d1dSXin LI>>>>>(0x3c.l+0x3E)	ushort		0	1.x/2.x
527*ae316d1dSXin LI>>>>>(0x3c.l+0x3F)	ubyte		<3
528*ae316d1dSXin LI>>>>>>(0x3c.l+0x37)	byte&0x04	0	(real mode only)
529*ae316d1dSXin LI>>>>>>(0x3c.l+0x37)	byte&0x04	!0	(real+protected mode)
530*ae316d1dSXin LI>>>>>(0x3c.l+0x3E)	ushort		=0x0300
531*ae316d1dSXin LI>>>>>>(0x3c.l+0x0c)	ubyte&0x08	0	(real+protected mode)
532*ae316d1dSXin LI>>>>>>(0x3c.l+0x0c)	ubyte&0x08	!0	(protected mode only)
533*ae316d1dSXin LI# Windows P-code application
534*ae316d1dSXin LI# https://web.archive.org/web/20000304044656/http://msdn.microsoft.com/library/backgrnd/html/msdn_c7pcode2.htm
535*ae316d1dSXin LI# https://library.thedatadungeon.com/msdn-1992-09/msjv7/html/msjv0g6a.content.htm
536*ae316d1dSXin LI# https://en.wikipedia.org/wiki/P-code_machine#Microsoft_P-code
537*ae316d1dSXin LI# Can be created by MSC7 or MSVC1.x CL.EXE /Oq switch which calls MPC.EXE
538*ae316d1dSXin LI# MPC.EXE (Make P-Code utility) sets bit2 in MZ e_res[2] (e_flags) field
539*ae316d1dSXin LI# Filter out false-positive Windows 3.x applications with OS/2 WLO loader
540*ae316d1dSXin LI# (sets bit7 in NE ne_flagsothers) as they do not have MZ e_res[] fields
541*ae316d1dSXin LI>>>>>(0x3c.l+0x3E)	ushort		>0x0300
542*ae316d1dSXin LI>>>>>>(0x3c.l+0x37)	ubyte&0x80	0
543*ae316d1dSXin LI>>>>>>>0x20		ubyte&0x04	!0	\b, P-code application
544*ae316d1dSXin LI# 32-bit Watcom Win386 extender in 16-bit Windows 3.x NE binaries
545*ae316d1dSXin LI# https://www.os2museum.com/wp/watcom-win386/
546*ae316d1dSXin LI# https://github.com/open-watcom/open-watcom-v2/blob/master/bld/win386/
547*ae316d1dSXin LI# https://misc.daniel-marschall.de/spiele/blown_away/disassemble.php
548*ae316d1dSXin LI# Examples: BA_LITE.EXE WALDO.EXE
549*ae316d1dSXin LI>>>>>(0x3c.l+0x3E)	ushort		>0x0300
550*ae316d1dSXin LI>>>>>>0x38		ulong		!0
551*ae316d1dSXin LI>>>>>>>(0x38.l)		string		MQ	\b, Watcom Win386 extender
552*ae316d1dSXin LI# OS 3 was reserved for Multitasking MS-DOS but it never used NE version 5+ (only NE version 4)
553*ae316d1dSXin LI#>>>>(0x3c.l+0x36)	byte		3 for Multitasking MS-DOS
554*ae316d1dSXin LI# OS 4 was reserved for MS Windows/386 device drivers but MS Windows/386 2.x never used NE format (Xenix x.out format was used instead)
555*ae316d1dSXin LI#>>>>(0x3c.l+0x36)	byte		4 for MS Windows/386 device driver
556*ae316d1dSXin LI# OS 5 is assigned to BOSS (Borland Operating System Services) but is used also by other 16-bit DOS applications
557*ae316d1dSXin LI>>>>(0x3c.l+0x36)	byte		5 for MS-DOS
558*ae316d1dSXin LI# HDLD16.BIN
559*ae316d1dSXin LI# x86 jmp near relative (0xe9 0x?? 0x??) + string "MI" (0x4d 0x49)
560*ae316d1dSXin LI>>>>>(8.s*16)		ulequad&0xffff0000ff	=0x494d0000e9	\b, HX DOS extender 16-bit (embedded with DPMI host)
561*ae316d1dSXin LI>>>>>(8.s*16)		ulequad&0xffff0000ff	!0x494d0000e9
562*ae316d1dSXin LI# DPMIST16.BIN
563*ae316d1dSXin LI>>>>>>(8.s*16)		search/0x200	cannot\ find\ loader\ DPMILD16.EXE	\b, HX DOS extender 16-bit (stub)
564*ae316d1dSXin LI# DPMILD16.BIN
565*ae316d1dSXin LI>>>>>>(8.s*16)		search/0x4000	DPMILD16:	\b, HX DOS extender 16-bit (embedded without DPMI host)
566*ae316d1dSXin LI# TLINK.EXE or TD.EXE from TASM 5.0
567*ae316d1dSXin LI>>>>>>(8.s*16)		string		16STUB
568*ae316d1dSXin LI>>>>>>>(8.s*16)		search/0x1000	rtm.exe\0dpmi16bi.ovl	\b, Borland rtm DOS extender (stub)
569*ae316d1dSXin LI>>>>>>(8.s*16)		string		!16STUB
570*ae316d1dSXin LI# TLINK.EXE or BRC.EXE from Borland Pascal 7.0
571*ae316d1dSXin LI>>>>>>>(8.s*16)	search/0x1000	BOSS\ Stub\ Version	\b, Borland BOSS DOS extender (stub)
572*ae316d1dSXin LI# OS 6 is not assigned but is used by 32-bit DOS application with extender (found only with HX DOS extender 32-bit)
573*ae316d1dSXin LI# http://downloads.sourceforge.net/dfendreloaded/D-Fend-Reloaded-1.4.4.zip
574*ae316d1dSXin LI# D-Fend Reloaded/VirtualHD/FREEDOS/DPMILD32.EXE
575*ae316d1dSXin LI# https://www.japheth.de/HX/DPMILD32.TXT
576*ae316d1dSXin LI>>>>(0x3c.l+0x36)	byte		6 for MS-DOS
577*ae316d1dSXin LI# HDLD32.BIN
578*ae316d1dSXin LI# x86 jmp near relative (0xe9 0x?? 0x??) + string "MI" (0x4d 0x49)
579*ae316d1dSXin LI>>>>>(8.s*16)		ulequad&0xffff0000ff	=0x494d0000e9	\b, HX DOS extender 32-bit (embedded with DPMI host)
580*ae316d1dSXin LI>>>>>(8.s*16)		ulequad&0xffff0000ff	!0x494d0000e9
581*ae316d1dSXin LI# DPMIST32.BIN
582*ae316d1dSXin LI>>>>>>(8.s*16)		search/0x200	cannot\ find\ loader\ DPMILD32.EXE	\b, HX DOS extender 32-bit (stub)
583*ae316d1dSXin LI# DPMILD32.BIN
584*ae316d1dSXin LI>>>>>>(8.s*16)		search/0x4000	DPMILD32:	\b, HX DOS extender 32-bit (embedded without DPMI host)
585*ae316d1dSXin LI# https://en.wikipedia.org/wiki/Phar_Lap_(company)
586*ae316d1dSXin LI# like: TELLPROT.EXE from 286DEX
587*ae316d1dSXin LI# can be created by BIND286.EXE from OS/2 NE binary
588*ae316d1dSXin LI>>>>(0x3c.l+0x36)	byte		0x81 for MS-DOS, Phar Lap 286 DOS extender, emulating OS/2 1.x
589*ae316d1dSXin LI# like: CVP7.EXE from 286DEX
590*ae316d1dSXin LI# can be created by BIND286.EXE from Windows NE binary
591*ae316d1dSXin LI>>>>(0x3c.l+0x36)	byte		0x82 for MS-DOS, Phar Lap 286 DOS extender, emulating MS Windows
592*ae316d1dSXin LI>>>>>(0x3c.l+0x3E)	ushort		0	1.x/2.x
593*ae316d1dSXin LI>>>>>(0x3c.l+0x3E)	ushort		!0
594*ae316d1dSXin LI>>>>>>(0x3c.l+0x3F)	ubyte		x	%u
595*ae316d1dSXin LI>>>>>>(0x3c.l+0x3E)	ubyte		x	\b.%02u
596*ae316d1dSXin LI>>>>(0x3c.l+0x36)	default		x
597*ae316d1dSXin LI>>>>>(0x3c.l+0x36)	ubyte		x for unknown OS %#x
598898496eeSXin LI# OS2EXEFlags; other EXE flags
599*ae316d1dSXin LI# 1~Long filename support 2~Win2.x proportional fonts 4~Win2.x protected mode 8~Executable has gangload area 10~Win9x thunk lib without DllEntryPoint 80~Win3.x app with OS/2 WLO loader
600*ae316d1dSXin LI#>>>>(0x3c.l+0x37)	byte		!0	\b, OS2EXEFlags 0x%x
601*ae316d1dSXin LI# gangstart; offset to start of gangload area like: 0 34h 58h 246h
602*ae316d1dSXin LI#>>>>(0x3c.l+0x38)	uleshort	!0	\b, gangstart 0x%x
603*ae316d1dSXin LI# ganglength; size of gangload area
604898496eeSXin LI# like: 0 33Eh 39Ah AEEh
605*ae316d1dSXin LI#>>>>(0x3c.l+0x3A)	uleshort	!0	\b, ganglength 0x%x
606898496eeSXin LI# mincodeswap; minimum code swap area size like 0 620Ch
607*ae316d1dSXin LI#>>>>(0x3c.l+0x3C)	uleshort	!0 \b, mincodeswap 0x%x
608*ae316d1dSXin LI>>>>(0x3c.l+0x3F)	ubyte		=3
609*ae316d1dSXin LI>>>>>0x3c		ulelong		>0x800
610*ae316d1dSXin LI>>>>>>(0x3c.l+0x37)	ubyte		&0x80	with OS/2 WLO loader
611*ae316d1dSXin LI# Detection for NE versions <5 which do not have OS type byte 0x36
612*ae316d1dSXin LI# These versions are used only by WINE, Windows 1.x/2.x and Multitasking MS-DOS
613*ae316d1dSXin LI# WINE binaries have special signature after the dos header (at fixed offset 0x40)
614*ae316d1dSXin LI# Multitasking MS-DOS binaries imports DOSCALLS library, so use it for distinguishing
615*ae316d1dSXin LI# Import libraries are part of the string table which starts one byte after the
616*ae316d1dSXin LI# 16-bit indirect offset 0x2a relative to the beginning of NE header, and consist
617*ae316d1dSXin LI# of concatenated pascal strings (first byte of the string is its length)
618*ae316d1dSXin LI>>>(0x3c.l+0x02)	ubyte		<5
619*ae316d1dSXin LI# like: fakedlls/krnl386.exe16 fakedlls/gdi.exe16 fakedlls/winsock.dll16 fakedlls/winoldap.mod16 fakedlls/mouse.drv16
620*ae316d1dSXin LI>>>>0x40		string		Wine\ placeholder\ DLL for WINE stub
621*ae316d1dSXin LI>>>>(0x3c.l+0x2a)	default		x
622*ae316d1dSXin LI# like: HE_DAEM.EXE POPUP.EXE QUEUER.EXE
623*ae316d1dSXin LI>>>>>&(&0.s-0x29)	search/512/C	\x08DOSCALLS for Multitasking MS-DOS
624*ae316d1dSXin LI>>>>>(0x3c.l+0x2a)	default		x for MS Windows 1.x/2.x
625*ae316d1dSXin LI# Special case, Windows 3.x OS parse from NE version 4 binaries also following NE version 5 fields:
626*ae316d1dSXin LI# - os type if is 0 or 2
627*ae316d1dSXin LI# - bits proportional fonts and protected mode
628*ae316d1dSXin LI# Such NE version 4 binary is treated by Windows 3.x OS as Windows 2.01
629*ae316d1dSXin LI# compatible binary and by Windows 2.x OS as Windows 1.01 compatible binary.
630*ae316d1dSXin LI# So if os type is correct (0 or 2; matched mask 0xfd) and at least one
631*ae316d1dSXin LI# of those bits is set and others are cleared (matched mask 0xf9) then
632*ae316d1dSXin LI# detect if binary has NE version 5 protected mode bit set.
633*ae316d1dSXin LI>>>>>>(0x3c.l+0x36)	leshort&0xf9fd	0
634*ae316d1dSXin LI>>>>>>>(0x3c.l+0x37)	byte&0x06	!0
635*ae316d1dSXin LI>>>>>>>>(0x3c.l+0x37)	byte&0x04	0	(real mode only)
636*ae316d1dSXin LI>>>>>>>>(0x3c.l+0x37)	byte&0x04	!0	(real+protected mode)
637*ae316d1dSXin LI>>>>>>>(0x3c.l+0x37)	default		x	(real mode only)
638*ae316d1dSXin LI>>>>>>(0x3c.l+0x36)	default		x	(real mode only)
63948c779cdSXin LI# DRV: Driver
64048c779cdSXin LI# 3GR: Grabber device driver
64148c779cdSXin LI# CPL: Control Panel Item
642898496eeSXin LI# VBX: Visual Basic Extension		https://en.wikipedia.org/wiki/Visual_Basic
643898496eeSXin LI# FON: Bitmap font			http://fileformats.archiveteam.org/wiki/FON
64448c779cdSXin LI# FOT: Font resource file
645898496eeSXin LI# EXE: WINSPOOL.EXE USER.EXE krnl386.exe GDI.EXE
646898496eeSXin LI# CNV: Microsoft Word text conversion	https://www.file-extensions.org/cnv-file-extension-microsoft-word-text-conversion-data
647*ae316d1dSXin LI>>>(0x3c.l+0x0c)	leshort		&0x8000
648*ae316d1dSXin LI# Check segment count, if 0 then this is resource-only DLL
649*ae316d1dSXin LI>>>>(0x3c.l+0x1c)	leshort		0
650*ae316d1dSXin LI>>>>>(0x3c.l+0x2c)	lelong		!0
651*ae316d1dSXin LI>>>>>>(&-4.l+1)		string/C	FONTRES	(DLL, font)
652*ae316d1dSXin LI!:ext	fon/fot
653*ae316d1dSXin LI>>>>>>(&-4.l+1)		default		x	(DLL, resource-only)
654*ae316d1dSXin LI!:ext	dll
655*ae316d1dSXin LI>>>>>(0x3c.l+0x2c)	lelong		0	(DLL, resource-only)
656*ae316d1dSXin LI!:ext	dll
657*ae316d1dSXin LI>>>>(0x3c.l+0x1c)	leshort		!0
658*ae316d1dSXin LI# Check description of the module, first word specifies type of the DLL library
659*ae316d1dSXin LI>>>>>(0x3c.l+0x2c)	lelong		!0
660*ae316d1dSXin LI>>>>>>(&-4.l+1)		string/C	DDRV	(DLL, driver)
661*ae316d1dSXin LI!:ext	drv
662*ae316d1dSXin LI>>>>>>(&-4.l+1)		default		x	(DLL)
663*ae316d1dSXin LI!:ext	dll/drv/3gr/cpl/vbx
664*ae316d1dSXin LI>>>>>(0x3c.l+0x2c)	lelong		0	(DLL)
665*ae316d1dSXin LI!:ext	dll/drv/3gr/cpl/vbx
66648c779cdSXin LI>>>(0x3c.l+0x0c)	leshort&0x8000	0 (EXE)
66748c779cdSXin LI!:ext	exe/scr
668*ae316d1dSXin LI>>>>(0x3c.l+0x0d)	ubyte&0x07	=1 (full screen)
669*ae316d1dSXin LI>>>>(0x3c.l+0x0d)	ubyte&0x07	=2 (console)
670*ae316d1dSXin LI>>>>(0x3c.l+0x0d)	ubyte&0x07	=3 (GUI)
671b6cee71dSXin LI>>>&(&0x24.s-1)		string		ARJSFX \b, ARJ self-extracting archive
672b6cee71dSXin LI>>>(0x3c.l+0x70)	search/0x80	WinZip(R)\ Self-Extractor \b, ZIP self-extracting archive (WinZip)
673b6cee71dSXin LI
674*ae316d1dSXin LI>>(0x3c.l)		string		LX \b, LX
675b6cee71dSXin LI!:mime	application/x-dosexec
676*ae316d1dSXin LI>>>(0x3c.l+0x2)		uleshort	=0x0000
677*ae316d1dSXin LI>>>>(0x3c.l)		use		lx-executable
678*ae316d1dSXin LI# no examples found for big endian variant
679*ae316d1dSXin LI>>>(0x3c.l+0x2)		uleshort	=0x0101
680*ae316d1dSXin LI>>>>(0x3c.l)		use		\^lx-executable
681*ae316d1dSXin LI# no examples found for PDP-11 endian variant
682*ae316d1dSXin LI>>>(0x3c.l+0x2)		uleshort	=0x0100
683*ae316d1dSXin LI# PDP-11-endian is not supported by magic "use" keyword yet
684*ae316d1dSXin LI# no examples found for other endian variants
685*ae316d1dSXin LI>>>0			default		x
686*ae316d1dSXin LI# other endianity is not supported by magic "use" keyword
687b6cee71dSXin LI>>>(8.s*16)		string		emx \b, emx
688b6cee71dSXin LI>>>>&1			string		x %s
689b6cee71dSXin LI>>>&(&0x54.l-3)		string		arjsfx \b, ARJ self-extracting archive
690b6cee71dSXin LI
691b6cee71dSXin LI# MS Windows system file, supposedly a collection of LE executables
692898496eeSXin LI# like vmm32.vxd WIN386.EXE
693b6cee71dSXin LI>>(0x3c.l)		string		W3 \b, W3 for MS Windows
694898496eeSXin LI#!:mime	application/x-dosexec
695898496eeSXin LI!:mime	application/x-ms-w3-executable
696*ae316d1dSXin LI>>>(0x3c.l+0x3)		ubyte		<4 %u
697*ae316d1dSXin LI# Windows 3.x WIN386.EXE
698*ae316d1dSXin LI!:ext	exe
699*ae316d1dSXin LI>>>(0x3c.l+0x3)		ubyte		>3 %u
700*ae316d1dSXin LI# Windows 95 VMM32.VXD
701*ae316d1dSXin LI!:ext	vxd
702*ae316d1dSXin LI>>>(0x3c.l+0x2)		ubyte		x \b.%02u
703*ae316d1dSXin LI
704898496eeSXin LI# W4 executable
705898496eeSXin LI>>(0x3c.l)		string		W4 \b, W4 for MS Windows
706898496eeSXin LI#!:mime	application/x-dosexec
707898496eeSXin LI!:mime	application/x-ms-w4-executable
708898496eeSXin LI# windows 98 VMM32.VXD
709898496eeSXin LI!:ext	vxd
710*ae316d1dSXin LI>>>(0x3c.l+0x3)		ubyte		x %u
711*ae316d1dSXin LI>>>(0x3c.l+0x2)		ubyte		x \b.%02u
712b6cee71dSXin LI
713*ae316d1dSXin LI# Linear Executable (LE) in Little Endian (\0\0)
714*ae316d1dSXin LI>>(0x3c.l)		string		LE\0\0 \b, LE
715b6cee71dSXin LI!:mime	application/x-dosexec
716b6cee71dSXin LI>>>(0x3c.l+0x0a)	leshort		1
717b6cee71dSXin LI# some DOS extenders use LE files with OS/2 header
718*ae316d1dSXin LI>>>>0x240		search/0x100	DOS/4G for MS-DOS, DOS/4G DOS extender
719*ae316d1dSXin LI>>>>0x240		search/0x200	WATCOM\ C/C++ for MS-DOS, DOS/4GW DOS extender
720b6cee71dSXin LI>>>>0x440		search/0x100	CauseWay\ DOS\ Extender for MS-DOS, CauseWay DOS extender
721b6cee71dSXin LI>>>>0x40		search/0x40	PMODE/W for MS-DOS, PMODE/W DOS extender
722b6cee71dSXin LI>>>>0x40		search/0x40	STUB/32A for MS-DOS, DOS/32A DOS extender (stub)
723b6cee71dSXin LI>>>>0x40		search/0x80	STUB/32C for MS-DOS, DOS/32A DOS extender (configurable stub)
724b6cee71dSXin LI>>>>0x40		search/0x80	DOS/32A for MS-DOS, DOS/32A DOS extender (embedded)
725*ae316d1dSXin LI# D3XW.EXE
726*ae316d1dSXin LI>>>>(8.s*16)		string		o2LEstub for MS-DOS, D3X DOS extender
727*ae316d1dSXin LI>>>>0			default		x
728*ae316d1dSXin LI# DOS32MW.DLL
729*ae316d1dSXin LI>>>>>(0x3c.l+0x10)	lelong&0x38000	=0x18000 for MS-DOS (DLL)
730*ae316d1dSXin LI!:ext	dll
731*ae316d1dSXin LI# HPFS.386 (HPFS386 filesystem for OS/2 1.x, part of Microsoft LAN Manager)
732*ae316d1dSXin LI# https://www.os2museum.com/wp/os2-history/os2-16-bit-server/
733*ae316d1dSXin LI# EXE module (&0x38000=0x00000) with zero application type (&0x700=0x000) and
734*ae316d1dSXin LI# with no external fixups (&0x20=0x20) is .386 32-bit driver module for OS/2 1.x
735*ae316d1dSXin LI>>>>>(0x3c.l+0x10)	lelong&0x38720	=0x00020 for OS/2 1.x (driver)
736*ae316d1dSXin LI!:ext	386
737*ae316d1dSXin LI>>>>>0			default		x for unknown OS 0x1
738b6cee71dSXin LI# this is a wild guess; hopefully it is a specific signature
739b6cee71dSXin LI>>>>&0x24		lelong		<0x50
740b6cee71dSXin LI>>>>>(&0x4c.l)		string		\xfc\xb8WATCOM
741b6cee71dSXin LI>>>>>>&0		search/8	3\xdbf\xb9 \b, 32Lite compressed
742b6cee71dSXin LI# another wild guess: if real OS/2 LE executables exist, they probably have higher start EIP
743b6cee71dSXin LI#>>>>(0x3c.l+0x1c)	lelong		>0x10000 for OS/2
744b6cee71dSXin LI# fails with DOS-Extenders.
745*ae316d1dSXin LI# OS 2 was reserved for MS Windows 16-bit but it never used LE (NE format was used instead)
746*ae316d1dSXin LI#>>>(0x3c.l+0x0a)	leshort		2 for MS Windows 16-bit
747*ae316d1dSXin LI# OS 3 was reserved for Multitasking MS-DOS but it never used LE (NE format was used instead)
748*ae316d1dSXin LI#>>>(0x3c.l+0x0a)	leshort		3 for Multitasking MS-DOS
749*ae316d1dSXin LI>>>(0x3c.l+0x0a)	leshort		4 for MS Windows
750*ae316d1dSXin LI>>>>(0x3c.l+0xc3)	ubyte		x %u
751*ae316d1dSXin LI>>>>(0x3c.l+0xc2)	ubyte		x \b.%02u
752*ae316d1dSXin LI>>>>(0x3c.l+0x10)	lelong&0x38000	=0x08000
753*ae316d1dSXin LI# DLL module (0x08000) with no external fixups (0x20) for i386 CPU (2) is .386 VxD file for MS Windows 3.x
754*ae316d1dSXin LI>>>>>(0x3c.l+0x10)	lelong&0x20	!0
755*ae316d1dSXin LI>>>>>>(0x3c.l+0x08)	leshort		2 (VxD 386)
756*ae316d1dSXin LI!:ext	386
757*ae316d1dSXin LI>>>>(0x3c.l+0x10)	lelong&0x38000	=0x28000 (VxD static)
758*ae316d1dSXin LI# VXD: VxD for MS Windows 95/98/Me
75948c779cdSXin LI# PDR: Port driver
76048c779cdSXin LI# MPD: Miniport driver (?)
761*ae316d1dSXin LI!:ext	vxd/pdr/mpd
762*ae316d1dSXin LI>>>>(0x3c.l+0x10)	lelong&0x38000	=0x38000 (VxD dynamic)
763*ae316d1dSXin LI!:ext	vxd/pdr/mpd
764*ae316d1dSXin LI>>>(0x3c.l+0x0a)	default		x
765*ae316d1dSXin LI>>>>(0x3c.l+0x0a)	leshort		x for unknown OS %#x
766b6cee71dSXin LI>>>(&0x7c.l+0x26)	string		UPX \b, UPX compressed
767b6cee71dSXin LI>>>&(&0x54.l-3)		string		UNACE \b, ACE self-extracting archive
768b6cee71dSXin LI
769*ae316d1dSXin LI# DOS/32A Linear Compressed file format
770*ae316d1dSXin LI>>(0x3c.l)		string		LC\0\0 \b, LC for MS-DOS
771*ae316d1dSXin LI>>>0x40			search/0x40	STUB/32A \b, DOS/32A DOS extender (stub)
772*ae316d1dSXin LI>>>0x40			search/0x80	STUB/32C \b, DOS/32A DOS extender (configurable stub)
773*ae316d1dSXin LI>>>0x40			search/0x80	DOS/32A \b, DOS/32A DOS extender (embedded)
774*ae316d1dSXin LI
775*ae316d1dSXin LI# PX\0\0 signature for 32bit DOS Applications in DOS-PE Format (https://www.japheth.de/HX.html)
776*ae316d1dSXin LI# SHDPMI.EXE, DOSTEST.EXE, GETVMODE.EXE, RMINT.EXE
777*ae316d1dSXin LI>(0x3c.l)	string		PX\0\0	\b, PE32
778*ae316d1dSXin LI>>(0x3c.l+24)	leshort		0x020b	\b+
779*ae316d1dSXin LI>>0		clear		x
780*ae316d1dSXin LI>>0		default		x	executable for MS-DOS
781*ae316d1dSXin LI# LOADPEX.BIN and HDLD32.BIN
782*ae316d1dSXin LI# x86 jmp near relative (0xe9 0x?? 0x??) + string "MI" (0x4d 0x49)
783*ae316d1dSXin LI>>(8.s*16)	ulequad&0xffff0000ff	=0x494d0000e9	\b, HX DOS extender (embedded with DPMI host)
784*ae316d1dSXin LI>>(8.s*16)	ulequad&0xffff0000ff	!0x494d0000e9
785*ae316d1dSXin LI# DPMIST32.BIN
786*ae316d1dSXin LI>>>(8.s*16)	search/0x200	cannot\ find\ loader\ DPMILD32.EXE	\b, HX DOS extender (stub)
787*ae316d1dSXin LI# LOADPE.BIN
788*ae316d1dSXin LI>>>(8.s*16)	search/0x600	PATH=HDPMI32.EXE	\b, HX DOS extender (embedded without DPMI host)
789*ae316d1dSXin LI# DPMILD32.BIN
790*ae316d1dSXin LI>>>(8.s*16)	search/0x4000	DPMILD32:	\b, HX DOS extender (embedded without DPMI host)
791*ae316d1dSXin LI
792*ae316d1dSXin LI>0		clear	x
793*ae316d1dSXin LI# Skip already parsed binary types
794*ae316d1dSXin LI# If magic in the branch is not parsed then always jumps to mz-unrecognized
795*ae316d1dSXin LI>(0x3c.l)	string	PE\0\0
796*ae316d1dSXin LI>(0x3c.l)	string	PX\0\0
797*ae316d1dSXin LI>(0x3c.l)	string	LX
798*ae316d1dSXin LI>(0x3c.l)	string	NE
799*ae316d1dSXin LI>>(0x3c.l-0x02)	string	!IMNE
800*ae316d1dSXin LI>>>0x18		uleshort <0x40
801*ae316d1dSXin LI>>>>0		use	mz-unrecognized
802*ae316d1dSXin LI>(0x3c.l)	string	W3
803898496eeSXin LI>>0x18		uleshort <0x40
804*ae316d1dSXin LI>>>0		use	mz-unrecognized
805*ae316d1dSXin LI>(0x3c.l)	string	W4
806*ae316d1dSXin LI>>0x18		uleshort <0x40
807*ae316d1dSXin LI>>>0		use	mz-unrecognized
808*ae316d1dSXin LI>(0x3c.l)	string	LE\0\0
809*ae316d1dSXin LI>>0x18		uleshort <0x40
810*ae316d1dSXin LI>>>0		use	mz-unrecognized
811*ae316d1dSXin LI>(0x3c.l)	string	LC
812*ae316d1dSXin LI>>0x18		uleshort <0x40
813*ae316d1dSXin LI>>>0		use	mz-unrecognized
814*ae316d1dSXin LI>0		default	x
815*ae316d1dSXin LI# This sequence jumps to the next MZ overlay
816*ae316d1dSXin LI>>2		leshort	!0
817*ae316d1dSXin LI# FIXME: Following line does not match binaries which total size is less than (4.s*512)
818*ae316d1dSXin LI>>>(4.s*512)	leshort	x
819*ae316d1dSXin LI>>>>&(2.s-514)	leshort	x
820*ae316d1dSXin LI>>>>>&-2	use	mz-next-overlay
821*ae316d1dSXin LI>>>>>&-2	string	BW
822*ae316d1dSXin LI>>>>>>0		use	mz-bw-collection
823*ae316d1dSXin LI>>>>>&-2	string	3P
824*ae316d1dSXin LI>>>>>>0		use	mz-3p
825*ae316d1dSXin LI>>>>0		default	x
826*ae316d1dSXin LI>>>>>0		use	mz-unrecognized
827*ae316d1dSXin LI>>>0		default	x
828*ae316d1dSXin LI>>>>0		use	mz-unrecognized
829*ae316d1dSXin LI>>2		leshort	0
830*ae316d1dSXin LI>>>(4.s*512)	leshort	x
831*ae316d1dSXin LI>>>>&-2		use	mz-next-overlay
832*ae316d1dSXin LI>>>>&-2		string	BW
833*ae316d1dSXin LI>>>>>0		use	mz-bw-collection
834*ae316d1dSXin LI>>>>&-2	string	3P
835*ae316d1dSXin LI>>>>>0		use	mz-3p
836*ae316d1dSXin LI>>>0		default	x
837*ae316d1dSXin LI>>>>0		use	mz-unrecognized
838b6cee71dSXin LI
839*ae316d1dSXin LI# Parse content of the COFF, executable type was already printed in mz-next-overlay
840*ae316d1dSXin LI>(4.s*512)	leshort		0x014c
841*ae316d1dSXin LI#!:mime	application/x-dosexec
842*ae316d1dSXin LI# djgpp go32 v1 COFF
843*ae316d1dSXin LI# F2C.EXE from f2c95201.zip or compress.exe from djdev112.zip
844*ae316d1dSXin LI>>(&-6.l)	string/b	StubInfoMagic!!\0 for MS-DOS
845*ae316d1dSXin LI# djgpp go32 v2 COFF
846*ae316d1dSXin LI>>(8.s*16)	string		go32stub for MS-DOS
847b6cee71dSXin LI>>(8.s*16)	string		emx
848b6cee71dSXin LI>>>&1		string		x for DOS, Win or OS/2, emx %s
849b6cee71dSXin LI>>&(&0x42.l-3)	byte		x
850b6cee71dSXin LI>>>&0x26	string		UPX \b, UPX compressed
85143a5ec4eSXin LI# and yet another guess: small .text, and after large .data is unusual, could be 32lite
852b6cee71dSXin LI>>&0x2c		search/0xa0	.text
853b6cee71dSXin LI>>>&0x0b	lelong		<0x2000
854b6cee71dSXin LI>>>>&0		lelong		>0x6000 \b, 32lite compressed
855b6cee71dSXin LI
856*ae316d1dSXin LI# Parse content of the a.out, executable type was already printed in mz-next-overlay
857*ae316d1dSXin LI>(4.s*512)	leshort		0x010b
858*ae316d1dSXin LI# djgpp go32 v1 a.out
859*ae316d1dSXin LI>>(&-6.l)	string/b	StubInfoMagic!!\0 for MS-DOS
860*ae316d1dSXin LI
861*ae316d1dSXin LI# djgpp go32 v1
862*ae316d1dSXin LI# Note that for "redirect" binaries is offset (4.s*512) behind end-of-file, so access it via "default"
863*ae316d1dSXin LI>(4.s*512)	clear		x
864*ae316d1dSXin LI>(4.s*512)	default		x
865*ae316d1dSXin LI>>(&-4.l)	string/b	StubInfoMagic!!\0
866*ae316d1dSXin LI>>>&0		lelong		>39
867*ae316d1dSXin LI>>>>&19		byte		x \b, DJGPP go32 v%u
868*ae316d1dSXin LI>>>>&18		byte		x \b.%u
869*ae316d1dSXin LI>>>>&17		byte		x \b%c DOS extender (stub)
870*ae316d1dSXin LI>>>&0		lelong		<40 \b, DJGPP go32 v1 DOS extender (stub)
871*ae316d1dSXin LI>>>&0		lelong		>35
872*ae316d1dSXin LI>>>>&0		byte		!0
873*ae316d1dSXin LI>>>>>&-1	string/16	x \b, autoload "%s"
874*ae316d1dSXin LI>>>&0		lelong		>62
875*ae316d1dSXin LI>>>>&28		byte		!0
876*ae316d1dSXin LI# zcat.exe from djdev112.zip
877*ae316d1dSXin LI>>>>>&-1	string/15	x \b, redirect to "%s"
878*ae316d1dSXin LI
879*ae316d1dSXin LI# djgpp go32 v2
880*ae316d1dSXin LI>(8.s*16)	string		go32stub
881*ae316d1dSXin LI# Version string is usually ", v 2.05", so skip leading spaces
882*ae316d1dSXin LI>>&0		string		,\ v\
883*ae316d1dSXin LI>>>&0		string/4	x \b, DJGPP go32 v%s DOS extender
884*ae316d1dSXin LI>>&0		default		x
885*ae316d1dSXin LI>>>&0		string/8	x \b, DJGPP go32 %s DOS extender
886*ae316d1dSXin LI>>&8		lelong		>43
887*ae316d1dSXin LI>>>&24		byte		0
888*ae316d1dSXin LI# check for embedded DPMI host PMODSTUB.EXE
889*ae316d1dSXin LI>>>>0x1c		string		PMODSTUB.EXE (embedded PMODE/DJ)
890*ae316d1dSXin LI>>>>0x1c		string		!PMODSTUB.EXE
891*ae316d1dSXin LI>>>>>0x18	leshort		0
892*ae316d1dSXin LI# check for the default djgpp stub
893*ae316d1dSXin LI>>>>>>0x40	search/0x80	The\ STUB.EXE\ stub\ loader (stub)
894*ae316d1dSXin LI>>>>>>>(8.s*16)	default		x
895*ae316d1dSXin LI>>>>>>>>&8	lelong		>83
896*ae316d1dSXin LI>>>>>>>>>&56	byte		!0
897*ae316d1dSXin LI# show which DPMI host executable is autoloaded when none is running
898*ae316d1dSXin LI>>>>>>>>>>&-1	string/16	x \b, autoload "%s"
899*ae316d1dSXin LI>>>>>(0x18.s)	default		x
900*ae316d1dSXin LI>>>>>>&(0x6.s*4)	default		x
901*ae316d1dSXin LI# check for embedded DPMI host CWSDSTUB.EXE
902*ae316d1dSXin LI>>>>>>>&0	search/16	CWSDPMI
903*ae316d1dSXin LI>>>>>>>>&-7	regex/T		=^CWSDPMI(\ [^\ ]+\ )? (embedded %s)
904*ae316d1dSXin LI# check for embedded DPMI host D3XD.EXE
905*ae316d1dSXin LI>>>>>>>&0	search/16	D3X
906*ae316d1dSXin LI>>>>>>>>&-3	regex/T		=^D3X(\ [^\ ]+\ )? (embedded %s)
907*ae316d1dSXin LI>>>&24		byte		!0
908*ae316d1dSXin LI# djtarx.exe or dxegen.exe from djdev205.zip
909*ae316d1dSXin LI>>>>&-1		string/8	x \b, redirect to "%s"
910*ae316d1dSXin LI
911b6cee71dSXin LI>(8.s*16) string $WdX \b, WDos/X DOS extender
912b6cee71dSXin LI
913b6cee71dSXin LI# By now an executable type should have been printed out.  The executable
914b6cee71dSXin LI# may be a self-uncompressing archive, so look for evidence of that and
915b6cee71dSXin LI# print it out.
916b6cee71dSXin LI#
917b6cee71dSXin LI# Some signatures below from Greg Roelofs, newt@uchicago.edu.
918b6cee71dSXin LI#
919b6cee71dSXin LI>0x35	string	\x8e\xc0\xb9\x08\x00\xf3\xa5\x4a\x75\xeb\x8e\xc3\x8e\xd8\x33\xff\xbe\x30\x00\x05 \b, aPack compressed
920b6cee71dSXin LI>0xe7	string	LH/2\ 	Self-Extract \b, %s
921b6cee71dSXin LI>0x1c	string	UC2X	\b, UCEXE compressed
922b6cee71dSXin LI>0x1c	string	WWP\ 	\b, WWPACK compressed
923b6cee71dSXin LI>0x1c	string	RJSX 	\b, ARJ self-extracting archive
924b6cee71dSXin LI>0x1c	string	diet 	\b, diet compressed
925b6cee71dSXin LI>0x1c	string	LZ09 	\b, LZEXE v0.90 compressed
926b6cee71dSXin LI>0x1c	string	LZ91 	\b, LZEXE v0.91 compressed
927b6cee71dSXin LI>0x1c	string	tz 	\b, TinyProg compressed
928*ae316d1dSXin LI>0x1e	string	Copyright\ 1989-1990\ PKWARE\ Inc.	\b, Self-extracting PKZIP archive
929b6cee71dSXin LI!:mime	application/zip
930b6cee71dSXin LI# Yes, this really is "Copr", not "Corp."
931*ae316d1dSXin LI>0x1e	string	PKLITE\ Copr.	\b, Self-extracting PKZIP archive
932b6cee71dSXin LI!:mime	application/zip
933b6cee71dSXin LI# winarj stores a message in the stub instead of the sig in the MZ header
934b6cee71dSXin LI>0x20	search/0xe0	aRJsfX \b, ARJ self-extracting archive
935b6cee71dSXin LI>0x20	string AIN
936b6cee71dSXin LI>>0x23	string 2	\b, AIN 2.x compressed
937b6cee71dSXin LI>>0x23	string <2	\b, AIN 1.x compressed
938b6cee71dSXin LI>>0x23	string >2	\b, AIN 1.x compressed
939b6cee71dSXin LI>0x24	string	LHa's\ SFX \b, LHa self-extracting archive
940b6cee71dSXin LI!:mime	application/x-lha
941b6cee71dSXin LI>0x24	string	LHA's\ SFX \b, LHa self-extracting archive
942b6cee71dSXin LI!:mime	application/x-lha
943b6cee71dSXin LI>0x24	string	\ $ARX \b, ARX self-extracting archive
944b6cee71dSXin LI>0x24	string	\ $LHarc \b, LHarc self-extracting archive
945b6cee71dSXin LI>0x20	string	SFX\ by\ LARC \b, LARC self-extracting archive
946b6cee71dSXin LI>0x40	string aPKG \b, aPackage self-extracting archive
947b6cee71dSXin LI>0x64	string	W\ Collis\0\0 \b, Compack compressed
948b6cee71dSXin LI>0x7a	string		Windows\ self-extracting\ ZIP	\b, ZIP self-extracting archive
949b6cee71dSXin LI>>&0xf4 search/0x140 \x0\x40\x1\x0
950b6cee71dSXin LI>>>(&0.l+(4)) string MSCF \b, WinHKI CAB self-extracting archive
951b6cee71dSXin LI>1638	string	-lh5- \b, LHa self-extracting archive v2.13S
952b6cee71dSXin LI>0x17888 string Rar! \b, RAR self-extracting archive
953b6cee71dSXin LI
954b6cee71dSXin LI# Skip to the end of the EXE.  This will usually work fine in the PE case
955b6cee71dSXin LI# because the MZ image is hardcoded into the toolchain and almost certainly
956b6cee71dSXin LI# won't match any of these signatures.
957b6cee71dSXin LI>(4.s*512)	long	x
958b6cee71dSXin LI>>&(2.s-517)	byte	x
959b6cee71dSXin LI>>>&0	string		PK\3\4 \b, ZIP self-extracting archive
960b6cee71dSXin LI>>>&0	string		Rar! \b, RAR self-extracting archive
961b6cee71dSXin LI>>>&0	string		=!\x11 \b, AIN 2.x self-extracting archive
962b6cee71dSXin LI>>>&0	string		=!\x12 \b, AIN 2.x self-extracting archive
963b6cee71dSXin LI>>>&0	string		=!\x17 \b, AIN 1.x self-extracting archive
964b6cee71dSXin LI>>>&0	string		=!\x18 \b, AIN 1.x self-extracting archive
965b6cee71dSXin LI>>>&7	search/400	**ACE** \b, ACE self-extracting archive
966b6cee71dSXin LI>>>&0	search/0x480	UC2SFX\ Header \b, UC2 self-extracting archive
967b6cee71dSXin LI
968b6cee71dSXin LI# a few unknown ZIP sfxes, no idea if they are needed or if they are
969b6cee71dSXin LI# already captured by the generic patterns above
970b6cee71dSXin LI>(8.s*16)	search/0x20	PKSFX \b, ZIP self-extracting archive (PKZIP)
971b6cee71dSXin LI# TODO: how to add this? >FileSize-34 string Windows\ Self-Installing\ Executable \b, ZIP self-extracting archive
972b6cee71dSXin LI#
973b6cee71dSXin LI
974b6cee71dSXin LI# TELVOX Teleinformatica CODEC self-extractor for OS/2:
975b6cee71dSXin LI>49801	string	\x79\xff\x80\xff\x76\xff	\b, CODEC archive v3.21
976b6cee71dSXin LI>>49824 leshort		=1			\b, 1 file
977b6cee71dSXin LI>>49824 leshort		>1			\b, %u files
978b6cee71dSXin LI
979*ae316d1dSXin LI
980*ae316d1dSXin LI# This named instance is called for multi overlay MZ executable with offset of the next overlay
981*ae316d1dSXin LI0	name	mz-next-overlay
982*ae316d1dSXin LI>0	string	P2	\b, EXP (P2) for MS-DOS, Phar Lap 286 DOS extender
983*ae316d1dSXin LI>0	string	P3	\b, EXP (P3) for MS-DOS, Phar Lap 386 DOS extender
984*ae316d1dSXin LI>0	string	MT	\b, MT for MS-DOS, IGC XMLOD i386 DOS extender
985*ae316d1dSXin LI>0	string	3P	\b, 3P for MS-DOS
986*ae316d1dSXin LI# Other 3P details are printed later as they depend on the original MZ content
987*ae316d1dSXin LI>>32	lelong&0x00000001	!0	\b, 16-bit
988*ae316d1dSXin LI>>32	lelong&0x00000001	0
989*ae316d1dSXin LI# CWC.EXE from cw349bin.zip is 32-bit
990*ae316d1dSXin LI>>>32	lelong&0x00010000	0	\b, 32-bit
991*ae316d1dSXin LI# WL32.EXE from cw349bin.zip is dual mode
992*ae316d1dSXin LI>>>32	lelong&0x00010000	!0	\b, Dual mode
993*ae316d1dSXin LI>>32	lelong&0x80000000	!0	\b, Compressed
994*ae316d1dSXin LI>0	string	D3X1	\b, D3X1 for MS-DOS, D3X DOS extender
995*ae316d1dSXin LI# BW details are printed later as they depend on the original MZ content
996*ae316d1dSXin LI>0	string	BW	\b, BW collection for MS-DOS
997*ae316d1dSXin LI# a.out details are printed later as they depend on the original MZ content
998*ae316d1dSXin LI>0	leshort	0x010b	\b, a.out
999*ae316d1dSXin LI# COFF details are printed later as they depend on the original MZ content
1000*ae316d1dSXin LI>0	leshort	0x014c	\b, COFF
1001*ae316d1dSXin LI>0	default	x
1002*ae316d1dSXin LI# now make offset aligned to 0x10
1003*ae316d1dSXin LI>>0	offset%0x10	0x0
1004*ae316d1dSXin LI# already aligned
1005*ae316d1dSXin LI>>>0x0	use	mz-next-overlay-aligned
1006*ae316d1dSXin LI>>0	offset%0x10	0x1
1007*ae316d1dSXin LI>>>0xf	use	mz-next-overlay-aligned
1008*ae316d1dSXin LI>>0	offset%0x10	0x2
1009*ae316d1dSXin LI>>>0xe	use	mz-next-overlay-aligned
1010*ae316d1dSXin LI>>0	offset%0x10	0x3
1011*ae316d1dSXin LI>>>0xd	use	mz-next-overlay-aligned
1012*ae316d1dSXin LI>>0	offset%0x10	0x4
1013*ae316d1dSXin LI>>>0xc	use	mz-next-overlay-aligned
1014*ae316d1dSXin LI>>0	offset%0x10	0x5
1015*ae316d1dSXin LI>>>0xb	use	mz-next-overlay-aligned
1016*ae316d1dSXin LI>>0	offset%0x10	0x6
1017*ae316d1dSXin LI>>>0xa	use	mz-next-overlay-aligned
1018*ae316d1dSXin LI>>0	offset%0x10	0x7
1019*ae316d1dSXin LI>>>0x9	use	mz-next-overlay-aligned
1020*ae316d1dSXin LI>>0	offset%0x10	0x8
1021*ae316d1dSXin LI>>>0x8	use	mz-next-overlay-aligned
1022*ae316d1dSXin LI>>0	offset%0x10	0x9
1023*ae316d1dSXin LI>>>0x7	use	mz-next-overlay-aligned
1024*ae316d1dSXin LI>>0	offset%0x10	0xa
1025*ae316d1dSXin LI>>>0x6	use	mz-next-overlay-aligned
1026*ae316d1dSXin LI>>0	offset%0x10	0xb
1027*ae316d1dSXin LI>>>0x5	use	mz-next-overlay-aligned
1028*ae316d1dSXin LI>>0	offset%0x10	0xc
1029*ae316d1dSXin LI>>>0x4	use	mz-next-overlay-aligned
1030*ae316d1dSXin LI>>0	offset%0x10	0xd
1031*ae316d1dSXin LI>>>0x3	use	mz-next-overlay-aligned
1032*ae316d1dSXin LI>>0	offset%0x10	0xe
1033*ae316d1dSXin LI>>>0x2	use	mz-next-overlay-aligned
1034*ae316d1dSXin LI>>0	offset%0x10	0xf
1035*ae316d1dSXin LI>>>0x1	use	mz-next-overlay-aligned
1036*ae316d1dSXin LI0	name	mz-next-overlay-aligned
1037*ae316d1dSXin LI>0	string	MP	\b, EXP (MP) for MS-DOS, Phar Lap 386 DOS extender
1038*ae316d1dSXin LI>0	default	x
1039*ae316d1dSXin LI>>0	use	mz-unrecognized
1040*ae316d1dSXin LI
1041*ae316d1dSXin LI
1042*ae316d1dSXin LI# This named instance is called for unrecognized MZ DOS binary from any offset
1043*ae316d1dSXin LI0	name	mz-unrecognized
1044*ae316d1dSXin LI>0	default	x	\b, MZ for MS-DOS
1045*ae316d1dSXin LI!:mime	application/x-dosexec
1046*ae316d1dSXin LI# Windows and later versions of DOS will allow .EXEs to be named with a .COM
1047*ae316d1dSXin LI# extension, mostly for compatibility's sake.
1048*ae316d1dSXin LI# like: EDIT.COM 4DOS.COM CMD8086.COM CMD-FR.COM SYSLINUX.COM
1049*ae316d1dSXin LI# URL:		https://en.wikipedia.org/wiki/Personal_NetWare#VLM
1050*ae316d1dSXin LI# Reference:	https://mark0.net/download/triddefs_xml.7z/defs/e/exe-vlm-msg.trid.xml
1051*ae316d1dSXin LI# also like: BGISRV.DRV
1052*ae316d1dSXin LI!:ext	exe/com/vlm/drv
1053*ae316d1dSXin LI
1054*ae316d1dSXin LI
1055*ae316d1dSXin LI# This named instance is called for BW collection with offset from the beginning of the file
1056*ae316d1dSXin LI0	name	mz-bw-collection
1057*ae316d1dSXin LI>(8.s*16)	default	x
1058*ae316d1dSXin LI>>&(&0x30.s)	default	x
1059*ae316d1dSXin LI>>>&0	string	DOS/16M	\b, DOS/16M DOS extender (embedded)
1060*ae316d1dSXin LI>>>&-8	string	DOS/16M	\b, DOS/16M DOS extender (embedded)
1061*ae316d1dSXin LI>>>&-8	string	DOS/4G	\b, DOS/4G DOS extender (embedded)
1062*ae316d1dSXin LI>>>0		default	x
1063*ae316d1dSXin LI>>>>(8.s*16)	search/0x4000	Stub\ failed\ to\ find\ DOS/4G\ extender.	\b, DOS/4G DOS extender (stub)
1064*ae316d1dSXin LI
1065*ae316d1dSXin LI
1066*ae316d1dSXin LI# This named instance is called for CauseWay MZ 3P binary with offset from the beginning of the file
1067*ae316d1dSXin LI0	name	mz-3p
1068*ae316d1dSXin LI# CWC.EXE and WL32.EXE from cw349bin.bin
1069*ae316d1dSXin LI>0x440	search/0x100	CauseWay\ DOS\ Extender			\b, CauseWay DOS extender
1070*ae316d1dSXin LI# CWHELP.EXE from cw349bin.bin
1071*ae316d1dSXin LI>0x200	search/0x100	CauseWay\ dynamic\ link\ library	\b, CauseWay DLL
1072*ae316d1dSXin LI
1073*ae316d1dSXin LI
107443a5ec4eSXin LI# Summary:	OS/2 LX Library and device driver (no DOS stub)
107543a5ec4eSXin LI# From:		Joerg Jenderek
107643a5ec4eSXin LI# URL:		http://en.wikipedia.org/wiki/EXE
107743a5ec4eSXin LI# Reference:	http://www.textfiles.com/programming/FORMATS/lxexe.txt
107843a5ec4eSXin LI#		https://github.com/open-watcom/open-watcom-v2/blob/master/bld/watcom/h/exeflat.h
1079*ae316d1dSXin LI#		https://github.com/bitwiseworks/os2tk45/blob/master/h/exe386.h
1080*ae316d1dSXin LI#		https://archive.org/download/IBMOS2Warp4ToolkitDocuments2/lxref.htm
108143a5ec4eSXin LI# Note:		by dll-os2-no-dos-stub.trid.xml called "OS/2 Dynamic Link Library (no DOS stub)"
108243a5ec4eSXin LI# similar looking like variant with MS-DOS stub (MZ magic): "MS-DOS executable, LX"
1083*ae316d1dSXin LI0	string/b	LX	LX executable
108443a5ec4eSXin LI#!:mime	application/x-msdownload
108543a5ec4eSXin LI!:mime	application/x-lx-executable
1086*ae316d1dSXin LI>2	uleshort	=0x0000
1087*ae316d1dSXin LI>>0	use			lx-executable
1088*ae316d1dSXin LI# no examples found for big endian variant
1089*ae316d1dSXin LI>2	uleshort	=0x0101
1090*ae316d1dSXin LI>>0	use			\^lx-executable
1091*ae316d1dSXin LI# no examples found for PDP-11 endian variant
1092*ae316d1dSXin LI>2	uleshort	=0x0100
1093*ae316d1dSXin LI# PDP-11-endian is not supported by magic "use" keyword yet
1094*ae316d1dSXin LI# no examples found for other endian variants
1095*ae316d1dSXin LI>>0	default		x
1096*ae316d1dSXin LI# other endianity is not supported by magic "use" keyword
1097*ae316d1dSXin LI
1098*ae316d1dSXin LI0       name    	lx-executable
109943a5ec4eSXin LI# FOR DEBUGGING!
1100*ae316d1dSXin LI# byte order: 00h~little-endian 01h~big-endian
1101*ae316d1dSXin LI#>0x02	ubyte			=0		\b, little-endian byte order
1102*ae316d1dSXin LI#>0x02	ubyte			=1		\b, big-endian word order
1103*ae316d1dSXin LI# word order: 00h~little-endian 01h~big-endian
110443a5ec4eSXin LI#>0x03	ubyte			=0		\b, little-endian word order
1105*ae316d1dSXin LI#>0x03	ubyte			=1		\b, big-endian word order
1106*ae316d1dSXin LI# cpu_type; CPU type like: 1~i286 2~i386 3~i486 4~i586 20h~i860-N10 21h~i860-N11 40h~MIPS R2000,R3000 41h~MIPS R6000 42h~MIPS R4000
110743a5ec4eSXin LI#>0x08	uleshort		x		\b, CPU %u
1108*ae316d1dSXin LI# os_type; target operating system like: 0~unknown 1~OS/2 2~Windows 16-bit 3~Multitasking MS-DOS 4.x 4~Windows 386 5~IBM Microkernel PN
110943a5ec4eSXin LI#>0x0A	leshort			x		\b, OS %u
111043a5ec4eSXin LI# flags; module type flags
111143a5ec4eSXin LI#>0x10	ulelong			x		\b, FLAGS %#8.8x
111243a5ec4eSXin LI# 00000002h				~Reserved for system use
111343a5ec4eSXin LI#>0x10	ulelong			&0x00000002	\b, 2h reserved
111443a5ec4eSXin LI# OSF_INIT_INSTANCE=00000004h		~Per-Process Library Initialization; setting this bit for EXE file is invalid
111543a5ec4eSXin LI#>0x10	ulelong			&0x00000004	\b, per-process library Initialization
1116*ae316d1dSXin LI#>0x10	ulelong			&0x00000008	\b, system dll
111743a5ec4eSXin LI# OSF_INTERNAL_FIXUPS_DONE=00000010h	~Internal fixups for the module have been applied
111843a5ec4eSXin LI#>0x10	ulelong			&0x00000010	\b, int. fixup
111943a5ec4eSXin LI# OSF_EXTERNAL_FIXUPS_DONE=00000020h	~External fixups for the module have been applied
112043a5ec4eSXin LI#>0x10	ulelong			&0x00000020	\b, ext. fixup
112143a5ec4eSXin LI# OSF_NOT_PM_COMPATIBLE=00000100h	~Incompatible with PM windowing
1122*ae316d1dSXin LI#>0x10	ulelong&0x00000700	=0x00000100	\b, incompatible with PM windowing
112343a5ec4eSXin LI# OSF_PM_COMPATIBLE=00000200h		~Compatible with PM windowing
1124*ae316d1dSXin LI#>0x10	ulelong&0x00000700	=0x00000200	\b, compatible with PM windowing
1125*ae316d1dSXin LI#>0x10	ulelong&0x00000700	=0x00000300	\b, uses PM windowing API
1126*ae316d1dSXin LI#>0x10	ulelong			&0x00002000	\b, not loadable
1127*ae316d1dSXin LI#>0x10	ulelong			&0x00008000	\b, library module
112843a5ec4eSXin LI# bit 17; device driver
1129*ae316d1dSXin LI#>0x10	ulelong			&0x00020000	\b, device driver
1130*ae316d1dSXin LI#>0x10	ulelong			&0x00080000	\b, multiple-processor unsafe
113143a5ec4eSXin LI# Per-process Library Termination; setting this bit for EXE file is invalid
1132*ae316d1dSXin LI#>0x10	ulelong			&0x40000000	\b, per-process library termination
1133*ae316d1dSXin LI# OS type
1134*ae316d1dSXin LI>0x0a	clear			x
113543a5ec4eSXin LI>0x0a	leshort			1		for OS/2
1136*ae316d1dSXin LI# OS 2 was reserved for MS Windows 16-bit but it never used LX (NE format was used instead)
1137*ae316d1dSXin LI#>0x0a	leshort			2		for MS Windows 16-bit
1138*ae316d1dSXin LI# OS 3 was reserved for Multitasking MS-DOS but it never used LX (NE format was used instead)
1139*ae316d1dSXin LI#>0x0a	leshort			3		for Multitasking MS-DOS
1140*ae316d1dSXin LI# OS 4 was reserved for MS Windows device drivers but it never used LX (LE format was used instead)
1141*ae316d1dSXin LI#>0x0a	leshort			4		for MS Windows
1142*ae316d1dSXin LI# OS 5 was reserved for IBM Microkernel Personality Neutral but it never used LX (the only released IBM Workplace OS for PowerPC used ELF format)
1143*ae316d1dSXin LI#>0x0a	leshort			5		for IBM Microkernel Personality Neutral
1144*ae316d1dSXin LI>0x0a	default			x
1145*ae316d1dSXin LI>>0x0a	leshort			x		for unknown OS %#x
114643a5ec4eSXin LI# http://www.ctyme.com/intr/rb-2939.htm#Table1610
114743a5ec4eSXin LI# library by module type mask 00038000h (bits 15-17);
1148898496eeSXin LI# 0h ~executable Program module
1149*ae316d1dSXin LI>0x10	ulelong&0x00038000	=0x00000000	(EXE)
1150*ae316d1dSXin LI!:ext	exe
1151*ae316d1dSXin LI# bits 8-10; OSF_PM_APP=700h in flags	~Uses PM windowing API; either it is GUI or console
1152*ae316d1dSXin LI>>0x10	ulelong&0x00000700	=0x00000100	(full screen)
1153*ae316d1dSXin LI>>0x10	ulelong&0x00000700	=0x00000200	(console)
1154*ae316d1dSXin LI>>0x10	ulelong&0x00000700	=0x00000300	(GUI)
1155*ae316d1dSXin LI>0x10	ulelong&0x00038000	=0x00008000	(DLL)
115643a5ec4eSXin LI!:ext	dll
1157*ae316d1dSXin LI>0x10	ulelong&0x00038000	=0x00010000	(unknown)
1158*ae316d1dSXin LI>0x10	ulelong&0x00038000	=0x00018000	(PMDLL)
1159*ae316d1dSXin LI>0x10	ulelong&0x00038000	=0x00020000	(PDD)
1160*ae316d1dSXin LI!:ext	sys
1161*ae316d1dSXin LI>0x10	ulelong&0x00038000	=0x00028000	(VDD)
1162*ae316d1dSXin LI!:ext	sys
1163*ae316d1dSXin LI>0x10	ulelong&0x00038000	=0x00030000	(DLD)
1164*ae316d1dSXin LI>0x10	ulelong&0x00038000	=0x00038000	(unknown)
116543a5ec4eSXin LI# CPU type
1166*ae316d1dSXin LI>0x08	clear			x
1167*ae316d1dSXin LI>0x08	uleshort		1		\b, Intel i286
116843a5ec4eSXin LI# all inspected examples
1169*ae316d1dSXin LI>0x08	uleshort		2		\b, Intel i386
1170*ae316d1dSXin LI>0x08	uleshort		3		\b, Intel i486
1171*ae316d1dSXin LI>0x08	uleshort		4		\b, Intel i586
1172*ae316d1dSXin LI# 20h 	Intel i860 N10 or compatible
1173*ae316d1dSXin LI# 21h 	Intel i860 N11 or compatible
117443a5ec4eSXin LI# 40h 	MIPS Mark I ( R2000, R3000) or compatible
117543a5ec4eSXin LI# 41h 	MIPS Mark II ( R6000 ) or compatible
117643a5ec4eSXin LI# 42h 	MIPS Mark III ( R4000 ) or compatible
1177*ae316d1dSXin LI>0x08	default			x
1178*ae316d1dSXin LI>>0x08	uleshort		x		\b, unknown CPU %#x
1179*ae316d1dSXin LI# Endianity for debugging, there are no samples for non-little-endian
1180*ae316d1dSXin LI#>0x02	clear			x
1181*ae316d1dSXin LI#>0x02	uleshort		=0x0000		(little-endian)
1182*ae316d1dSXin LI#>0x02	uleshort		=0x0101		(big-endian)
1183*ae316d1dSXin LI#>0x02	uleshort		=0x0100		(PDP-11-endian)
1184*ae316d1dSXin LI#>0x02	default			x		(unknown-endian)
118543a5ec4eSXin LI
118648c779cdSXin LI# added by Joerg Jenderek of https://www.freedos.org/software/?prog=kc
118748c779cdSXin LI# and https://www.freedos.org/software/?prog=kpdos
1188b6cee71dSXin LI# for FreeDOS files like KEYBOARD.SYS, KEYBRD2.SYS, KEYBRD3.SYS, *.KBD
1189b6cee71dSXin LI0	string/b	KCF		FreeDOS KEYBoard Layout collection
1190b6cee71dSXin LI# only version=0x100 found
119143a5ec4eSXin LI>3	uleshort	x		\b, version %#x
1192b6cee71dSXin LI# length of string containing author,info and special characters
1193b6cee71dSXin LI>6	ubyte		>0
1194b6cee71dSXin LI#>>6	pstring		x		\b, name=%s
1195b6cee71dSXin LI>>7	string		>\0		\b, author=%-.14s
1196b6cee71dSXin LI>>7	search/254	\xff		\b, info=
1197b6cee71dSXin LI#>>>&0	string		x		\b%-s
1198b6cee71dSXin LI>>>&0	string		x		\b%-.15s
1199b6cee71dSXin LI# for FreeDOS *.KL files
1200b6cee71dSXin LI0	string/b	KLF		FreeDOS KEYBoard Layout file
1201b6cee71dSXin LI# only version=0x100 or 0x101 found
120243a5ec4eSXin LI>3	uleshort	x		\b, version %#x
1203b6cee71dSXin LI# stringlength
1204b6cee71dSXin LI>5	ubyte		>0
1205b6cee71dSXin LI>>8	string		x		\b, name=%-.2s
1206b6cee71dSXin LI0	string	\xffKEYB\ \ \ \0\0\0\0
1207b6cee71dSXin LI>12	string	\0\0\0\0`\004\360	MS-DOS KEYBoard Layout file
1208b6cee71dSXin LI
1209898496eeSXin LI# DOS device driver updated by Joerg Jenderek at May 2011,Mar 2017,Aug 2020,Mar 2023
121043a5ec4eSXin LI# URL:		http://fileformats.archiveteam.org/wiki/DOS_device_driver
121143a5ec4eSXin LI# Reference:	http://www.delorie.com/djgpp/doc/rbinter/it/46/16.html
1212898496eeSXin LI# http://www.o3one.org/hwdocs/bios_doc/dosref22.html
121340427ccaSGordon Tetlow0	ulequad&0x07a0ffffffff		0xffffffff
121443a5ec4eSXin LI# skip OS/2 INI ./os2
121543a5ec4eSXin LI>4  ubelong   !0x14000000
1216898496eeSXin LI#>>10  ubequad   x		MAYBE_DRIVER_NAME=%16.16llx
1217898496eeSXin LI# https://bugs.astron.com/view.php?id=434
1218898496eeSXin LI# skip OOXML document fragment 0000.dat where driver name is "empty" instead of "ASCII like"
1219898496eeSXin LI>>10  ubequad   !0
1220898496eeSXin LI>>>0	use				msdos-driver
122140427ccaSGordon Tetlow0       name    			msdos-driver		DOS executable (
122240427ccaSGordon Tetlow#!:mime	application/octet-stream
122340427ccaSGordon Tetlow!:mime	application/x-dosdriver
122440427ccaSGordon Tetlow# also found FreeDOS print driver SPOOL.DEV and disc compression driver STACLOAD.BIN
122543a5ec4eSXin LI# and IBM Token-Ring adapter IBMTOK.DOS. Why and when DOS instead SYS is used?
122643a5ec4eSXin LI# PROTMAN.DOS ELNKPL.DOS
122743a5ec4eSXin LI!:ext	sys/dev/bin/dos
122843a5ec4eSXin LI# 1 space char after "UPX compressed" to get phrase like "UPX compressed character device"
1229b6cee71dSXin LI>40	search/7			UPX!			\bUPX compressed
1230b6cee71dSXin LI# DOS device driver attributes
1231b6cee71dSXin LI>4	uleshort&0x8000			0x0000			\bblock device driver
1232b6cee71dSXin LI# character device
1233b6cee71dSXin LI>4	uleshort&0x8000			0x8000			\b
123443a5ec4eSXin LI# 1 space char after "clock" to get phrase like "clock character device driver CLOCK$"
1235b6cee71dSXin LI>>4	uleshort&0x0008			0x0008			\bclock
1236b6cee71dSXin LI# fast video output by int 29h
123743a5ec4eSXin LI# 1 space char after "fast" to get phrase like "fast standard input/output character device driver"
1238b6cee71dSXin LI>>4	uleshort&0x0010			0x0010			\bfast
1239b6cee71dSXin LI# standard input/output device
124043a5ec4eSXin LI# 1 space char after "standard" to get phrase like "standard input/output character device driver"
1241b6cee71dSXin LI>>4	uleshort&0x0003			>0			\bstandard
1242b6cee71dSXin LI>>>4	uleshort&0x0001			0x0001			\binput
1243b6cee71dSXin LI>>>4	uleshort&0x0003			0x0003			\b/
124443a5ec4eSXin LI# 1 space char after "output" to get phrase like "input/output character device driver"
1245b6cee71dSXin LI>>>4	uleshort&0x0002			0x0002			\boutput
1246b6cee71dSXin LI>>4	uleshort&0x8000			0x8000			\bcharacter device driver
1247b6cee71dSXin LI>0	ubyte				x
1248b6cee71dSXin LI# upx compressed device driver has garbage instead of real in name field of header
1249b6cee71dSXin LI>>40	search/7			UPX!
1250b6cee71dSXin LI>>40	default				x
1251b6cee71dSXin LI# leading/trailing nulls, zeros or non ASCII characters in 8-byte name field at offset 10 are skipped
1252898496eeSXin LI# 1 space char before device driver name to get phrase like "device driver PROTMAN$" "device driver HP-150II" "device driver PC$MOUSE"
1253898496eeSXin LI>>>12		ubyte			>0x23			\b
1254b6cee71dSXin LI>>>>10		ubyte			>0x20
1255b6cee71dSXin LI>>>>>10		ubyte			!0x2E
1256b6cee71dSXin LI>>>>>>10	ubyte			!0x2A			\b%c
1257b6cee71dSXin LI>>>>11		ubyte			>0x20
1258b6cee71dSXin LI>>>>>11		ubyte			!0x2E			\b%c
1259b6cee71dSXin LI>>>>12		ubyte			>0x20
1260b6cee71dSXin LI>>>>>12		ubyte			!0x39
1261b6cee71dSXin LI>>>>>>12	ubyte			!0x2E			\b%c
1262b6cee71dSXin LI>>>13		ubyte			>0x20
1263b6cee71dSXin LI>>>>13		ubyte			!0x2E			\b%c
1264b6cee71dSXin LI>>>>14		ubyte			>0x20
1265b6cee71dSXin LI>>>>>14		ubyte			!0x2E			\b%c
1266b6cee71dSXin LI>>>>15		ubyte			>0x20
1267b6cee71dSXin LI>>>>>15		ubyte			!0x2E			\b%c
1268b6cee71dSXin LI>>>>16		ubyte			>0x20
1269b6cee71dSXin LI>>>>>16		ubyte			!0x2E
1270b6cee71dSXin LI>>>>>>16	ubyte			<0xCB			\b%c
1271b6cee71dSXin LI>>>>17		ubyte			>0x20
1272b6cee71dSXin LI>>>>>17		ubyte			!0x2E
1273b6cee71dSXin LI>>>>>>17	ubyte			<0x90			\b%c
1274b6cee71dSXin LI# some character device drivers like ASPICD.SYS, btcdrom.sys and Cr_atapi.sys contain only spaces or points in name field
127540427ccaSGordon Tetlow>>>12		ubyte			<0x2F
1276b6cee71dSXin LI# they have their real name at offset 22
127740427ccaSGordon Tetlow# also block device drivers like DUMBDRV.SYS
127840427ccaSGordon Tetlow>>>>22		string			>\056			%-.6s
1279b6cee71dSXin LI>4	uleshort&0x8000			0x0000
1280b6cee71dSXin LI# 32 bit sector addressing ( > 32 MB) for block devices
1281b6cee71dSXin LI>>4	uleshort&0x0002			0x0002			\b,32-bit sector-
1282b6cee71dSXin LI# support by driver functions 13h, 17h, 18h
1283b6cee71dSXin LI>4	uleshort&0x0040			0x0040			\b,IOCTL-
1284b6cee71dSXin LI# open, close, removable media support by driver functions 0Dh, 0Eh, 0Fh
1285b6cee71dSXin LI>4	uleshort&0x0800			0x0800			\b,close media-
1286b6cee71dSXin LI# output until busy support by int 10h for character device driver
1287b6cee71dSXin LI>4	uleshort&0x8000			0x8000
1288b6cee71dSXin LI>>4	uleshort&0x2000			0x2000			\b,until busy-
1289b6cee71dSXin LI# direct read/write support by driver functions 03h,0Ch
1290b6cee71dSXin LI>4	uleshort&0x4000			0x4000			\b,control strings-
1291b6cee71dSXin LI>4	uleshort&0x8000			0x8000
1292b6cee71dSXin LI>>4	uleshort&0x6840			>0			\bsupport
1293b6cee71dSXin LI>4	uleshort&0x8000			0x0000
1294b6cee71dSXin LI>>4	uleshort&0x4842			>0			\bsupport
1295b6cee71dSXin LI>0	ubyte				x			\b)
129643a5ec4eSXin LI>0	ulelong				!0xffffffff		with pointer %#x
1297b6cee71dSXin LI# DOS driver cmd640x.sys has 0x12 instead of 0xffffffff for pointer field to next device header
129840427ccaSGordon Tetlow0	ulequad				0x0513c00000000012
129940427ccaSGordon Tetlow>0	use				msdos-driver
130040427ccaSGordon Tetlow# DOS drivers DC2975.SYS, DUMBDRV.SYS, ECHO.SYS has also none 0xffffffff for pointer field
130140427ccaSGordon Tetlow0	ulequad				0x32f28000ffff0016
130240427ccaSGordon Tetlow>0	use				msdos-driver
130340427ccaSGordon Tetlow0	ulequad				0x007f00000000ffff
130440427ccaSGordon Tetlow>0	use				msdos-driver
130543a5ec4eSXin LI# https://www.uwe-sieber.de/files/cfg_echo.zip
130640427ccaSGordon Tetlow0	ulequad				0x001600000000ffff
130740427ccaSGordon Tetlow>0	use				msdos-driver
130840427ccaSGordon Tetlow# DOS drivers LS120.SYS, MKELS120.SYS use reserved bits of attribute field
130940427ccaSGordon Tetlow0	ulequad				0x0bf708c2ffffffff
131040427ccaSGordon Tetlow>0	use				msdos-driver
131140427ccaSGordon Tetlow0	ulequad				0x07bd08c2ffffffff
131240427ccaSGordon Tetlow>0	use				msdos-driver
131343a5ec4eSXin LI# 3Com EtherLink 3C501 CID\SERVER\IBMLS\IBM500D1\DLSNETDR.ZIP\ELNK.DOS
131443a5ec4eSXin LI0	ulequad				0x027ac0c0ffffffff
131543a5ec4eSXin LI>0	use				msdos-driver
131643a5ec4eSXin LI# IBM Streamer CID\SERVER\IBMLS\IBM500D1\DLSNETDR.ZIP\IBMMPC.DOS
131743a5ec4eSXin LI0	ulequad				0x00228880ffffffff
131843a5ec4eSXin LI>0	use				msdos-driver
1319b6cee71dSXin LI
13203e41d09dSXin LI# updated by Joerg Jenderek
13213e41d09dSXin LI# GRR: line below too general as it catches also
13223e41d09dSXin LI# rt.lib DYADISKS.PIC and many more
13233e41d09dSXin LI# start with assembler instruction MOV
13243e41d09dSXin LI0	ubyte		0x8c
13253e41d09dSXin LI# skip "AppleWorks word processor data" like ARTICLE.1 ./apple
13263e41d09dSXin LI>4	string			!O====
13273e41d09dSXin LI# skip some unknown basic binaries like RocketRnger.SHR
13283e41d09dSXin LI>>5	string			!MAIN
13293e41d09dSXin LI# skip "GPG symmetrically encrypted data" ./gnu
13303e41d09dSXin LI# skip "PGP symmetric key encrypted data" ./pgp
13313e41d09dSXin LI# openpgpdefs.h: fourth byte < 14 indicate cipher algorithm type
1332a2dfb722SXin LI>>>4	ubyte			>13
1333a2dfb722SXin LI>>>>0		use	msdos-com
13343e41d09dSXin LI# the remaining files should be DOS *.COM executables
13353e41d09dSXin LI# dosshell.COM	8cc0 2ea35f07 e85211 e88a11 b80058 cd
13363e41d09dSXin LI# hmload.COM	8cc8 8ec0 bbc02b 89dc 83c30f c1eb04 b4
13373e41d09dSXin LI# UNDELETE.COM	8cca 2e8916 6503 b430 cd21 8b 2e0200 8b
13383e41d09dSXin LI# BOOTFIX.COM	8cca 2e8916 9603 b430 cd21 8b 2e0200 8b
13393e41d09dSXin LI# RAWRITE3.COM	8cca 2e8916 d602 b430 cd21 8b 2e0200 8b
13403e41d09dSXin LI# SHARE.COM	8cca 2e8916 d602 b430 cd21 8b 2e0200 8b
13413e41d09dSXin LI# validchr.COM	8cca 2e8916 9603 b430 cd21 8b 2e028b1e
13423e41d09dSXin LI# devload.COM	8cca 8916ad01 b430 cd21 8b2e0200 892e
1343a5d223e6SXin LI
1344a5d223e6SXin LI0       name    msdos-com
1345a2dfb722SXin LI# URL:		http://fileformats.archiveteam.org/wiki/DOS_executable_(.com)
1346a2dfb722SXin LI>0  byte        x               DOS executable (
1347898496eeSXin LI# DOS executable with JuMP 16-bit instruction
1348a2dfb722SXin LI>0	byte			=0xE9
1349a2dfb722SXin LI# check for probably nil padding til offset 64 of Lotus driver name
1350a2dfb722SXin LI>>56		quad		=0
1351898496eeSXin LI# check for "long" alphabetic Lotus driver name like:
1352a2dfb722SXin LI# Diablo "COMPAQ Text Display" "IBM Monochrome Display" "Plantronics ColorPlus"
1353a2dfb722SXin LI>>>24			regex	=^[A-Z][A-Za-z\040]{5,21}	\bLotus driver) %s
1354a2dfb722SXin LI!:mime				application/x-dosexec
1355a2dfb722SXin LI# like: CPQ0TD.DRV IBM0MONO.DRV (Lotus 123 10a) SDIAB4.DRV SPL0CPLS.DRV (Lotus Symphony 2)
1356a2dfb722SXin LI!:ext				drv
1357a2dfb722SXin LI# COM with nils like MODE.COM IBMDOS.COM (pcdos 3.31 ru Compaq) RSSTUB.COM (PC-DOS 2000 de) ACCESS.COM (Lotus Symphony 1)
1358a2dfb722SXin LI>>>24			default	x				\bCOM)
1359a2dfb722SXin LI!:mime				application/x-dosexec
1360a2dfb722SXin LI!:ext				com
1361898496eeSXin LI# DOS executable with JuMP 16-bit and without nil padding
1362a2dfb722SXin LI>>56		quad		!0
1363a2dfb722SXin LI# https://wiki.syslinux.org/wiki/index.php?title=Doc/comboot
1364a2dfb722SXin LI# TODO: HOWTO distinguish COMboot from pure DOS executables?
1365a2dfb722SXin LI# look for unreliable Syslinux specific api call INTerrupt 22h for 16-bit COMBOOT program
1366a2dfb722SXin LI>>>1			search/0xc088	\xcd\x22		\bCOM or COMBOOT 16-bit)
1367a2dfb722SXin LI!:mime				application/x-dosexec
1368a2dfb722SXin LI# like: sbm.cbt command.com (Windows XP) UNI2ASCI.COM (FreeDOS 1.2)
1369a2dfb722SXin LI!:ext				com/cbt
1370a2dfb722SXin LI>>>1			default		x			\bCOM)
1371a2dfb722SXin LI!:mime				application/x-dosexec
1372a2dfb722SXin LI!:ext				com
1373a2dfb722SXin LI# DOS executable without JuMP 16-bit instruction
1374a2dfb722SXin LI>0	byte			!0xE9
1375a2dfb722SXin LI# SCREATE.SYS	https://en.wikipedia.org/wiki/Stac_Electronics
1376a2dfb722SXin LI>>10		string		=?STACVOL			\bSCREATE.SYS)
1377a2dfb722SXin LI!:mime			application/x-dosexec
1378a2dfb722SXin LI!:ext			sys
1379a2dfb722SXin LI# COM executable without JuMP 16-bit instruction and not SCREATE.SYS
1380a2dfb722SXin LI>>10		string		!?STACVOL			\bCOM)
138148c779cdSXin LI!:mime			application/x-dosexec
138248c779cdSXin LI!:ext			com
1383a5d223e6SXin LI>6	string		SFX\ of\ LHarc	\b, %s
1384a5d223e6SXin LI>0x1FE leshort	0xAA55		    \b, boot code
1385a5d223e6SXin LI>85	string		UPX		        \b, UPX compressed
1386a5d223e6SXin LI>4	string		\ $ARX		    \b, ARX self-extracting archive
1387a5d223e6SXin LI>4	string		\ $LHarc	    \b, LHarc self-extracting archive
1388a5d223e6SXin LI>0x20e string	SFX\ by\ LARC	\b, LARC self-extracting archive
1389a2dfb722SXin LI# like: E30ODI.COM MADGEODI.COM UNI2ASCI.COM RECOVER.COM (DOS 2) COMMAND.COM (DOS 2)
1390a2dfb722SXin LI>1	search/0xc088	\xcd\x22	\b, maybe with interrupt 22h
1391a2dfb722SXin LI>0	ubelong		x		\b, start instruction %#8.8x
1392a2dfb722SXin LI# show more instructions but not in samples like: rem.com (DJGPP)
1393a2dfb722SXin LI>4	ubelong		x		%8.8x
1394a5d223e6SXin LI
1395a5d223e6SXin LI# JMP 8bit
1396a5d223e6SXin LI0	        byte	0xeb
1397a2dfb722SXin LI# byte 0xeb conflicts with magic leshort 0xn2eb of "SYMMETRY i386" handled by ./sequent
1398a5d223e6SXin LI# allow forward jumps only
1399a5d223e6SXin LI>1          byte    >-1
1400a5d223e6SXin LI# that offset must be accessible
1401a2dfb722SXin LI# with hexadecimal values like: 0e 2e 50 8c 8d ba bc bd be e8 fb fc
1402a5d223e6SXin LI>>(1.b+2)   byte    x
1403a2dfb722SXin LI# if look like COM executable with x86 boot signature then this
1404a2dfb722SXin LI# implies FAT volume with x86 real mode code already handled by ./filesystems
1405a2dfb722SXin LI#
1406a2dfb722SXin LI# No x86 boot signature implies often DOS executable
1407a2dfb722SXin LI# check for unrealistic high number of FATs. Then it is an unusual disk image or often a DOS executable
1408a2dfb722SXin LI# like: FIXBIOS.COM (50 bytes)
1409a2dfb722SXin LI>>>16		ubyte		>3
1410a2dfb722SXin LI# https://www.drivedroid.io/
1411a2dfb722SXin LI# skip MBR disk image drivedroid.img version 12 July 2013 by start message
1412a2dfb722SXin LI>>>>2		string		!DriveDroid
1413a2dfb722SXin LI# ftp://old-dos.ru/OSCollect/OS/MS-DOS/Final Releases/
1414a2dfb722SXin LI# skip unusual floppy image disk1.img of MS-DOS 1.25 (Corona Data Systems OEM)
1415a2dfb722SXin LI# by check for characteristic message text near the beginning
1416a2dfb722SXin LI>>>>>15		string		!Non\040System\040disk
1417a2dfb722SXin LI# "ftp://old-dos.ru/OSCollect/OS/BeOS/BeOS 4.0.rar"
1418a2dfb722SXin LI# skip BeOS 4 bootfloppy.img done as "Linux kernel x86 boot executable" by ./linux
1419a2dfb722SXin LI# by check for characteristic message text near the beginning
1420a2dfb722SXin LI>>>>>>6		string		!read\040error\015
1421a2dfb722SXin LI# https://github.com/ventoy/Ventoy/releases/download/v1.0.78/ventoy-1.0.78-windows.zip
1422a2dfb722SXin LI# skip ventoy 1.0.78 boot_hybrid.img
1423a2dfb722SXin LI>>>>>>>24	string		!\220\220\353I$\022\017
1424a2dfb722SXin LI# "ftp://old-dos.ru/OSCollect/OS/MS-DOS/Final Releases/PC-DOS 1.0 (5.25).rar"
1425a2dfb722SXin LI# skip unusual floppy image PCDOS100.IMG of DOS 1.0
1426a2dfb722SXin LI# by check for characteristic message text near the beginning
1427a2dfb722SXin LI>>>>>>>>9	string		!7-May-81
1428a2dfb722SXin LI# "ftp://old-dos.ru/OSCollect/OS/BeOS/BeOS 5.0 Personal (BA).rar"
1429a2dfb722SXin LI# skip BeOS 5 floppy_1.44.00.ima done as "DOS/MBR boot sector" by ./filesystems
1430a2dfb722SXin LI# by check for characteristic message near the beginning
1431a2dfb722SXin LI>>>>>>>>>3	string		!\370sdfS\270
1432a2dfb722SXin LI# like: FIXBIOS.COM (50 bytes)
1433a2dfb722SXin LI>>>>>>>>>>0		use		msdos-com
1434a2dfb722SXin LI# check for unrealistic low number of FATs. Then it is an unusual FAT disk image or often a DOS executable
1435a2dfb722SXin LI# like: DEVICE.COM INSTALL.COM (GAG 4.10) WORD.COM (Word 1.15)
1436a2dfb722SXin LI>>>16		ubyte		=0
1437a2dfb722SXin LI# if low FATs with x86 boot signature it can be unusual disk image like: boot.img (Ventoy 1.0.27) geodspms.img (Syslinux)
1438a2dfb722SXin LI>>>>0x1FE	leshort		=0xAA55
1439a2dfb722SXin LI>>>>0x1FE	default		x
1440a2dfb722SXin LI# https://thestarman.pcministry.com/tool/hxd/dimtut.htm
1441a2dfb722SXin LI# skip unusual floppy image TK-DOS11.img IBMDOS11.img of IBM DOS 1.10
1442a2dfb722SXin LI# by check for characteristic bootloader names near end of boot sector
1443a2dfb722SXin LI>>>>>395	string		!ibmbio\040\040com
1444a2dfb722SXin LI>>>>>>0			use		msdos-com
1445a2dfb722SXin LI# 8-bit jump with valid number of FAT implies FAT volume already handled by ./filesystems
1446a2dfb722SXin LI# like: balder.img
1447a2dfb722SXin LI>>>16		default		x
1448a2dfb722SXin LI# skip disk images with boot signature at end of 1st sector
1449a2dfb722SXin LI# like: TDSK-64b.img
1450a2dfb722SXin LI>>>>(11.s-2)	uleshort	!0xAA55
1451a2dfb722SXin LI# skip unusual floppy image without boot signature like 360k-256.img (mtools 4.0.18)
1452a2dfb722SXin LI# by check for characteristic file system type text for FAT (12 bit or 16 bit)
1453a2dfb722SXin LI>>>>>54		string		!FAT
1454a2dfb722SXin LI# "ftp://old-dos.ru/OSCollect/OS/MS-DOS/Final Releases/Microsoft MS-DOS 3.31 (Compaq OEM) (3.5).rar"
1455a2dfb722SXin LI# skip unusual floppy image Disk4.img without boot signature and file system type text
1456a2dfb722SXin LI# by check for characteristic OEM-ID text
1457a2dfb722SXin LI>>>>>>3		string		!COMPAQ\040\040
1458a2dfb722SXin LI# no such DOS COM executables found
1459a2dfb722SXin LI>>>>>>>0		use		msdos-com
1460a5d223e6SXin LI# JMP 16bit
1461a5d223e6SXin LI0           byte    0xe9
1462*ae316d1dSXin LI# display DOS executable (COM or COMBOOT 16-bit strength=40=40-0) after ESP-IDF application image (strength=40=40+0) handled by ./firmware
1463*ae316d1dSXin LI#!:strength	-0
1464a2dfb722SXin LI# 16-bit offset; for DEBUGGING!; can be negative like: USBDRIVE.COM
1465*ae316d1dSXin LI# 2h (CPQ0TD.DRV) 4FEh (NDN.COM) 581h (DRMOUSE.COM) 1FDh (GAG.COM) BE07h (USBDRIVE.COM)
1466*ae316d1dSXin LI#>1		uleshort	x	\b, OFFSET=%#4.4x
1467a2dfb722SXin LI#>1		leshort		x	\b, OFFSET %d
1468a5d223e6SXin LI# forward jumps
1469a2dfb722SXin LI>1		leshort	>-1
1470a5d223e6SXin LI# that offset must be accessible
1471a2dfb722SXin LI# with hexadecimal values like: 06 1e 0e 2e 60 8c 8d b4 ba be e8 fc
1472a5d223e6SXin LI>>(1.s+3)   byte    x
1473a2dfb722SXin LI# check for unrealistic high number of FATs. Then it is not a disk image and it is a DOS executable
1474a2dfb722SXin LI# like: CALLVER.COM CPUCACHE.COM K437_EUR.COM SHSUCDX.COM UMBFILL.COM (183 bytes)
1475a2dfb722SXin LI>>>16		ubyte		>3
1476a2dfb722SXin LI>>>>0			use		msdos-com
1477a2dfb722SXin LI# check for unrealistic low number of FATs. Then it is not a disk image and it is a DOS executable
1478a2dfb722SXin LI# like: GAG.COM DRMOUSE.COM NDN.COM CPQ0TD.DRV
1479*ae316d1dSXin LI# or ESP-IDF application image like: WLED_0.14.0_ESP32-C3.bin opendtu-generic_esp32.bin
1480a2dfb722SXin LI>>>16		ubyte		=0
1481*ae316d1dSXin LI# skip ESP-IDF application image handled by ./firmware with ESP_APP_DESC_MAGIC_WORD
1482*ae316d1dSXin LI>>>>32	ulelong		!0xABCD5432
1483*ae316d1dSXin LI>>>>>0			use		msdos-com
1484a2dfb722SXin LI# maybe disc image with valid number of FATs or DOS executable
1485a2dfb722SXin LI# like: IPXODI.COM PERUSE.COM TASKID.COM
1486a2dfb722SXin LI>>>16		default	x
1487a2dfb722SXin LI# invalid low media descriptor. Then it is not a disk image and it is a DOS executable
1488a2dfb722SXin LI>>>>21		ubyte		<0xE5
1489a2dfb722SXin LI>>>>>0			use		msdos-com
1490a2dfb722SXin LI# valid media descriptor. Then it is maybe disk image or DOS executable
1491a2dfb722SXin LI>>>>21		ubyte		>0xE4
1492a2dfb722SXin LI# invalid sectorsize not a power of 2 from 32-32768. Then it is not a disk image and it must be DOS executable
1493a2dfb722SXin LI# like: LEARN.COM (Word 1.15)
1494a2dfb722SXin LI>>>>>11		uleshort&0x001f	!0
1495a2dfb722SXin LI>>>>>>0			use		msdos-com
1496a5d223e6SXin LI# negative offset, must not lead into PSP
1497a2dfb722SXin LI# like: BASICA.COM (PC dos 3.20) FORMAT.COM SMC8100.COM WORD.COM (word4)
1498a2dfb722SXin LI# HIDSUPT1.COM USBDRIVE.COM USBSUPT1.COM USBUHCI.COM (FreeDOS USBDOS)
1499a2dfb722SXin LI>1		leshort	<-259
1500a5d223e6SXin LI# that offset must be accessible
1501a2dfb722SXin LI# add 10000h to jump at end of 64 KiB segment, add 1 for jump instruction and 2 for 16-bit offset
1502a5d223e6SXin LI>>(1,s+65539)   byte    x
1503a2dfb722SXin LI# after jump next instruction for DEBUGGING!
1504a2dfb722SXin LI#>>>&-1		ubelong	x	\b, NEXT instruction %#8.8x
1505a5d223e6SXin LI>>>0        use msdos-com
1506a5d223e6SXin LI
1507a2dfb722SXin LI# updated by Joerg Jenderek at Oct 2008,2015,2022
15083e41d09dSXin LI# following line is too general
15093e41d09dSXin LI0	ubyte		0xb8
15103e41d09dSXin LI# skip 2 linux kernels like memtest.bin with "\xb8\xc0\x07\x8e" in ./linux
15113e41d09dSXin LI>0	string		!\xb8\xc0\x07\x8e
1512b6cee71dSXin LI# modified by Joerg Jenderek
15133e41d09dSXin LI# syslinux COM32 or COM32R executable
15143e41d09dSXin LI>>1	lelong&0xFFFFFFFe 0x21CD4CFe	COM executable (32-bit COMBOOT
151548c779cdSXin LI# https://www.syslinux.org/wiki/index.php/Comboot_API
15163e41d09dSXin LI# Since version 5.00 c32 modules switched from the COM32 object format to ELF
15173e41d09dSXin LI!:mime	application/x-c32-comboot-syslinux-exec
15183e41d09dSXin LI!:ext c32
151948c779cdSXin LI# https://syslinux.zytor.com/comboot.php
15203e41d09dSXin LI# older syslinux version ( <4 )
1521b6cee71dSXin LI# (32-bit COMBOOT) programs *.C32 contain 32-bit code and run in flat-memory 32-bit protected mode
1522b6cee71dSXin LI# start with assembler instructions mov eax,21cd4cffh
15233e41d09dSXin LI>>>1	lelong		0x21CD4CFf	\b)
1524b6cee71dSXin LI# syslinux:doc/comboot.txt
1525b6cee71dSXin LI# A COM32R program must start with the byte sequence B8 FE 4C CD 21 (mov
1526b6cee71dSXin LI# eax,21cd4cfeh) as a magic number.
15273e41d09dSXin LI# syslinux version (4.x)
15283e41d09dSXin LI# "COM executable (COM32R)" or "Syslinux COM32 module" by TrID
15293e41d09dSXin LI>>>1	lelong		0x21CD4CFe	\b, relocatable)
1530a2dfb722SXin LI>>1	default	x
1531a2dfb722SXin LI# look for interrupt instruction like in rem.com (DJGPP) LOADER.COM (DR-DOS 7.x)
1532a2dfb722SXin LI>>>3	search/118	\xCD
1533898496eeSXin LI# FOR DEBUGGING; possible hexadecimal interrupt number like: 10~BANNER.COM 13~bcdw_cl.com 15~poweroff.com (Syslinux)
1534a2dfb722SXin LI# 1A~BERNDPCI.COM 20~SETENHKB.COM 21~mostly 22~gfxboot.com (Syslinux) 2F~SHUTDOWN.COM (GEMSYS)
1535a2dfb722SXin LI#>>>>&0	ubyte	x			\b, INTERUPT %#x
1536a2dfb722SXin LI# few examples with interrupt 0x13 instruction
1537a2dfb722SXin LI>>>>&0	ubyte	=0x13
1538a2dfb722SXin LI# FOR DEBUGGING!
1539a2dfb722SXin LI#>>>>>3	ubequad	x			\b, 2nd INSTRUCTION %#16.16llx
1540a2dfb722SXin LI# skip Gpt.com Mbr.com (edk2-UDK2018 bootsector) described as "DOS/MBR boot sector" by ./filesystems
1541a2dfb722SXin LI# by check for assembler instructions: mov  es,ax ; mov  ax,07c0h ; mov ds,ax
1542a2dfb722SXin LI>>>>>3	ubequad	!0x8ec0b8c0078ed88d
1543898496eeSXin LI# few COM executables with interrupt 0x13 instruction like: Bootable CD Wizard executables bcdw_cl.com fdemuoff.com
1544a2dfb722SXin LI# http://bootcd.narod.ru/bcdw150z_en.zip
1545a2dfb722SXin LI>>>>>>0		use		msdos-com
1546a2dfb722SXin LI# few examples with interrupt 0x16 instruction like flashimg.img
1547a2dfb722SXin LI>>>>&0	ubyte	=0x16
1548a2dfb722SXin LI# skip Syslinux 3.71 flashimg.img done as "DOS/MBR boot sector" by ./filesystems
1549a2dfb722SXin LI# by check for assembler instructions: cmp ax 0xE4E4 (magic); jnz
1550a2dfb722SXin LI>>>>>8	ubelong	!0x3DE4E475
1551a2dfb722SXin LI# no DOS executable with interrupt 0x16 found
1552a2dfb722SXin LI>>>>>>0		use		msdos-com
1553a2dfb722SXin LI# most examples with interrupt instruction unequal 0x13 and 0x16
1554a2dfb722SXin LI>>>>&0	default	x
1555a2dfb722SXin LI#>>>>>&-1 ubyte	x			\b, INTERUPT %#x
1556a2dfb722SXin LI# like: LOADER.COM SETENHKB.COM banner.com copybs.com gif2raw.com poweroff.com rem.com
1557a2dfb722SXin LI>>>>>0		use		msdos-com
1558898496eeSXin LI# few COM executables without interrupt instruction like RESTART.COM (DOS 7.10) REBOOT.COM
1559a2dfb722SXin LI# or some EUC-KR text files or one Ulead Imaginfo thumbnail
1560a2dfb722SXin LI>>>3	default	x
1561a2dfb722SXin LI# FOR DEBUGGING; 2nd instruction like 0x50 (RESTART.COM) 0x8e (REBOOT.COM)
1562a2dfb722SXin LI# or random like: 0x0 (IMAGINFO.PE3 sky_snow) 0xb1 (euckr_.txt)
1563a2dfb722SXin LI#>>>>3	ubyte	x			\b, 2nd INSTRUCTION %#x
1564a2dfb722SXin LI# skip 1 Ulead Imaginfo thumbnail (IMAGINFO.PE3 sky_snow)
1565a2dfb722SXin LI# inside SAMPLES/TEXTURES/SKY_SNOW
1566a2dfb722SXin LI# from https://archive.org/download/PI3CANON/PI3CANON.iso
1567a2dfb722SXin LI>>>>3	ubyte	!0x0
1568a2dfb722SXin LI# skip some EUC-KR text files like: euckr_falsepositive.txt
1569a2dfb722SXin LI# https://bugs.astron.com/view.php?id=186
1570a2dfb722SXin LI>>>>>3	ubyte	!0xb1
1571a2dfb722SXin LI# like: RESTART.COM (DOS 7.10) REBOOT.COM
1572a2dfb722SXin LI>>>>>>0	use		msdos-com
15733e41d09dSXin LI
157443a5ec4eSXin LI# URL:		https://en.wikipedia.org/wiki/UPX
157543a5ec4eSXin LI# Reference:	https://github.com/upx/upx/archive/v3.96.zip/upx-3.96/
157643a5ec4eSXin LI#		src/stub/src/i086-dos16.com.S
157743a5ec4eSXin LI# Update:	Joerg Jenderek
157843a5ec4eSXin LI# assembler instructions: cmp sp, offset sp_limit
1579b6cee71dSXin LI0	string/b	\x81\xfc
158043a5ec4eSXin LI#>2	uleshort	x		\b, sp_limit=%#x
158143a5ec4eSXin LI# assembler instructions: jump above +2; int 0x20; mov cx, offset bytes_to_copy
1582b6cee71dSXin LI>4	string	\x77\x02\xcd\x20\xb9
158343a5ec4eSXin LI#>9	uleshort	x		\b, [bytes_to_copy]=%#x
158443a5ec4eSXin LI# at different offsets assembler instructions: push di; jump decomp_start_n2b
158543a5ec4eSXin LI>0x1e	search/3	\x57\xe9
158643a5ec4eSXin LI#>>&0	uleshort	x		\b, decomp_start_n2b=%#x
158743a5ec4eSXin LI# src/stub/src/include/header.S; UPX_MAGIC_LE32
158843a5ec4eSXin LI>>&2	string		UPX!		FREE-DOS executable (COM), UPX
158948c779cdSXin LI!:mime	application/x-dosexec
159043a5ec4eSXin LI# UPX compressed *.CPI; See ./fonts
159143a5ec4eSXin LI>>>&21	string		=FONT		compressed DOS code page font
159243a5ec4eSXin LI!:ext	cpx
159343a5ec4eSXin LI>>>&21	string		!FONT		compressed
159448c779cdSXin LI!:ext	com
159543a5ec4eSXin LI# compressed size?
159643a5ec4eSXin LI#>>>&14	uleshort+152	x		\b, %u bytes
159743a5ec4eSXin LI# uncompressed len
159843a5ec4eSXin LI>>>&12	uleshort	x		\b, uncompressed %u bytes
1599b6cee71dSXin LI252	string Must\ have\ DOS\ version DR-DOS executable (COM)
160048c779cdSXin LI!:mime	application/x-dosexec
160148c779cdSXin LI!:ext	com
1602b6cee71dSXin LI# GRR search is not working
1603b6cee71dSXin LI#2	search/28	\xcd\x21	COM executable for MS-DOS
1604b6cee71dSXin LI#WHICHFAT.cOM
1605b6cee71dSXin LI2	string	\xcd\x21		COM executable for DOS
160648c779cdSXin LI!:mime	application/x-dosexec
160748c779cdSXin LI!:ext	com
1608b6cee71dSXin LI#DELTREE.cOM DELTREE2.cOM
1609b6cee71dSXin LI4	string	\xcd\x21		COM executable for DOS
161048c779cdSXin LI!:mime	application/x-dosexec
161148c779cdSXin LI!:ext	com
1612b6cee71dSXin LI#IFMEMDSK.cOM ASSIGN.cOM COMP.cOM
1613b6cee71dSXin LI5	string	\xcd\x21		COM executable for DOS
161448c779cdSXin LI!:mime	application/x-dosexec
161548c779cdSXin LI!:ext	com
1616b6cee71dSXin LI#DELTMP.COm HASFAT32.cOM
1617b6cee71dSXin LI7	string	\xcd\x21
1618b6cee71dSXin LI>0	byte	!0xb8			COM executable for DOS
161948c779cdSXin LI!:mime	application/x-dosexec
162048c779cdSXin LI!:ext	com
1621b6cee71dSXin LI#COMP.cOM MORE.COm
1622b6cee71dSXin LI10	string	\xcd\x21
1623b6cee71dSXin LI>5	string	!\xcd\x21		COM executable for DOS
162448c779cdSXin LI!:mime	application/x-dosexec
162548c779cdSXin LI!:ext	com
1626b6cee71dSXin LI#comecho.com
1627b6cee71dSXin LI13	string	\xcd\x21		COM executable for DOS
162848c779cdSXin LI!:mime	application/x-dosexec
162948c779cdSXin LI!:ext	com
1630b6cee71dSXin LI#HELP.COm EDIT.coM
163143a5ec4eSXin LI18	string	\xcd\x21
163243a5ec4eSXin LI# not printable before it?
163343a5ec4eSXin LI>17	byte	>32
163443a5ec4eSXin LI>>17	byte	<126
163543a5ec4eSXin LI>>17	default	x			COM executable for MS-DOS
163648c779cdSXin LI!:mime	application/x-dosexec
163748c779cdSXin LI!:ext	com
1638b6cee71dSXin LI#NWRPLTRM.COm
1639b6cee71dSXin LI23	string	\xcd\x21		COM executable for MS-DOS
164048c779cdSXin LI!:mime	application/x-dosexec
164148c779cdSXin LI!:ext	com
1642b6cee71dSXin LI#LOADFIX.cOm LOADFIX.cOm
1643b6cee71dSXin LI30	string	\xcd\x21		COM executable for MS-DOS
164448c779cdSXin LI!:mime	application/x-dosexec
164548c779cdSXin LI!:ext	com
1646b6cee71dSXin LI#syslinux.com 3.11
1647b6cee71dSXin LI70	string	\xcd\x21		COM executable for DOS
164848c779cdSXin LI!:mime	application/x-dosexec
164948c779cdSXin LI!:ext	com
1650b6cee71dSXin LI# many compressed/converted COMs start with a copy loop instead of a jump
1651b6cee71dSXin LI0x6	search/0xa	\xfc\x57\xf3\xa5\xc3	COM executable for MS-DOS
165248c779cdSXin LI!:mime	application/x-dosexec
165348c779cdSXin LI!:ext	com
1654b6cee71dSXin LI0x6	search/0xa	\xfc\x57\xf3\xa4\xc3	COM executable for DOS
165548c779cdSXin LI!:mime	application/x-dosexec
165648c779cdSXin LI!:ext	com
1657b6cee71dSXin LI>0x18	search/0x10	\x50\xa4\xff\xd5\x73	\b, aPack compressed
1658b6cee71dSXin LI0x3c	string		W\ Collis\0\0		COM executable for MS-DOS, Compack compressed
165948c779cdSXin LI!:mime	application/x-dosexec
166048c779cdSXin LI!:ext	com
1661b6cee71dSXin LI# FIXME: missing diet .com compression
1662b6cee71dSXin LI
1663b6cee71dSXin LI# miscellaneous formats
1664b6cee71dSXin LI0	string/b	LZ		MS-DOS executable (built-in)
1665b6cee71dSXin LI#0	byte		0xf0		MS-DOS program library data
1666b6cee71dSXin LI#
1667b6cee71dSXin LI
1668b6cee71dSXin LI# AAF files:
1669b6cee71dSXin LI# <stuartc@rd.bbc.co.uk> Stuart Cunningham
1670b6cee71dSXin LI0	string/b	\320\317\021\340\241\261\032\341AAFB\015\000OM\006\016\053\064\001\001\001\377			AAF legacy file using MS Structured Storage
1671b6cee71dSXin LI>30	byte	9		(512B sectors)
1672b6cee71dSXin LI>30	byte	12		(4kB sectors)
1673b6cee71dSXin LI0	string/b	\320\317\021\340\241\261\032\341\001\002\001\015\000\002\000\000\006\016\053\064\003\002\001\001			AAF file using MS Structured Storage
1674b6cee71dSXin LI>30	byte	9		(512B sectors)
1675b6cee71dSXin LI>30	byte	12		(4kB sectors)
1676b6cee71dSXin LI
1677b6cee71dSXin LI# Popular applications
1678b6cee71dSXin LI#
1679d38c30c0SXin LI# Update:	Joerg Jenderek
1680d38c30c0SXin LI# URL:		http://fileformats.archiveteam.org/wiki/DOC
1681d38c30c0SXin LI# Reference:	https://web.archive.org/web/20170206041048/
1682d38c30c0SXin LI#		http://www.msxnet.org/word2rtf/formats/ffh-dosword5
1683d38c30c0SXin LI# wIdent+dty
1684d38c30c0SXin LI0	belong	0x31be0000
1685d38c30c0SXin LI# skip droid skeleton like x-fmt-274-signature-id-488.doc
1686d38c30c0SXin LI>128	ubyte		>0  			Microsoft
1687d38c30c0SXin LI>>96	uleshort	=0			Word
1688b6cee71dSXin LI!:mime	application/msword
1689d38c30c0SXin LI!:apple	MSWDWDBN
1690d38c30c0SXin LI# DCX is used in the Unix version.
1691d38c30c0SXin LI!:ext	doc/dcx
1692d38c30c0SXin LI>>>0x6E	ulequad		=0			1.0-4.0
1693d38c30c0SXin LI>>>0x6E	ulequad		!0			5.0-6.0
1694d38c30c0SXin LI>>>0x6E	ulequad		x			(DOS) Document
1695d38c30c0SXin LI# https://web.archive.org/web/20130831064118/http://msxnet.org/word2rtf/formats/write.txt
1696d38c30c0SXin LI>>96	uleshort	!0			Write 3.0 (Windows) Document
1697d38c30c0SXin LI!:mime	application/x-mswrite
1698d38c30c0SXin LI!:apple	MSWDWDBN
1699d38c30c0SXin LI# sometimes also doc like in splitter.doc srchtest.doc
1700d38c30c0SXin LI!:ext	wri/doc
1701d38c30c0SXin LI# wTool must be 0125400 octal
1702d38c30c0SXin LI#>>4	uleshort	!0xAB00			\b, wTool %o
1703d38c30c0SXin LI# reserved; must be zero
1704d38c30c0SXin LI#>>6	ulelong		!0			\b, reserved %u
1705d38c30c0SXin LI# block pointer to the block containing optional file manager information
170643a5ec4eSXin LI#>>0x1C	uleshort	x			\b, at %#x info block
1707d38c30c0SXin LI# jump to File manager information block
1708d38c30c0SXin LI>>(0x1C.s*128)	uleshort x
1709d38c30c0SXin LI# test for valid information start; maybe also 0012h
1710d38c30c0SXin LI>>>&-2		uleshort	=0x0014
1711d38c30c0SXin LI# Document ASCIIZ name
1712d38c30c0SXin LI>>>>&0x12	string		x		%s
1713d38c30c0SXin LI# author name
1714d38c30c0SXin LI>>>>>&1		string		x		\b, author %s
1715d38c30c0SXin LI# reviser name
1716d38c30c0SXin LI>>>>>>&1	string		x		\b, reviser %s
1717d38c30c0SXin LI# keywords
1718d38c30c0SXin LI>>>>>>>&1	string		x		\b, keywords %s
1719d38c30c0SXin LI# comment
1720d38c30c0SXin LI>>>>>>>>&1	string		x		\b, comment %s
1721d38c30c0SXin LI# version number
1722d38c30c0SXin LI>>>>>>>>>&1	string		x		\b, version %s
1723d38c30c0SXin LI# date of last change MM/DD/YY
1724d38c30c0SXin LI>>>>>>>>>>&1	string		x		\b, %-.8s
1725d38c30c0SXin LI# creation date MM/DD/YY
1726d38c30c0SXin LI>>>>>>>>>>&9	string		x		created %-.8s
1727d38c30c0SXin LI# file name of print format like NORMAL.STY
1728d38c30c0SXin LI>>0x1E	string		>0			\b, formatted by %-.66s
1729d38c30c0SXin LI# count of pages in whole file for write variant; maybe some times wrong
1730d38c30c0SXin LI>>96	uleshort	>0			\b, %u pages
1731d38c30c0SXin LI# name of the printer driver like HPLASMS
1732d38c30c0SXin LI>>0x62	string		>0			\b, %-.8s printer
1733d38c30c0SXin LI# number of blocks used in the file; seems to be 0 for Word 4.0 and Write 3.0
1734d38c30c0SXin LI>>0x6A	uleshort	>0			\b, %u blocks
1735d38c30c0SXin LI# bit field for corrected text areas
173643a5ec4eSXin LI#>>0x6C	uleshort	x			\b, %#x bit field
1737d38c30c0SXin LI# text of document; some times start with 4 non printable characters like CR LF
1738d38c30c0SXin LI>>128	ubyte		x			\b,
1739d38c30c0SXin LI>>>128		ubyte	>0x1F
1740d38c30c0SXin LI>>>>128		string	x			%s
1741d38c30c0SXin LI>>>128		ubyte	<0x20
1742d38c30c0SXin LI>>>>129		ubyte	>0x1F
1743d38c30c0SXin LI>>>>>129	string	x			%s
1744d38c30c0SXin LI>>>>129		ubyte	<0x20
1745d38c30c0SXin LI>>>>>130	ubyte	>0x1F
1746d38c30c0SXin LI>>>>>>130	string	x			%s
1747d38c30c0SXin LI>>>>>130	ubyte	<0x20
1748d38c30c0SXin LI>>>>>>131	ubyte	>0x1F
1749d38c30c0SXin LI>>>>>>>131	string	x			%s
1750d38c30c0SXin LI>>>>>>131	ubyte	<0x20
1751d38c30c0SXin LI>>>>>>>132	ubyte	>0x1F
1752d38c30c0SXin LI>>>>>>>>132	string	x			%s
1753d38c30c0SXin LI>>>>>>>132	ubyte	<0x20
1754d38c30c0SXin LI>>>>>>>>133	ubyte	>0x1F
1755d38c30c0SXin LI>>>>>>>>>133	string	x			%s
1756b6cee71dSXin LI#
1757b6cee71dSXin LI0	string/b	PO^Q`				Microsoft Word 6.0 Document
1758b6cee71dSXin LI!:mime	application/msword
1759b6cee71dSXin LI#
176040427ccaSGordon Tetlow4   long        0
176140427ccaSGordon Tetlow>0  belong      0xfe320000      Microsoft Word for Macintosh 1.0
1762b6cee71dSXin LI!:mime	application/msword
176340427ccaSGordon Tetlow!:ext   mcw
176440427ccaSGordon Tetlow>0  belong      0xfe340000      Microsoft Word for Macintosh 3.0
1765b6cee71dSXin LI!:mime	application/msword
176640427ccaSGordon Tetlow!:ext   mcw
176740427ccaSGordon Tetlow>0  belong      0xfe37001c      Microsoft Word for Macintosh 4.0
176840427ccaSGordon Tetlow!:mime	application/msword
176940427ccaSGordon Tetlow!:ext   mcw
177040427ccaSGordon Tetlow>0  belong      0xfe370023      Microsoft Word for Macintosh 5.0
177140427ccaSGordon Tetlow!:mime	application/msword
177240427ccaSGordon Tetlow!:ext   mcw
177340427ccaSGordon Tetlow
177440427ccaSGordon Tetlow0	string/b	\333\245-\0\0\0			Microsoft Word 2.0 Document
177540427ccaSGordon Tetlow!:mime	application/msword
177640427ccaSGordon Tetlow!:ext   doc
177758a0f0d0SEitan Adler# Note: seems already recognized as "OLE 2 Compound Document" in ./ole2compounddocs
177858a0f0d0SEitan Adler#512	string/b	\354\245\301			Microsoft Word Document
177958a0f0d0SEitan Adler#!:mime	application/msword
1780b6cee71dSXin LI
1781b6cee71dSXin LI#
1782b6cee71dSXin LI0	string/b	\xDB\xA5\x2D\x00		Microsoft WinWord 2.0 Document
1783b6cee71dSXin LI!:mime application/msword
1784b6cee71dSXin LI
1785b6cee71dSXin LI#
1786b6cee71dSXin LI0	string/b	\x09\x04\x06\x00\x00\x00\x10\x00	Microsoft Excel Worksheet
1787b6cee71dSXin LI!:mime	application/vnd.ms-excel
1788d38c30c0SXin LI# https://www.macdisk.com/macsigen.php
1789d38c30c0SXin LI!:apple	XCELXLS4
1790d38c30c0SXin LI!:ext	xls
1791b6cee71dSXin LI#
1792a5d223e6SXin LI# Update: Joerg Jenderek
1793a5d223e6SXin LI# URL: https://en.wikipedia.org/wiki/Lotus_1-2-3
1794a5d223e6SXin LI# Reference: http://www.aboutvb.de/bas/formate/pdf/wk3.pdf
1795a5d223e6SXin LI# Note: newer Lotus versions >2 use longer BOF record
1796a5d223e6SXin LI# record type (BeginningOfFile=0000h) + length (001Ah)
1797a5d223e6SXin LI0	belong	0x00001a00
1798a5d223e6SXin LI# reserved should be 0h but 8c0dh for TUTMAC.WK3, 5h for SAMPADNS.WK3, 1h for a_readme.wk3, 1eh for K&G86.WK3
1799a5d223e6SXin LI#>18	uleshort&0x73E0	0
1800a5d223e6SXin LI# Lotus Multi Byte Character Set (LMBCS=1-31)
1801a5d223e6SXin LI>20	ubyte		>0
1802a5d223e6SXin LI>>20	ubyte		<32	Lotus 1-2-3
1803a5d223e6SXin LI#!:mime	application/x-123
1804a5d223e6SXin LI!:mime	application/vnd.lotus-1-2-3
1805a5d223e6SXin LI!:apple	????L123
1806a5d223e6SXin LI# (version 5.26) labeled the entry as "Lotus 1-2-3 wk3 document data"
1807a5d223e6SXin LI>>>4	uleshort	0x1000	WorKsheet, version 3
1808a5d223e6SXin LI!:ext	wk3
1809a5d223e6SXin LI# (version 5.26) labeled the entry as "Lotus 1-2-3 wk4 document data"
1810a5d223e6SXin LI>>>4	uleshort	0x1002	WorKsheet, version 4
1811a5d223e6SXin LI# also worksheet template 4 (.wt4)
1812a5d223e6SXin LI!:ext	wk4/wt4
1813a5d223e6SXin LI# no example or documentation for wk5
1814a5d223e6SXin LI#>>4	uleshort	0x????	WorKsheet, version 4
1815a5d223e6SXin LI#!:ext	wk5
1816a5d223e6SXin LI# only MacrotoScript.123 example
1817a5d223e6SXin LI>>>4	uleshort	0x1003	WorKsheet, version 97
1818a5d223e6SXin LI# also worksheet template Smartmaster (.12M)?
1819a5d223e6SXin LI!:ext	123
1820a5d223e6SXin LI# only Set_Y2K.123 example
1821a5d223e6SXin LI>>>4	uleshort	0x1005	WorKsheet, version 9.8 Millennium
1822a5d223e6SXin LI!:ext	123
1823a5d223e6SXin LI# no example for this version
1824a5d223e6SXin LI>>>4	uleshort	0x8001	FoRMatting data
1825a5d223e6SXin LI!:ext	frm
1826a5d223e6SXin LI# (version 5.26) labeled the entry as "Lotus 1-2-3 fm3 or fmb document data"
1827a5d223e6SXin LI# TrID labeles the entry as "Formatting Data for Lotus 1-2-3 worksheet"
1828a5d223e6SXin LI>>>4	uleshort	0x8007	ForMatting data, version 3
1829a5d223e6SXin LI!:ext	fm3
1830a5d223e6SXin LI>>>4	default		x	unknown
1831a5d223e6SXin LI# file revision sub code 0004h for worksheets
1832a5d223e6SXin LI>>>>6	uleshort	=0x0004	worksheet
1833a5d223e6SXin LI!:ext	wXX
1834a5d223e6SXin LI>>>>6	uleshort	!0x0004	formatting data
1835a5d223e6SXin LI!:ext	fXX
1836a5d223e6SXin LI# main revision number
183743a5ec4eSXin LI>>>>4	uleshort	x	\b, revision %#x
1838a5d223e6SXin LI>>>6	uleshort	=0x0004	\b, cell range
1839a5d223e6SXin LI# active cellcoord range (start row, page,column ; end row, page, column)
1840a5d223e6SXin LI# start values normally 0~1st sheet A1
1841a5d223e6SXin LI>>>>8	ulelong		!0
1842a5d223e6SXin LI>>>>>10	ubyte		>0	\b%d*
1843a5d223e6SXin LI>>>>>8	uleshort	x	\b%d,
1844a5d223e6SXin LI>>>>>11	ubyte		x	\b%d-
1845a5d223e6SXin LI# end page mostly 0
1846a5d223e6SXin LI>>>>14	ubyte		>0	\b%d*
1847a5d223e6SXin LI# end raw, column normally not 0
1848a5d223e6SXin LI>>>>12	uleshort	x	\b%d,
1849a5d223e6SXin LI>>>>15	ubyte		x	\b%d
1850a5d223e6SXin LI# Lotus Multi Byte Character Set (1~cp850,2~cp851,...,16~japan,...,31~??)
185143a5ec4eSXin LI>>>>20	ubyte		>1	\b, character set %#x
1852a5d223e6SXin LI# flags
185343a5ec4eSXin LI>>>>21	ubyte		x	\b, flags %#x
1854a5d223e6SXin LI>>>6	uleshort	!0x0004
1855a5d223e6SXin LI# record type (FONTNAME=00AEh)
1856a5d223e6SXin LI>>>>30	search/29	\0\xAE
1857a5d223e6SXin LI# variable length m (2) + entries (1) + ?? (1) + LCMBS string (n)
1858a5d223e6SXin LI>>>>>&4	string		>\0	\b, 1st font "%s"
1859b6cee71dSXin LI#
1860a5d223e6SXin LI# Update: Joerg Jenderek
1861a5d223e6SXin LI# URL: http://fileformats.archiveteam.org/wiki/Lotus_1-2-3
1862a5d223e6SXin LI# Reference: http://www.schnarff.com/file-formats/lotus-1-2-3/WSFF2.TXT
1863a5d223e6SXin LI# Note: Used by both old Lotus 1-2-3 and Lotus Symphony (DOS) til version 2.x
1864a5d223e6SXin LI# record type (BeginningOfFile=0000h) + length (0002h)
1865a5d223e6SXin LI0	belong	0x00000200
1866a5d223e6SXin LI# GRR: line above is too general as it catches also MS Windows CURsor
1867a5d223e6SXin LI# to display MS Windows cursor (strength=70) before Lotus 1-2-3 (strength=70-1)
1868a5d223e6SXin LI!:strength -1
1869a5d223e6SXin LI# skip Windows cursors with image height <256 and keep Lotus with low opcode 0001-0083h
1870a5d223e6SXin LI>7	ubyte		0
187143a5ec4eSXin LI# skip Windows cursors with image width 256 and keep Lotus with positive opcode
1872a5d223e6SXin LI>>6	ubyte		>0	Lotus
1873a5d223e6SXin LI# !:mime	application/x-123
1874a5d223e6SXin LI!:mime	application/vnd.lotus-1-2-3
1875a5d223e6SXin LI!:apple	????L123
1876a5d223e6SXin LI# revision number (0404h = 123 1A, 0405h = Lotus Symphony , 0406h = 123 2.x wk1 , 8006h = fmt , ...)
1877a5d223e6SXin LI# undocumented; (version 5.26) labeled the configurations as "Lotus 1-2-3"
1878a5d223e6SXin LI>>>4	uleshort	0x0007	1-2-3 CoNFiguration, version 2.x (PGRAPH.CNF)
1879a5d223e6SXin LI!:ext	cnf
1880a5d223e6SXin LI>>>4	uleshort	0x0C05	1-2-3 CoNFiguration, version 2.4J
1881a5d223e6SXin LI!:ext	cnf
1882a5d223e6SXin LI>>>4	uleshort	0x0801	1-2-3 CoNFiguration, version 1-2.1
1883a5d223e6SXin LI!:ext	cnf
1884a5d223e6SXin LI>>>4	uleshort	0x0802	Symphony CoNFiguration
1885a5d223e6SXin LI!:ext	cnf
1886a5d223e6SXin LI>>>4	uleshort	0x0804	1-2-3 CoNFiguration, version 2.2
1887a5d223e6SXin LI!:ext	cnf
1888a5d223e6SXin LI>>>4	uleshort	0x080A	1-2-3 CoNFiguration, version 2.3-2.4
1889a5d223e6SXin LI!:ext	cnf
1890a5d223e6SXin LI>>>4	uleshort	0x1402	1-2-3 CoNFiguration, version 3.x
1891a5d223e6SXin LI!:ext	cnf
1892a5d223e6SXin LI>>>4	uleshort	0x1450	1-2-3 CoNFiguration, version 4.x
1893a5d223e6SXin LI!:ext	cnf
1894a5d223e6SXin LI# (version 5.26) labeled the entry as "Lotus 123"
1895a5d223e6SXin LI# TrID labeles the entry as "Lotus 123 Worksheet (generic)"
1896a5d223e6SXin LI>>>4	uleshort	0x0404	1-2-3 WorKSheet, version 1
1897a5d223e6SXin LI# extension "wks" also for Microsoft Works document
1898a5d223e6SXin LI!:ext	wks
1899a5d223e6SXin LI# (version 5.26) labeled the entry as "Lotus 123"
1900a5d223e6SXin LI# TrID labeles the entry as "Lotus 123 Worksheet (generic)"
1901a5d223e6SXin LI>>>4	uleshort	0x0405	Symphony WoRksheet, version 1.0
1902a5d223e6SXin LI!:ext	wrk/wr1
1903a5d223e6SXin LI# (version 5.26) labeled the entry as "Lotus 1-2-3 wk1 document data"
1904a5d223e6SXin LI# TrID labeles the entry as "Lotus 123 Worksheet (V2)"
1905a5d223e6SXin LI>>>4	uleshort	0x0406	1-2-3/Symphony worksheet, version 2
1906a5d223e6SXin LI# Symphony (.wr1)
1907a5d223e6SXin LI!:ext	wk1/wr1
1908a5d223e6SXin LI# no example for this japan version
1909a5d223e6SXin LI>>>4	uleshort	0x0600	1-2-3 WorKsheet, version 1.xJ
1910a5d223e6SXin LI!:ext	wj1
1911a5d223e6SXin LI# no example or documentation for wk2
1912a5d223e6SXin LI#>>>4	uleshort	0x????	1-2-3 WorKsheet, version 2
1913a5d223e6SXin LI#!:ext	wk2
1914a5d223e6SXin LI# undocumented japan version
1915a5d223e6SXin LI>>>4	uleshort	0x0602	1-2-3 worksheet, version 2.4J
1916a5d223e6SXin LI!:ext	wj3
1917a5d223e6SXin LI# (version 5.26) labeled the entry as "Lotus 1-2-3 fmt document data"
1918a5d223e6SXin LI>>>4	uleshort	0x8006	1-2-3 ForMaTting data, version 2.x
1919a5d223e6SXin LI# japan version 2.4J (fj3)
1920a5d223e6SXin LI!:ext	fmt/fj3
1921a5d223e6SXin LI# no example for this version
1922a5d223e6SXin LI>>>4	uleshort	0x8007	1-2-3 FoRMatting data, version 2.0
1923a5d223e6SXin LI!:ext	frm
1924a5d223e6SXin LI# (version 5.26) labeled the entry as "Lotus 1-2-3"
1925a5d223e6SXin LI>>>4	default		x	unknown worksheet or configuration
1926a5d223e6SXin LI!:ext	cnf
192743a5ec4eSXin LI>>>>4	uleshort	x	\b, revision %#x
1928a5d223e6SXin LI# 2nd record for most worksheets describes cells range
1929a5d223e6SXin LI>>>6		use	lotus-cells
193043a5ec4eSXin LI# 3rd record for most japan worksheets describes cells range
1931a5d223e6SXin LI>>>(8.s+10)	use	lotus-cells
1932a5d223e6SXin LI#	check and then display Lotus worksheet cells range
1933a5d223e6SXin LI0	name		lotus-cells
1934a5d223e6SXin LI# look for type (RANGE=0006h) + length (0008h) at record begin
1935a5d223e6SXin LI>0	ubelong	0x06000800	\b, cell range
1936a5d223e6SXin LI# cell range (start column, row, end column, row) start values normally 0,0~A1 cell
1937a5d223e6SXin LI>>4	ulong		!0
1938a5d223e6SXin LI>>>4	uleshort	x	\b%d,
1939a5d223e6SXin LI>>>6	uleshort	x	\b%d-
1940a5d223e6SXin LI# end of cell range
1941a5d223e6SXin LI>>8	uleshort	x	\b%d,
1942a5d223e6SXin LI>>10	uleshort	x	\b%d
1943a5d223e6SXin LI# EndOfLotus123
1944b6cee71dSXin LI0	string/b		WordPro\0	Lotus WordPro
1945b6cee71dSXin LI!:mime	application/vnd.lotus-wordpro
1946b6cee71dSXin LI0	string/b		WordPro\r\373	Lotus WordPro
1947b6cee71dSXin LI!:mime	application/vnd.lotus-wordpro
1948b6cee71dSXin LI
1949b6cee71dSXin LI
1950b6cee71dSXin LI# Summary: Script used by InstallScield to uninstall applications
1951b6cee71dSXin LI# Extension: .isu
1952b6cee71dSXin LI# Submitted by: unknown
1953b6cee71dSXin LI# Modified by (1): Abel Cheung <abelcheung@gmail.com> (replace useless entry)
1954b6cee71dSXin LI0		string		\x71\xa8\x00\x00\x01\x02
1955b6cee71dSXin LI>12		string		Stirling\ Technologies,		InstallShield Uninstall Script
1956b6cee71dSXin LI
1957b6cee71dSXin LI# Winamp .avs
1958b6cee71dSXin LI#0	string	Nullsoft\ AVS\ Preset\ \060\056\061\032 A plug in for Winamp ms-windows Freeware media player
1959b6cee71dSXin LI0	string/b	Nullsoft\ AVS\ Preset\ 	Winamp plug in
1960b6cee71dSXin LI
19612dc4dbb9SEitan Adler# Windows Metafile .WMF
1962898496eeSXin LI# URL: 		http://fileformats.archiveteam.org/wiki/Windows_Metafile
1963898496eeSXin LI#		http://en.wikipedia.org/wiki/Windows_Metafile
1964898496eeSXin LI# Reference:	https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-WMF/%5bMS-WMF%5d.pdf
1965898496eeSXin LI#		http://mark0.net/download/triddefs_xml.7z/defs/w/wmf.trid.xml
1966898496eeSXin LI# Note:		called "Windows Metafile" by TrID and
1967898496eeSXin LI#		verified by ImageMagick `identify -verbose *.wmf` as WMF (Windows Meta File)
1968898496eeSXin LI# META_PLACEABLE Record (Aldus Placeable Metafile signature)
1969898496eeSXin LI0	string/b	\327\315\306\232
1970898496eeSXin LI# Note:		called "Windows Metafile Image with Placeable File Header" by DROID via PUID x-fmt/119
1971898496eeSXin LI#		and verified by XnView `nconvert -info abydos.wmf SPA_FLAG.wmf hardcopy-windows-meta.wmf` as "Windows Placeable metafile"
1972898496eeSXin LI# skip failed libreoffice-7.3.2.2 ofz35149-1.wmf with invalid version 2020h and exttextout-2.wmf with invalid version 3a02h
1973898496eeSXin LI# and x-fmt-119-signature-id-609.wmf without version instead of 0100h=METAVERSION100 or 0300h=METAVERSION300
1974898496eeSXin LI>26	uleshort&0xFDff	=0x0100			Windows metafile
1975898496eeSXin LI# HWmf; resource handle to the metafile; When the metafile is on disk, this field MUST contain 0
1976898496eeSXin LI# seems to be always true but in failed samples 2020h ofz35149-1.wmf 56f8h exttextout-2.wmf
1977898496eeSXin LI>>4	uleshort	!0			\b, resource handle %#x
1978898496eeSXin LI# BoundingBox; the rectangle in the playback context measured in logical units for displaying
1979898496eeSXin LI# sometimes useful like: hardcopy-windows-meta.wmf (0,0 / 1280,1024)
1980898496eeSXin LI# but garbage in x-fmt-119-signature-id-609.wmf (-21589,-21589 / -21589,-21589)
1981898496eeSXin LI#>>6	ubequad		x			\b, bounding box %#16.16llx
1982898496eeSXin LI# Left; x-coordinate of the upper-left corner of the rectangle
1983898496eeSXin LI>>6	leshort		x			\b, bounding box (%d
1984898496eeSXin LI# Top; y-coordinate upper-left corner
1985898496eeSXin LI>>8	leshort		x			\b,%d
1986898496eeSXin LI# Right; x-coordinate lower-right corner
1987898496eeSXin LI>>10	leshort		x			/ %d
1988898496eeSXin LI# Bottom; y-coordinate lower-right corner
1989898496eeSXin LI>>12	leshort		x			\b,%d)
1990898496eeSXin LI# Inch; number of logical units per inch like: 72 96 575 576 1000 1200 1439 1440 2540
1991898496eeSXin LI>>14	uleshort	x			\b, dpi %u
1992898496eeSXin LI# Reserved; field is not used and MUST be set to 0; but ababababh in x-fmt-119-signature-id-609.wmf
1993898496eeSXin LI>>16	ulelong		!0			\b, reserved %#x
1994898496eeSXin LI# Checksum; checksum for the previous 10 words
1995898496eeSXin LI>>20	uleshort	x			\b, checksum %#x
1996898496eeSXin LI# META_HEADER Record after META_PLACEABLE Record
1997898496eeSXin LI>>22	use		wmf-head
1998898496eeSXin LI# GRR:		no example for type 2 (DISKMETAFILE) variant found under few thousands WMF
19992dc4dbb9SEitan Adler0	string/b	\002\000\011\000	Windows metafile
2000898496eeSXin LI>0	use		wmf-head
2001898496eeSXin LI# Reference:	http://mark0.net/download/triddefs_xml.7z/defs/w/wmf-16.trid.xml
2002898496eeSXin LI# Note:		called "Windows Metafile (old Win 3.x format)" by TrID and
2003898496eeSXin LI#		"Windows Metafile Image without Placeable File Header" by DROID via PUID x-fmt/119
2004898496eeSXin LI#		verified by XnView `nconvert -info *.wmf` as Windows metafile
2005898496eeSXin LI# variant with type=1=MEMORYMETAFILE and valid HeaderSize 9
2006898496eeSXin LI0	string/b	\001\000\011\000
2007898496eeSXin LI# skip DROID x-fmt-119-signature-id-1228.wmf by looking for content after header (18 bytes=2*011)
2008898496eeSXin LI>18	ulelong		>0			Windows metafile
2009898496eeSXin LI# GRR: in version 5.44 unequal and not endian variant not working!
2010898496eeSXin LI#>18	ulelong		!0			THIS_SHOULD_NOT_HAPPEN
2011898496eeSXin LI#>18	long		!0			THIS_SHOULD_NOT_HAPPEN
2012898496eeSXin LI>>0	use		wmf-head
2013898496eeSXin LI#	display information of Windows metafile header (type, size, objects)
2014898496eeSXin LI0	name		wmf-head
2015898496eeSXin LI# MetafileType: 0001h=MEMORYMETAFILE~Metafile is stored in memory 0002h=DISKMETAFILE~Metafile is stored on disk
2016898496eeSXin LI>0	uleshort	!0x0001			\b, type %#x
2017898496eeSXin LI# HeaderSize; the number of WORDs in header record; seems to be always 9 (18 bytes)
2018898496eeSXin LI>2	uleshort*2	!18			\b, header size %u
2019898496eeSXin LI# MetafileVersion: 0100h=METAVERSION100~DIBs (device-independent bitmaps) not supported 0300h=METAVERSION300~DIBs are supported
2020898496eeSXin LI# but in failed samples 2020h ofz35149-1.wmf 3a02h exttextout-2.wmf
2021898496eeSXin LI>4	uleshort	=0x0100			\b, DIBs not supported
2022898496eeSXin LI>4	uleshort	=0x0300
2023898496eeSXin LI#>4	uleshort	=0x0300			\b, DIBs supported
2024898496eeSXin LI# this should not happen!
2025898496eeSXin LI>4	default		x			\b, version
2026898496eeSXin LI>>4	uleshort	x			%#x
2027898496eeSXin LI# Size; the number of WORDs in the entire metafile
2028898496eeSXin LI>6	ulelong	x				\b, size %u words
2029898496eeSXin LI#>6	ulelong*2	x			\b, size %u bytes
20302dc4dbb9SEitan Adler!:mime	image/wmf
20312dc4dbb9SEitan Adler!:ext	wmf
2032898496eeSXin LI# NumberOfObjects: the number of graphics objects like: 0 hardcopy-windows-meta.wmf 1 2 3 4 5 6 7 8 9 12 13 14 16 17 20 27 110 PERSGRID.WMF
2033898496eeSXin LI>10	uleshort	x			\b, %u objects
2034898496eeSXin LI# MaxRecord: the size of the largest record in the metafile in WORDs like: 78h b0h 1f4h 310h 63fh 1e0022h 3fcc21h
2035898496eeSXin LI>12	ulelong		x			\b, largest record size %#x
2036898496eeSXin LI# NumberOfMembers: It SHOULD be 0x0000, but 5 TestBitBltStretchBlt.wmf 13 TestPalette.wmf and in failed samples 4254 bitcount-1.wmf 8224 ofz5942-1.wmf 56832 exttextout-2.wmf
2037898496eeSXin LI>16	uleshort	!0			\b, %u members
2038b6cee71dSXin LI
2039b6cee71dSXin LI#tz3 files whatever that is (MS Works files)
2040b6cee71dSXin LI0	string/b	\003\001\001\004\070\001\000\000	tz3 ms-works file
2041b6cee71dSXin LI0	string/b	\003\002\001\004\070\001\000\000	tz3 ms-works file
2042b6cee71dSXin LI0	string/b	\003\003\001\004\070\001\000\000	tz3 ms-works file
2043b6cee71dSXin LI
2044b6cee71dSXin LI# PGP sig files .sig
2045b6cee71dSXin LI#0 string \211\000\077\003\005\000\063\237\127 065 to  \027\266\151\064\005\045\101\233\021\002 PGP sig
2046b6cee71dSXin LI0 string \211\000\077\003\005\000\063\237\127\065\027\266\151\064\005\045\101\233\021\002 PGP sig
2047b6cee71dSXin LI0 string \211\000\077\003\005\000\063\237\127\066\027\266\151\064\005\045\101\233\021\002 PGP sig
2048b6cee71dSXin LI0 string \211\000\077\003\005\000\063\237\127\067\027\266\151\064\005\045\101\233\021\002 PGP sig
2049b6cee71dSXin LI0 string \211\000\077\003\005\000\063\237\127\070\027\266\151\064\005\045\101\233\021\002 PGP sig
2050b6cee71dSXin LI0 string \211\000\077\003\005\000\063\237\127\071\027\266\151\064\005\045\101\233\021\002 PGP sig
2051b6cee71dSXin LI0 string \211\000\225\003\005\000\062\122\207\304\100\345\042 PGP sig
2052b6cee71dSXin LI
2053b6cee71dSXin LI# windows zips files .dmf
2054b6cee71dSXin LI0	string/b	MDIF\032\000\010\000\000\000\372\046\100\175\001\000\001\036\001\000 MS Windows special zipped file
2055b6cee71dSXin LI
2056b6cee71dSXin LI# Windows icons
2057282e23f0SXin LI# Update: Joerg Jenderek
2058282e23f0SXin LI# URL: https://en.wikipedia.org/wiki/CUR_(file_format)
205940427ccaSGordon Tetlow# Note: similar to Windows CURsor. container for BMP (only DIB part) or PNG
2060b6cee71dSXin LI0   belong  0x00000100
2061b6cee71dSXin LI>9  byte    0
2062282e23f0SXin LI>>0 byte    x
2063282e23f0SXin LI>>0 use     cur-ico-dir
2064b6cee71dSXin LI>9  ubyte   0xff
2065282e23f0SXin LI>>0 byte    x
2066282e23f0SXin LI>>0 use     cur-ico-dir
2067282e23f0SXin LI#	displays number of icons and information for icon or cursor
2068282e23f0SXin LI0	name		cur-ico-dir
2069282e23f0SXin LI# skip some Lotus 1-2-3 worksheets, CYCLE.PIC and keep Windows cursors with
2070282e23f0SXin LI# 1st data offset = dir header size + n * dir entry size = 6 + n * 10h = ?6h
2071282e23f0SXin LI>18		ulelong		&0x00000006
2072282e23f0SXin LI# skip remaining worksheets, because valid only for DIB image (40) or PNG image (\x89PNG)
2073282e23f0SXin LI>>(18.l)	ulelong		x		MS Windows
2074282e23f0SXin LI>>>0		ubelong		0x00000100	icon resource
207548c779cdSXin LI# https://www.iana.org/assignments/media-types/image/vnd.microsoft.icon
207648c779cdSXin LI!:mime		image/vnd.microsoft.icon
207748c779cdSXin LI#!:mime		image/x-icon
2078282e23f0SXin LI!:ext		ico
2079282e23f0SXin LI>>>>4 		uleshort	x		- %d icon
2080282e23f0SXin LI# plural s
2081282e23f0SXin LI>>>>4 		uleshort	>1		\bs
2082282e23f0SXin LI# 1st icon
2083282e23f0SXin LI>>>>0x06	use		ico-entry
2084282e23f0SXin LI# 2nd icon
2085282e23f0SXin LI>>>>4 		uleshort	>1
2086282e23f0SXin LI>>>>>0x16	use		ico-entry
2087282e23f0SXin LI>>>0		ubelong		0x00000200	cursor resource
2088282e23f0SXin LI#!:mime		image/x-cur
2089282e23f0SXin LI!:mime		image/x-win-bitmap
2090282e23f0SXin LI!:ext		cur
2091282e23f0SXin LI>>>>4 		uleshort	x		- %d icon
2092282e23f0SXin LI>>>>4 		uleshort	>1		\bs
2093282e23f0SXin LI# 1st cursor
2094282e23f0SXin LI>>>>0x06	use		cur-entry
2095282e23f0SXin LI#>>>>0x16	use		cur-entry
2096282e23f0SXin LI#	display information of one cursor entry
2097282e23f0SXin LI0	name		cur-entry
2098282e23f0SXin LI>0	use		cur-ico-entry
2099282e23f0SXin LI>4	uleshort	x	\b, hotspot @%dx
2100282e23f0SXin LI>6	uleshort	x	\b%d
2101282e23f0SXin LI#	display information of one icon entry
2102282e23f0SXin LI0	name		ico-entry
2103282e23f0SXin LI>0			use	cur-ico-entry
2104282e23f0SXin LI# normally 0 1 but also found 14
2105282e23f0SXin LI>4	uleshort	>1	\b, %d planes
2106282e23f0SXin LI# normally 0 1 but also found some 3, 4, some 6, 8, 24, many 32, two 256
2107282e23f0SXin LI>6	uleshort	>1	\b, %d bits/pixel
2108282e23f0SXin LI#	display shared information of cursor or icon entry
2109282e23f0SXin LI0		name		cur-ico-entry
2110282e23f0SXin LI>0		byte		=0		\b, 256x
2111282e23f0SXin LI>0		byte		!0		\b, %dx
2112282e23f0SXin LI>1		byte        	=0		\b256
2113282e23f0SXin LI>1		byte        	!0		\b%d
2114282e23f0SXin LI# number of colors in palette
2115282e23f0SXin LI>2		ubyte		!0		\b, %d colors
2116282e23f0SXin LI# reserved 0 FFh
2117282e23f0SXin LI#>3		ubyte        	x		\b, reserved %x
2118282e23f0SXin LI#>8		ulelong		x		\b, image size %d
2119282e23f0SXin LI# offset of PNG or DIB image
212043a5ec4eSXin LI#>12		ulelong		x		\b, offset %#x
2121282e23f0SXin LI# PNG header (\x89PNG)
2122282e23f0SXin LI>(12.l)		ubelong		=0x89504e47
212348c779cdSXin LI# 1 space char after "with" to get phrase "with PNG image" by magic in ./images
2124282e23f0SXin LI>>&-4		indirect	x	\b with
2125282e23f0SXin LI# DIB image
2126282e23f0SXin LI>(12.l)		ubelong		!0x89504e47
2127282e23f0SXin LI#>>&-4		use     	dib-image
2128b6cee71dSXin LI
2129b6cee71dSXin LI# Windows non-animated cursors
2130282e23f0SXin LI# Update: Joerg Jenderek
2131282e23f0SXin LI# URL: https://en.wikipedia.org/wiki/CUR_(file_format)
213240427ccaSGordon Tetlow# Note: similar to Windows ICOn. container for BMP ( only DIB part)
2133282e23f0SXin LI# GRR: line below is too general as it catches also Lotus 1-2-3 files
2134b6cee71dSXin LI0   belong  0x00000200
2135b6cee71dSXin LI>9  byte    0
2136282e23f0SXin LI>>0 use     cur-ico-dir
2137b6cee71dSXin LI>9  ubyte   0xff
2138282e23f0SXin LI>>0 use     cur-ico-dir
2139b6cee71dSXin LI
2140b6cee71dSXin LI# .chr files
2141b6cee71dSXin LI0	string/b	PK\010\010BGI	Borland font
2142b6cee71dSXin LI>4	string	>\0	%s
2143b6cee71dSXin LI# then there is a copyright notice
2144b6cee71dSXin LI
2145b6cee71dSXin LI
2146b6cee71dSXin LI# .bgi files
2147b6cee71dSXin LI0	string/b	pk\010\010BGI	Borland device
2148b6cee71dSXin LI>4	string	>\0	%s
2149b6cee71dSXin LI# then there is a copyright notice
2150b6cee71dSXin LI
2151b6cee71dSXin LI
2152b6cee71dSXin LI# Windows Recycle Bin record file (named INFO2)
2153b6cee71dSXin LI# By Abel Cheung (abelcheung AT gmail dot com)
2154b6cee71dSXin LI# Version 4 always has 280 bytes (0x118) per record, version 5 has 800 bytes
2155b6cee71dSXin LI# Since Vista uses another structure, INFO2 structure probably won't change
2156b6cee71dSXin LI# anymore. Detailed analysis in:
2157b6cee71dSXin LI# http://www.cybersecurityinstitute.biz/downloads/INFO2.pdf
2158b6cee71dSXin LI0	lelong		0x00000004
2159b6cee71dSXin LI>12	lelong		0x00000118	Windows Recycle Bin INFO2 file (Win98 or below)
2160b6cee71dSXin LI
2161b6cee71dSXin LI0	lelong		0x00000005
2162b6cee71dSXin LI>12	lelong		0x00000320	Windows Recycle Bin INFO2 file (Win2k - WinXP)
2163b6cee71dSXin LI
2164b6cee71dSXin LI# From Doug Lee via a FreeBSD pr
2165b6cee71dSXin LI9	string		GERBILDOC	First Choice document
2166b6cee71dSXin LI9	string		GERBILDB	First Choice database
2167b6cee71dSXin LI9	string		GERBILCLIP	First Choice database
2168b6cee71dSXin LI0	string		GERBIL		First Choice device file
2169b6cee71dSXin LI9	string		RABBITGRAPH	RabbitGraph file
2170b6cee71dSXin LI0	string		DCU1		Borland Delphi .DCU file
2171b6cee71dSXin LI0	string		=!<spell>	MKS Spell hash list (old format)
2172b6cee71dSXin LI0	string		=!<spell2>	MKS Spell hash list
2173b6cee71dSXin LI# Too simple - MPi
2174b6cee71dSXin LI#0	string		AH		Halo(TM) bitmapped font file
2175b6cee71dSXin LI0	lelong		0x08086b70	TurboC BGI file
2176b6cee71dSXin LI0	lelong		0x08084b50	TurboC Font file
2177b6cee71dSXin LI
2178b6cee71dSXin LI# Debian#712046: The magic below identifies "Delphi compiled form data".
2179b6cee71dSXin LI# An additional source of information is available at:
2180b6cee71dSXin LI# http://www.woodmann.com/fravia/dafix_t1.htm
2181b6cee71dSXin LI0	string		TPF0
2182b6cee71dSXin LI>4	pstring		>\0		Delphi compiled form '%s'
2183b6cee71dSXin LI
2184b6cee71dSXin LI# tests for DBase files moved, updated and merged to database
2185b6cee71dSXin LI
2186b6cee71dSXin LI0	string		PMCC		Windows 3.x .GRP file
2187b6cee71dSXin LI1	string		RDC-meg		MegaDots
2188b6cee71dSXin LI>8	byte		>0x2F		version %c
2189b6cee71dSXin LI>9	byte		>0x2F		\b.%c file
2190b6cee71dSXin LI
219148c779cdSXin LI# .PIF files added by Joerg Jenderek from https://smsoft.ru/en/pifdoc.htm
2192b6cee71dSXin LI# only for windows versions equal or greater 3.0
2193b6cee71dSXin LI0x171	string	MICROSOFT\ PIFEX\0	Windows Program Information File
2194b6cee71dSXin LI!:mime	application/x-dosexec
219548c779cdSXin LI!:ext	pif
2196b6cee71dSXin LI#>2	string	 	>\0		\b, Title:%.30s
2197b6cee71dSXin LI>0x24	string		>\0		\b for %.63s
2198b6cee71dSXin LI>0x65	string		>\0		\b, directory=%.64s
2199b6cee71dSXin LI>0xA5	string		>\0		\b, parameters=%.64s
2200b6cee71dSXin LI#>0x181	leshort	x	\b, offset %x
2201b6cee71dSXin LI#>0x183	leshort	x	\b, offsetdata %x
2202b6cee71dSXin LI#>0x185	leshort	x	\b, section length %x
2203b6cee71dSXin LI>0x187	search/0xB55	WINDOWS\ VMM\ 4.0\0
2204b6cee71dSXin LI>>&0x5e		ubyte	>0
2205b6cee71dSXin LI>>>&-1		string	<PIFMGR.DLL		\b, icon=%s
2206b6cee71dSXin LI#>>>&-1		string	PIFMGR.DLL		\b, icon=%s
2207b6cee71dSXin LI>>>&-1		string	>PIFMGR.DLL		\b, icon=%s
2208b6cee71dSXin LI>>&0xF0		ubyte	>0
2209b6cee71dSXin LI>>>&-1		string	<Terminal		\b, font=%.32s
2210b6cee71dSXin LI#>>>&-1		string	=Terminal		\b, font=%.32s
2211b6cee71dSXin LI>>>&-1		string	>Terminal		\b, font=%.32s
2212b6cee71dSXin LI>>&0x110	ubyte	>0
2213b6cee71dSXin LI>>>&-1		string	<Lucida\ Console	\b, TrueTypeFont=%.32s
2214b6cee71dSXin LI#>>>&-1		string	=Lucida\ Console	\b, TrueTypeFont=%.32s
2215b6cee71dSXin LI>>>&-1		string	>Lucida\ Console	\b, TrueTypeFont=%.32s
2216b6cee71dSXin LI#>0x187	search/0xB55	WINDOWS\ 286\ 3.0\0	\b, Windows 3.X standard mode-style
2217b6cee71dSXin LI#>0x187	search/0xB55	WINDOWS\ 386\ 3.0\0	\b, Windows 3.X enhanced mode-style
2218b6cee71dSXin LI>0x187	search/0xB55	WINDOWS\ NT\ \ 3.1\0	\b, Windows NT-style
2219b6cee71dSXin LI#>0x187	search/0xB55	WINDOWS\ NT\ \ 4.0\0	\b, Windows NT-style
2220b6cee71dSXin LI>0x187	search/0xB55	CONFIG\ \ SYS\ 4.0\0	\b +CONFIG.SYS
2221b6cee71dSXin LI#>>&06		string	x			\b:%s
2222b6cee71dSXin LI>0x187	search/0xB55	AUTOEXECBAT\ 4.0\0	\b +AUTOEXEC.BAT
2223b6cee71dSXin LI#>>&06		string	x			\b:%s
2224b6cee71dSXin LI
2225b6cee71dSXin LI# Norton Guide (.NG , .HLP) files added by Joerg Jenderek from source NG2HTML.C
2226b6cee71dSXin LI# of http://www.davep.org/norton-guides/ng2h-105.tgz
222748c779cdSXin LI# https://en.wikipedia.org/wiki/Norton_Guides
2228b6cee71dSXin LI0	string		NG\0\001
2229b6cee71dSXin LI# only value 0x100 found at offset 2
2230b6cee71dSXin LI>2	ulelong		0x00000100	Norton Guide
223143a5ec4eSXin LI!:mime	application/x-norton-guide
223243a5ec4eSXin LI# often like NORTON.NG but some times like NC.HLP
223343a5ec4eSXin LI!:ext	ng/hlp
2234b6cee71dSXin LI# Title[40]
2235b6cee71dSXin LI>>8	string		>\0		"%-.40s"
2236b6cee71dSXin LI#>>6	uleshort	x		\b, MenuCount=%u
2237b6cee71dSXin LI# szCredits[5][66]
2238b6cee71dSXin LI>>48	string		>\0		\b, %-.66s
2239b6cee71dSXin LI>>114	string		>\0		%-.66s
2240b6cee71dSXin LI
224143a5ec4eSXin LI# URL:		https://en.wikipedia.org/wiki/Norton_Commander
224243a5ec4eSXin LI# Reference:	http://mark0.net/download/triddefs_xml.7z/defs/m/msg-nc-eng.trid.xml
224343a5ec4eSXin LI# From:		Joerg Jenderek
224443a5ec4eSXin LI# Note:		Message file is used by executable with same main name.
224543a5ec4eSXin LI#		Only tested with version 5.50 (english) and 2.01 (Windows)
224643a5ec4eSXin LI0	string		Abort
224743a5ec4eSXin LI# \0 or i
224843a5ec4eSXin LI#>5	ubyte		x		%x
224943a5ec4eSXin LI# skip ASCII Abort text by looking for error message like in NCVIEW.MSG
225043a5ec4eSXin LI>6	search/7089	Non-DOS\ disk	Norton Commander module message
225143a5ec4eSXin LI!:mime	application/x-norton-msg
225243a5ec4eSXin LI!:ext	msg
225343a5ec4eSXin LI
225443a5ec4eSXin LI# URL:		http://www.antonis.de/dos/dos-tuts/mpdostip/html/nwdostip.htm
225543a5ec4eSXin LI# Reference:	https://mark0.net/download/triddefs_xml.7z/defs/m/msg-netware-dos.trid.xml
225643a5ec4eSXin LI# From:		Joerg Jenderek
225743a5ec4eSXin LI0	string	DOS\ Client\ Message\ File:	Novell DOS client message
225843a5ec4eSXin LI#!:mime	application/octet-stream
225943a5ec4eSXin LI#!:mime	application/x-novell-msg
226043a5ec4eSXin LI!:ext	msg
226143a5ec4eSXin LI# look for second letter instead space character
226243a5ec4eSXin LI>26	ubyte		>0x20
226343a5ec4eSXin LI# digit 1 or often main or program name like: IPXODI.COM TASKID pnwtrap DOSRqstr
226443a5ec4eSXin LI>>25		ubyte	!0x20			%c
226543a5ec4eSXin LI>>>26		ubyte	!0x20			\b%c
226643a5ec4eSXin LI>>>>27		ubyte	!0x20			\b%c
226743a5ec4eSXin LI>>>>>28		ubyte	!0x20			\b%c
226843a5ec4eSXin LI>>>>>>29	ubyte	!0x20			\b%c
226943a5ec4eSXin LI>>>>>>>30	ubyte	!0x20			\b%c
227043a5ec4eSXin LI>>>>>>>>31	ubyte	!0x20			\b%c
227143a5ec4eSXin LI>>>>>>>>>32	ubyte	!0x20			\b%c
227243a5ec4eSXin LI>>>>>>>>>>33	ubyte	!0x20			\b%c
227343a5ec4eSXin LI>>>>>>>>>>>34	ubyte	!0x20			\b%c
227443a5ec4eSXin LI>>>>>>>>>>>>35	ubyte	!0x20			\b%c
227543a5ec4eSXin LI>>>>>>>>>>>>>36	ubyte	!0x20			\b%c
227643a5ec4eSXin LI# followed by string like: 0 v.10 V1.20
227743a5ec4eSXin LI#
227843a5ec4eSXin LI# followed by ,\040Tran
227943a5ec4eSXin LI>28	search/14	,\040Tran
228043a5ec4eSXin LI# probably translated version string like: 0 v1.00
228143a5ec4eSXin LI>>&0	string	x				\b, tran version %s
228243a5ec4eSXin LI# followed by Ctrl-J Ctrl-Z
228343a5ec4eSXin LI>>>&0	ubyte		!0xa			\b, terminated by %#2.2x
228443a5ec4eSXin LI>>>>&0	ubyte		x			\b%2.2x
228543a5ec4eSXin LI# Ctrl-Z
228643a5ec4eSXin LI>0x65	ubyte		!0x1A			\b, at 0x65 %#x
228743a5ec4eSXin LI# one
228843a5ec4eSXin LI>0x66	ubyte		!0x01			\b, at 0x66 %#x
228943a5ec4eSXin LI# URL:		https://en.wikipedia.org/wiki/NetWare
229043a5ec4eSXin LI# Reference:	http://mark0.net/download/triddefs_xml.7z/defs/d/dat-novell-msg.trid.xml
229143a5ec4eSXin LI# ftp://ftp.iitb.ac.in/LDP/en/NLM-HOWTO/NLM-HOWTO-single.html
229243a5ec4eSXin LI# From:		Joerg Jenderek
229343a5ec4eSXin LI0	string	Novell\ Message\ Librarian\ Data\ File	Novell message librarian data
229443a5ec4eSXin LI#>35	string	Version\ 1.00
229543a5ec4eSXin LI#>49	string	COPYRIGHT\ (c)\ 1985\ by\ Novell,\ Inc.
229643a5ec4eSXin LI#>83	string	\ \ All\ Rights\ Reserved
229743a5ec4eSXin LI#!:mime	application/octet-stream
229843a5ec4eSXin LI#!:mime	application/x-novell-msg
229943a5ec4eSXin LI!:ext	msg
230043a5ec4eSXin LI#!:ext	msg/dat
2301*ae316d1dSXin LI
2302*ae316d1dSXin LI# Summary:	Turbo Pascal Help
2303*ae316d1dSXin LI# From:		Joerg Jenderek
2304*ae316d1dSXin LI# URL:		https://en.wikipedia.org/wiki/Turbo_Pascal
2305*ae316d1dSXin LI# Reference:	http://mark0.net/download/triddefs_xml.7z/defs/h/hlp-tp-2.trid.xml
2306*ae316d1dSXin LI# Note:		called "Turbo Pascal Help (v2)" by TrID
2307*ae316d1dSXin LI0	string		TPH2	Turbo Pascal help, version 2
2308*ae316d1dSXin LI#!:mime	application/octet-stream
2309*ae316d1dSXin LI!:mime	application/x-pascal-hlp
2310*ae316d1dSXin LI# 4DOS help file, version 1.00 3.30
2311*ae316d1dSXin LI!:ext	hlp
2312*ae316d1dSXin LI# URL:		https://en.wikipedia.org/wiki/4DOS
2313*ae316d1dSXin LI# Reference:	http://mark0.net/download/triddefs_xml.7z/defs/h/hlp-4dos-v2.trid.xml
2314*ae316d1dSXin LI# Note:		called "4DOS Help (v2)" by TrID
2315*ae316d1dSXin LI0	string	ALIAS\r\nASSIGN\r\n
2316*ae316d1dSXin LI>13	search/3016	4DOS	4DOS help file, version 2.x
2317*ae316d1dSXin LI#!:mime	text/plain
2318*ae316d1dSXin LI!:mime	application/x-4dos-hlp
2319*ae316d1dSXin LI# DOS.HLP 4DOS help file, version 2.21
2320*ae316d1dSXin LI!:ext	hlp
2321*ae316d1dSXin LI# Reference:	http://mark0.net/download/triddefs_xml.7z/defs/h/hlp-4dos-v4.trid.xml
2322*ae316d1dSXin LI# Note:		called "4DOS Help (v4)" by TrID
2323*ae316d1dSXin LI0	string		4DH4	4DOS help file, version 4.x
2324*ae316d1dSXin LI#!:mime	application/octet-stream
2325*ae316d1dSXin LI!:mime	application/x-4dos-hlp
2326*ae316d1dSXin LI# 4dos402b.hlp
2327*ae316d1dSXin LI!:ext	hlp
2328*ae316d1dSXin LI# Reference:	https://4dos.info/4dsource/4helpsrc.zip/TPHELP.PAS
2329*ae316d1dSXin LI# Reference:	http://mark0.net/download/triddefs_xml.7z/defs/h/hlp-4dos.trid.xml
2330b6cee71dSXin LI# 4DOS help (.HLP) files added by Joerg Jenderek from source TPHELP.PAS
233148c779cdSXin LI# of https://www.4dos.info/
2332*ae316d1dSXin LI# check for valid pascal string length (6 or 8) of HelpID, 4DH magic, valid major number (5 6 7 8)
2333*ae316d1dSXin LI0	ubequad&0xF1ffFFffF0000000	0x0034444830000000	4DOS help file
2334*ae316d1dSXin LI#!:mime	application/octet-stream
2335*ae316d1dSXin LI!:mime	application/x-4dos-hlp
2336*ae316d1dSXin LI!:ext	hlp
2337*ae316d1dSXin LI# pascal string length of of HelpID like: 6 8
2338*ae316d1dSXin LI#>0	ubyte	x			PLENGHT=%x
2339*ae316d1dSXin LI# Note:	version string correspond or is a little bit lower than value of _4VER variable or output of 4DOS command `VER /R`
2340*ae316d1dSXin LI# one-digit major version number of version string
2341*ae316d1dSXin LI>4	string	x			\b, version %-1.1s
2342*ae316d1dSXin LI# two-digit minor version number depending on pascal string length at the beginning
2343*ae316d1dSXin LI>>0	ubyte	8			\b.
2344*ae316d1dSXin LI>>>5	string	x			\b%-2.2s
2345*ae316d1dSXin LI# Byte at offset 7 (A=41h) and 8 (A=41h) is not Revison like C (=43h) as reported by VER /R for 4DOS602b.HLP
2346*ae316d1dSXin LI# GRR: maybe this is patch level
2347*ae316d1dSXin LI>>>7	string	x			%-.2s
2348*ae316d1dSXin LI# few samples with string length 6 (implying exact 2 byte minor version digits) like in 4DOS500f.HLP 4dos551c_ge.hlp
2349*ae316d1dSXin LI>>0	ubyte	6			\b.
2350*ae316d1dSXin LI>>>5	string	x			\b%-2.2s
2351*ae316d1dSXin LI# just in case pascal string length is neither 6 nor 8
2352*ae316d1dSXin LI#>>0	default	x			\b.
2353*ae316d1dSXin LI#>>>5	string	x			%-2.2s
2354*ae316d1dSXin LI# false for version 5.52 and older, but true for version 6.02 and newer
2355*ae316d1dSXin LI>4	ubeshort	>0x3535
2356*ae316d1dSXin LI# HighestTopic; highest topic number
2357*ae316d1dSXin LI#>>9	uleshort x			HighestTopic=%#4.4x
2358*ae316d1dSXin LI# NumTopics; number of topics
2359*ae316d1dSXin LI#>>11	uleshort x			NumTopics=%#4.4x
2360*ae316d1dSXin LI# BiggestTopic; size of largest topic in uncompressed bytes
2361*ae316d1dSXin LI#>>13	uleshort x			BiggestTopic=%#4.4x
2362*ae316d1dSXin LI# NamedTopics; number of topics in help index
2363*ae316d1dSXin LI#>>15	uleshort x			NamedTopics=%#4.4x
2364*ae316d1dSXin LI# NameSize; Size of largest name, 0 for none
2365*ae316d1dSXin LI#>>17	uleshort x			NameSize=%#4.4x
2366*ae316d1dSXin LI# PickSize; size of each entry in pick table, 0 for none
2367*ae316d1dSXin LI#>>18	uleshort x			PickSize=%#4.4x
2368*ae316d1dSXin LI# width; width of help window, with frame if any
2369*ae316d1dSXin LI#>>19	ubyte x				Width=%#2.2x
2370*ae316d1dSXin LI# FirstTopic; topic to show first (0 = index)
2371*ae316d1dSXin LI#>>20	uleshort x			FirstTopic=%#4.4x
2372*ae316d1dSXin LI# KeysTopic; topic to show when keys help needed
2373*ae316d1dSXin LI#>>22	uleshort x			KeysTopic=%#4.4x
2374*ae316d1dSXin LI# ExtHelpName; string[13]; name for external help program like: HELP.COM DOSBOOK.EXE
2375*ae316d1dSXin LI>>24	pstring	x			\b, external help %s
2376*ae316d1dSXin LI# ExtHelpEnv; String[16]; environment variable for alternate external help program name like: DOSHELP
2377*ae316d1dSXin LI>>38	pstring	x			or specified by DOS environment variable %s
2378*ae316d1dSXin LI# XlateArray = array[0..29] of Byte; {Most common characters in help text}
2379*ae316d1dSXin LI#>>55	ubequad x			XlateArray=%#16.16llx
2380*ae316d1dSXin LI# SharewareData : SharewareDataRec; shareware info for 4DOS.COM
2381*ae316d1dSXin LI#>>87	ubequad x			SharewareData=%#16.16llx
2382b6cee71dSXin LI
2383b6cee71dSXin LI# old binary Microsoft (.HLP) files added by Joerg Jenderek from http://file-extension.net/seeker/file_extension_hlp
2384*ae316d1dSXin LI# URL:		http://fileformats.archiveteam.org/wiki/Microsoft_Advisor_Help
2385*ae316d1dSXin LI# Reference:	http://mark0.net/download/triddefs_xml.7z/defs/h/hlp-ms-adv.trid.xml
2386*ae316d1dSXin LI# Note:		called "Microsoft Advisor Help" by TrID
2387*ae316d1dSXin LI0	ulequad&0xFFffFFfeFFffFFff	0x003a000000024e4c	MS Advisor help file
2388*ae316d1dSXin LI#!:mime								application/octet-stream
2389*ae316d1dSXin LI!:mime								application/x-ms-hlp
2390*ae316d1dSXin LI!:ext								hlp
2391b6cee71dSXin LI
2392b6cee71dSXin LI# HtmlHelp files (.chm)
23939ce06829SXin LI0	string/b	ITSF\003\000\000\000\x60\000\000\000	MS Windows HtmlHelp Data
2394a4d6d3b8SXin LI!:mime	application/vnd.ms-htmlhelp
2395a4d6d3b8SXin LI!:ext	chm
2396b6cee71dSXin LI
2397b6cee71dSXin LI# GFA-BASIC (Wolfram Kleff)
2398b6cee71dSXin LI2	string/b	GFA-BASIC3	GFA-BASIC 3 data
2399b6cee71dSXin LI
2400b6cee71dSXin LI#------------------------------------------------------------------------------
2401b6cee71dSXin LI# From Stuart Caie <kyzer@4u.net> (developer of cabextract)
24022dc4dbb9SEitan Adler# Update: Joerg Jenderek
24032dc4dbb9SEitan Adler# URL: https://en.wikipedia.org/wiki/Cabinet_(file_format)
24042dc4dbb9SEitan Adler# Reference: https://msdn.microsoft.com/en-us/library/bb267310.aspx
24052dc4dbb9SEitan Adler# Note: verified by `7z l *.cab`
2406b6cee71dSXin LI# Microsoft Cabinet files
2407b6cee71dSXin LI0	string/b	MSCF\0\0\0\0	Microsoft Cabinet archive data
24082dc4dbb9SEitan Adler#
24092dc4dbb9SEitan Adler# https://support.microsoft.com/en-us/help/973559/frequently-asked-questions-about-the-microsoft-support-diagnostic-tool
24102dc4dbb9SEitan Adler# CAB with *.{diagcfg,diagpkg} is used by Microsoft Support Diagnostic Tool MSDT.EXE
24112dc4dbb9SEitan Adler# because some archive does not have *.diag* as 1st or 2nd archive member like
24122dc4dbb9SEitan Adler# O15CTRRemove.diagcab or AzureStorageAnalyticsLogs_global.DiagCab
24132dc4dbb9SEitan Adler# brute looking after header for filenames with diagcfg or diagpkg extension in CFFILE section
24142dc4dbb9SEitan Adler>0x2c	search/980/c	.diag		\b, Diagnostic
2415b6cee71dSXin LI!:mime	application/vnd.ms-cab-compressed
24162dc4dbb9SEitan Adler!:ext	diagcab
24172dc4dbb9SEitan Adler# http://fileformats.archiveteam.org/wiki/PUZ
24182dc4dbb9SEitan Adler# Microsoft Publisher version about 2003 has a "Pack and Go" feature that
24192dc4dbb9SEitan Adler# bundles a Publisher document *PNG.pub with all links into a CAB
24202dc4dbb9SEitan Adler>0x2c	search/300/c	png.pub\0		\b, Publisher Packed and Go
24212dc4dbb9SEitan Adler!:mime	application/vnd.ms-cab-compressed
24222dc4dbb9SEitan Adler!:ext	puz
24232dc4dbb9SEitan Adler# ppz variant with Microsoft PowerPoint Viewer ppview32.exe to play PowerPoint presentation
24242dc4dbb9SEitan Adler>0x2c	search/17/c	ppview32.exe\0		\b, PowerPoint Viewer Packed and Go
24252dc4dbb9SEitan Adler!:mime	application/vnd.ms-powerpoint
24262dc4dbb9SEitan Adler#!:mime	application/mspowerpoint
24272dc4dbb9SEitan Adler!:ext	ppz
24282726a701SXin LI# URL:		https://en.wikipedia.org/wiki/Windows_Desktop_Gadgets
24292726a701SXin LI# Reference:	https://docs.microsoft.com/en-us/previous-versions/windows/desktop/sidebar/
24302726a701SXin LI# http://win10gadgets.com/download/273/ All_CPU_Meter1.zip/All_CPU_Meter_V4.7.3.gadget
24312726a701SXin LI>0x2c	search/968/c	gadget.xml		\b, Windows Desktop Gadget
24322726a701SXin LI#!:mime	application/vnd.ms-cab-compressed
24332726a701SXin LI# http://extension.nirsoft.net/gadget
24342726a701SXin LI!:mime	application/x-windows-gadget
24352726a701SXin LI!:ext	gadget
24362dc4dbb9SEitan Adler# http://www.incredimail.com/
24372dc4dbb9SEitan Adler# IncrediMail CAB contains an initialisation file "content.ini" like in im2.ims
24382dc4dbb9SEitan Adler>0x2c	search/3369/c	content.ini\0	\b, IncrediMail
24392dc4dbb9SEitan Adler!:mime	application/x-incredimail
24402dc4dbb9SEitan Adler# member Flavor.htm implies IncrediMail ecard like in tell_a_friend.imf
24412dc4dbb9SEitan Adler>>0x2c	search/83/c	Flavor.htm\0	ecard
24422dc4dbb9SEitan Adler!:ext	imf
24432dc4dbb9SEitan Adler# member Macromedia Flash data *.swf implies IncrediMail skin like in im2.ims
24442dc4dbb9SEitan Adler>>0x2c	search/211/c	.swf\0		skin
24452dc4dbb9SEitan Adler!:ext	ims
24462dc4dbb9SEitan Adler# member anim.im3 implies IncrediMail animation like in letter_fold.ima
24472dc4dbb9SEitan Adler>>0x2c	search/92/c	anim.im3\0	animation
24482dc4dbb9SEitan Adler!:ext	ima
24492dc4dbb9SEitan Adler# other IncrediMail cab archive
24502dc4dbb9SEitan Adler>>0x2c	default		x
24512dc4dbb9SEitan Adler>>>0x2c	search/116/c	thumb		ecard, image, notifier or skin
24522dc4dbb9SEitan Adler!:ext	imf/imi/imn/ims
24532dc4dbb9SEitan Adler# http://file-extension.net/seeker/file_extension_ime
24542dc4dbb9SEitan Adler>>>0x2c	default		x		emoticons or sound
24552dc4dbb9SEitan Adler!:ext	ime/imw
24562726a701SXin LI# no Diagnostic, Packed and Go, Windows Desktop Gadget, IncrediMail
24572dc4dbb9SEitan Adler>0x2c	default		x
24582dc4dbb9SEitan Adler# look for 1st member name
24592dc4dbb9SEitan Adler>>(16.l+16)	ubyte	x
2460898496eeSXin LI# From:		Joerg Jenderek
2461898496eeSXin LI# URL:		https://docs.microsoft.com/en-us/windows-hardware/drivers/install/building-device-metadata-packages
2462898496eeSXin LI# Reference:	http://mark0.net/download/triddefs_xml.7z/defs/d/devicemetadata-ms.trid.xml
2463898496eeSXin LI>>>&-1	string 		PackageInfo.xml	\b, Device Metadata Package
2464898496eeSXin LI!:mime	application/vnd.ms-cab-compressed
2465898496eeSXin LI!:ext	devicemetadata-ms
24662dc4dbb9SEitan Adler# https://en.wikipedia.org/wiki/SNP_file_format
24672dc4dbb9SEitan Adler>>>&-1	string/c 	_accrpt_.snp	\b, Access report snapshot
24682dc4dbb9SEitan Adler!:mime	application/msaccess
24692dc4dbb9SEitan Adler!:ext	snp
24702726a701SXin LI# https://en.wikipedia.org/wiki/Microsoft_InfoPath
24712726a701SXin LI>>>&-1	string 		manifest.xsf	\b, InfoPath Form Template
24722726a701SXin LI!:mime	application/vnd.ms-cab-compressed
24732726a701SXin LI#!:mime	application/vnd.ms-infopath
24742726a701SXin LI!:ext	xsn
24752dc4dbb9SEitan Adler# https://www.cabextract.org.uk/wince_cab_format/
24762dc4dbb9SEitan Adler# extension of DOS 8+3 name with ".000" of 1st archive member name implies Windows CE installer
24772dc4dbb9SEitan Adler>>>&7	string 		=.000		\b, WinCE install
24782dc4dbb9SEitan Adler!:mime	application/vnd.ms-cab-compressed
24792dc4dbb9SEitan Adler!:ext	cab
24802dc4dbb9SEitan Adler
248148c779cdSXin LI# https://support.microsoft.com/kb/934307/en-US
24822dc4dbb9SEitan Adler# All inspected MSU contain a file with name WSUSSCAN.cab
24832dc4dbb9SEitan Adler# that is called "Windows Update meta data" by Microsoft
24842dc4dbb9SEitan Adler>>>&-1	string/c 	wsusscan.cab	\b, Microsoft Standalone Update
24852dc4dbb9SEitan Adler!:mime	application/vnd.ms-cab-compressed
24862dc4dbb9SEitan Adler!:ext	msu
24872dc4dbb9SEitan Adler>>>&-1	default		x
248843a5ec4eSXin LI# look at point character of 1st archive member name for file name extension
2489898496eeSXin LI# GRR: search range is maybe too large and match point else where like in EN600x64.cab!
24902dc4dbb9SEitan Adler>>>>&-1	search/255 	.
24912dc4dbb9SEitan Adler# http://www.pptfaq.com/FAQ00164_What_is_a_PPZ_file-.htm
24922dc4dbb9SEitan Adler# PPZ were created using Pack & Go feature of PowerPoint versions 97 - 2002
24932dc4dbb9SEitan Adler# packs optional files, a PowerPoint presentation *.ppt with optional PLAYLIST.LST to CAB
2494898496eeSXin LI>>>>>&0	string/c	ppt\0
2495898496eeSXin LI>>>>>>28 uleshort	>1		\b, PowerPoint Packed and Go
24962dc4dbb9SEitan Adler!:mime	application/vnd.ms-powerpoint
24972dc4dbb9SEitan Adler#!:mime	application/mspowerpoint
24982dc4dbb9SEitan Adler!:ext	ppz
2499898496eeSXin LI# or POWERPNT.PPT packed as POWERPNT.PP_ found on Windows 2000,XP setup CD in directory i386
2500898496eeSXin LI>>>>>>28 uleshort	=1		\b, one packed PowerPoint
2501898496eeSXin LI!:mime	application/vnd.ms-cab-compressed
2502898496eeSXin LI!:ext	pp_
25032dc4dbb9SEitan Adler# https://msdn.microsoft.com/en-us/library/windows/desktop/bb773190(v=vs.85).aspx
25042dc4dbb9SEitan Adler# first member *.theme implies Windows 7 Theme Pack like in CommunityShowcaseAqua3.themepack
25052dc4dbb9SEitan Adler# or Windows 8 Desktop Theme Pack like in PanoramicGlaciers.deskthemepack
25062dc4dbb9SEitan Adler>>>>>&0	string/c	theme		\b, Windows
25072dc4dbb9SEitan Adler!:mime	application/x-windows-themepack
250848c779cdSXin LI# https://www.drewkeller.com/content/using-theme-both-windows-7-and-windows-8
25092dc4dbb9SEitan Adler# 1st member Panoramic.theme or Panoramas.theme implies Windows 8-10 Theme Pack
25102dc4dbb9SEitan Adler# with MTSM=RJSPBS in [MasterThemeSelector] inside *.theme
25112dc4dbb9SEitan Adler>>>>>>(16.l+16)	string	=Panoram	8
25122dc4dbb9SEitan Adler!:ext	deskthemepack
25132dc4dbb9SEitan Adler>>>>>>(16.l+16)	string	!Panoram	7 or 8
25142dc4dbb9SEitan Adler!:ext	themepack/deskthemepack
25152dc4dbb9SEitan Adler>>>>>>(16.l+16)	ubyte	x		Theme Pack
2516a2dfb722SXin LI# URL:		https://en.wikipedia.org/wiki/Microsoft_OneNote#File_format
2517a2dfb722SXin LI#		http://fileformats.archiveteam.org/wiki/OneNote
2518a2dfb722SXin LI# Reference:	https://mark0.net/download/triddefs_xml.7z/defs/o/onepkg.trid.xml
2519a2dfb722SXin LI# 1st member name like: "Class Notes.one" "test-onenote.one" "Open Notebook.onetoc2" "Editor �ffnen.onetoc2"
2520a2dfb722SXin LI>>>>>&0	string/c	one		\b, OneNote Package
2521a2dfb722SXin LI!:mime	application/msonenote
2522a2dfb722SXin LI!:ext	onepkg
25232dc4dbb9SEitan Adler>>>>>&0	default		x
25242dc4dbb9SEitan Adler# look for null terminator of 1st member name
25252dc4dbb9SEitan Adler>>>>>>&0	search/255 	\0
25262dc4dbb9SEitan Adler# 2nd member name WSUSSCAN.cab like in Microsoft-Windows-MediaFeaturePack-OOB-Package.msu
25272dc4dbb9SEitan Adler>>>>>>>&16	string/c 	wsusscan.cab	\b, Microsoft Standalone Update
25282dc4dbb9SEitan Adler!:mime	application/vnd.ms-cab-compressed
25292dc4dbb9SEitan Adler!:ext	msu
25302dc4dbb9SEitan Adler>>>>>>>&16	default	x
25312dc4dbb9SEitan Adler# archive with more then one file need some output in version 5.32 to avoid error message like
25322dc4dbb9SEitan Adler# Magdir/msdos, 1138: Warning: Current entry does not yet have a description for adding a MIME type
25332dc4dbb9SEitan Adler# Magdir/msdos, 1139: Warning: Current entry does not yet have a description for adding a EXTENSION type
25342dc4dbb9SEitan Adler# file: could not find any valid magic files!
25352dc4dbb9SEitan Adler>>>>>>>>28	uleshort	>1	\b, many
25362dc4dbb9SEitan Adler!:mime	application/vnd.ms-cab-compressed
25372dc4dbb9SEitan Adler!:ext	cab
25382dc4dbb9SEitan Adler# remaining archives with just one file
25392dc4dbb9SEitan Adler>>>>>>>>28	uleshort	=1
25402dc4dbb9SEitan Adler# neither extra bytes nor cab chain implies Windows 2000,XP setup files in directory i386
25412dc4dbb9SEitan Adler>>>>>>>>>30	uleshort	=0x0000	\b, Windows 2000/XP setup
25422dc4dbb9SEitan Adler# cut of last char of source extension and add underscore to generate extension
25432dc4dbb9SEitan Adler# TERMCAP._ ... FXSCOUNT.H_ ... L3CODECA.AC_ ... NPDRMV2.ZI_
25442dc4dbb9SEitan Adler!:mime	application/vnd.ms-cab-compressed
25452dc4dbb9SEitan Adler!:ext	_/?_/??_
25462dc4dbb9SEitan Adler# archive need some output like "single" in version 5.32 to avoid error messages
25472dc4dbb9SEitan Adler>>>>>>>>>30	uleshort	!0x0000	\b, single
25482dc4dbb9SEitan Adler!:mime	application/vnd.ms-cab-compressed
25492dc4dbb9SEitan Adler!:ext	cab
2550898496eeSXin LI# first archive name without point character
2551898496eeSXin LI>>>>&-1	default		x
2552898496eeSXin LI>>>>>28	uleshort	=1	\b, single
2553898496eeSXin LI!:mime	application/vnd.ms-cab-compressed
2554898496eeSXin LI# on XP_CD\I386\ like: NETWORKS._ PROTOCOL._ QUOTES._ SERVICES._
2555898496eeSXin LI!:ext	_
2556898496eeSXin LI>>>>>28	uleshort	>1	\b, many
2557898496eeSXin LI!:mime	application/vnd.ms-cab-compressed
2558898496eeSXin LI# like: HP Envy 6000 printer driver packages Full_x86.cab Full_x64.cab
2559898496eeSXin LI!:ext	cab
25602dc4dbb9SEitan Adler# TODO: additional extensions like
25612dc4dbb9SEitan Adler# .xtp	InfoPath Template Part
25622dc4dbb9SEitan Adler# .lvf	Logitech Video Effects Face Accessory
25632dc4dbb9SEitan Adler>8	ulelong		x		\b, %u bytes
25642dc4dbb9SEitan Adler>28	uleshort		1		\b, 1 file
25652dc4dbb9SEitan Adler>28	uleshort		>1		\b, %u files
25662dc4dbb9SEitan Adler# Reserved fields, set to zero
25672dc4dbb9SEitan Adler#>4	belong		!0		\b, reserved1 %x
25682dc4dbb9SEitan Adler#>12	belong		!0		\b, reserved2 %x
25692dc4dbb9SEitan Adler# offset of the first CFFILE entry coffFiles: minimal 2Ch
257043a5ec4eSXin LI>16	ulelong		x		\b, at %#x
25712dc4dbb9SEitan Adler>(16.l)	use		cab-file
25722dc4dbb9SEitan Adler# at least also 2nd member
25732dc4dbb9SEitan Adler>28	uleshort		>1
25742dc4dbb9SEitan Adler>>(16.l+16)	ubyte	x
25752dc4dbb9SEitan Adler>>>&0	search/255 	\0
25762dc4dbb9SEitan Adler# second member info
25772dc4dbb9SEitan Adler>>>>&0	use		cab-file
25782dc4dbb9SEitan Adler#>20	belong		!0		\b, reserved %x
25792dc4dbb9SEitan Adler# Cabinet file format version. Currently, versionMajor = 1 and versionMinor = 3
258043a5ec4eSXin LI>24	ubeshort	!0x0301		\b version %#x
25812dc4dbb9SEitan Adler# number of CFFOLDER entries
25822dc4dbb9SEitan Adler>26	uleshort	>1		\b, %u cffolders
25832dc4dbb9SEitan Adler# cabinet file option indicators 1~PREVIOUS, 2~NEXT, 4~reserved fields
25842dc4dbb9SEitan Adler# only found for flags 0 1 2 3 4 not 7
258543a5ec4eSXin LI>30	uleshort	>0		\b, flags %#x
25862dc4dbb9SEitan Adler# Cabinet files have a 16-bit cabinet setID field that is designed for application use.
25872dc4dbb9SEitan Adler# default is zero, however, the -i option of cabarc can be used to set this field
25882dc4dbb9SEitan Adler>32	uleshort	>0		\b, ID %u
25892dc4dbb9SEitan Adler# iCabinet is number of this cabinet file in a set, where 0 for the first cabinet
25902dc4dbb9SEitan Adler#>34	uleshort	x		\b, iCabinet %u
25912dc4dbb9SEitan Adler# add one for display because humans start numbering by 1 and also fit to name of disk szDisk*
25922dc4dbb9SEitan Adler>34	uleshort+1	x		\b, number %u
25932dc4dbb9SEitan Adler>30	uleshort	&0x0004		\b, extra bytes
25942dc4dbb9SEitan Adler# cbCFHeader optional size of per-cabinet reserved area 14h 1800h
25952dc4dbb9SEitan Adler>>36	uleshort	>0		%u in head
25962dc4dbb9SEitan Adler# cbCFFolder is optional size of per-folder reserved area
25972dc4dbb9SEitan Adler>>38	ubyte		>0		%u in folder
25982dc4dbb9SEitan Adler# cbCFData is optional size of per-datablock reserved area
25992dc4dbb9SEitan Adler>>39	ubyte		>0		%u in data block
26002dc4dbb9SEitan Adler# optional per-cabinet reserved area abReserve[cbCFHeader]
26012dc4dbb9SEitan Adler>>36	uleshort	>0
26022dc4dbb9SEitan Adler# 1st CFFOLDER after reserved area in header
26032dc4dbb9SEitan Adler>>>(36.s+40)	use			cab-folder
26042dc4dbb9SEitan Adler# no reserved area in header
26052dc4dbb9SEitan Adler>30	uleshort	^0x0004
26062dc4dbb9SEitan Adler# no previous and next cab archive
26072dc4dbb9SEitan Adler>>30	uleshort		=0x0000
26082dc4dbb9SEitan Adler>>>36	use				cab-folder
26092dc4dbb9SEitan Adler# only previous cab archive
26102dc4dbb9SEitan Adler>>30	uleshort		=0x0001	\b, previous
26112dc4dbb9SEitan Adler>>>36	use				cab-anchor
26122dc4dbb9SEitan Adler# only next cab archive
26132dc4dbb9SEitan Adler>>30	uleshort		=0x0002	\b, next
26142dc4dbb9SEitan Adler>>>36	use				cab-anchor
26152dc4dbb9SEitan Adler# previous+next cab archive
26162dc4dbb9SEitan Adler# can not use sub routine cab-anchor to display previous and next cabinet together
26172dc4dbb9SEitan Adler#>>>36	use				cab-anchor
26182dc4dbb9SEitan Adler#>>>>&0	use				cab-anchor
26192dc4dbb9SEitan Adler>>30	uleshort		=0x0003	\b, previous
26202dc4dbb9SEitan Adler>>>36	string		x		%s
26212dc4dbb9SEitan Adler# optional name of previous disk szDisk*
26222dc4dbb9SEitan Adler>>>>&1	string		x		disk %s
26232dc4dbb9SEitan Adler>>>>>&1	string		x		\b, next %s
26242dc4dbb9SEitan Adler# optional name of previous disk szDisk*
26252dc4dbb9SEitan Adler>>>>>>&1	string		x	disk %s
26262dc4dbb9SEitan Adler>>>>>>>&1	use			cab-folder
26272dc4dbb9SEitan Adler#	display filename and disk name of previous or next cabinet
26282dc4dbb9SEitan Adler0       name    			cab-anchor
26292dc4dbb9SEitan Adler# optional name of previous/next cabinet file szCabinet*[255]
26302dc4dbb9SEitan Adler>&0	string		x		%s
26312dc4dbb9SEitan Adler# optional name of previous/next disk szDisk*[255]
26322dc4dbb9SEitan Adler>>&1	string		x		disk %s
26332dc4dbb9SEitan Adler#	display folder structure CFFOLDER information like compression of cabinet
26342dc4dbb9SEitan Adler0       name    			cab-folder
26352dc4dbb9SEitan Adler# offset of the CFDATA block in this folder
263643a5ec4eSXin LI#>0	ulelong		x		\b, coffCabStart %#x
26372dc4dbb9SEitan Adler# number of CFDATA blocks in folder
26382dc4dbb9SEitan Adler>4	uleshort	x		\b, %u datablock
26392dc4dbb9SEitan Adler# plural s
26402dc4dbb9SEitan Adler>4	uleshort	>1		\bs
26412dc4dbb9SEitan Adler# compression typeCompress: 0~None 1~MSZIP 0x1503~LZX:21 0x1003~LZX:16 0x0f03~LZX:15
264243a5ec4eSXin LI>6	uleshort	x		\b, %#x compression
26432dc4dbb9SEitan Adler# optional per-folder reserved area
264443a5ec4eSXin LI#>8	ubequad		x		\b, abReserve %#llx
26452dc4dbb9SEitan Adler#	display member structure CFFILE information like member name of cabinet
26462dc4dbb9SEitan Adler0       name    			cab-file
26472dc4dbb9SEitan Adler# cbFile is uncompressed size of file in bytes
26482dc4dbb9SEitan Adler#>0	ulelong		x		\b, cbFile %u
26492dc4dbb9SEitan Adler# uoffFolderStart is uncompressed offset of file in folder
265043a5ec4eSXin LI#>4	ulelong		>0		\b, uoffFolderStart %#x
26512dc4dbb9SEitan Adler# iFolder is index into the CFFOLDER area. 0 indicates first folder in cabinet
26522dc4dbb9SEitan Adler# define ifoldCONTINUED_FROM_PREV      (0xFFFD)
26532dc4dbb9SEitan Adler# define ifoldCONTINUED_TO_NEXT        (0xFFFE)
26542dc4dbb9SEitan Adler# define ifoldCONTINUED_PREV_AND_NEXT  (0xFFFF)
265543a5ec4eSXin LI>8	uleshort	>0		\b, iFolder %#x
26562dc4dbb9SEitan Adler# date stamp for file
2657898496eeSXin LI>10	lemsdosdate	x		last modified %s
26582dc4dbb9SEitan Adler# time stamp for file
2659898496eeSXin LI>12	lemsdostime	x		%s
26602dc4dbb9SEitan Adler# attribs is attribute flags for file
26612dc4dbb9SEitan Adler# define  _A_RDONLY       (0x01)  file is read-only
26622dc4dbb9SEitan Adler# define  _A_HIDDEN       (0x02)  file is hidden
26632dc4dbb9SEitan Adler# define  _A_SYSTEM       (0x04)  file is a system file
26642dc4dbb9SEitan Adler# define  _A_ARCH         (0x20)  file modified since last backup
26652dc4dbb9SEitan Adler# example http://sebastien.kirche.free.fr/pebuilder_plugins/depends.cab
26662dc4dbb9SEitan Adler# define  _A_EXEC         (0x40)  run after extraction
26672dc4dbb9SEitan Adler# define  _A_NAME_IS_UTF  (0x80)  szName[] contains UTF
26682dc4dbb9SEitan Adler# define  UNKNOWN       (0x0100)  undocumented or accident
266943a5ec4eSXin LI#>14	uleshort	x		\b, attribs %#x
26702dc4dbb9SEitan Adler>14	uleshort	>0		+
26712dc4dbb9SEitan Adler>>14	uleshort	&0x0001		\bR
26722dc4dbb9SEitan Adler>>14	uleshort	&0x0002		\bH
26732dc4dbb9SEitan Adler>>14	uleshort	&0x0004		\bS
26742dc4dbb9SEitan Adler>>14	uleshort	&0x0020		\bA
26752dc4dbb9SEitan Adler>>14	uleshort	&0x0040		\bX
26762dc4dbb9SEitan Adler>>14	uleshort	&0x0080		\bUtf
26772dc4dbb9SEitan Adler# unknown 0x0100 flag found on one XP_CD:\I386\DRIVER.CAB
26782dc4dbb9SEitan Adler>>14	uleshort	&0x0100		\b?
26792dc4dbb9SEitan Adler# szName is name of archive member
26802dc4dbb9SEitan Adler>16	string		x		"%s"
26812dc4dbb9SEitan Adler# next archive member name if more files
26822dc4dbb9SEitan Adler#>>&17	string		>\0		\b, NEXT NAME %-.50s
2683b6cee71dSXin LI
2684b6cee71dSXin LI# InstallShield Cabinet files
2685b6cee71dSXin LI0	string/b	ISc(		InstallShield Cabinet archive data
2686b6cee71dSXin LI>5	byte&0xf0	=0x60		version 6,
2687b6cee71dSXin LI>5	byte&0xf0	!0x60		version 4/5,
2688b6cee71dSXin LI>(12.l+40)	lelong	x		%u files
2689b6cee71dSXin LI
2690b6cee71dSXin LI# Windows CE package files
2691b6cee71dSXin LI0	string/b	MSCE\0\0\0\0	Microsoft WinCE install header
2692b6cee71dSXin LI>20	lelong		0		\b, architecture-independent
2693b6cee71dSXin LI>20	lelong		103		\b, Hitachi SH3
2694b6cee71dSXin LI>20	lelong		104		\b, Hitachi SH4
2695b6cee71dSXin LI>20	lelong		0xA11		\b, StrongARM
2696b6cee71dSXin LI>20	lelong		4000		\b, MIPS R4000
2697b6cee71dSXin LI>20	lelong		10003		\b, Hitachi SH3
2698b6cee71dSXin LI>20	lelong		10004		\b, Hitachi SH3E
2699b6cee71dSXin LI>20	lelong		10005		\b, Hitachi SH4
2700b6cee71dSXin LI>20	lelong		70001		\b, ARM 7TDMI
2701b6cee71dSXin LI>52	leshort		1		\b, 1 file
2702b6cee71dSXin LI>52	leshort		>1		\b, %u files
2703b6cee71dSXin LI>56	leshort		1		\b, 1 registry entry
2704b6cee71dSXin LI>56	leshort		>1		\b, %u registry entries
2705b6cee71dSXin LI
2706b6cee71dSXin LI
2707b6cee71dSXin LI# Windows Enhanced Metafile (EMF)
2708b6cee71dSXin LI# See msdn.microsoft.com/archive/en-us/dnargdi/html/msdn_enhmeta.asp
2709b6cee71dSXin LI# for further information.
2710b6cee71dSXin LI0	ulelong 1
2711b6cee71dSXin LI>40	string	\ EMF		Windows Enhanced Metafile (EMF) image data
271243a5ec4eSXin LI>>44	ulelong x		version %#x
2713b6cee71dSXin LI
2714b6cee71dSXin LI
2715b6cee71dSXin LI0	string/b	\224\246\056		Microsoft Word Document
2716b6cee71dSXin LI!:mime	application/msword
2717b6cee71dSXin LI
2718b6cee71dSXin LI# From: "Nelson A. de Oliveira" <naoliv@gmail.com>
2719b6cee71dSXin LI# Magic type for Dell's BIOS .hdr files
2720b6cee71dSXin LI# Dell's .hdr
2721b6cee71dSXin LI0	string/b $RBU
2722b6cee71dSXin LI>23	string Dell			%s system BIOS
2723b6cee71dSXin LI>5	byte   2
2724b6cee71dSXin LI>>48	byte   x			version %d.
2725b6cee71dSXin LI>>49	byte   x			\b%d.
2726b6cee71dSXin LI>>50	byte   x			\b%d
2727b6cee71dSXin LI>5	byte   <2
2728b6cee71dSXin LI>>48	string x			version %.3s
2729b6cee71dSXin LI
2730b6cee71dSXin LI# Type: Microsoft Document Imaging Format (.mdi)
273148c779cdSXin LI# URL:	https://en.wikipedia.org/wiki/Microsoft_Document_Imaging_Format
2732b6cee71dSXin LI# From: Daniele Sempione <scrows@oziosi.org>
2733a5d223e6SXin LI# Too weak (EP)
2734a5d223e6SXin LI#0	short	0x5045			Microsoft Document Imaging Format
2735b6cee71dSXin LI
2736b6cee71dSXin LI# MS eBook format (.lit)
2737b6cee71dSXin LI0	string/b	ITOLITLS		Microsoft Reader eBook Data
2738b6cee71dSXin LI>8	lelong	x			\b, version %u
2739b6cee71dSXin LI!:mime					application/x-ms-reader
2740b6cee71dSXin LI
2741b6cee71dSXin LI# Windows CE Binary Image Data Format
2742b6cee71dSXin LI# From: Dr. Jesus <j@hug.gs>
2743b6cee71dSXin LI0	string/b	B000FF\n	Windows Embedded CE binary image
2744b6cee71dSXin LI
2745b6cee71dSXin LI# The second byte of these signatures is a file version; I don't know what,
2746b6cee71dSXin LI# if anything, produced files with version numbers 0-2.
2747b6cee71dSXin LI# From: John Elliott <johne@seasip.demon.co.uk>
2748b6cee71dSXin LI0	string	\xfc\x03\x00	Mallard BASIC program data (v1.11)
2749b6cee71dSXin LI0	string	\xfc\x04\x00	Mallard BASIC program data (v1.29+)
2750b6cee71dSXin LI0	string	\xfc\x03\x01	Mallard BASIC protected program data (v1.11)
2751b6cee71dSXin LI0	string	\xfc\x04\x01	Mallard BASIC protected program data (v1.29+)
2752b6cee71dSXin LI
2753b6cee71dSXin LI0	string	MIOPEN		Mallard BASIC Jetsam data
2754b6cee71dSXin LI0	string	Jetsam0		Mallard BASIC Jetsam index data
2755b6cee71dSXin LI
275640427ccaSGordon Tetlow# DOS backup 2.0 to 3.2
275743a5ec4eSXin LI# URL:		http://fileformats.archiveteam.org/wiki/BACKUP_(MS-DOS)
275843a5ec4eSXin LI# Reference:	http://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/dos/restore/brtecdoc.htm
275940427ccaSGordon Tetlow# backupid.@@@
276040427ccaSGordon Tetlow
276140427ccaSGordon Tetlow# plausibility check for date
276240427ccaSGordon Tetlow0x3	ushort	>1979
276340427ccaSGordon Tetlow>0x5	ubyte-1 <31
276440427ccaSGordon Tetlow>>0x6	ubyte-1 <12
276540427ccaSGordon Tetlow# actually 121 nul bytes
276640427ccaSGordon Tetlow>>>0x7	string	\0\0\0\0\0\0\0\0
276740427ccaSGordon Tetlow>>>>0x1 ubyte	x	DOS 2.0 backup id file, sequence %d
276843a5ec4eSXin LI#!:mime	application/octet-stream
276940427ccaSGordon Tetlow!:ext @@@
277040427ccaSGordon Tetlow>>>>0x0 ubyte	0xff	\b, last disk
277140427ccaSGordon Tetlow
277240427ccaSGordon Tetlow# backed up file
277340427ccaSGordon Tetlow
277440427ccaSGordon Tetlow# skip some AppleWorks word like Tomahawk.Awp, WIN98SE-DE.vhd
277540427ccaSGordon Tetlow# by looking for trailing nul of maximal file name string
277640427ccaSGordon Tetlow0x52	ubyte	0
277740427ccaSGordon Tetlow# test for flag byte: FFh~complete file, 00h~split file
277840427ccaSGordon Tetlow# FFh -127 =	-1 -127 =	-128
277940427ccaSGordon Tetlow# 00h -127 =	 0 -127 =	-127
278040427ccaSGordon Tetlow>0	byte-127	<-126
278140427ccaSGordon Tetlow# plausibility check for file name length
278240427ccaSGordon Tetlow>>0x53	ubyte-1	<78
278340427ccaSGordon Tetlow# looking for terminating nul of file name string
278440427ccaSGordon Tetlow>>>(0x53.b+4)	ubyte	0
278540427ccaSGordon Tetlow# looking if last char of string is valid DOS file name
278640427ccaSGordon Tetlow>>>>(0x53.b+3)	ubyte	>0x1F
278740427ccaSGordon Tetlow# actually 44 nul bytes
278840427ccaSGordon Tetlow# but sometimes garbage according to Ralf Quint. So can not be used as test
278940427ccaSGordon Tetlow#>0x54	string	\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
279040427ccaSGordon Tetlow# first char of full file name is DOS (5Ch) or UNIX (2Fh) path separator
279140427ccaSGordon Tetlow# only DOS variant found. UNIX variant according to V32SLASH.TXT in archive PD0315.EXE
279240427ccaSGordon Tetlow>>>>>5	ubyte&0x8C	0x0C
279340427ccaSGordon Tetlow# ./msdos (version 5.30) labeled the entry as
279440427ccaSGordon Tetlow# "DOS 2.0 backed up file %s, split file, sequence %d" or
279540427ccaSGordon Tetlow# "DOS 2.0 backed up file %s, complete file"
279640427ccaSGordon Tetlow>>>>>>0	ubyte	x	DOS 2.0-3.2 backed up
279740427ccaSGordon Tetlow#>>>>>>0	ubyte	0xff	complete
279840427ccaSGordon Tetlow>>>>>>0	ubyte	0
279940427ccaSGordon Tetlow>>>>>>>1 uleshort	x	sequence %d of
280040427ccaSGordon Tetlow# full file name with path but without drive letter and colon stored from 0x05 til 0x52
280140427ccaSGordon Tetlow>>>>>>0x5	string	x	file %s
280243a5ec4eSXin LI#!:mime	application/octet-stream
280340427ccaSGordon Tetlow# backup name is original filename
280443a5ec4eSXin LI#!:ext	doc/exe/rar/zip
280540427ccaSGordon Tetlow#!:ext	*
280640427ccaSGordon Tetlow# magic/Magdir/msdos, 1169: Warning: EXTENSION type `     *' has bad char '*'
280740427ccaSGordon Tetlow# file: line 1169: Bad magic entry '  *'
280840427ccaSGordon Tetlow# after header original file content
280940427ccaSGordon Tetlow>>>>>>128	indirect x	\b;
281040427ccaSGordon Tetlow
281140427ccaSGordon Tetlow
281240427ccaSGordon Tetlow# DOS backup 3.3 to 5.x
281340427ccaSGordon Tetlow
281440427ccaSGordon Tetlow# CONTROL.nnn files
281540427ccaSGordon Tetlow0	string	\x8bBACKUP\x20
281640427ccaSGordon Tetlow# actually 128 nul bytes
281740427ccaSGordon Tetlow>0xa	string	\0\0\0\0\0\0\0\0
281840427ccaSGordon Tetlow>>0x9	ubyte	x	DOS 3.3 backup control file, sequence %d
281940427ccaSGordon Tetlow>>0x8a	ubyte	0xff	\b, last disk
282040427ccaSGordon Tetlow
282140427ccaSGordon Tetlow# NB: The BACKUP.nnn files consist of the files backed up,
282240427ccaSGordon Tetlow# concatenated.
2823a4d6d3b8SXin LI
2824a4d6d3b8SXin LI# From:		Joerg Jenderek
2825a4d6d3b8SXin LI# URL:		http://fileformats.archiveteam.org/wiki/MS-DOS_date/time
2826a4d6d3b8SXin LI# Reference:	https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-dosdatetimetofiletime
2827a4d6d3b8SXin LI# Note:		DOS date+time format is different from formats such as Unix epoch
2828a4d6d3b8SXin LI#		bit encoded; uses year values relative to 1980 and 2 second precision
2829a4d6d3b8SXin LI0	name		dos-date
2830a4d6d3b8SXin LI# HHHHHMMMMMMSSSSS bit encoded Hour (0-23) Minute (0-59) SecondPart (*2)
2831a4d6d3b8SXin LI#>0	uleshort	x	RAW TIME [%#4.4x]
2832a4d6d3b8SXin LI# hour part
2833a4d6d3b8SXin LI#>0	uleshort/2048	x	hour [%u]
2834a4d6d3b8SXin LI# YYYYYMMMMDDDDD bit encoded YearPart (+1980) Month (1-12) Day (1-31)
2835a4d6d3b8SXin LI#>2	uleshort	x	RAW DATE [%#4.4x]
2836a4d6d3b8SXin LI# day part
2837a4d6d3b8SXin LI>2	uleshort&0x001F	x	%u
2838a4d6d3b8SXin LI#>2	uleshort/16	x	MONTH PART [%#x]
2839a4d6d3b8SXin LI# GRR: not working
2840a4d6d3b8SXin LI#>2	uleshort/16	&0x000F	MONTH [%u]
2841a4d6d3b8SXin LI#>2	uleshort&0x01E0	x	MONTH PART [%#4.4x]
2842a4d6d3b8SXin LI>2	uleshort&0x01E0	=0x0020	jan
2843a4d6d3b8SXin LI>2	uleshort&0x01E0	=0x0040	feb
2844a4d6d3b8SXin LI>2	uleshort&0x01E0	=0x0060	mar
2845a4d6d3b8SXin LI>2	uleshort&0x01E0	=0x0080	apr
2846a4d6d3b8SXin LI>2	uleshort&0x01E0	=0x00A0	may
2847a4d6d3b8SXin LI>2	uleshort&0x01E0	=0x00C0	jun
2848a4d6d3b8SXin LI>2	uleshort&0x01E0	=0x00E0	jul
2849a4d6d3b8SXin LI>2	uleshort&0x01E0	=0x0100	aug
2850a4d6d3b8SXin LI>2	uleshort&0x01E0	=0x0120	sep
2851a4d6d3b8SXin LI>2	uleshort&0x01E0	=0x0140	oct
2852a4d6d3b8SXin LI>2	uleshort&0x01E0	=0x0160	nov
2853a4d6d3b8SXin LI>2	uleshort&0x01E0	=0x0180	dec
2854a4d6d3b8SXin LI# year part
2855a4d6d3b8SXin LI>2	uleshort/512	x	1980+%u
2856a4d6d3b8SXin LI#
2857*ae316d1dSXin LI
2858*ae316d1dSXin LI# ExcelBIFF2-8BOF.magic - Excel Binary Interchange File Format versions 2-8
2859*ae316d1dSXin LI# Beginning of File records
2860*ae316d1dSXin LI# See https://www.gaia-gis.it/gaia-sins/freexl-1.0.6-doxy-doc/html/Format.html
2861*ae316d1dSXin LI#	Excel	Commercial	BIFF	Release
2862*ae316d1dSXin LI#	Version	Name		Version	Year	Notes
2863*ae316d1dSXin LI#	2.x	Excel 2.0	BIFF2	1987	Before CFBF. File is the BIFF
2864*ae316d1dSXin LI#						stream, containing a single
2865*ae316d1dSXin LI#						worksheet.
2866*ae316d1dSXin LI#	3.0	Excel 3.0	BIFF3	1990	""
2867*ae316d1dSXin LI#	4.0	Excel 4.0	BIFF4	1992	""
2868*ae316d1dSXin LI#	5.0	Excel 5.0	BIFF5	1993	Starting with BIFF5, a single
2869*ae316d1dSXin LI#						Workbook can internally store
2870*ae316d1dSXin LI#						many individual Worksheets.
2871*ae316d1dSXin LI#						The BIFF stream is stored in
2872*ae316d1dSXin LI#						the CFBF file container.
2873*ae316d1dSXin LI#	7.0	Excel 95	BIFF5	1995
2874*ae316d1dSXin LI#	8.0	Excel 98	BIFF8	1998
2875*ae316d1dSXin LI#	9.0	Excel 2000	BIFF8	1999
2876*ae316d1dSXin LI#	10.0	Excel XP	BIFF8	2001
2877*ae316d1dSXin LI#	11.0	Excel 2003	BIFF8	2003
2878*ae316d1dSXin LI# See https://www.openoffice.org/sc/excelfileformat.pdf#page=135
2879*ae316d1dSXin LI#	5.8 BOF – Beginning of File
2880*ae316d1dSXin LI# See also https://en.wikipedia.org/wiki/Microsoft_Excel;
2881*ae316d1dSXin LI#	Old file extensions
2882*ae316d1dSXin LI#	Format		Extension	Description
2883*ae316d1dSXin LI#	Spreadsheet	.xls	Main spreadsheet format which holds data in
2884*ae316d1dSXin LI#				worksheets, charts, and macros
2885*ae316d1dSXin LI#	Add-in (VBA)	.xla	Adds custom functionality; written in VBA
2886*ae316d1dSXin LI#	Toolbar		.xlb	The file extension where Microsoft Excel custom
2887*ae316d1dSXin LI#				toolbar settings are stored.
2888*ae316d1dSXin LI#	Chart		.xlc	A chart created with data from a Microsoft Excel
2889*ae316d1dSXin LI#				spreadsheet that only saves the chart.
2890*ae316d1dSXin LI#				To save the chart and spreadsheet save as .XLS.
2891*ae316d1dSXin LI#				XLC is not supported in Excel 2007 or in any
2892*ae316d1dSXin LI#				newer versions of Excel.
2893*ae316d1dSXin LI#	Dialog		.xld	Used in older versions of Excel.
2894*ae316d1dSXin LI#	Archive		.xlk	A backup of an Excel Spreadsheet
2895*ae316d1dSXin LI#	Add-in (DLL)	.xll	Adds custom functionality; written in C++/C,
2896*ae316d1dSXin LI#				Fortran, etc. and compiled in to a special
2897*ae316d1dSXin LI#				dynamic-link library
2898*ae316d1dSXin LI#	Macro		.xlm	A macro is created by the user or pre-installed
2899*ae316d1dSXin LI#				with Excel.
2900*ae316d1dSXin LI#	Template	.xlt	A pre-formatted spreadsheet created by the user
2901*ae316d1dSXin LI#				or by Microsoft Excel.
2902*ae316d1dSXin LI#	Module		.xlv	A module is written in VBA (Visual Basic for
2903*ae316d1dSXin LI#				Applications) for Microsoft Excel
2904*ae316d1dSXin LI#	Workspace	.xlw	Arrangement of the windows of multiple Workbooks
2905*ae316d1dSXin LI#	Library		.DLL	Code written in VBA may access functions in a
2906*ae316d1dSXin LI#				DLL, typically this is used to access the
2907*ae316d1dSXin LI#				Windows API
2908*ae316d1dSXin LI#!:ext	xls/xla/xlb/xlc/xld/xlk/xll/xlm/xlt/xlv/xlw
2909*ae316d1dSXin LI
2910*ae316d1dSXin LI#!:mime	application/vnd.ms-excel
2911*ae316d1dSXin LI
2912*ae316d1dSXin LI#	5.8.1 BOF Records Written by Excel
2913*ae316d1dSXin LI#	Record BOF, BIFF2 (record identifier is 0009 H):
2914*ae316d1dSXin LI#	Offset	Size	Contents
2915*ae316d1dSXin LI#	0	2	BIFF version (not used)
2916*ae316d1dSXin LI#	2	2	Type of the following data:	0010H = Sheet
2917*ae316d1dSXin LI#							0020H = Chart
2918*ae316d1dSXin LI#							0040H = Macro sheet
2919*ae316d1dSXin LI#	e.g. 0x0009 BOF len 4 version 2 content 0x0010 Sheet
2920*ae316d1dSXin LI0	uleshort	=0x0009	Excel 2 BIFF 2
2921*ae316d1dSXin LI>2	uleshort	=4
2922*ae316d1dSXin LI#			version
2923*ae316d1dSXin LI>>4	uleshort	=0
2924*ae316d1dSXin LI>>4	uleshort	=2
2925*ae316d1dSXin LI>>>6	uleshort	=0x0010	Sheet
2926*ae316d1dSXin LI>>>6	uleshort	=0x0020	Chart
2927*ae316d1dSXin LI>>>6	uleshort	=0x0040	Macros
2928*ae316d1dSXin LI
2929*ae316d1dSXin LI#	Record BOF, BIFF3 (record identifier is 0209 H) and
2930*ae316d1dSXin LI#	BIFF4 (record identifier is 0409H):
2931*ae316d1dSXin LI#	Offset	Size	Contents
2932*ae316d1dSXin LI#	0	2	BIFF version (not used)
2933*ae316d1dSXin LI#	2	2	Type of the following data:	0010H = Sheet
2934*ae316d1dSXin LI#							0020H = Chart
2935*ae316d1dSXin LI#							0040H = Macro sheet
2936*ae316d1dSXin LI#							0100H = Workspace
2937*ae316d1dSXin LI#							(BIFF3W/BIFF4W only)
2938*ae316d1dSXin LI#	4	2        Not used
2939*ae316d1dSXin LI0	uleshort	=0x0209	Excel 3 BIFF 3
2940*ae316d1dSXin LI>2	uleshort	=6
2941*ae316d1dSXin LI#			version
2942*ae316d1dSXin LI>>4	uleshort	=0
2943*ae316d1dSXin LI>>4	uleshort	=3
2944*ae316d1dSXin LI>>>6	uleshort	=0x0010	Sheet
2945*ae316d1dSXin LI>>>6	uleshort	=0x0020	Chart
2946*ae316d1dSXin LI>>>6	uleshort	=0x0040	Macros
2947*ae316d1dSXin LI#			(BIFF3W only)
2948*ae316d1dSXin LI>>>6	uleshort	=0x0100	Workspace
2949*ae316d1dSXin LI
2950*ae316d1dSXin LI0	uleshort	=0x0409	Excel 4 BIFF 4
2951*ae316d1dSXin LI>2	uleshort	=6
2952*ae316d1dSXin LI#			version
2953*ae316d1dSXin LI>>4	uleshort	=0
2954*ae316d1dSXin LI>>4	uleshort	=4
2955*ae316d1dSXin LI>>>6	uleshort	=0x0010	Sheet
2956*ae316d1dSXin LI>>>6	uleshort	=0x0020	Chart
2957*ae316d1dSXin LI>>>6	uleshort	=0x0040	Macros
2958*ae316d1dSXin LI#			(BIFF4W only)
2959*ae316d1dSXin LI>>>6	uleshort	=0x0100	Workspace
2960*ae316d1dSXin LI
2961*ae316d1dSXin LI#	Record BOF, BIFF5 (record identifier is 0809 H):
2962*ae316d1dSXin LI#	Offset	Size        Contents
2963*ae316d1dSXin LI#	0	2	BIFF version (always 0500H for BIFF5).
2964*ae316d1dSXin LI#			Should only be used, if this record is the leading
2965*ae316d1dSXin LI#			workbook globals BOF (see above).
2966*ae316d1dSXin LI#	2	2	Type of the following data:
2967*ae316d1dSXin LI#			0005H = Workbook globals
2968*ae316d1dSXin LI#			0006H = Visual Basic module
2969*ae316d1dSXin LI#			0010H = Sheet or dialogue (see SHEETPR,
2970*ae316d1dSXin LI#						   ➜5.97)
2971*ae316d1dSXin LI#			0020H = Chart
2972*ae316d1dSXin LI#			0040H = Macro sheet
2973*ae316d1dSXin LI#			0100H = Workspace (BIFF5W only)
2974*ae316d1dSXin LI#	4	2	Build identifier, must not be 0
2975*ae316d1dSXin LI#	6	2	Build year
2976*ae316d1dSXin LI0	uleshort	=0x0809	Excel 5 BIFF 5
2977*ae316d1dSXin LI>2	uleshort	=8
2978*ae316d1dSXin LI#			version
2979*ae316d1dSXin LI>>4	uleshort	=0x0500
2980*ae316d1dSXin LI>>4	uleshort	=5
2981*ae316d1dSXin LI>>4	uleshort	=0
2982*ae316d1dSXin LI>>>6	uleshort	=0x0005	Workbook Globals
2983*ae316d1dSXin LI>>>6	uleshort	=0x0006	VB Module
2984*ae316d1dSXin LI>>>6	uleshort	=0x0010	Sheet
2985*ae316d1dSXin LI>>>6	uleshort	=0x0020	Chart
2986*ae316d1dSXin LI>>>6	uleshort	=0x0040	Macros
2987*ae316d1dSXin LI#			(BIFF5W only)
2988*ae316d1dSXin LI>>>6	uleshort	=0x0100	Workspace
2989*ae316d1dSXin LI>>>>8	uleshort	>0	Build %d
2990*ae316d1dSXin LI>>>>>10	uleshort	>1900	Year %d
2991*ae316d1dSXin LI
2992*ae316d1dSXin LI#	Record BOF, BIFF8 (record identifier is 0809 H):
2993*ae316d1dSXin LI#	Offset	Size	Contents
2994*ae316d1dSXin LI#	 0	2	BIFF version (always 0600 H for BIFF8)
2995*ae316d1dSXin LI#	 2	2	Type of the following data:
2996*ae316d1dSXin LI#			0005H = Workbook globals
2997*ae316d1dSXin LI#			0006H = Visual Basic module
2998*ae316d1dSXin LI#			0010H = Sheet or dialogue (see SHEETPR,
2999*ae316d1dSXin LI#						   ➜5.97)
3000*ae316d1dSXin LI#			0020H = Chart
3001*ae316d1dSXin LI#			0040H = Macro sheet
3002*ae316d1dSXin LI#			0100H = Workspace (BIFF8W only)
3003*ae316d1dSXin LI#	 4	2	Build identifier, must not be 0
3004*ae316d1dSXin LI#	 6	2	Build year, must not be 0
3005*ae316d1dSXin LI#	 8	4	File history flags
3006*ae316d1dSXin LI#	12	4	Lowest Excel version that can read all records in this
3007*ae316d1dSXin LI#			file
3008*ae316d1dSXin LI0	uleshort	=0x0809	Excel 8 BIFF 8
3009*ae316d1dSXin LI>2	uleshort	=16
3010*ae316d1dSXin LI#			version
3011*ae316d1dSXin LI>>4	uleshort	=0x0600
3012*ae316d1dSXin LI>>4	uleshort	=8
3013*ae316d1dSXin LI>>4	uleshort	=0
3014*ae316d1dSXin LI>>>6	uleshort	=0x0005	Workbook Globals
3015*ae316d1dSXin LI>>>6	uleshort	=0x0006	VB Module
3016*ae316d1dSXin LI>>>6	uleshort	=0x0010	Sheet
3017*ae316d1dSXin LI>>>6	uleshort	=0x0020	Chart
3018*ae316d1dSXin LI>>>6	uleshort	=0x0040	Macros
3019*ae316d1dSXin LI#			(BIFF8W only)
3020*ae316d1dSXin LI>>>6	uleshort	=0x0100	Workspace
3021*ae316d1dSXin LI>>>>8	uleshort	>0	Build %d
3022*ae316d1dSXin LI>>>>>10	uleshort	>1900	Year %d
3023*ae316d1dSXin LI>>>>>>12 ulelong	!0	File history %d
3024*ae316d1dSXin LI>>>>>>16 ulelong	>0	Excel version needed %d
3025*ae316d1dSXin LI
3026*ae316d1dSXin LI#	5.8.2 BOF Records Written by Other External Tools
3027*ae316d1dSXin LI#	Various external tools write non-standard BOF records with the record
3028*ae316d1dSXin LI#	identifier 0809H (determining a BIFF5-BIFF8 BOF record), but with a
3029*ae316d1dSXin LI#	different BIFF version field. In this case, the record identifier is
3030*ae316d1dSXin LI#	ignored, and only the version field is used to set the BIFF version of
3031*ae316d1dSXin LI#	the workbook.
3032*ae316d1dSXin LI#	Record BOF (record identifier is 0809 H):
3033*ae316d1dSXin LI#	Offset	Size	Contents
3034*ae316d1dSXin LI#	0	2	BIFF version:			0000H = BIFF5
3035*ae316d1dSXin LI#							0200H = BIFF2
3036*ae316d1dSXin LI#							0300H = BIFF3
3037*ae316d1dSXin LI#							0400H = BIFF4
3038*ae316d1dSXin LI#							0500H = BIFF5
3039*ae316d1dSXin LI#							0600H = BIFF8
3040*ae316d1dSXin LI#	2	2	Type of the following data:
3041*ae316d1dSXin LI#			0005H = Workbook globals
3042*ae316d1dSXin LI#			0006H = Visual Basic module
3043*ae316d1dSXin LI#			0010H = Sheet or dialogue (see SHEETPR,
3044*ae316d1dSXin LI#						   ➜5.97)
3045*ae316d1dSXin LI#			0020H = Chart
3046*ae316d1dSXin LI#			0040H = Macro sheet
3047*ae316d1dSXin LI#			0100H = Workspace
3048*ae316d1dSXin LI#	[4]	var.	(optional) Additional fields of a BOF record,
3049*ae316d1dSXin LI#			should be ignored
3050*ae316d1dSXin LI0	uleshort	=0x0809
3051*ae316d1dSXin LI#			>= 4
3052*ae316d1dSXin LI>2	uleshort	>3
3053*ae316d1dSXin LI>>4	uleshort	=0	Excel 5 BIFF 5
3054*ae316d1dSXin LI>>4	uleshort	=0x0200	Excel 2 BIFF 2
3055*ae316d1dSXin LI>>4	uleshort	=2	Excel 2 BIFF 2
3056*ae316d1dSXin LI>>4	uleshort	=0x0300	Excel 3 BIFF 3
3057*ae316d1dSXin LI>>4	uleshort	=3	Excel 3 BIFF 3
3058*ae316d1dSXin LI>>4	uleshort	=0x0400	Excel 4 BIFF 4
3059*ae316d1dSXin LI>>4	uleshort	=4	Excel 4 BIFF 4
3060*ae316d1dSXin LI>>4	uleshort	=0x0500	Excel 5 BIFF 5
3061*ae316d1dSXin LI>>4	uleshort	=5	Excel 5 BIFF 5
3062*ae316d1dSXin LI>>4	uleshort	=0x0600	Excel 8 BIFF 8
3063*ae316d1dSXin LI>>4	uleshort	=6	Excel 8 BIFF 8
3064*ae316d1dSXin LI>>4	uleshort	=0x0800	Excel 8 BIFF 8
3065*ae316d1dSXin LI>>4	uleshort	=8	Excel 8 BIFF 8
3066*ae316d1dSXin LI>>>6	uleshort	=0x0005	Workbook Globals
3067*ae316d1dSXin LI>>>6	uleshort	=0x0006	VB Module
3068*ae316d1dSXin LI>>>6	uleshort	=0x0010	Sheet/Dialogue
3069*ae316d1dSXin LI>>>6	uleshort	=0x0020	Chart
3070*ae316d1dSXin LI>>>6	uleshort	=0x0040	Macros
3071*ae316d1dSXin LI#			(BIFF8W only)
3072*ae316d1dSXin LI>>>6	uleshort	=0x0100	Workspace
3073*ae316d1dSXin LI
3074