パーティション II メタデータによると、有効なフィールドは、.NET 実行可能ファイルに存在する CLR メタデータ テーブルを示すビットマスクであると書かれていますが、「並べ替えられた」フィールドが何のためにあるのかはわかりません。 .NET ポータブル実行可能イメージを独自に作成する場合、このフィールドには何を出力する必要がありますか?
2 に答える
ソートされたフィールドは、特定のメタデータ テーブルがソートされているかどうかを示しているだけだと思います (有効なのと同じようにビットフィールドです)。
これにより、ランタイムの実装で、memmap されたデータから直接テーブルでバイナリ検索を実行できるようになります。
EDIT:これは答えではありません。私は質問をSortedフィールドではなくValidフィールドに関するものと誤解していますが、答えに関連している場合に備えてここに残しています
あなたが話している「有効な」フィールドは、Partition II、§24.2.6 で説明されており、関連する部分は次のとおりです。
Valid フィールドは、ストリームに格納されるテーブルごとに特定のビットが設定された 64 ビットのビットベクトルです。テーブルからインデックスへのマッピングは、§22 の冒頭に記載されています。たとえば、論理メタデータに DeclSecurity テーブルが存在する場合、Valid ベクトルにビット 0x0e を設定する必要があります。存在しないテーブルを Valid に含めることは無効であるため、0x2c より上のすべてのビットは 0 になります。
§22.2 で始まるセクション 22 の各サブセクションでは、1 つのテーブルについて説明し、そのビット インデックスを示します。たとえば、§22.2 のタイトルは「Assembly: 0x20」です。これは、§22.2 で説明されている Assembly テーブルが PE に存在する場合にのみ、Valid
フィールドにビット 0x20 を設定する必要があることを意味します。これは、 の 0x20 番目 (つまり、32 番目) のビットを設定する必要があることを意味するわけではないことに注意してください。Valid & 0x20 == 0x20
Valid
Valid & (1 << 0x20) == (1 << 0x20)
しばらくの間、それが 0 インデックスか 1 インデックスかわからなかったので、0 インデックスと仮定しました。しかし、Module テーブルはテーブル 0x00 であるため、インデックスが 0 であることは確かです。