1 <?xml version=
"1.0" encoding=
"iso-8859-1"?>
4 <xsl:stylesheet version=
"1.0" xmlns:
xsl=
"http://www.w3.org/1999/XSL/Transform">
6 <xsl:import href=
"gen-utils.xsl"/>
8 <xsl:output method=
"text"/>
11 <!-- ******************************************************************* -->
13 <xsl:template match=
"/">// Auto-generated file - DO NOT EDIT!
14 // Please edit md-schema.xml or tabs-decoder.xsl if you want to make changes.
18 namespace Mono.PEToolkit.Metadata {
25 public sealed class TabsDecoder {
36 public static MDToken DecodeToken(CodedTokenId id, int data)
38 MDToken res = new MDToken();
46 <xsl:for-each select=
"md-schema/coded-tokens/map">
47 case CodedTokenId.
<xsl:value-of select=
"@name"/> :
48 tag = data
& 0x
<xsl:value-of select=
"substring('000103070F1F3F7FFF',1 + (2 * @bits),2)"/>;
49 rid = (int) ((uint) data
>> <xsl:value-of select=
"@bits"/>);
51 <xsl:for-each select=
"table">
52 <xsl:variable name=
"tok-type">
54 <xsl:when test=
"boolean(@token-type)">
55 <xsl:value-of select=
"@token-type"/>
58 <xsl:value-of select=
"@name"/>
62 case
<xsl:value-of select=
"@tag"/> :
63 tok = TokenType.
<xsl:value-of select=
"$tok-type"/>;
67 throw new BadMetaDataException(
"Invalid coded token for <xsl:value-of select="@name
"/>, unknown table tag - " + tag);
69 res = new MDToken(tok, rid);
82 private static int GetCodedIndexSize(TablesHeap heap, CodedTokenId id, int [] rows)
89 <xsl:for-each select=
"md-schema/coded-tokens/map">
90 case CodedTokenId.
<xsl:value-of select=
"@name"/> :
91 res = MDUtils.Max(
<xsl:call-template name=
"get-tables-list"/>);
92 res = res
< (
1 << (
16 -
<xsl:value-of select=
"@bits"/>)) ?
2 :
4;
105 private static int GetIndexSize(TableId tab, int [] rows)
107 // Index is
2 bytes wide if table has less than
2^
16 rows
108 // otherwise it's
4 bytes wide.
109 return ((uint) rows [(int) tab]) < (
1 <<
16) ?
2 :
4;
113 private static void AllocBuff(ref byte [] buff, int size)
115 if (buff == null || buff.Length < size) {
116 buff = new byte [(size +
4) & ~
3];
118 Array.Clear(buff,
0, size);
124 unsafe public static int DecodePhysicalTables(TablesHeap heap, byte [] data, int offs, int [] rows)
126 int rowSize; // expanded row size (all indices are dwords)
127 int fldSize; // physical field size
131 int si = heap.StringsIndexSize;
132 int gi = heap.GUIDIndexSize;
133 int bi = heap.BlobIndexSize;
136 <xsl:apply-templates select=
"md-schema/tables/table"/>
150 <!-- ******************************************************************* -->
151 <xsl:template name=
"get-tables-list">
152 <xsl:param name=
"map-node" select=
"."/>
154 <xsl:for-each select=
"$map-node/table">
156 <xsl:when test=
"@name = 'String'"><!-- HACK -->
157 <xsl:text>(heap.StringsIndexSize
> 2 ?
1 << 17 :
1)
</xsl:text>
160 <xsl:text>rows [(int) TableId.
</xsl:text><xsl:value-of select=
"@name"/><xsl:text>]
</xsl:text>
163 <xsl:if test=
"position() != last()">
164 <xsl:text>,
</xsl:text>
173 <!-- ******************************************************************* -->
174 <xsl:template name=
"get-field-size">
175 <xsl:param name=
"type" select=
"@type"/>
178 <!-- RVA special case, PE library type -->
179 <xsl:when test=
"$type = 'RVA'">
180 <xsl:text>RVA.Size
</xsl:text>
182 <!-- #Strings, #Blob or #GUID -->
183 <xsl:when test=
"contains($type,'#')">
185 <xsl:when test=
"contains(substring-after($type, '#'), 'Strings')">
186 <xsl:text>si
</xsl:text>
188 <xsl:when test=
"contains(substring-after($type, '#'), 'Blob')">
189 <xsl:text>bi
</xsl:text>
191 <xsl:when test=
"contains(substring-after($type, '#'), 'GUID')">
192 <xsl:text>gi
</xsl:text>
195 <xsl:text>ERROR: Unknown index -
</xsl:text>
196 <xsl:value-of select=
"$type"/>
200 <!-- table indices -->
201 <xsl:when test=
"starts-with($type,'index')">
202 <xsl:variable name=
"tab">
203 <xsl:call-template name=
"extract-arg"/>
205 <xsl:value-of select=
"concat('GetIndexSize(TableId.', $tab, ', rows)')"/>
207 <!-- coded tokens -->
208 <xsl:when test=
"starts-with($type,'coded-index')">
209 <xsl:variable name=
"tab">
210 <xsl:call-template name=
"extract-arg"/>
212 <xsl:value-of select=
"concat('GetCodedIndexSize(heap, CodedTokenId.', $tab, ', rows)')"/>
215 <xsl:value-of select=
"concat('sizeof (', $type, ')')"/>
223 <!-- ******************************************************************* -->
224 <xsl:template match=
"md-schema/tables/table">
225 if (heap.Has
<xsl:value-of select=
"@name"/>) {
226 rowSize =
<xsl:call-template name=
"get-expanded-size"/>;
227 nRows = rows [(int) TableId.
<xsl:value-of select=
"@name"/>];
228 AllocBuff(ref buff, rowSize * nRows);
231 MDTable tab = new
<xsl:value-of select=
"@name"/>Table(heap);
233 for (int i = nRows; --i
>=
0;) {
234 <xsl:for-each select=
"schema/field">
235 <xsl:variable name=
"fld-size">
236 <xsl:call-template name=
"get-field-size"/>
238 <xsl:variable name=
"exp-fld-size">
239 <xsl:call-template name=
"get-expanded-size">
240 <xsl:with-param name=
"fields" select=
"."/>
243 //
<xsl:value-of select=
"@name"/>,
<xsl:value-of select=
"@type"/>
244 fldSize =
<xsl:value-of select=
"$fld-size"/>;
245 Array.Copy(data, offs, buff, dest, fldSize);
247 dest +=
<xsl:value-of select=
"$exp-fld-size"/>;
251 tab.FromRawData(buff,
0, nRows);