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