35 const int bufferLength = 2048;
37 readonly Stream stream;
38 readonly
byte[] buffer =
new byte[bufferLength];
40 int pos = bufferLength;
49 base(module, (heapSizes & 0x01) != 0, (heapSizes & 0x02) != 0, (heapSizes & 0x04) != 0)
54 void FillBuffer(
int needed)
56 int count = bufferLength - pos;
60 Buffer.BlockCopy(buffer, pos, buffer, 0, count);
65 while (count < needed)
67 var len = stream.Read(buffer, count, bufferLength - count);
69 throw new BadImageFormatException();
74 if (count != bufferLength)
78 Buffer.BlockCopy(buffer, 0, buffer, bufferLength - count, count);
79 pos = bufferLength - count;
83 internal ushort ReadUInt16()
85 return (ushort)ReadInt16();
88 internal short ReadInt16()
90 if (pos > bufferLength - 2)
93 var b1 = buffer[pos++];
94 var b2 = buffer[pos++];
95 return (
short)(b1 | (b2 << 8));
98 internal int ReadInt32()
100 if (pos > bufferLength - 4)
103 var b1 = buffer[pos++];
104 var b2 = buffer[pos++];
105 var b3 = buffer[pos++];
106 var b4 = buffer[pos++];
107 return b1 | (b2 << 8) | (b3 << 16) | (b4 << 24);
110 int ReadIndex(
bool big)
112 return big ? ReadInt32() : ReadUInt16();
115 internal int ReadStringIndex()
117 return ReadIndex(bigStrings);
120 internal int ReadGuidIndex()
122 return ReadIndex(bigGuids);
125 internal int ReadBlobIndex()
127 return ReadIndex(bigBlobs);
130 internal int ReadResolutionScope()
132 var codedIndex = ReadIndex(bigResolutionScope);
133 return (codedIndex & 3)
switch
135 0 => (ModuleTable.Index << 24) + (codedIndex >> 2),
136 1 => (ModuleRefTable.Index << 24) + (codedIndex >> 2),
137 2 => (AssemblyRefTable.Index << 24) + (codedIndex >> 2),
138 3 => (TypeRefTable.Index << 24) + (codedIndex >> 2),
139 _ =>
throw new BadImageFormatException(),
143 internal int ReadTypeDefOrRef()
145 var codedIndex = ReadIndex(bigTypeDefOrRef);
146 return (codedIndex & 3)
switch
148 0 => (TypeDefTable.Index << 24) + (codedIndex >> 2),
149 1 => (TypeRefTable.Index << 24) + (codedIndex >> 2),
150 2 => (TypeSpecTable.Index << 24) + (codedIndex >> 2),
151 _ =>
throw new BadImageFormatException(),
155 internal int ReadMemberRefParent()
157 var codedIndex = ReadIndex(bigMemberRefParent);
158 return (codedIndex & 7)
switch
160 0 => (TypeDefTable.Index << 24) + (codedIndex >> 3),
161 1 => (TypeRefTable.Index << 24) + (codedIndex >> 3),
162 2 => (ModuleRefTable.Index << 24) + (codedIndex >> 3),
163 3 => (MethodDefTable.Index << 24) + (codedIndex >> 3),
164 4 => (TypeSpecTable.Index << 24) + (codedIndex >> 3),
165 _ =>
throw new BadImageFormatException(),
169 internal int ReadHasCustomAttribute()
171 var codedIndex = ReadIndex(bigHasCustomAttribute);
172 return (codedIndex & 31)
switch
174 0 => (MethodDefTable.Index << 24) + (codedIndex >> 5),
175 1 => (FieldTable.Index << 24) + (codedIndex >> 5),
176 2 => (TypeRefTable.Index << 24) + (codedIndex >> 5),
177 3 => (TypeDefTable.Index << 24) + (codedIndex >> 5),
178 4 => (ParamTable.Index << 24) + (codedIndex >> 5),
179 5 => (InterfaceImplTable.Index << 24) + (codedIndex >> 5),
180 6 => (MemberRefTable.Index << 24) + (codedIndex >> 5),
181 7 => (ModuleTable.Index << 24) + (codedIndex >> 5),
182 8 => (DeclSecurityTable.Index << 24) + (codedIndex >> 5),
183 9 => (PropertyTable.Index << 24) + (codedIndex >> 5),
184 10 => (EventTable.Index << 24) + (codedIndex >> 5),
185 11 => (StandAloneSigTable.Index << 24) + (codedIndex >> 5),
186 12 => (ModuleRefTable.Index << 24) + (codedIndex >> 5),
187 13 => (TypeSpecTable.Index << 24) + (codedIndex >> 5),
188 14 => (AssemblyTable.Index << 24) + (codedIndex >> 5),
189 15 => (AssemblyRefTable.Index << 24) + (codedIndex >> 5),
190 16 => (FileTable.Index << 24) + (codedIndex >> 5),
191 17 => (ExportedTypeTable.Index << 24) + (codedIndex >> 5),
192 18 => (ManifestResourceTable.Index << 24) + (codedIndex >> 5),
193 19 => (GenericParamTable.Index << 24) + (codedIndex >> 5),
194 20 => (GenericParamConstraintTable.Index << 24) + (codedIndex >> 5),
195 21 => (MethodSpecTable.Index << 24) + (codedIndex >> 5),
196 _ =>
throw new BadImageFormatException(),
200 internal int ReadCustomAttributeType()
202 var codedIndex = ReadIndex(bigCustomAttributeType);
203 return (codedIndex & 7)
switch
205 2 => (MethodDefTable.Index << 24) + (codedIndex >> 3),
206 3 => (MemberRefTable.Index << 24) + (codedIndex >> 3),
207 _ =>
throw new BadImageFormatException(),
211 internal int ReadMethodDefOrRef()
213 var codedIndex = ReadIndex(bigMethodDefOrRef);
214 return (codedIndex & 1)
switch
216 0 => (MethodDefTable.Index << 24) + (codedIndex >> 1),
217 1 => (MemberRefTable.Index << 24) + (codedIndex >> 1),
218 _ =>
throw new BadImageFormatException(),
222 internal int ReadHasConstant()
224 var codedIndex = ReadIndex(bigHasConstant);
225 return (codedIndex & 3)
switch
227 0 => (FieldTable.Index << 24) + (codedIndex >> 2),
228 1 => (ParamTable.Index << 24) + (codedIndex >> 2),
229 2 => (PropertyTable.Index << 24) + (codedIndex >> 2),
230 _ =>
throw new BadImageFormatException(),
234 internal int ReadHasSemantics()
236 var codedIndex = ReadIndex(bigHasSemantics);
237 return (codedIndex & 1)
switch
239 0 => (EventTable.Index << 24) + (codedIndex >> 1),
240 1 => (PropertyTable.Index << 24) + (codedIndex >> 1),
241 _ =>
throw new BadImageFormatException(),
245 internal int ReadHasFieldMarshal()
247 var codedIndex = ReadIndex(bigHasFieldMarshal);
248 return (codedIndex & 1)
switch
250 0 => (FieldTable.Index << 24) + (codedIndex >> 1),
251 1 => (ParamTable.Index << 24) + (codedIndex >> 1),
252 _ =>
throw new BadImageFormatException(),
256 internal int ReadHasDeclSecurity()
258 var codedIndex = ReadIndex(bigHasDeclSecurity);
259 return (codedIndex & 3)
switch
261 0 => (TypeDefTable.Index << 24) + (codedIndex >> 2),
262 1 => (MethodDefTable.Index << 24) + (codedIndex >> 2),
263 2 => (AssemblyTable.Index << 24) + (codedIndex >> 2),
264 _ =>
throw new BadImageFormatException(),
268 internal int ReadTypeOrMethodDef()
270 var codedIndex = ReadIndex(bigTypeOrMethodDef);
271 return (codedIndex & 1)
switch
273 0 => (TypeDefTable.Index << 24) + (codedIndex >> 1),
274 1 => (MethodDefTable.Index << 24) + (codedIndex >> 1),
275 _ =>
throw new BadImageFormatException(),
279 internal int ReadMemberForwarded()
281 var codedIndex = ReadIndex(bigMemberForwarded);
282 return (codedIndex & 1)
switch
284 0 => (FieldTable.Index << 24) + (codedIndex >> 1),
285 1 => (MethodDefTable.Index << 24) + (codedIndex >> 1),
286 _ =>
throw new BadImageFormatException(),
290 internal int ReadImplementation()
292 var codedIndex = ReadIndex(bigImplementation);
293 return (codedIndex & 3)
switch
295 0 => (FileTable.Index << 24) + (codedIndex >> 2),
296 1 => (AssemblyRefTable.Index << 24) + (codedIndex >> 2),
297 2 => (ExportedTypeTable.Index << 24) + (codedIndex >> 2),
298 _ =>
throw new BadImageFormatException(),
302 internal int ReadField()
304 return ReadIndex(bigField);
307 internal int ReadMethodDef()
309 return ReadIndex(bigMethodDef);
312 internal int ReadParam()
314 return ReadIndex(bigParam);
317 internal int ReadProperty()
319 return ReadIndex(bigProperty);
322 internal int ReadEvent()
324 return ReadIndex(bigEvent);
327 internal int ReadTypeDef()
329 return ReadIndex(bigTypeDef) | (TypeDefTable.Index << 24);
332 internal int ReadGenericParam()
334 return ReadIndex(bigGenericParam) | (GenericParamTable.Index << 24);
337 internal int ReadModuleRef()
339 return ReadIndex(bigModuleRef) | (ModuleRefTable.Index << 24);