1b6cee71dSXin LI 2b6cee71dSXin LI#------------------------------------------------------------------------------ 3*ae316d1dSXin LI# $File: msvc,v 1.12 2024/03/31 15:08:13 christos Exp $ 4b6cee71dSXin LI# msvc: file(1) magic for msvc 5b6cee71dSXin LI# "H. Nanosecond" <aldomel@ix.netcom.com> 6b6cee71dSXin LI# Microsoft visual C 7b6cee71dSXin LI# 8b6cee71dSXin LI# I have version 1.0 9b6cee71dSXin LI 10b6cee71dSXin LI# .aps 11b6cee71dSXin LI0 string HWB\000\377\001\000\000\000 Microsoft Visual C .APS file 12b6cee71dSXin LI 13b6cee71dSXin LI# .ide 14b6cee71dSXin LI#too long 0 string \102\157\162\154\141\156\144\040\103\053\053\040\120\162\157\152\145\143\164\040\106\151\154\145\012\000\032\000\002\000\262\000\272\276\372\316 MSVC .ide 15b6cee71dSXin LI0 string \102\157\162\154\141\156\144\040\103\053\053\040\120\162\157 MSVC .ide 16b6cee71dSXin LI 17b6cee71dSXin LI# .res 18*ae316d1dSXin LI# https://learn.microsoft.com/en-us/windows/win32/menurc/resource-file-formats 19*ae316d1dSXin LI# https://learn.microsoft.com/en-us/windows/win32/menurc/resourceheader 20*ae316d1dSXin LI# A binary resource file consists of a number of concatenated resource entries. 21*ae316d1dSXin LI# Each entry consists of a resource header and the data for that resource. 22*ae316d1dSXin LI# Resource file starts with an empty resource entry with 32-byte long header in 23*ae316d1dSXin LI# which is stored ordinal type 0 and ordinal name 0. 24*ae316d1dSXin LI0 string \000\000\000\000\040\000\000\000\377\377\000\000\377\377\000\000 Microsoft Visual C binary resource file 25*ae316d1dSXin LI!:ext res 26b6cee71dSXin LI 27b6cee71dSXin LI#.lib 28a4d6d3b8SXin LI# URL: https://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B 29a4d6d3b8SXin LI# http://fileformats.archiveteam.org/wiki/Microsoft_Library 30a4d6d3b8SXin LI# http://fileformats.archiveteam.org/wiki/OMF 31a4d6d3b8SXin LI# Reference: http://mark0.net/download/triddefs_xml.7z/defs/l/lib-msvc.trid.xml 32a4d6d3b8SXin LI# https://pierrelib.pagesperso-orange.fr/exec_formats/OMF_v1.1.pdf 33a4d6d3b8SXin LI# Update: Joerg Jenderek 34a4d6d3b8SXin LI#0 string \360\015\000\000 Microsoft Visual C library 35a4d6d3b8SXin LI#0 string \360\075\000\000 Microsoft Visual C library 36a4d6d3b8SXin LI#0 string \360\175\000\000 Microsoft Visual C library 37a4d6d3b8SXin LI# test for RecordType~LibraryHeaderRecord=0xF0 + RecordLength=???Dh + dictionary offset is multiple of 0x200 38a4d6d3b8SXin LI0 ubelong&0xFF0f80ff =0xF00d0000 39a4d6d3b8SXin LI# Microsoft Visual C library (strength=70) before MIDI SysEx messages (strength=50) handled by ./sysex 40a4d6d3b8SXin LI#!:strength +0 41a4d6d3b8SXin LI# test for valid 2nd RecordType~Translator Header Record=THEADR=80h or LHEADR=82h 42a4d6d3b8SXin LI>(1.s+3) ubyte&0xFD =0x80 43a4d6d3b8SXin LI>>0 use omf-lib 44a4d6d3b8SXin LI# display information about Microsoft Visual C/OMF library 45a4d6d3b8SXin LI0 name omf-lib 46a4d6d3b8SXin LI# RecordType~LibraryHeaderRecord=0xF0 47a4d6d3b8SXin LI#>0 byte 0xF0 Microsoft Visual C library 48a4d6d3b8SXin LI# the above description was used in file version 5.41 49a4d6d3b8SXin LI>0 byte 0xF0 Microsoft Visual C/OMF library 50a4d6d3b8SXin LI#>0 byte 0xF0 relocatable Object Module Format (OMF) libray 51a4d6d3b8SXin LI#!:mime application/octet-stream 52a4d6d3b8SXin LI!:mime application/x-omf-lib 53a4d6d3b8SXin LI!:ext lib 54a4d6d3b8SXin LI# 1st record data length like 13=0Dh 29=1Dh 61=3Dh 125=7Dh 509=01FDh ... 32765=7FFDh 55a4d6d3b8SXin LI#>1 uleshort x \b, 1st record data length %u 56a4d6d3b8SXin LI#>1 uleshort x \b, 1st record data length %#x 57a4d6d3b8SXin LI# 2**4=16 <= RecordLength+3 = PageSize = 2**n {16 32 512 no examples 64 128 256 1024 2048 ...32768} <= 2**15=32768 58a4d6d3b8SXin LI>1 uleshort+3 x \b, page size %u 59a4d6d3b8SXin LI# dictionary offset like: 400h 600h a00h c00h 1200h 1800h 2400h 5600h 12800h 19200h 28a00h 60a4d6d3b8SXin LI>3 ulelong x \b, at %#x dictionary 61a4d6d3b8SXin LI# dictionary block a 512 bytes; the first 37 bytes correspond to the 37 buckets 62a4d6d3b8SXin LI#>(3.l) ubequad x (%#16.16llx...) 63a4d6d3b8SXin LI# dictionary size; length in 512-byte blocks; a prime number? like: 64a4d6d3b8SXin LI# 1 2 3 4 5 6 7 9 11 13 15 16 18 21 22 23 24 25 31 50 53 89 101 117 277 65a4d6d3b8SXin LI>7 uleshort x with %u block 66a4d6d3b8SXin LI# plurals s 67a4d6d3b8SXin LI>7 uleshort >1 \bs 68a4d6d3b8SXin LI# If dictionary byte 38 (FFLAG) has the value 255, there is no space left 69a4d6d3b8SXin LI>(3.l+37) ubyte <0xFF (FFLAG=%#x) 70a4d6d3b8SXin LI>(3.l+37) ubyte =0xFF (FFLAG=full) 71a4d6d3b8SXin LI# dictionary entry; length byte of following symbol, the following text bytes of symbol, two bytes specifies the page number 72a4d6d3b8SXin LI# like: dbfntx1! DBFNTX.LIB zlibCompileFlags_ ZLIB.LIB atoi! mwlibc.lib 73a4d6d3b8SXin LI>(3.l+38) pstring x 1st entry %s 74a4d6d3b8SXin LI# like: 1 33 41 47 458 8783 75a4d6d3b8SXin LI>>&0 uleshort x in page %u 76a4d6d3b8SXin LI# library flags; 0 or 1, but WHAT IS 0x4d in MOUSE.LIB ? 77a4d6d3b8SXin LI>9 ubyte >1 \b, flags %#x 78a4d6d3b8SXin LI>9 ubyte =1 case sensitive 79a4d6d3b8SXin LI# In the library after header comes first object module with a Library Module Header Record (LHEADR=82h) 80a4d6d3b8SXin LI# but in examples Translator Header Record (THEADR=80h) which is handled identically 81a4d6d3b8SXin LI>(1.s+3) ubyte x \b, 2nd record 82a4d6d3b8SXin LI>(1.s+3) ubyte !0x80 (type %#x) 83a4d6d3b8SXin LI#>(1.s+4) uleshort x \b, 2nd record data length %u 84a4d6d3b8SXin LI# Module name often source name like "dos\crt0.asm" in mlibce.lib or "QB4UTIL.ASM" in QB4UTIL.LIB 85a4d6d3b8SXin LI# or "C:\Documents and Settings\Allan Campbell\My Documents\FDOSBoot\zlib\zutil.c" in ZLIB.LIB 86a4d6d3b8SXin LI# or title like "87INIT" in FP87.LIB or "ACOSASIN" in MATHC.LIB or "Copyright" in calc-bcc.lib 87a4d6d3b8SXin LI>(1.s+6) pstring x "%s" 88a4d6d3b8SXin LI# 2nd record checksum 89a4d6d3b8SXin LI#>>&0 ubyte x checksum %#x 90a4d6d3b8SXin LI# 3rd RecordType: 96h~LNAMES 88h~COMENT 91a4d6d3b8SXin LI>>&1 ubyte x \b, 3rd record 92a4d6d3b8SXin LI>>&1 ubyte !0x88 93a4d6d3b8SXin LI>>>&-1 ubyte !0x96 94a4d6d3b8SXin LI# 3rd unusual record type 95a4d6d3b8SXin LI>>>>&-1 ubyte x (type %#x) 96a4d6d3b8SXin LI# 3rd record is a List of Names Record (LNAMES=96h) 97a4d6d3b8SXin LI>>&1 ubyte =0x96 LNAMES 98a4d6d3b8SXin LI# LNAMES record length like: 2 15 19 99a4d6d3b8SXin LI#>>>&0 uleshort x \b, LNAMES record length %u 100a4d6d3b8SXin LI>>>&0 uleshort >2 101a4d6d3b8SXin LI# 1st LNAME string length; null is valid; maximal 255 102a4d6d3b8SXin LI#>>>>&0 ubyte x 1st LNAME length %u 103a4d6d3b8SXin LI>>>>&0 ubyte =0 104a4d6d3b8SXin LI# 2nd LNAME length like: 4 7 8 17 31 105a4d6d3b8SXin LI#>>>>>&0 ubyte x 2nd LNAME length %u 106a4d6d3b8SXin LI# name used for segment, class, group, overlay, etc like: 107a4d6d3b8SXin LI# CODE (mwlibc.lib) _TEXT32 (JMPPM32.LIB) _OVLCODE (WOVL.LIB) 108a4d6d3b8SXin LI>>>>>&0 pstring x %s 109a4d6d3b8SXin LI# 3rd LNAME length like: 4 5 110a4d6d3b8SXin LI#>>>>>>&0 ubyte x 3rd LNAME length %u 111a4d6d3b8SXin LI# like: DATA (mwlibc.lib) CODE (JMPPM32.LIB) _TEXT (EMU87.LIB) 112a4d6d3b8SXin LI>>>>>>&0 pstring x %s 113a4d6d3b8SXin LI# maybe 4th LNAME length like: 4 6 114a4d6d3b8SXin LI>>>>>>>&0 ubyte <44 115a4d6d3b8SXin LI# like: DATA (DEBUG.LIB) DGROUP (mwlibc.lib MOUSE.LIB) 116a4d6d3b8SXin LI>>>>>>>>&-1 pstring x %s 117a4d6d3b8SXin LI# 3rd record is a COMMENT (Including all comment class extensions) 118a4d6d3b8SXin LI>>&1 ubyte =0x88 COMMENT 119a4d6d3b8SXin LI# comment record length like: 3 FLIB7M.LIB 1Bh 1Eh 23h 27h 2Bh 30h freetype-bcc.lib 120a4d6d3b8SXin LI#>>>&0 uleshort x \b, record length %#x 121a4d6d3b8SXin LI# real comment length = record length - 1 (comment type) - 1 (comment Class) - 1 (checksum) -1 (char count) 122a4d6d3b8SXin LI# like: 2 LIBFL.LIB 4 "UUID" 5 "dscap" 6 "int386" 7 "qb4util" 8 "AMSGEXIT" 16 REXX.LIB 20 27 35 44 freetype-bcc.lib 123a4d6d3b8SXin LI#>>>>&-2 uleshort-4 >0 \b, comment length %u 124a4d6d3b8SXin LI# check that record contain at least comment type (1 byte), comment class (1 byte), checksum (1 byte) 125a4d6d3b8SXin LI# probably always true 126a4d6d3b8SXin LI>>>&0 uleshort >2 127a4d6d3b8SXin LI# comment type: 80h~NP~no purge bit 40h~NL~no list bit 128a4d6d3b8SXin LI#>>>>&0 ubyte !0 Type %#x 129a4d6d3b8SXin LI>>>>&0 ubyte &0x80 Preserved 130a4d6d3b8SXin LI# no example 131a4d6d3b8SXin LI>>>>&0 ubyte &0x40 NoList 132a4d6d3b8SXin LI# comment class like: 0~Translator A0~OMF extensions A3~LIBMOD A1~New OMF extensions AA~UNKNOWN 133a4d6d3b8SXin LI>>>>&1 ubyte x class=%#x 134a4d6d3b8SXin LI# check that comment record contains at least real content 135a4d6d3b8SXin LI>>>>&-2 uleshort >3 136a4d6d3b8SXin LI# Translator comment record (0); it may name the source language or translator 137a4d6d3b8SXin LI>>>>>&1 ubyte =0 Translator 138a4d6d3b8SXin LI#>>>>>>&0 ubyte x Translator length %u 139a4d6d3b8SXin LI# like: "TC86 Borland Turbo C 2.01 " (GEMS.LIB) "TC86 Borland Turbo C++ 3.00" (CATDB.LIB) 140a4d6d3b8SXin LI>>>>>>&0 pstring x "%s" 141a4d6d3b8SXin LI# OMF extensions comment record (A0); first byte of commentary string identifies subtype 142a4d6d3b8SXin LI>>>>>&1 ubyte =0xA0 OMF extensions 143a4d6d3b8SXin LI# A0 subtype like: 1~IMPDEF 144a4d6d3b8SXin LI>>>>>>&0 ubyte !1 subtype %#x 145a4d6d3b8SXin LI# Import Definition Record (Comment Class A0, Subtype 01~IMPDEF) 146a4d6d3b8SXin LI>>>>>>&0 ubyte 1 IMPDEF 147a4d6d3b8SXin LI# ordinal flag; determines form of Entry Ident field. If nonzero (seems to be 1) Entry is ordinal 148a4d6d3b8SXin LI>>>>>>>&0 ubyte !0 ordinal 149a4d6d3b8SXin LI# like: IMPORT.LIB DOSCALLS.LIB mlibw.lib mwinlibc.lib REXX.LIB 150a4d6d3b8SXin LI>>>>>>>>&-1 ubyte >1 %u 151a4d6d3b8SXin LI# Internal Name in count, char string format; module name for the imported symbol 152a4d6d3b8SXin LI# like: 7 "REXXSAA" 9 11 13 14 15 16 20 21 26 "_Z10_clip_linePdS_S_S_dddd" 153a4d6d3b8SXin LI#>>>>>>>&1 ubyte x internal name length %u 154a4d6d3b8SXin LI# internal module name like: _DllGetVersion DllGetVersion BezierTerminationTest Copyright 155a4d6d3b8SXin LI>>>>>>>&1 pstring x %s 156a4d6d3b8SXin LI# module name in count, char string format; DLL name that supplies a matching export symbol 157a4d6d3b8SXin LI# like: jpeg62.dll (jpeg-bcc.lib) unrar3.dll (unrar-bcc.lib) REXX (REXX.LIB) 158a4d6d3b8SXin LI>>>>>>>>&0 pstring x exported by %s 159a4d6d3b8SXin LI# Entry Ident; 16-bit if ordinal flag != 0 or imported name in count, char string format if ordinal flag = 0 160a4d6d3b8SXin LI# like: \0 (calc-bcc.lib) DllGetVersion (libtiff-bcc.lib) UTF8ToHtml (libxml2-bcc.lib) xslAddCall (libxslt-bcc.lib) 161a4d6d3b8SXin LI#>>>>>>>>>&0 pstring >\0 entry ident %s 162a4d6d3b8SXin LI# "New OMF" extensions comment (A1); indicate version of symbolic debug information 163a4d6d3b8SXin LI# like: LIBFL.LIB 164a4d6d3b8SXin LI>>>>>&1 ubyte =0xA1 New OMF extensions 165a4d6d3b8SXin LI# symbolic debug information version n 166a4d6d3b8SXin LI>>>>>>&0 ubyte x n=%u 167a4d6d3b8SXin LI# symbolic debug information style like: HL~IBM PM Debugger style (LIBFL.LIB) DX~AIX style CV~Microsoft symbol and type style 168a4d6d3b8SXin LI>>>>>>>&0 string HL IBM style 169a4d6d3b8SXin LI>>>>>>>&0 string DX AIX style 170a4d6d3b8SXin LI>>>>>>>&0 string CV Microsoft style 171a4d6d3b8SXin LI# LIBMOD comment record (A3) used only by the librarian 172a4d6d3b8SXin LI# Microsoft extension added for LIB version 3.07 in macro assembler (MASM 5.0) 173a4d6d3b8SXin LI>>>>>&1 ubyte =0xA3 LIBMOD 174a4d6d3b8SXin LI# The A3 LIBMOD record contains only the ASCII string of the module name in count char format 175a4d6d3b8SXin LI#>>>>>>&0 ubyte x LIBMOD length %u 176a4d6d3b8SXin LI# LIBMOD comment record module name without path and extension like: 177a4d6d3b8SXin LI# qb4util (QB4UTIL.LIB) affaldiv (libh.lib) crt0 (slibc.lib) clipper (DDDRAWS.LIB) dinpdev (DINPUTS.LIB) UUID (UUID.LIB) 178a4d6d3b8SXin LI>>>>>>&0 pstring x %s 179a4d6d3b8SXin LI# GRR: WHAT iS THAT? AA foo comment record 180a4d6d3b8SXin LI#>>>>>&1 ubyte =0xAA AA-comment 181a4d6d3b8SXin LI# like: OS220 182a4d6d3b8SXin LI#>>>>>>&0 string x what=%-5.5s 183a4d6d3b8SXin LI# 184b6cee71dSXin LI 185b6cee71dSXin LI#.pch 186b6cee71dSXin LI0 string DTJPCH0\000\022\103\006\200 Microsoft Visual C .pch 187b6cee71dSXin LI 1883e41d09dSXin LI# Summary: Symbol Table / Debug info used by Microsoft compilers 1893e41d09dSXin LI# URL: https://en.wikipedia.org/wiki/Program_database 1903e41d09dSXin LI# Reference: https://code.google.com/p/pdbparser/wiki/MSF_Format 1913e41d09dSXin LI# Update: Joerg Jenderek 1923e41d09dSXin LI# Note: test only for Windows XP+SP3 x86 , 8.1 x64 arm and 10.1 x86 1933e41d09dSXin LI# info does only applies partly for older files like msvbvm50.pdb about year 2001 19440427ccaSGordon Tetlow0 string Microsoft\ C/C++\040 1953e41d09dSXin LI# "Microsoft Program DataBase" by TrID 1963e41d09dSXin LI>24 search/14 \r\n\x1A MSVC program database 1973e41d09dSXin LI!:mime application/x-ms-pdb 1983e41d09dSXin LI!:ext pdb 1993e41d09dSXin LI# "MSF 7.00" "program database 2.00" for msvbvm50.pdb 2003e41d09dSXin LI>>16 regex \([0-9.]+\) ver %s 2013e41d09dSXin LI#>>>0x38 search/128123456 /LinkInfo \b with linkinfo 2023e41d09dSXin LI# "MSF 7.00" variant 2033e41d09dSXin LI>>0x1e leshort 0 2043e41d09dSXin LI# PageSize 400h 1000h 2053e41d09dSXin LI>>>0x20 lelong x \b, %d 2063e41d09dSXin LI# Page Count 2073e41d09dSXin LI>>>0x28 lelong x \b*%d bytes 2083e41d09dSXin LI# "program database 2.00" variant 2093e41d09dSXin LI>>0x1e leshort !0 2103e41d09dSXin LI# PageSize 400h 2113e41d09dSXin LI>>>0x2c lelong x \b, %d 2123e41d09dSXin LI# Page Count for msoo-dll.pdb 4379h 2133e41d09dSXin LI>>>0x32 leshort x \b*%d bytes 214b6cee71dSXin LI 21540427ccaSGordon Tetlow# Reference: https://github.com/Microsoft/vstest/pull/856/commits/fdc7a9f074ca5a8dfeec83b1be9162bf0cf4000d 21648c779cdSXin LI0 string/c bsjb\001\000\001\000\000\000\000\000\f\000\000\000pdb\ v1.0 Microsoft Roslyn C# debugging symbols version 1.0 21740427ccaSGordon Tetlow 218b6cee71dSXin LI#.sbr 219b6cee71dSXin LI0 string \000\002\000\007\000 MSVC .sbr 220b6cee71dSXin LI>5 string >\0 %s 221b6cee71dSXin LI 222b6cee71dSXin LI#.bsc 223b6cee71dSXin LI0 string \002\000\002\001 MSVC .bsc 224b6cee71dSXin LI 225b6cee71dSXin LI#.wsp 226b6cee71dSXin LI0 string 1.00\ .0000.0000\000\003 MSVC .wsp version 1.0000.0000 227b6cee71dSXin LI# these seem to start with the version and contain menus 228