3

根据分区 II 元数据,它说有效字段是一个位掩码,它记录了 .NET 可执行文件中存在哪些 CLR 元数据表——但我不知道“排序”字段的用途是什么——它的意义是什么?在创建自己的 .NET 可移植可执行映像时,我应该向该字段发出什么信息?

4

2 回答 2

1

我认为排序字段只是提示特定元数据表是否已排序(它是一个位域,就像有效一样)。

这将允许运行时的实现直接从 memmap 数据中对表进行二进制搜索。

于 2009-10-25T02:03:01.463 回答
0

编辑:这不是答案,我将问题误读为关于 Valid 字段而不是 Sorted 字段,但我将其留在这里以防它与答案有关

您正在谈论的“有效”字段在Partition II §24.2.6 中进行了描述,相关部分如下:

Valid 字段是一个 64 位的位向量,它为存储在流中的每个表设置了一个特定的位;表到索引的映射在第 22 节的开头给出。例如,当逻辑元数据中存在 DeclSecurity 表时,应在 Valid 向量中设置位 0x0e。在 Valid 中包含不存在的表是无效的,因此 0x2c 以上的所有位都应为零。

第 22 节中从第 22.2 节开始的每一小节都描述了一个表,并给出了它的位索引。例如,§22.2 的标题为“Assembly: 0x20”。这意味着,当且仅当第 22.2 节中描述的组装表存在于您的 PE 中时,必须在该Valid字段中设置位 0x20。请注意,这并不意味着,而是必须设置Valid & 0x20 == 0x20的第 0x20 位(即第 32 位) ,即。ValidValid & (1 << 0x20) == (1 << 0x20)

有一段时间我不确定它是 0-indexed 还是 1-indexed,所以我假设 0-indexed。但我现在确定它是 0 索引的,因为 Module 表是表 0x00。

于 2009-10-25T01:15:02.997 回答