【发布时间】:2009-10-25 00:39:03
【问题描述】:
根据分区 II 元数据,它说有效字段是一个位掩码,它指出了 .NET 可执行文件中存在哪些 CLR 元数据表——但我不知道“排序”字段是什么for--它的意义是什么?在创建我自己的 .NET 可移植可执行映像时,我应该在这个字段中发出什么?
【问题讨论】:
标签: .net clr metadata low-level
根据分区 II 元数据,它说有效字段是一个位掩码,它指出了 .NET 可执行文件中存在哪些 CLR 元数据表——但我不知道“排序”字段是什么for--它的意义是什么?在创建我自己的 .NET 可移植可执行映像时,我应该在这个字段中发出什么?
【问题讨论】:
标签: .net clr metadata low-level
我认为排序字段只是提示特定元数据表是否已排序(它是一个位字段,就像有效一样)。
这将允许运行时的实现直接从 memmapped 数据中对表进行二进制搜索。
【讨论】:
编辑:这不是答案,我将问题误认为是关于 Valid 字段而不是 Sorted 字段,但我将其留在这里以防它与答案相关
您所说的“有效”字段在Partition II, §24.2.6 中有描述,相关部分如下:
有效字段是一个 64 位的位向量,它为存储在流中的每个表设置了一个特定的位;表到索引的映射在第 22 节的开头给出。例如,当逻辑元数据中存在 DeclSecurity 表时,应在 Valid 向量中设置位 0x0e。 Valid 中包含不存在的表是无效的,因此 0x2c 以上的所有位都应为零。
从第 22.2 节开始的第 22 节的每个小节都描述了一个表,并给出了它的位索引。例如,§22.2 的标题为“Assembly: 0x20”。这意味着,当且仅当第 22.2 节中描述的汇编表存在于您的 PE 中时,必须在 Valid 字段中设置位 0x20。注意这里NOT表示Valid & 0x20 == 0x20,表示Valid的第0x20位(即第32位)必须设置,即Valid & (1 << 0x20) == (1 << 0x20)。
有一段时间我不确定它是 0 索引还是 1 索引,所以我假设它是 0 索引。但我现在确定它是 0 索引的,因为 Module 表是表 0x00。
【讨论】: