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