#This part of the test suite only verifies structural properties, not table relationships
- #Flags invalid bits: 9,11,14,15,19,21,24-31
+ #Flags invalid bits: 6,9,14,15,19,21,24-31
+ invalid offset table-row ( 2 1 ) set-bit 6
invalid offset table-row ( 2 1 ) set-bit 9
- invalid offset table-row ( 2 1 ) set-bit 11
invalid offset table-row ( 2 1 ) set-bit 14
invalid offset table-row ( 2 1 ) set-bit 15
invalid offset table-row ( 2 1 ) set-bit 19
invalid offset table-row ( 4 0 ) or-ushort 0x60
#field with literal must be static (7)
- valid offset table-row ( 4 0 ) or-ushort 0x50
+ valid offset table-row ( 4 4 ) or-ushort 0x50
invalid offset table-row ( 4 0 ) or-ushort 0x40
#field with rt special name must have special name (8)
#special name
valid offset table-row ( 4 0 ) or-ushort 0x0200
#special name + rt special name
+
+ #LAMEIMPL MS requires that fields marked rtspecialname to be named value__ even if they are not enums
valid offset table-row ( 4 0 ) or-ushort 0x0600
#only rt special name
invalid offset table-row ( 4 0 ) or-ushort 0x0400
#no row in the field rva table for field 0 (11)
invalid offset table-row ( 4 0 ) or-ushort 0x0100
-
#name can't be empty or invalid (12)
invalid offset table-row ( 4 1 ) + 2 set-ushort 0
invalid offset table-row ( 4 1 ) + 2 set-ushort 0x9999
- #TODO verify 14+
+ #invalid signature
+ invalid offset table-row ( 4 1 ) + 4 set-ushort 0x4666
+
+ #if it's a global variable, it must be static and (public|compiler controler|private) (16)
+ #static + compiler controled
+ valid offset table-row ( 2 1 ) + 10 set-ushort 2 , offset table-row ( 4 0 ) set-ushort 0x10
+ #static + private
+ valid offset table-row ( 2 1 ) + 10 set-ushort 2 , offset table-row ( 4 0 ) set-ushort 0x11
+ #static + public
+ valid offset table-row ( 2 1 ) + 10 set-ushort 2 , offset table-row ( 4 0 ) set-ushort 0x16
+ #static + bad visibility
+ #LAMEIMPL MS doesn't verify visibility
+ invalid offset table-row ( 2 1 ) + 10 set-ushort 2 , offset table-row ( 4 0 ) set-ushort 0x12
+ invalid offset table-row ( 2 1 ) + 10 set-ushort 2 , offset table-row ( 4 0 ) set-ushort 0x13
+ invalid offset table-row ( 2 1 ) + 10 set-ushort 2 , offset table-row ( 4 0 ) set-ushort 0x14
+ invalid offset table-row ( 2 1 ) + 10 set-ushort 2 , offset table-row ( 4 0 ) set-ushort 0x15
+
+ #public and not static
+ invalid offset table-row ( 2 1 ) + 10 set-ushort 2 , offset table-row ( 4 0 ) set-ushort 0x06
+
+ #field is constant but has no row in the contant table
+ #LAMESPEC this check is missing from the spec
+ invalid offset table-row ( 4 0 ) or-ushort 0x50
+
+ #TODO enum and signature content
+}
+
+methoddef-table {
+ assembly assembly-with-methods.exe
+
+ #bad implflags (3)
+ #unused bits 4,5,6,8,9,10,11,15
+ #LAMEIMPL MS doesn't check invalid bits 6,8,9,10,11,13,14,15
+ invalid offset table-row ( 6 0 ) + 4 set-bit 6
+ invalid offset table-row ( 6 0 ) + 4 set-bit 8
+ invalid offset table-row ( 6 0 ) + 4 set-bit 9
+ invalid offset table-row ( 6 0 ) + 4 set-bit 10
+ invalid offset table-row ( 6 0 ) + 4 set-bit 11
+ invalid offset table-row ( 6 0 ) + 4 set-bit 13
+ invalid offset table-row ( 6 0 ) + 4 set-bit 14
+ invalid offset table-row ( 6 0 ) + 4 set-bit 15
+
+ #bad flags (4)
+ #no unused bits
+
+ #invalid .ctor with generic params and specialname (6)
+ #method 0 is a .ctor, method 1 is generic
+ invalid offset table-row ( 6 1 ) + 6 or-ushort 0x1800 , offset table-row ( 6 1 ) + 8 set-ushort read.ushort ( table-row ( 6 0 ) + 8 )
+
+ #visibility 0x7 is invalid (6)
+ invalid offset table-row ( 6 0 ) + 6 or-ushort 0x7
+
+ #Invalid combination of flags (7)
+ #static + final
+ invalid offset table-row ( 6 2 ) + 6 set-ushort 0x0030
+ #static + virtual
+ invalid offset table-row ( 6 2 ) + 6 set-ushort 0x0050
+ #static + newslot
+ invalid offset table-row ( 6 2 ) + 6 set-ushort 0x0110
+ #final + abstract
+ invalid offset table-row ( 6 2 ) + 6 set-ushort 0x0420
+ #abstract + pinvokeimpl
+ invalid offset table-row ( 6 2 ) + 6 set-ushort 0x2400
+
+ #LAMEIMPL MS doesn't care about this
+ #compilercontrolled | specialname
+ invalid offset table-row ( 6 2 ) + 6 set-ushort 0x0800
+
+ #LAMEIMPL MS doesn't care about this
+ #compilercontrolled | rtspecialname
+ invalid offset table-row ( 6 2 ) + 6 set-ushort 0x1800
+
+ #Abstract method must be virtual (8)
+ invalid offset table-row ( 6 2 ) + 6 set-ushort 0x0400
+
+ #A rtspecialnamemethod must be special name (9)
+ invalid offset table-row ( 6 2 ) + 6 set-ushort 0x1000
+
+ #XXX we don't care about CAS security (10, 11,12,13)
+
+ #name shall be non empty (14)
+ invalid offset table-row ( 6 2 ) + 8 set-ushort 0
+ invalid offset table-row ( 6 2 ) + 8 set-ushort 0x9999
+
+ #Interface cannot have .ctors (15)
+ #method 3 belongs to an inteface
+ invalid offset table-row ( 6 3 ) + 8 set-ushort read.ushort ( table-row ( 6 0 ) + 8 )
+ #Interfacre methods can't be static
+ invalid offset table-row ( 6 3 ) + 6 or-ushort 0x0010
+
+ #XXX we don't care about CLS names (17)
+
+ #signature shall be good (18)
+ invalid offset table-row ( 6 2 ) + 10 set-ushort 0x9999
+
+ #TODO type kind check for valuetypes (21)
+ #TODO implement duplicate detection (22)
+
+ #if (final,newslot or stric) then it must be virtual (24)
+ #final
+ valid offset table-row ( 6 2 ) + 6 set-ushort 0x0060
+ invalid offset table-row ( 6 2 ) + 6 set-ushort 0x0020
+
+ #newslot
+ valid offset table-row ( 6 2 ) + 6 set-ushort 0x0140
+ invalid offset table-row ( 6 2 ) + 6 set-ushort 0x0100
+
+ #strict
+ valid offset table-row ( 6 2 ) + 6 set-ushort 0x0240
+ invalid offset table-row ( 6 2 ) + 6 set-ushort 0x0200
+
+ #if pinvoke then it must not be virtual (25)
+ #this is a pretty stupid test as all pinvokes must be static, which disallows virtual
+ #method 5 is a pinvoke
+ invalid offset table-row ( 6 5 ) + 6 or-ushort 0x0040
+
+ #if !abstract then only one of: rva != 0, pinvoke or implruntime (26)
+ #pinvoke with rva != 0
+ invalid offset table-row ( 6 5 ) set-uint read.uint ( table-row ( 6 2 ) )
+
+ #pinvoke with runtime
+ #LAMEIMPL/SPEC either MS ignores it or the spec is ill defined
+ #invalid offset table-row ( 6 5 ) + 4 or-ushort 0x1000
+
+ #if compilercontroled (0x0) it must have an RVA or a pinvoke
+ #let's change method 3 which is part of an interface
+ invalid offset table-row ( 6 3 ) + 6 set-ushort 0x05c0
+
+ #TODO check signature (28,29,30,31,32,33)
+
+ #if RVA = 0 then one of (abstract, runtime, pinvoke) (34)
+ #let's test with an abstract class, method 6 is abstract and belongs to one.
+ invalid offset table-row ( 6 7 ) + 6 set-ushort 0x0006
+ #icall
+ valid offset table-row ( 6 7 ) + 6 set-ushort 0x01c6 , offset table-row ( 6 7 ) + 4 or-ushort 0x1000
+
+ #if rva != 0 then abstract == 0 and codetypemask must be (native,cil,runtime) and rva shall be valid (35)
+ #rva != 0 and abstract == 0
+ invalid offset table-row ( 6 2 ) + 6 or-ushort 0x0400
+ #rva != 0 and codetypemask == OPTIL
+ invalid offset table-row ( 6 2 ) + 4 set-ushort 0x0002
+ #invalid rva
+ invalid offset table-row ( 6 2 ) set-uint 0x999999
+
+ #if pinvoke the rva == 0 and has a row in implmap (36)
+ #method 5 is a pinvoke
+ #pinvoke with rva !=0
+ invalid offset table-row ( 6 5 ) set-uint 0x20f8
+ #pinvoke without an implmap row
+ invalid offset table-row ( 0x1C 0 ) + 2 set-ushort 0xF
+
+ #if rtspecialname = 1 then name must be: .ctor and .cctor (37)
+ #is not .ctor or .cctor
+ invalid offset table-row ( 6 2 ) + 6 or-ushort 0x1800
+
+ #.ctor or .cctor without rtspecialname (38)
+ #method 9 is .ctor method 10 is .cctor
+ invalid offset table-row ( 6 9 ) + 6 set-ushort 0x0006
+ invalid offset table-row ( 6 10 ) + 6 set-ushort 0x0016
+
+ #TODO do all .ctor and .cctor valdiation (39, 40)
+}
+
+methoddef-table-global-methods {
+ assembly assembly-with-global-method.exe
+
+ #checks for methods owned by <module> (20)
+
+ #static + public
+ valid offset table-row ( 6 0 ) + 6 set-ushort 0x0010
+ #static + private
+ valid offset table-row ( 6 0 ) + 6 set-ushort 0x0011
+ #static + compiler controled
+ valid offset table-row ( 6 0 ) + 6 set-ushort 0x0016
+
+ #must be static
+ invalid offset table-row ( 6 0 ) + 6 set-ushort 0x0006
+
+ #must not be abstract
+ invalid offset table-row ( 6 0 ) + 6 set-ushort 0x0416
+
+ #must not be virtual
+ invalid offset table-row ( 6 0 ) + 6 set-ushort 0x0056
+
+ #can only be compiler controled, public or private
+ #which leaves out: famandassem assem family famorassem
+ #LAMEIMPL MS doesn't care about those bits.
+ invalid offset table-row ( 6 0 ) + 6 set-ushort 0x0012
+ invalid offset table-row ( 6 0 ) + 6 set-ushort 0x0013
+ invalid offset table-row ( 6 0 ) + 6 set-ushort 0x0014
+ invalid offset table-row ( 6 0 ) + 6 set-ushort 0x0015
+}
+
+methoddef-table-params {
+ assembly assembly-with-methods.exe
+
+ #method 12,13,14 have 3 params and params: 2,5,8
+ #method 13 has 3 params and params: 5
+ invalid offset table-row ( 6 12 ) + 12 set-ushort 6
+ invalid offset table-row ( 6 13 ) + 12 set-ushort 99
+}
+
+
+param-table {
+ assembly assembly-with-params.exe
+
+ #Flags should only have valid bits (3)
+ #bits not used: 2,3,5,6,7,8,910,11,14,15
+ invalid offset table-row ( 8 0 ) set-bit 2
+ invalid offset table-row ( 8 0 ) set-bit 3
+ invalid offset table-row ( 8 0 ) set-bit 5
+ invalid offset table-row ( 8 0 ) set-bit 6
+ invalid offset table-row ( 8 0 ) set-bit 7
+ invalid offset table-row ( 8 0 ) set-bit 8
+ invalid offset table-row ( 8 0 ) set-bit 9
+ invalid offset table-row ( 8 0 ) set-bit 10
+ invalid offset table-row ( 8 0 ) set-bit 11
+ invalid offset table-row ( 8 0 ) set-bit 14
+ invalid offset table-row ( 8 0 ) set-bit 15
+
+ #TODO verify if sequence is < number of params, requires to decode signature (4)
+
+ #ordering
+ valid offset table-row ( 8 0 ) + 2 set-ushort 0
+ invalid offset table-row ( 8 0 ) + 2 set-ushort 2
+ invalid offset table-row ( 8 1 ) + 2 set-ushort 1
+
+
+ #if HasDefault = 1 then there must be a row in the constant table (6)
+ #param 2 doesn't have a default
+ invalid offset table-row ( 8 2 ) or-ushort 0x1000
+
+ #if HasDefault = 0 then there must be no row in the constant table (7)
+ #param 0 have a default
+ invalid offset table-row ( 8 0 ) set-ushort 0x000
+
+ #if FieldMarshal = 1 the there must be a row in the FieldMarshal table
+ invalid offset table-row ( 8 1 ) set-ushort 0x2000
+
+ invalid offset table-row ( 8 1 ) + 4 set-ushort 0x99999
+ #ok to be empty
+ valid offset table-row ( 8 1 ) + 4 set-ushort 0
+}
+
+interfaceimpl-table {
+ assembly assembly-with-complex-type.exe
+
+ #class cannot be null (2)
+ #LAMEIMPL MS allows a null class
+ valid offset table-row ( 9 0 ) set-ushort 0
+
+ #class must be a valid row (3.a)
+ invalid offset table-row ( 9 0 ) set-ushort 0x9999
+
+ #interface must be a valid token (3.b)
+ #null
+ invalid offset table-row ( 9 0 ) + 2 set-ushort 0
+ #invalid table bit 0x3
+ invalid offset table-row ( 9 0 ) + 2 set-ushort 0x7
+ #invalid token typedef
+ invalid offset table-row ( 9 0 ) + 2 set-ushort 0x8800
+ #invalid token typeref
+ invalid offset table-row ( 9 0 ) + 2 set-ushort 0x8801
+ #invalid token typespec
+ invalid offset table-row ( 9 0 ) + 2 set-ushort 0x8802
+
+ #TODO verify if the target is an interface (3.c)
+
+}
+
+memberref-table {
+ assembly assembly-with-complex-type.exe
+
+ #class must be a valid token (1 2)
+ #null
+ invalid offset table-row ( 10 0 ) set-ushort 0
+ #invalid coded table
+ invalid offset table-row ( 10 0 ) set-ushort 0x0015
+ invalid offset table-row ( 10 0 ) set-ushort 0x0016
+ invalid offset table-row ( 10 0 ) set-ushort 0x0017
+ #invalid code index
+ invalid offset table-row ( 10 0 ) set-ushort 0x1000
+ invalid offset table-row ( 10 0 ) set-ushort 0x1001
+ invalid offset table-row ( 10 0 ) set-ushort 0x1002
+ invalid offset table-row ( 10 0 ) set-ushort 0x1003
+ invalid offset table-row ( 10 0 ) set-ushort 0x1004
+
+ #name must be valid and non-empty (3)
+ invalid offset table-row ( 10 0 ) + 2 set-ushort 0x0000
+ invalid offset table-row ( 10 0 ) + 2 set-ushort 0x9900
+
+ #signature must be valid (5)
+ invalid offset table-row ( 10 0 ) + 4 set-ushort 0x9900
+
+
+ #TODO validate the signature (5)
+
+ #LAMESPEC CompilerControled visibility (9,10) is nice but no impl care about
+
+ #LAMESPEC what does (11) mean?
}
+constant-table {
+ assembly assembly-with-constants.exe
+
+ #type must be one of (bool, char, i1, u1, i2, u2, i4, u4, i8, u8, r4, r8, string or class
+ #class must have value zero (1)
+ #this means (type >= 0x02 && type <= 0x0e) or (type == 0x12 && value == 0)
+ #bad type
+ invalid offset table-row ( 0xB 0 ) set-byte 0x00
+ invalid offset table-row ( 0xB 0 ) set-byte 0x01
+ invalid offset table-row ( 0xB 0 ) set-byte 0x01
+ invalid offset table-row ( 0xB 0 ) set-byte 0x0F
+ invalid offset table-row ( 0xB 0 ) set-byte 0x10
+ invalid offset table-row ( 0xB 0 ) set-byte 0x11
+ invalid offset table-row ( 0xB 0 ) set-byte 0x13
+ invalid offset table-row ( 0xB 0 ) set-byte 0x20
+
+ #type == class && value != 0
+ invalid offset table-row ( 0xB 2 ) set-byte 0x12 , offset table-row ( 0xB 2 ) + 4 set-ushort 0x0001
+
+ #parent is a valid row in the field, property or param table (3)
+ #Test for a property with a valid default value
+ #First remove default from param 'a' (param table idx 0)
+ #Then set the has default flag in the property table
+ #Finally, make the first constant point from the part to the property (const 1, prop 0, token 0x6)
+ valid offset table-row ( 0x8 0 ) set-ushort 0 , offset table-row ( 0x17 0 ) or-ushort 0x1000 , offset table-row ( 0xB 1 ) + 2 set-ushort 0x6
+
+ #Invalid coded table
+ invalid offset table-row ( 0xB 0 ) + 2 set-ushort 0x0013 , offset table-row ( 0x04 0 ) set-ushort 0x16
+ #null
+ invalid offset table-row ( 0xB 0 ) + 2 set-ushort 0x0000 , offset table-row ( 0x04 0 ) set-ushort 0x16
+ #bad field
+ invalid offset table-row ( 0xB 0 ) + 2 set-ushort 0x00F0 , offset table-row ( 0x04 0 ) set-ushort 0x16
+ #bad param
+ invalid offset table-row ( 0xB 0 ) + 2 set-ushort 0x00F1 , offset table-row ( 0x04 0 ) set-ushort 0x16
+ #bad property
+ invalid offset table-row ( 0xB 0 ) + 2 set-ushort 0x00F2 , offset table-row ( 0x04 0 ) set-ushort 0x16
+
+ #TODO check for dups
+
+ #TODO check value range
+ #we set it to 1 less the end of the blob heap
+ invalid offset table-row ( 0xB 0 ) + 4 set-ushort read.uint ( stream-header ( 3 ) + 4 )
+
+ #LAMEIMPL, MS doesn't bound check the constant size. Lame of them.
+ invalid offset table-row ( 0xB 0 ) + 4 set-ushort read.uint ( stream-header ( 3 ) + 4 ) - 1
+}
+
+cattr-table {
+ assembly assembly-with-cattr.exe
+
+ #parent is a valid coded index (2)
+ #The spec say any table can be used, but only 19 tables are allowed on the coded token
+ #bad table
+ invalid offset table-row ( 0xC 0 ) set-ushort 0x33
+ invalid offset table-row ( 0xC 0 ) set-ushort 0x34
+ invalid offset table-row ( 0xC 0 ) set-ushort 0x35
+ invalid offset table-row ( 0xC 0 ) set-ushort 0x36
+
+ #LAMEIMPL MS doesn't test this error
+ invalid offset table-row ( 0xC 0 ) set-ushort 0x37
+ #LAMEIMPL MS doesn't test this error
+ invalid offset table-row ( 0xC 0 ) set-ushort 0x38
+
+ invalid offset table-row ( 0xC 0 ) set-ushort 0x39
+ invalid offset table-row ( 0xC 0 ) set-ushort 0x3A
+ invalid offset table-row ( 0xC 0 ) set-ushort 0x3B
+ invalid offset table-row ( 0xC 0 ) set-ushort 0x3C
+ invalid offset table-row ( 0xC 0 ) set-ushort 0x3D
+ invalid offset table-row ( 0xC 0 ) set-ushort 0x3E
+ invalid offset table-row ( 0xC 0 ) set-ushort 0x3F
+
+ #bad index
+ invalid offset table-row ( 0xC 0 ) set-ushort 0x8801
+ invalid offset table-row ( 0xC 0 ) set-ushort 0x8832
+
+ #type is a valid token (3)
+ #this uses 3 bits and only 0x2/0x3 are valid
+ invalid offset table-row ( 0xC 0 ) + 2 set-ushort 0x0008
+ invalid offset table-row ( 0xC 0 ) + 2 set-ushort 0x0009
+ valid offset table-row ( 0xC 0 ) + 2 set-ushort 0x000A
+ valid offset table-row ( 0xC 0 ) + 2 set-ushort 0x000B
+ invalid offset table-row ( 0xC 0 ) + 2 set-ushort 0x000C
+ invalid offset table-row ( 0xC 0 ) + 2 set-ushort 0x000D
+ invalid offset table-row ( 0xC 0 ) + 2 set-ushort 0x000E
+ invalid offset table-row ( 0xC 0 ) + 2 set-ushort 0x000F
+
+ #value is optional (4)
+ valid offset table-row ( 0xC 0 ) + 4 set-ushort 0
+
+ #Valid is a valid blob index (5)
+ invalid offset table-row ( 0xC 0 ) + 4 set-ushort 0x8888
+
+ #TODO validate the cattr blob (6,7,8,9)
+ #TODO verify is Type is a .ctor.
+}
+
+field-marshal-table {
+ assembly assembly-with-complex-type.exe
+
+ #part must be valid (2)
+ #LAMEIMPL MS doesn't verify for null
+ invalid offset table-row ( 0xd 0 ) set-ushort 0x0000 , offset table-row ( 0x4 5 ) set-ushort 0x0001
+ invalid offset table-row ( 0xd 0 ) set-ushort 0x8800 , offset table-row ( 0x4 5 ) set-ushort 0x0001
+ invalid offset table-row ( 0xd 0 ) set-ushort 0x8801 , offset table-row ( 0x4 5 ) set-ushort 0x0001
+
+ #native type must index non null valid blob index (3)
+ #LAMEIMPL MS doesn't verify for null
+ invalid offset table-row ( 0xd 0 ) + 2 set-ushort 0
+ invalid offset table-row ( 0xd 0 ) + 2 set-ushort 0x9900
+
+ #TODO check for dups (4)
+
+ #TODO check the marshalspec blob (5)
+}
+
+decl-security-table {
+ assembly assembly-with-cas.exe
+
+ #bad parent (2)
+ invalid offset table-row ( 0xe 0 ) + 2 set-ushort 0x0000
+ invalid offset table-row ( 0xe 0 ) + 2 set-ushort 0x0007
+ invalid offset table-row ( 0xe 0 ) + 2 set-ushort 0x1000
+ invalid offset table-row ( 0xe 0 ) + 2 set-ushort 0x1001
+ invalid offset table-row ( 0xe 0 ) + 2 set-ushort 0x1002
+
+ #bad permission set (6)
+ invalid offset table-row ( 0xe 0 ) + 4 set-ushort 0x8800
+}
+
+class-layout-table {
+ assembly assembly-with-complex-type.exe
+
+ #valid parent row (2)
+ invalid offset table-row ( 0xF 0 ) + 6 set-ushort 0x0000
+ invalid offset table-row ( 0xF 0 ) + 6 set-ushort 0x0880
+
+ #TODO check that the type is not an interface (2)
+ #TODO parent must not have auto layout (3)
+
+ #packing must be (0,1,2,4,8,16,32,64,128) (4)
+ invalid offset table-row ( 0xF 0 ) set-ushort 0x0003
+
+ #TODO do checks depending on the kind of parent (4)
+
+ #Check layout along the inheritance chain. (7)
+}
+
+field-layout-table {
+ assembly assembly-with-complex-type.exe
+
+ #TODO check properties of the field (2, 5, 7, 8, 9)
+
+ #Field must be valid (4)
+ invalid offset table-row ( 0x10 0 ) + 4 set-ushort 0x0000
+ invalid offset table-row ( 0x10 0 ) + 4 set-ushort 0x8800
+
+}
+
+stand-alone-sig-table {
+ assembly assembly-with-complex-type.exe
+
+ #signature has a valid blob index (2)
+
+ #TODO validate the blob content. (3)
+ invalid offset table-row ( 0x11 0 ) set-ushort 0x8800
+
+}
+
+event-map-table {
+ assembly assembly-with-events.exe
+
+ #parent must be a valid typedef token
+ invalid offset table-row ( 0x12 0 ) set-ushort 0x8800
+
+ #bad eventlist
+ invalid offset table-row ( 0x12 0 ) + 2 set-ushort 0x0000
+ invalid offset table-row ( 0x12 0 ) + 2 set-ushort 0x8800
+
+ #eventlist must not be duplicated and increase monotonically
+ #evt list is 1,3,7 we change the first to 4
+ invalid offset table-row ( 0x12 0 ) + 2 set-ushort 4
+}
+
+event-table {
+ assembly assembly-with-events.exe
+
+ #event flags have valid bits (3)
+ #only bits 9 and 10 are used
+
+ invalid offset table-row ( 0x14 0 ) set-bit 0
+ invalid offset table-row ( 0x14 0 ) set-bit 1
+ invalid offset table-row ( 0x14 0 ) set-bit 2
+ invalid offset table-row ( 0x14 0 ) set-bit 3
+ invalid offset table-row ( 0x14 0 ) set-bit 4
+ invalid offset table-row ( 0x14 0 ) set-bit 5
+ invalid offset table-row ( 0x14 0 ) set-bit 6
+ invalid offset table-row ( 0x14 0 ) set-bit 7
+ invalid offset table-row ( 0x14 0 ) set-bit 8
+ invalid offset table-row ( 0x14 0 ) set-bit 11
+ invalid offset table-row ( 0x14 0 ) set-bit 12
+ invalid offset table-row ( 0x14 0 ) set-bit 13
+ invalid offset table-row ( 0x14 0 ) set-bit 14
+ invalid offset table-row ( 0x14 0 ) set-bit 15
+
+ #name is a valid non empty string (4)
+ invalid offset table-row ( 0x14 0 ) + 2 set-ushort 0
+ invalid offset table-row ( 0x14 0 ) + 2 set-ushort 0x8880
+
+ #event type can be null (6)
+ valid offset table-row ( 0x14 0 ) + 4 set-ushort 0
+
+ #event type is valid (7)
+ #coded table 0x3 is invalid
+ invalid offset table-row ( 0x14 0 ) + 4 set-ushort 0x7
+ invalid offset table-row ( 0x14 0 ) + 4 set-ushort 0x8880
+ invalid offset table-row ( 0x14 0 ) + 4 set-ushort 0x8881
+ invalid offset table-row ( 0x14 0 ) + 4 set-ushort 0x8882
+
+ #TODO eventtype must be a class (8)
+
+ #TODO for each row, there shall be one add_ and one remove_ row in methodsemantics (9)
+ #change AddOn to Other
+ invalid offset table-row ( 0x18 0 ) set-ushort 0x0004
+ #change RemoveOn to Other
+ invalid offset table-row ( 0x18 1 ) set-ushort 0x0004
+
+ #TODO for each row, there can be zero or one raise_ rows (10)
+
+ #TODO check for dups
+}
+
+property-map-table {
+ assembly assembly-with-properties.exe
+
+ #parent must be a valid typedef token
+ invalid offset table-row ( 0x15 0 ) set-ushort 0x8800
+
+ #bad propertylist
+ invalid offset table-row ( 0x15 0 ) + 2 set-ushort 0x0000
+ invalid offset table-row ( 0x15 0 ) + 2 set-ushort 0x8800
+
+ #propertylist must not be duplicated and increase monotonically
+ #property list is 1,3,7 we change the first to 4
+ invalid offset table-row ( 0x15 0 ) + 2 set-ushort 4
+}
+
+property-table {
+ assembly assembly-with-properties.exe
+
+ #valid flags (3)
+ #only bits 9, 10 and 12 are used
+ invalid offset table-row ( 0x17 0 ) set-bit 0
+ invalid offset table-row ( 0x17 0 ) set-bit 1
+ invalid offset table-row ( 0x17 0 ) set-bit 2
+ invalid offset table-row ( 0x17 0 ) set-bit 3
+ invalid offset table-row ( 0x17 0 ) set-bit 4
+ invalid offset table-row ( 0x17 0 ) set-bit 5
+ invalid offset table-row ( 0x17 0 ) set-bit 6
+ invalid offset table-row ( 0x17 0 ) set-bit 7
+ invalid offset table-row ( 0x17 0 ) set-bit 8
+ invalid offset table-row ( 0x17 0 ) set-bit 11
+ invalid offset table-row ( 0x17 0 ) set-bit 13
+ invalid offset table-row ( 0x17 0 ) set-bit 14
+ invalid offset table-row ( 0x17 0 ) set-bit 15
+
+ #valid non empty name (4)
+ invalid offset table-row ( 0x17 0 ) + 2 set-ushort 0
+ invalid offset table-row ( 0x17 0 ) + 2 set-ushort 0x8800
+
+ #type must be a non null type signature in the blob heap (6)
+ invalid offset table-row ( 0x17 0 ) + 4 set-ushort 0
+ invalid offset table-row ( 0x17 0 ) + 4 set-ushort 0x8800
+
+ #TODO signature must be of the right kind (7)
+
+ #if property has default, there must be a row in the defaults table
+ #we mark row zero as having default value
+ #field zero has default value
+ valid offset table-row (0x17 0) + 0 or-ushort 0x1000, #mark the property with hasdefault
+ offset table-row (0x04 0) + 0 set-ushort 0x0011, #clear literal and hasdefault from the field
+ offset table-row (0x0B 0) + 2 set-ushort 0x0006 #change the parent token to row 1 of the property table (0x2)
+
+ invalid offset table-row (0x17 0) + 0 or-ushort 0x1000
+
+ #TODO check for dups
+}
+
+methodimpl-table {
+ assembly assembly-with-complex-type.exe
+
+ #class shall be valid (2)
+ invalid offset table-row (0x19 0) set-ushort 0
+ invalid offset table-row (0x19 0) set-ushort 0x8800
+
+ #methodbody shall be valid (3)
+ #null
+ invalid offset table-row (0x19 0) + 2 set-ushort 0x0000
+ invalid offset table-row (0x19 0) + 2 set-ushort 0x0001
+ #out of range
+ invalid offset table-row (0x19 0) + 2 set-ushort 0x8800
+ invalid offset table-row (0x19 0) + 2 set-ushort 0x8801
+
+ #MethodDeclaration shall be valid
+ #null
+ invalid offset table-row (0x19 0) + 4 set-ushort 0x0000
+ invalid offset table-row (0x19 0) + 4 set-ushort 0x0001
+ #out of range
+ invalid offset table-row (0x19 0) + 4 set-ushort 0x8800
+ invalid offset table-row (0x19 0) + 4 set-ushort 0x8801
+
+
+ #TODO check MethodDeclaration method for virtual and owner type for !sealed (4,5)
+ #TODO check MethodBody for belonging to a super type of Class,been virtual and rva != 0 (6,7,8)
+ #TODO check MethodBody must belong to any ancestor or iface of Class (9)
+ #TODO check MethodDeclaration method shall not be final (10)
+ #TODO if MethodDeclaration is strict, it must be visible to Class (11)
+ #TODO the method signature of MethodBody must match of MethodDeclaration (12)
+ #TODO no dups
+}
+
+moduleref-table {
+ assembly assembly-with-module.exe
+
+ #string must be valid (2)
+ invalid offset table-row (0x1A 0) set-ushort 0
+ invalid offset table-row (0x1A 0) set-ushort 0x8801
+
+ #TODO there must be a row on the File table with the same name
+}
+
+typespec-table {
+ assembly assembly-with-complex-type.exe
+
+ #valid signature
+ invalid offset table-row (0x1B 0) set-ushort 0
+ invalid offset table-row (0x1B 0) set-ushort 0x8800
+}
+
+implmap-table {
+ assembly assembly-with-methods.exe
+
+ #flags has good values (2)
+ #used bits: 0,1,2,7,8,9,10
+ invalid offset table-row (0x1C 0) set-bit 3
+ invalid offset table-row (0x1C 0) set-bit 4
+ invalid offset table-row (0x1C 0) set-bit 5
+ invalid offset table-row (0x1C 0) set-bit 6
+ invalid offset table-row (0x1C 0) set-bit 11
+ invalid offset table-row (0x1C 0) set-bit 12
+ invalid offset table-row (0x1C 0) set-bit 13
+ invalid offset table-row (0x1C 0) set-bit 14
+ invalid offset table-row (0x1C 0) set-bit 15
+
+ #call conv 0 and 6 are invalid
+ invalid offset table-row (0x1C 0) set-ushort 0x0000
+ invalid offset table-row (0x1C 0) set-ushort 0x0600
+ invalid offset table-row (0x1C 0) set-ushort 0x0700
+
+ #memberforwarded token is valid and indexes a method (3)
+ #pinvoke is row 5
+ invalid offset table-row (0x1C 0) + 2 set-ushort 0x0000, #null
+ offset table-row (0x06 5) + 6 set-ushort 0x0444 #set method to abstract instead of pinvoke
+ invalid offset table-row (0x1C 0) + 2 set-ushort 0x0002, #field
+ offset table-row (0x06 5) + 6 set-ushort 0x0444 #set method to abstract instead of pinvoke
+ invalid offset table-row (0x1C 0) + 2 set-ushort 0x8801, #bad method
+ offset table-row (0x06 5) + 6 set-ushort 0x0444 #set method to abstract instead of pinvoke
+
+ #charset rule is not required (4)
+
+ #import name must be valid (5)
+ invalid offset table-row (0x1C 0) + 4 set-ushort 0x0000 #null
+ invalid offset table-row (0x1C 0) + 4 set-ushort 0x8800 #invalid
+
+ #import scope must be valie (6)
+ invalid offset table-row (0x1C 0) + 6 set-ushort 0x0000 #null
+ invalid offset table-row (0x1C 0) + 6 set-ushort 0x8800 #invalid
+
+ #TODO check methoddef for pinvokeimpl and state (7)
+}
+
+fieldrva-table {
+ assembly assembly-with-complex-type.exe
+
+ #rva non zero (1)
+ invalid offset table-row (0x1D 0) set-uint 0
+ #valid rva (2)
+ invalid offset table-row (0x1D 0) set-uint 0x88880000
+
+ #valid field (4)
+ #field 17 has rva
+ invalid offset table-row (0x1D 0) + 4 set-ushort 0,
+ offset table-row (0x04 17) set-ushort 0x0013 #remove fieldrva from target field
+ invalid offset table-row (0x1D 0) + 4 set-ushort 0x9901,
+ offset table-row (0x04 17) set-ushort 0x0013
+
+
+ #TODO verify if the field is a blitable valuetype
+ #TODO verify if the field.size + rva does boundcheck
+}
+
+assembly-table {
+ assembly simple-assembly.exe
+
+ #The table can have zero or 1 row (1)
+ #rows
+ invalid offset tables-header + 40 set-uint 2,
+ offset stream-header (0) + 4 set-uint read.uint (stream-header (0) + 4) + 22 #increase the size of the #~ section
+
+ #bad hasalg (2)
+ valid offset table-row (0x20 0) set-uint 0
+ valid offset table-row (0x20 0) set-uint 0x8003
+ valid offset table-row (0x20 0) set-uint 0x8004
+ invalid offset table-row (0x20 0) set-uint 0x8005
+ invalid offset table-row (0x20 0) set-uint 1
+
+ #good flags (4)
+ #only bits 0, 8, 14 and 15 are used
+ invalid offset table-row (0x20 0) + 12 set-bit 1
+ invalid offset table-row (0x20 0) + 12 set-bit 5
+ invalid offset table-row (0x20 0) + 12 set-bit 9
+ invalid offset table-row (0x20 0) + 12 set-bit 11
+ invalid offset table-row (0x20 0) + 12 set-bit 16
+ invalid offset table-row (0x20 0) + 12 set-bit 20
+ invalid offset table-row (0x20 0) + 12 set-bit 23
+ invalid offset table-row (0x20 0) + 12 set-bit 26
+ invalid offset table-row (0x20 0) + 12 set-bit 29
+ invalid offset table-row (0x20 0) + 12 set-bit 30
+ invalid offset table-row (0x20 0) + 12 set-bit 31
+
+
+ #valid pub key (5)
+ valid offset table-row (0x20 0) + 16 set-ushort 0
+ invalid offset table-row (0x20 0) + 16 set-ushort 0x9990
+
+ #name is a valid non-empty string (5)
+ invalid offset table-row (0x20 0) + 18 set-ushort 0
+ invalid offset table-row (0x20 0) + 18 set-ushort 0x9990
+
+ #culture is an optional valid non-empty string (8)
+ valid offset table-row (0x20 0) + 20 set-ushort 0
+ invalid offset table-row (0x20 0) + 20 set-ushort 0x9990
+
+ #TODO check if culture is one of the listed cultures (9) (23.1.3)
+}
+
+assembly-ref-table {
+ assembly simple-assembly.exe
+
+ #flags can only have publickey set (2)
+ valid offset table-row (0x23 0) + 8 set-uint 0
+ valid offset table-row (0x23 0) + 8 set-uint 1
+ invalid offset table-row (0x23 0) + 8 set-uint 0x0100
+ invalid offset table-row (0x23 0) + 8 set-uint 0x4000
+ invalid offset table-row (0x23 0) + 8 set-uint 0x8000
+ invalid offset table-row (0x23 0) + 8 set-bit 2
+ invalid offset table-row (0x23 0) + 8 set-bit 5
+ invalid offset table-row (0x23 0) + 8 set-bit 9
+ invalid offset table-row (0x23 0) + 8 set-bit 20
+ invalid offset table-row (0x23 0) + 8 set-bit 22
+ invalid offset table-row (0x23 0) + 8 set-bit 30
+
+ #PublicKeyToken is valid (3)
+ valid offset table-row (0x23 0) + 12 set-ushort 0
+ invalid offset table-row (0x23 0) + 12 set-ushort 0x9700
+
+ #name is a valid non-empty string (5)
+ invalid offset table-row (0x23 0) + 14 set-ushort 0x9700
+ invalid offset table-row (0x23 0) + 14 set-ushort 0
+
+ #culture is an optional valid non-empty string (6)
+ valid offset table-row (0x23 0) + 16 set-ushort 0
+ invalid offset table-row (0x23 0) + 16 set-ushort 0x9990
+
+ #TODO check if culture is one of the listed cultures (7) (23.1.3)
+
+ #HashValue is an optinal valid blob item (9)
+ valid offset table-row (0x23 0) + 18 set-ushort 0
+ invalid offset table-row (0x23 0) + 18 set-ushort 0x9990
+
+ #it's ok to have dups
+}
+
+file-table {
+ assembly assembly-with-resource.exe
+
+ #flags is valid (1)
+ #only bit 0 is valid
+ invalid offset table-row (0x26 0) set-bit 1
+ invalid offset table-row (0x26 0) set-bit 4
+ invalid offset table-row (0x26 0) set-bit 6
+ invalid offset table-row (0x26 0) set-bit 8
+ invalid offset table-row (0x26 0) set-bit 11
+ invalid offset table-row (0x26 0) set-bit 17
+ invalid offset table-row (0x26 0) set-bit 22
+ invalid offset table-row (0x26 0) set-bit 27
+ invalid offset table-row (0x26 0) set-bit 29
+ invalid offset table-row (0x26 0) set-bit 31
+
+ #name is a non empty string (2)
+ invalid offset table-row (0x26 0) + 4 set-ushort 0
+ invalid offset table-row (0x26 0) + 4 set-ushort 0x9999
+
+ #hash is a valid blob item (3)
+ invalid offset table-row (0x26 0) + 6 set-ushort 0
+ invalid offset table-row (0x26 0) + 6 set-ushort 0x9999
+
+ #TODO check name format (I belive only the lack of directory directives should be checked)
+ #TODO check for dups based on name
+ #TODO check for images with rows in file and assembly tables
+}
+
+exported-type-table {
+ assembly assembly-with-module.exe
+
+ #flags is valid (it's a TypeAttribute flag set) (3)
+ #Flags invalid bits: 6,9,14,15,19,21,24-31
+ invalid offset table-row (0x27 0) set-bit 6 #this is a mysterious bit on MS
+ invalid offset table-row (0x27 0) set-bit 9
+ invalid offset table-row (0x27 0) set-bit 14
+ invalid offset table-row (0x27 0) set-bit 15
+ invalid offset table-row (0x27 0) set-bit 19
+ valid offset table-row (0x27 0) set-bit 21 #this is the non specified FORWARDER bit
+ invalid offset table-row (0x27 0) set-bit 24
+ invalid offset table-row (0x27 0) set-bit 25
+ invalid offset table-row (0x27 0) set-bit 26
+ invalid offset table-row (0x27 0) set-bit 27
+ invalid offset table-row (0x27 0) set-bit 28
+ invalid offset table-row (0x27 0) set-bit 29
+ invalid offset table-row (0x27 0) set-bit 30
+ invalid offset table-row (0x27 0) set-bit 31
+
+ #type 0 is toplevel
+ #type 1 is nested
+ #if Implementation points to file table visibility must be public (4)
+ #invalid offset table-row (0x27 0) set-uint 0x100005 #LAMEIMPL/SPEC this check is not really relevant
+
+ #if Implementation points to exported type table visibility must be nested public (5)
+ #invalid offset table-row (0x27 1) set-uint 0x100005 #LAMEIMPL/SPEC this check is not really relevant
+
+ #typename is a valid non-empty string (7)
+ invalid offset table-row (0x27 0) + 8 set-ushort 0
+ invalid offset table-row (0x27 0) + 8 set-ushort 0x9900
+
+ #typenamedpace is a valid string (8,9)
+ invalid offset table-row (0x27 0) + 10 set-ushort 0x9900
+
+ #nested types must have an empty typenamespace (11)
+ valid offset table-row (0x27 1) + 10 set-ushort 0
+ invalid offset table-row (0x27 1) + 10 set-ushort 1 #LAMEIMPL ms doesn't check this.
+
+ #12 implementation is a valid non empty token (12)
+ invalid offset table-row (0x27 0) + 12 set-ushort 0
+ invalid offset table-row (0x27 0) + 12 set-ushort 0x8880
+
+ #TODO check if a type in the exported table is not defined in the current module (2)
+ #TODO check if target type is valid and public (6)
+ #TODO check for dups (14,15,16)
+}
+
+manifest-resource-table {
+ assembly assembly-with-resource.exe
+
+ #flags must have a valid value (3)
+ #only bits 0-2 are used
+ invalid offset table-row (0x28 0) + 4 set-bit 3
+ invalid offset table-row (0x28 0) + 4 set-bit 7
+ invalid offset table-row (0x28 0) + 4 set-bit 16
+ invalid offset table-row (0x28 0) + 4 set-bit 31
+
+ #inly 0x1 and 0x2 are valid visibility values (4)
+ invalid offset table-row (0x28 0) + 4 set-uint 0
+ invalid offset table-row (0x28 0) + 4 set-uint 3
+ invalid offset table-row (0x28 0) + 4 set-uint 4
+ invalid offset table-row (0x28 0) + 4 set-uint 5
+ invalid offset table-row (0x28 0) + 4 set-uint 6
+ invalid offset table-row (0x28 0) + 4 set-uint 7
+
+ #name shall index a valid non-empty (5)
+ invalid offset table-row (0x28 0) + 8 set-ushort 0
+ invalid offset table-row (0x28 0) + 8 set-ushort 0x9900
+
+ #if implementation is null the offset is a valid offset based on cli resource entry (7)
+ valid offset table-row (0x28 0) + 10 set-ushort 0,
+ offset table-row (0x28 0) + 0 set-uint 1
+
+ #LAMEIMPL it doesn't check the resource offset!
+ invalid offset table-row (0x28 0) + 10 set-ushort 0,
+ offset table-row (0x28 0) + 0 set-uint 0x990000
+
+
+ #implementation is a valid token (8)
+ #does it accept exported type?
+ invalid offset table-row (0x28 0) + 10 set-ushort 0x0006
+
+ #coded table 4 is invalid
+ invalid offset table-row (0x28 0) + 10 set-ushort 0x0007
+ #bad index
+ invalid offset table-row (0x28 0) + 10 set-ushort 0x8800
+ invalid offset table-row (0x28 0) + 10 set-ushort 0x8801
+
+ #if implementation point to a file it's index must be zero (10)
+ #row 0 is a file resource
+ invalid offset table-row (0x28 0) set-uint 1
+
+ #TODO check for dups (9)
+}
+
+nested-class-table {
+ assembly assembly-with-complex-type.exe
+
+ #both nested and enclosing classes must index valid non-null rows in the typedef table (2,3)
+ invalid offset table-row (0x29 0) set-ushort 0
+ invalid offset table-row (0x29 0) set-ushort 0x9800
+
+ invalid offset table-row (0x29 0) + 2 set-ushort 0
+ invalid offset table-row (0x29 0) + 2 set-ushort 0x9800
+
+ invalid offset table-row (0x29 0) + 2 set-ushort read.ushort (table-row (0x29 0))
+
+ #TODO check for dups based on nestedclass (5)
+}
+
+
+generic-param-table {
+ assembly assembly-with-generics.exe
+
+ #bad flags
+ #only 0-4 are used
+ invalid offset table-row (0x2A 0) + 2 set-bit 5
+ invalid offset table-row (0x2A 0) + 2 set-bit 6
+ invalid offset table-row (0x2A 0) + 2 set-bit 7
+ invalid offset table-row (0x2A 0) + 2 set-bit 8
+ invalid offset table-row (0x2A 0) + 2 set-bit 9
+ invalid offset table-row (0x2A 0) + 2 set-bit 10
+ invalid offset table-row (0x2A 0) + 2 set-bit 11
+ invalid offset table-row (0x2A 0) + 2 set-bit 12
+ invalid offset table-row (0x2A 0) + 2 set-bit 13
+ invalid offset table-row (0x2A 0) + 2 set-bit 14
+ invalid offset table-row (0x2A 0) + 2 set-bit 15
+
+ #variance 0x3 is invalid
+ invalid offset table-row (0x2A 0) + 2 set-ushort 0x3
+
+ #bad or null owner
+ invalid offset table-row (0x2A 0) + 4 set-ushort 0
+ invalid offset table-row (0x2A 0) + 4 set-ushort 0x8800
+ invalid offset table-row (0x2A 0) + 4 set-ushort 0x8801
+
+ #bad or empty name
+ invalid offset table-row (0x2A 0) + 6 set-ushort 0
+ invalid offset table-row (0x2A 0) + 6 set-ushort 0x8800
+
+ #wrong order
+ invalid offset table-row (0x2A 0) set-ushort 1,
+ offset table-row (0x2A 1) set-ushort 0
+
+ #not monotonically growing
+ invalid offset table-row (0x2A 0) set-ushort 0,
+ offset table-row (0x2A 1) set-ushort 0
+
+ #start big
+ invalid offset table-row (0x2A 0) set-ushort 1,
+ offset table-row (0x2A 1) set-ushort 2
+
+ #step bigger than 1
+ invalid offset table-row (0x2A 0) set-ushort 0,
+ offset table-row (0x2A 1) set-ushort 2
+}
+
+method-spec-table {
+ assembly assembly-with-generics.exe
+
+ #method is a valid token
+ invalid offset table-row (0x2B 0) set-ushort 0
+ invalid offset table-row (0x2B 0) set-ushort 0x8800
+ invalid offset table-row (0x2B 0) set-ushort 0x8801
+
+ #instantiation is invalid
+
+ invalid offset table-row (0x2B 0) + 2 set-ushort 0
+ invalid offset table-row (0x2B 0) + 2 set-ushort 0xABCD
+
+ #TODO check the content of the blob sig and validate against the token.
+}
+
+generic-param-constraint-table {
+ assembly assembly-with-generics.exe
+
+ #owner is a valid rown in the gparam table
+ invalid offset table-row (0x2C 0) set-ushort 0x0000
+ invalid offset table-row (0x2C 0) set-ushort 0x2345
+
+ #constaint is a valid token
+ invalid offset table-row (0x2C 0) + 2 set-ushort 0x0000
+ invalid offset table-row (0x2C 0) + 2 set-ushort 0x0007
+ invalid offset table-row (0x2C 0) + 2 set-ushort 0x8800
+ invalid offset table-row (0x2C 0) + 2 set-ushort 0x8801
+ invalid offset table-row (0x2C 0) + 2 set-ushort 0x8802
+
+ #TODO check for dups and sorting.
+}