“〜”中的排序位向量字段的目的是什么? .NET程序集中的元数据头?
题
根据Partition II元数据,它说有效字段是一个位掩码,用于指出.NET可执行文件中存在哪些CLR元数据表 - 但我无法弄清楚的是“已排序”的内容。字段是为了什么 - 它的意义是什么,以及在创建我自己的.NET可移植可执行映像时我应该在这个字段中发出什么?
解决方案
我认为排序字段只是暗示特定元数据表是否已排序(它是一个有效的位域)。
这将允许实现运行时直接从memmapped数据对表进行二进制搜索。
其他提示
编辑:这不是一个答案,我误解了问题是关于有效字段而不是排序字段,但我将它留在这里,以防它与答案相关
“有效”您正在谈论的字段在分区II ,#167; 24.2.6,相关部分如下:
有效字段是64位位向量,它为存储在流中的每个表设置了特定的位;表格到索引的映射在§ 22的开头给出。例如,当逻辑元数据中存在DeclSecurity表时,应在有效向量中设置位0x0e。在Valid中包含不存在的表是无效的,因此0x2c以上的所有位都应为零。
以§ 22.2开头的第22节的每个子节描述一个表,并给出其位索引。例如,§ 22.2标题为“Assembly:0x20”。这意味着,当且仅当您的PE中存在§ 22.2中描述的汇编表时,必须在 Valid
字段中设置位0x20。请注意, NOT 表示 Valid& 0x20 == 0x20
,这意味着必须设置 Valid
的第0x20位(即第32位),也就是说 Valid&amp; (1&lt;&lt;&lt; 0x20)==(1&lt; <0x20)
。
有一段时间我不确定它是0索引还是1索引,所以我假设0索引。但我现在肯定知道它是0索引的,因为Module表是表0x00。