¿Cuál es el propósito del campo de vector de bits ordenado en el encabezado de metadatos “~” en un ensamblado .NET?

StackOverflow https://stackoverflow.com/questions/1619614

  •  06-07-2019
  •  | 
  •  

Pregunta

De acuerdo con los metadatos de la Partición II, dice que el campo válido es una máscara de bits que indica qué tablas de metadatos de CLR están presentes en un ejecutable .NET, pero lo que no puedo entender es qué está "ordenado". campo es para: ¿cuál es su importancia y qué debo emitir en este campo al crear mis propias imágenes ejecutables portátiles .NET?

¿Fue útil?

Solución

Creo que el campo ordenado solo indica si la tabla de metadatos específica está ordenada o no (es un campo de bits como válido).

Esto permitiría una implementación de un tiempo de ejecución para realizar una búsqueda binaria en la tabla directamente desde los datos de memmapped.

Otros consejos

EDITAR: Esto no es una respuesta, leo mal la pregunta porque se trata del campo válido en lugar del campo ordenado, pero lo dejo aquí en caso de que esté relacionado con la respuesta

El " Válido " el campo del que habla se describe en Partition II , & # 167; 24.2.6, con la parte relevante como sigue:

  

El campo Válido es un vector de bits de 64 bits que tiene un bit específico establecido para cada tabla que se almacena en el flujo; la asignación de tablas a índices se da al comienzo de & # 167; 22. Por ejemplo, cuando la tabla DeclSecurity está presente en los metadatos lógicos, el bit 0x0e debe establecerse en el vector válido. No es válido incluir tablas no existentes en Válido, por lo que todos los bits por encima de 0x2c serán cero.

Cada subsección de la sección 22 que comienza con & # 167; 22.2 describe una tabla y proporciona su índice de bits. Por ejemplo, & # 167; 22.2 se titula " Asamblea: 0x20 " Esto significa que, si y solo si la tabla de ensamblaje descrita en & # 167; 22.2 está presente en su PE, entonces el bit 0x20 debe establecerse en el campo Valid . Tenga en cuenta que esto significa que NO significa que Válido & amp; 0x20 == 0x20 , significa que se debe establecer el bit 0x20 (es decir, el 32) de Valid , es decir, Valid & amp; (1 < < 0x20) == (1 < < 0x20) .

Por un tiempo no estaba seguro de si era 0 indexado o 1 indexado, así que asumí 0 indexado. Pero ahora estoy seguro de que está indexado en 0, porque la tabla del módulo es la tabla 0x00.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top