Estructuras Binarias x86-64

Iniciado por FFernandez, 6 Junio 2020, 21:47 PM

0 Miembros y 2 Visitantes están viendo este tema.

FFernandez

Primera parte:  
Este es un manual indirecto de las estructuras binarias del juego de instrucciones x86-64, está abierto a edición constructiva.
Este prefijo es opcional puede estar presente o no, se enumeran los casos en los que puede estar presente. De momento se representa la forma Hexadecimal del mismo.




// LEGANCY PREFIX

/*
0x66 h     ANULACION DEL TAMAÑO PREDETERMINADO DE OPERANDOS Operand-Size Override   IN 64   PREDETeRMINADO 32----------EFECTIVE 16

0x67h  Address-Size Overrides   IN 64  -----EFECTIVE 32

Ojo  In 64-bit mode, the CS, DS, ES, and SS segment overrides are ignored
0x2Eh  Forces use of current CS segment for memory operands.
0x3Eh Forces use of current DS segment for memory operands.
0x26h Forces use of current ES segment for memory operands.
0x64h Forces use of current FS segment for memory operands.
0x65h Forces use of current GS segment for memory operands.
0x36h Forces use of current SS segment for memory operands.
*/
/*
El prefijo LOCK solo se puede usar con las formas de las siguientes instrucciones que escriben una memoria y: ADC, ADD, AND, BTC, BTR, BTS, CMPXCHG, CMPXCHG8B, CMPXCHG16B, DEC, INC, NEG, NOT, OR, SBB, SUB, XADD, XCHG y XOR. Se produce una excepción de código de operación no válido si el prefijo LOCK se usa con cualquier otra instrucción.
0xF0h LOCK        El byte de prefijo de repetición / bloqueo garantiza que la instrucción tendrá uso exclusivo de toda la memoria compartida, hasta que la instrucción complete la ejecución:


BT, BTS, BTR, BTC                   mem, reg/imm
XCHG                                reg, mem
XCHG                                mem, reg
ADD, OR, ADC, SBB, AND, SUB, XOR    mem, reg/imm
NOT, NEG, INC, DEC                  mem


Prefijos de repetición

Instrucciones que no pueden usar prefijos de repetición. En general, los prefijos de repetición solo se deben usar en las instrucciones de cadena enumeradas en las tablas 1-6, 1-7 y 1-8 . Para otras instrucciones (principalmente instrucciones SIMD), los prefijos 66h, F2h y F3h se usan como modificadores de instrucciones para extender el espacio de codificación de instrucciones en los mapas de código de operación 0Fh, 0F_38h y 0F_3Ah




1-6

REP Prefix Opcodes  (0xF3h) también se usa como prefijo obligatorio para la instrucción POPCNT, LZCNT y ADOX.
Ejemplo: ADOX reg64, reg/mem64              F3 0F 38 F6 /r       Añadir sin firmar con indicador de desbordamiento

       



REP INS reg/mem8, DXREP INSB  F3 6C  
REP INS reg/mem16/32, DXREP INSWREP INSD F3 6D
REP LODS mem8 REP LODSB F3 AC
REP LODS mem16/32/64 REP LODSWREP LODSDREP LODSQ F3 AD
REP MOVS mem8, mem8REP MOVSB F3 A4
REP MOVS mem16/32/64, mem16/32/64 REP MOVSWREP MOVSDREP MOVSQ F3 A5
REP OUTS DX, reg/mem8 REP OUTSB F3 6E
REP OUTS DX, reg/mem16/32 REP OUTSWREP OUTSD F3 6F
REP STOS mem8REP STOSB F3 AA
REP STOS mem16/32/64 REP STOSWREP STOSDREP STOSQ  F3 AB

1-7

REPE and REPZ Prefix Opcodes  ( 0xF3h)
REPx CMPS mem8, mem8REPx CMPSB F3 A6
REPx CMPS mem16/32/64, mem16/32/64 REPx CMPSWREPx CMPSDREPx CMPSQ F3 A7
REPx SCAS mem8 REPx SCASB F3 AE
REPx SCAS mem16/32/64 REPx SCASWREPx SCASDREPx SCASQ F3 AF

1-8
REPNE and REPNZ Prefix Opcodes  (F2)
REPNx CMPS mem8, mem8REPNx CMPSB F2 A6
REPNx CMPS mem16/32/64, mem16/32/64 REPNx CMPSWREPNx CMPSDREPNx CMPSQ F2 A7
REPNx SCAS mem8REPNx SCASBF2 AEREPNx SCAS mem16/32/64 REPNx SCASWREPNx SCASDREPNx SCASQ F2 AF



*/

Segunda Parte


/*
// REX PREFIX
  0X40h a 0X4Fh

¡Este Prefijo no simpre esta presente!

     FORMATO  del Byte REX (0100 WRXB)

Hay que tener en cuenta que hablaremos de un procesador y sistema operativo de 64 bits.

En un sistema de 64 bits el operando predeterminado es de 32 bits.

Si W = 0  implica que no se cambia el tamaño del operando.
Si W= 1   implica que se cambia el tamaño del operando a 64 bits.

R es una extensión del REG del (Byte M0Dr/m)(*)
X es una extensión del Índice del (SIB Byte) ¿si existe? Sino es ignorado (*)
B es una extensión de la BASE del (SIB Byte) ¿si existe? En caso
Contrario es una extensión del r/m del (Byte M0Dr/m)(*)

RexPrefix (40,41,42,43,44,45,46,47,48,49,4A,4B,4C,4D,4E,4F)
Notación      Rex.w = 1        (48 49 4A 4B 4C 4D 4E 4F)  64 bits

   
   
Byte MOD r/m      (MOD 2 bits, REG 3 bits, r/m 3 bits)
SIB Byte                  (Escala 2 bits, Índice 3 bits, Base 3 bits)


Byte MOD r/m




MOD
(00)   direccionamiento indirecto  ojo. No hay desplazamiento
(01)   1 byte de desplazamiento
(10) 4 byte de desplazamiento
(11) direccionamiento directo a registro  ojo. No hay desplazamiento solo Imm...

En estos casos : { "C0", "C8", "D0", "D8", "E0", "EB", "F0", "F8", "C1", "C9", "D1", "D9", "E1", "E9", "F1", "F9", "C2", "CA", "D2", "DA", "E2", "EA", "F2", "FA", "C3", "CB", "D3", "DB", "E3", "EB", "F3", "FB", "C4", "CC", "D4", "DC", "E4", "EC", "F4", "FC", "C5", "CD", "D5", "DD", "E5", "ED", "F5", "FD", "C6", "CE", "D6", "DE", "E6", "EE", "F6", "FE", "C7", "CF", "D7", "DF", "E7", "EF", "F7", "FF" }


REG
de datos(000, 001,010,011)
Punteros de pila(100,101)
Registros de índices(110,111)

r/m                            Direccionamiento efectivo
de datos(000, 001,010,011)  + desplazamiento
(100) indica que existe el    SIB Byte  

SIB Presente { "04", "0C", "14", "1C", "24", "2C", "34", "3C", "44", "4C", "54", "5C", "64", "6C", "74", "7C", "84", "8C", "94", "9C", "A4", "AC", "B4", "BC" }


Si (101) solo hay desplazamiento
En estos casos: { "05", "00", "15", "1D", "25", "2D", "35", "3D" }  mod (00)  Ojo 32 Bits


Registros de índices(110,111) + desplazamiento



 SIB Byte


Escala    (Índice * Escala)Valué          
(00)   =  1
(01)   = 2
(10)            = 4
(11)            = 8


Indece

de datos(000, 001,010,011)
Registros de índices(110,111)
Punteros de pila(101)
(100)      no hacer nada

BASE
de datos(000, 001,010,011)
Registros de índices(110,111)
Punteros de pila(100)
(101)    Solamente desplazamiento si MOD = (00), si MOD =(01) OR (10) Punteros de pila
MOD (11) no utilizado

Direccionamiento efectivo con el SIB Byte
[Índice * Escala]  + desplazamiento(viene predeterminado por MOD del Byte MOD r/m)




¡Ojo!

El direccionamiento de desplazamiento en modo de 64 bits utiliza codificaciones ModR / M y SIB existentes de 32 bits. Los tamaños de desplazamiento ModR / M y SIB no cambian. Permanecen 8 bits o 32 bits y se extienden a 64 bits.


Registros de segmento Predeterminados

El registro de segmento predeterminado es SS para las direcciones efectivas que contienen un índice BP, DS para otras direcciones efectivas

Si    r/m = (010) or (011)   el registro de segmento predeterminado es SS
Si     r/m =(000) or (001) or (100) or (101) or (110) or (111) el registro de segmento predeterminado es  DS

Ejemplo de Mnemonic  ADD  ( Z000 0XDS )

S=0 8bits Operando           S=1 16-32Bits Operando
D=1 Indica que el operando(destino) es el REG del MODr/m
D=0 Indica que el operando(destino) es el indicado por MOD......r/m del MODr/m
¿Si Z=1 y D=0 indica que el tamaño del imm..  esta establecido por S
¿Si Z=1 y D=1 indica que el tamaño de imm.. se extenderá al tamaño del operando
¿Si X=1  indica que el operando es un registro predeterminado Al, AX, EAX RAX segun el tamaño expresado por "S" con sus Prefijos correspondientes si es diferente a 8 o 32 Bits.

Hay que tener en cuenta que el operando predeterminado es de 32 bits
y el Direccionamiento se extiende a 64 bits en sistemas de 64.
imm...  Inmediato Valué
r... Registros generales     AL-8   AX- 16    EAX- 32  RAX- 64 bits    hay 8 en total (AL CL DL BL AH CH DH BH)  
(Inmediato)imm8 = 8 bits         imm16= 16 bits  imm32 = 32 bits etc.....



0x00h     0000 0000      [MOD=(11)  REG=(000)    r/m(000)]= 0x00h           ADD r/m, r8  *                00 (00) r.. variable

Longitud de esta instrucion     1 Byte del OpCode + 1 Byte del MODr/m  Total 2 Bytes

El destino de la operacion es el MODr/m porque lo indica el digito "D"=0
por lo tanto el origen es el REG


MOD =(11) indica que la operacion es de registro a registro.

0x01h     0000 0001        [MOD=(11)  REG=(000)    r/m(000)]= 0xC0h           ADD r/m, r16   *       66  01 (C0) r.. variable
0x02 h     0000 0010        [MOD=(11)  REG=(000)     r/m(000)]= 0xCOh           ADD r8, r/m  *               02  (C0) r .. variable  
0x03h      0000 0011       [MOD=(11)  REG=(000)    r/m(000)]= 0xCOh           ADD r16, r/m   *             66 03 C0  

X=1 Indica que el Operando(Destino) es el registro de uso general predeterminado (AL,AX,EAX,RAX,XMM0)

0x04h      0000 0100     (04) (imm8)         ADD AL, imm8                       modo directo    ok
0x05h     0000 0101           66 05   (imm16)    ADD AX, imm16           modo directo    ok
0x05h      0000 0101     05 (imm32)        ADD EAX, imm32                    modo directo     ok

En el caso Z = 1 el REG del Byte MODr/m (000) es una extensión del OpCODE Z.
El Operando(destino) es siempre el MOD......r/m.


0x80h      1000 0000         [MOD=(00)  REG=(000)   r/m(000)]= 0x00h           ADD r/m, imm8   *
0x81h      1000 0001        [MOD=(00)  REG=(000)     r/m(000)]          ADD r/m, imm16    *      66  81 (80) r..variable
0x81h      1000 0001         [MOD=(00)  REG=(000)    r/m(000)]          ADD r/m, imm32   *
0x83h      1000 0011      [MOD=(00)  REG=(000)     r/m(000)]           ADD r/m, imm8    *   se extiende imm8 a 32bits        


Esto se aplica a todas estas instrucciones aritméticas-lógicas

REG (000) ADD
REG  (001)  OR
REG  (010) ADC
REG  (011) SBB
REG  (100) AND
REG  (101) SUB
REG  (110) XOR
REG  (111) CMP





El byte SIB


Normalmente no está presente. Solo es necesario cuando una instrucción usa el formato de direccionamiento ( Scale * Index + Base). esto solamente lo indica en Byte MODr/m  si el Campo Registro = (100)=REG.
(Escala 2 BITS, Índice 3 bits, Base 3 Bits)


un ejemplo rápido

ADD ecx, [ebx + edi x 4]    = 0x030CBBh
ADD                        MODr/m            SIB
0 0000 0 1 1       00 001 100       10 111 011


Una parte importante es el desplazamiento, mejor un ejemplo:


ADD ebp,[disp32 + eax*1] = 0x03, 0x2C, 0x05, 0x00, 0x00, 0x00, 0x00
       ADD            modR/M           SIB Byte                            Disp32
= 00000011     00 101 100      00 000 101       00000000 00000000 00000000


ADD ebp,[0x11 + eax*1] = 0x03, 0x2C, 0x05,     0x11, 0x00, 0x00, 0x00 Total Bytes 3+4=7

                                                                              Disp32(0x11h)  se desplaza a la izquierda
= 00000011 00 101 100 00 000 101        00010001 00000000 00000000


ADD ebp,[0x11 + 0x11*4] = 0x03, 0x2C, 0x25, 0x55, 0x00, 0x00, 0x00


IMPORTANTICIMO NUNCA PERDER DE VISTA EL MODO DEL SISTEMA OPERATIVO 32 O 64
El ejemplo anterior corre en un sistema de 32 bits. ¿qué ocurre si corre en un sistema de 64 Bits?

    Recordatorio             0x67h  Address-Size Overrides   IN 64  -----EFECTIVE 32  
     
ADD ebp,[0x11 + eax*1] = 0x67, 0x03, 0x2C, 0x05,  0x11, 0x00, 0x00, 0x00 Total Bytes 1+3+4=8

            L-Prefix                ADD           modR/M           SIB Byte                            Disp32

=        01100111        00000011    00 101 100       00 000 101        00010001 00000000 00000000
                                       
Hemos utilizado el EAX 32 bits, si hubieramos utilizado RAX de 64 bis no haria falta el prefijo.



Algunos Valúes  Aritméticos - Lógicos


ADD x,y       xValue= (x+y)

ADC x,y       xValue= (x+y+CF)

SUB x,y       xValue= (x-y)

SBB x,y       xValue= (x-y-CF)

INC x         xValue= (x+1)

DEC x         xValue= (x-1)

NOT x=(0001)  xValue= (1110)  invierte los bits

NEG x=(1110)  xValue= [(0001)+1]= (0010) invierte los bits y le suma 1

OR x,y  x=(1110) y=(0011)   xValue=(1101)  if (bitx=bity) = 0  else = 1

AND x,y x=(1110) y=(0011)   xValue=(0010) if (bitx=1 y bity=1)=1 else =0

CMP x,y   if x=y Then (ZF (zero flag) gets a value=1) else =0

JMP x         Goto x


// VEX y XOP PREFIX

2 Bytes opecode
0xC5h   VEX

11000100     W vvvv L pp    W=0 fijo
map_select  00001         fijo
Implícito X=1 B=1


3 Bytes opecode
0xC4h VEX

11000101     RXB mmmmm       W vvvv L PP

0X8Fh    XOP
10001111     RXB mmmmm      W vvvv L PP


R
R = 1  obligatorio en 32 bits =  rex.r=0
R = 0  64 bits  = rex.r=1
R es una extensión del REG del (Byte M0Dr/m)(*)

X
X = 1   obligatorio en 32 bits
X=0     64 bits    
X es una extensión del Índice del (SIB Byte) ¿si existe? Sino es ignorado (*)

B
B = 1    ignorado en 32 bits                
B=0        64 bits  
B es una extensión de la BASE del (SIB Byte) ¿si existe? En caso
Contrario es una extensión del r/m del (Byte M0Dr/m)(*)


código de operación específico (uso como REX.W, o usado para código de operación
extensión, o ignorado, dependiendo del byte del código de operación)

W         =   REX.W INVERSO
Si W = 1  implica que no se cambia el tamaño del operando.
Si W= 0   implica que se cambia el tamaño del operando a 64 bits.



mmmmm       Mapa Selecionado
VEX
00000  reservado
00001  byte de código de operación inicial 0F implícito          opcode   Mapa 1   2 Byte
00010                                                                   0F 38       opcode  Mapa 2   3 Byte
00011                                                                   0F 3A       opcode  Mapa 3   3 Byte
00100  reservado
11111  reservado

XOP
00000 – 00111  Reservdo
01000 XOP opcode map 8
01001 XOP opcode map 9
01010 XOP opcode map 10
(Ah)01011 – 11111Reserved

vvvv
Es un especificador de registro (en forma de complemento de 1)
o 1111 si no se usa?¿
vvvv
Binary    Register           Binary              Register
0000    XMM15/YMM15      1000          XMM07/YMM07
0001    XMM14/YMM14      1001          XMM06/YMM06
0010    XMM13/YMM13      1010           XMM05/YMM05
0011    XMM12/YMM12      1011           XMM04/YMM04
0100    XMM11/YMM11      1100            XMM03/YMM03
0101     XMM10/YMM10     1101            XMM02/YMM02
0110     XMM09/YMM09     1110            XMM01/YMM01
0111     XMM08/YMM08     1111            XMM00/YMM00



L =0       scalar o 128 bits vector  
L= 1      256 Bits Vector

En Instruciones de Mascara

L=0  2 operandos in mascara
L=1  3 operandos in mascara


PP
Extensión de código de operación que proporciona la funcionalidad equivalente de un prefijo SIMD

00 None
01  66
10  F3
11  F2


VEX Byte 1, el bit [7] contiene un bit análogo a un REX.R invertido. En los modos protegido y de compatibilidad, el bit debe establecerse en "1"; de lo contrario,
la instrucción es LES o LDS.
El bit [6] del byte VEX de 3 bytes codifica un bit análogo a un bit REX.X invertido. Es una extensión del campo Índice SIB en modos de 64 bits. En los modos de 32 bits, este bit debe establecerse en "1"; de lo contrario, la instrucción es LES o LDS. Este bit solo está disponible en el prefijo VEX de 3 bytes. Este bit se
almacena en formato invertido.
El bit [5] del byte VEX de 3 bytes codifica un bit análogo a un REX.B invertido. En los modos de 64 bits, es una extensión del campo ModR / M r / m, o el campo base SIB.
En los modos de 32 bits, este bit se ignora. Este bit solo está disponible en el prefijo VEX de 3 bytes. Este bit se almacena en formato de bit invertido
El bit [7] del byte 2 VEX de 3 bytes está representado por la notación VEX.W. Puede proporcionar las siguientes funciones, dependiendo del código de operación específico.

• Para las instrucciones AVX que tienen instrucciones SSE heredadas equivalentes (por lo general, estas instrucciones SSE tienen un operando de registro de propósito general con su atributo de tamaño de operando promocionable por REX.W), si REX.W promueve el atributo de tamaño de operando del operando de registro de propósito general en la instrucción SSE heredada, VEX.W tiene el mismo significado en la forma equivalente AVX correspondiente. En los modos de 32 bits, VEX.W se ignora en silencio.

• Para las instrucciones AVX que tienen instrucciones SSE heredadas equivalentes (por lo general, estas instrucciones SSE tienen oper-ands con su atributo de tamaño de operando fijo y no promocionable por REX.W), si REX. A W no le importa la instrucción SSE heredada, VEX.W se ignora en la forma equivalente de AVX correspondiente independientemente del modo.

• Para las nuevas instrucciones AVX donde VEX.W no tiene una función definida (por lo general, esto significa la combinación del byte de código de operación y VEX.mmmmm no tenía ninguna función SSE equivalente), VEX.W está reservado como cero y si se configura en un valor distinto de cero, la instrucción será #UD

2 bytes VEX Byte 1, bits [6: 3] y 3 bytes VEX Byte 2, bits [6: 3] - 'vvvv' el Especificador de registro de origen o destino En modo de 32 bits, el primer byte VEX C4 y C5 alias las instrucciones LES y LDS.

Para mantener la compatibilidad con los programas existentes, el segundo byte VEX, los bits [7: 6] deben ser 11b. Para lograr esto, los bits de carga útil VEX se seleccionan para colocar solo campos válidos invertidos de 64 bits (selectores de registro extendido) en estos bits superiores.

El VEX de 2 bytes Byte 1, bits [6: 3] y el VEX de 3 bytes, Byte 2, bits [6: 3] codifican un campo (abreviatura VEX.vvvv) que para instrucciones con 2 o más registros fuente y un XMM o YMM o destino de memoria codifica el primer especificador de registro fuente almacenado en forma invertida (complemento de 1). VEX.vvvv no es utilizado por las instrucciones con una fuente (excepto ciertos turnos, ver más abajo) o en instrucciones sin XMM o YMM o destino de memoria.

Si una instrucción no usa VEX.vvvv, entonces debe establecerse en 1111b; de lo contrario, la instrucción será # UD.
En el modo de 64 bits, se pueden usar los 4 bits. el bit 6 debe ser 1 (si el bit 6 no es 1, la versión VEX de 2 bytes generará instrucción LDS y la versión VEX de 3 bytes ignorará este bit

El campo VEX.vvvv está codificado en formato de bit invertido para acceder a un operando de registro
*/

Continuare pronto.........................

3DNow!™
      Formato y        Opcodes
0x0F0Fh

0Fh 0Fh [ModRM] [SIB] [displacement] imm8_opcode

[/b][/size]

EVEX PREFIX
 
0X62h
R X B r  00 mm
W vvvv 1 pp
z l L b V aaa

PREFIX      62        1º   2º    3º  

mm             selección mapa

PP
Extensión de código de operación que proporciona la funcionalidad equivalente de un prefijo SIMD

00 None
01  66
10  F3
11  F2

RXB         Extensión del M/m, M/r , SIB/b y SIB/índice

r     Extensión del  EVEX.R and ModR/M.reg

X  Extensión del  EVEX.B and ModR/M.rm, SIB/VSIB si esta presente

vvvv
Es un especificador de registro (en forma de complemento de 1)
o 1111 si no se usa?¿

V  Extensión del  EVEX.vvvv , VSIB si esta presente Especificador de registro NDS / VIDX High-16


aaa Especificación de registro de máscara de operaciones integrada
Las instrucciones que requieren aaa <> 000 no permiten que EVEX.z se establezca en 1.

W   extensión de tamaño

Z     enmascaramiento (fusión y puesta a cero)

b            Broadcast/RC/SAE Context
b=1
Instrucciones de FP con redondeo semántico.
Instrucciones de carga + operación con fuente de memoria
b= 0
Para :Otras instrucciones (carga / almacenamiento / difusión / recopilación / dispersión explícitas)


l                Vector length/RC
l L        
00b: 128-bit  01b: 256-bit  10b: 512-bit    11b: Reservado (#UD)





Instrucciones que requieren el vector:       XCR0 Bit Vector [7:0]

Legacy SIMD prefix Instrucciones codificadas (e.g SSE)XMM
xxxxxx11b

VEX- Instrucciones codificadas operando en YMM YMM
xxxxx111b

EVEX-codificadas 128-bit Instrucciones ZMM
111xx111b

EVEX- codificadas 256-bit Instrucciones ZMM
111xx111b

EVEX-encoded 512-bit Instrucciones ZMM
111xx111b

VEX- codificadas  Instrucciones operando en  opmaskk-reg
xx1xxx11b


vmulps zmm1, zmm2, [rax] {1to16}

0x62, 0xF1, 0x6C, 0x58, 0x59, 0x08


   0º         1º         2º         3º    
{ 0x62,    0xF1,    0x6C,   0x58,    0x59,        0x18 }

 pref                                         op/s mapa    r/m


Broadcast  (escalar) r/m


                       
                    zlLbVaaa

58 (1 to 16)    01011000  operando en zmm con reg de 64 bits

18  (1 to 4)    00011000  operando en xmm con reg de 32 bits


AVX-512 Opmask registers


Ejemplo de codificacion completo


Opcode Operando destino, operando, operando field

KANDW k1, k2, k3     modificamos el Operando destino k1

Prefixo VEX  +  W vvvv L pp + Opcode   + M/r
 
c5 ec 41 cb    k1   k2   k3           W vvvv L pp              M/r   11 001 011    k1 = base = 1

KANDW k4, k2, k3
c5 ec 41 e3    k4   k2   k3                                   M/r    11 100  011   k4 = base = 4

KANDW k7, k2, k3
c5 ec 41 fb    k7   k2   k3           1 1101 1 00                     11 111 011   k7 = base = 7



KANDW k1, k2, k3


c5 ec 41 cb    k1   k2   k3           W vvvv L pp              M/r   11 001 011     k3= m/r =3  

KANDW k1, k2, k4

c5 ec 41 cc                                                          11 001 100      k4= m/r =4

KANDW k1, k2, k7                                                      

c5 ec 41 cf                                                          11 001 111      k7= m/r =7    



KANDW k1, k2, k3                      

c5 ec 41 cb                            1 1101 1 00            101 bits invertidos 010 = 2 =k2

KANDW k1, k4, k3

c5 dc 41 cb                            1 1011 1 00            011 bits invertidos 100 = 4 =k4


KANDW k1, k7, k3

c5 c4 41 cb                             1 1000 1 00           000 bits invertidos 111 = 7 =k7


Aqui se codifica el Operando que en este caso no tiene sentido, pero se trata igual.

El Opcode lleva implicito que es una operacion con mascara "Opmask"


                                       




Static Rounding Mode  (EVEX.b = 1)   SAE CONTROL     aqui el Ll indica el round          

vaddps zmm7 {k6}, zmm2, zmm4, {rd-sae}

0x62, 0xF1, 0x6C, 0x3E, 0x58, 0xFC



                     zlLbVaaa
3E   rd-sae     00111110

5e   ru-sae     01011110

1E   rn-sae     00011110

7E   rz-sae     01111110

Analice del código hexadecimal

Instrucción "CMP"     Concretamente "81 /7 Imm?"

Compara Imm?(valor inmediato de 16,32,* en 64 Bit Modo si no alteramos el operando se extiende a 64 bits, claro el direccionamiento es de 64 bits sí o sí) Con r?/m( con Registro o Memoria)
"rip" – Dirección relativa
"PTR"- Puntero a la memoria en este caso (donde leeremos 32 Bits a partir del puntero)
El Operando en 64 bits es 32bits por lo general

Opcode
   81                  /7             disp32           Imm32  
   81                  3D        B90000B9     00 00 02 00
Opcode        Mod/r
                         3D(00  111  101)(modo  /7  disp32)

Ensamblador : DWORD PTR [rip+0XFFFF FFFF B900 00B9],0x20000
Se compara el valor Imm32 con el valor que esta a partir de la dirección "PTR"

Modificador                                               disp32           imm16
      66                    81             3D             B9B90000         02  00
   PREFIX                                3D(00  111  101)(modo  /7  disp32)      

Ensamblador :    WORD PTR [rip+0xB9B9],0x2
Se compara el valor Imm16 con el valor que está a partir de la dirección "PTR"

opcode               Mod/r                                                  Imm32
81                          3E                                                   00000200
                              3E (00 111 110) (Mod    /7     rsi)

Ensamblador :    DWORD PTR [rsi],0x20000

                            Imm32(lectura iz-derecha)                         Imm32(valor)
81  3E                  20 00 02 02                     DWORD PTR [rsi],   0x2 02 00 20
81  3E                  10 00 02 03                      DWORD PTR [rsi],   0x3 02 00 10
81  3E                  12 34 56 78                      DWORD PTR [rsi],   0x78 56 34 12

Con REX
48   81   3D   7F000001     23000004
QWORD PTR [rip+0x1 00 00 7F],0x4 00 00 23  

48 81  3D   7F 00 00 01    23 00 00 40
QWORD PTR [rip+0x100007F],0x40 00 00 23  

Conclusión   0x2 en ensamblador(Representa el valor de 02== 2) = 02(lectura Hexadecimal)


FFernandez

#1
CREANDO DESENSAMBLADOR


PRIMERO LA BASE DE DATOS GENERICA



FFernandez

#2
Segundo:   Base de datos de Instrucciones Documentadas




FFernandez

#3
AMD  Continua   Cancelado




MCKSys Argentina

Está construyendo un testamento...

No sería mejor colocar todo en un repo como GitHub y poner el link?

Más que nada por claridad...

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


FFernandez

Cita de: MCKSys Argentina en 24 Julio 2020, 02:26 AM
Está construyendo un testamento...

No sería mejor colocar todo en un repo como GitHub y poner el link?

Más que nada por claridad...

Saludos!


Tengo casi listo el Testamento de Intel, lo cruzare con el de AMD y publicare solo una base de datos de instruciones conocidas.   si se puede la publico aqui.     Mas adelante publicare funciones que utilizaremos y mas Testamento...........jeje     soy todo oido, gracias

apuromafo CLS

yo sugeriría que abordaras un documento en github o gitlab, o bitbucket o cosas asi, con el tiempo evitas tener que...juntar tantos libros, además las arquitecturas mueven en cantidad de bits, tienes asm de 8, 16, 32, 64...

FFernandez

#7
Estructuras PE  Windows


Código (cpp) [Seleccionar]

using System;
using System.Collections.Generic;
using System.Linq;
public class PE_Formato
{
   
   public static string[] IMAGE_DOS_HEADER_64(string[] DosHeader)

   { // 64 bytes

       string[] Retorno = new string[19];

       Retorno[0] = "e_magic, Firma MZ" + ";" + TotalConversor.HextoStringASCII(DosHeader[0] + DosHeader[1]);

       Retorno[1] = "e_cblp, Bytes Codigo Ultima Pagina" + ";" + TotalConversor.ConVertBaseDecimal( DosHeader[3] + DosHeader[2],16); ;

       Retorno[2] = "e_cp, paginas en archivo" + ";" + TotalConversor.ConVertBaseDecimal(DosHeader[5] + DosHeader[4], 16); ;

       Retorno[3] = "e_crlc, reubicación" + ";" + DosHeader[7] + DosHeader[6];

       Retorno[4] = "e_cparhdr, Tamaño del encabezado en  párrafos" + ";" + TotalConversor.ConVertBaseDecimal(DosHeader[9] + DosHeader[8], 16);  // paragraphs (16 byte chunks)

       Retorno[5] = "e_minalloc, Mínimos párrafos adicionales necesarios" + ";" + TotalConversor.ConVertBaseDecimal(DosHeader[11] + DosHeader[10], 16);

       Retorno[6] = "e_maxalloc, Máximo de párrafos adicionales necesarios" + ";" + TotalConversor.ConVertBaseDecimal(DosHeader[13] + DosHeader[12], 16);

       Retorno[7] = "e_ss, Valor inicial (relativo) SS" + ";" + DosHeader[15] + DosHeader[14];

       Retorno[8] = "e_sp, Valor inicial del SP" + ";" + DosHeader[17] + DosHeader[16];

       Retorno[9] = "e_csum, Checksum" + ";" + DosHeader[18] + DosHeader[19];  //++

       Retorno[10] = "e_ip, Valor IP inicial" + ";" + DosHeader[21] + DosHeader[20];

       Retorno[11] = "e_cs, Valor inicial (relativo) CS" + ";" + DosHeader[23] + DosHeader[22];

       Retorno[12] = "e_lfarlc, Dirección de archivo de la tabla de reubicación INICIO STUB??" + ";" + DosHeader[25] + DosHeader[24];

       Retorno[13] = "e_ovno, Número de superposición" + ";" + DosHeader[27] + DosHeader[26];

       Retorno[14] = "e_res[4]" + ";" + DosHeader[29] + DosHeader[28]; //  34-35

       Retorno[15] = "e_oemid, OEM identificador (para e_oeminfo)" + ";" + DosHeader[37] + DosHeader[36];

       Retorno[16] = "e_oeminfo,  OEM información específico e_oemid " + ";" + DosHeader[39] + DosHeader[38];

       Retorno[17] = "e_res2[10]" + ";" + DosHeader[41] + DosHeader[40];  // 58-59

       Retorno[18] = "Puntero Encabezado PE RVA" + ";" + DosHeader[63] + DosHeader[62] + DosHeader[61] + DosHeader[60];
     

       return Retorno;
   }

   public static string[] IMAGE_FILE_HEADER_24(string[] FileHeader)
   { //

       string[] Retorno = new string[8];

       Retorno[0] = "Signature, firma del archivo en este caso PE00 PE 90 0" + ";" + TotalConversor.HextoStringASCII(FileHeader[0] + FileHeader[1] + FileHeader[2] + FileHeader[3]);

       Retorno[1] = "Machine, Procesador Arquitectura 014C–X86-32 8664-X86-64  0000–todos 0200-IA64" + ";" + FileHeader[5] + FileHeader[4]; //++

       Retorno[2] = "NumberOfSections, Número de secciones" + ";" + TotalConversor.ConVertBaseDecimal(FileHeader[7] + FileHeader[6], 16);

       Retorno[3] = "TimeDateStamp, Los 32 bits bajos del número de segundos desde las 00:00 del 1 de enero de 1970" + ";" + TotalConversor.ConvertExaFechaEsamblado(FileHeader[11] + FileHeader[10] + FileHeader[9] + FileHeader[8]); //++

       Retorno[4] = "PointerToSymbolTable, Pointer A la tabla de símbolos  OBSOLETO IMG 00000000 RVA" + ";" + FileHeader[15] + FileHeader[14] + FileHeader[13] + FileHeader[12];

       Retorno[5] = "NumberOfSymbols, Número de símbolos OBSOLETO IMG 00000000" + ";" + TotalConversor.ConVertBaseDecimal(FileHeader[19] + FileHeader[18]+ FileHeader[17] + FileHeader[16], 16);

       Retorno[6] = "SizeOfOptionalHeader, Tamaño del encabezado opcional  Para archivo de imagen " + ";" + TotalConversor.ConVertBaseDecimal(FileHeader[21] + FileHeader[20], 16);

       Retorno[7] = "Characteristics, Características  ****" + ";" + FileHeader[23] + FileHeader[22]; //++


      return Retorno;
   }  /* TOTAL 24 BYTES */

   public static string[] IMAGE_OPTIONAL_HEADER64_112(string[] OpHeader)
   {
       string[] Retorno = new string[29];

       Retorno[0] = "Magic, 010B -32  020B -64   0107 -ROM  0000 -dual" + ";" + OpHeader[1] + OpHeader[0];

       Retorno[1] = "MajorLinkerVersion, enlazador" + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[2],16);

       Retorno[2] = "MinorLinkerVersion, enlazador" + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[3],16);

       Retorno[3] = "SizeOfCode, tamaño del codigo maquina en todas las secciones" + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[7] + OpHeader[6] + OpHeader[5] + OpHeader[4],16);

       Retorno[4] = "SizeOfInitializedData, tamaño de la sección de datos iniciados" + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[11] + OpHeader[10] + OpHeader[9] + OpHeader[8],16);

       Retorno[5] = "SizeOfUninitializedData, tamaño de la sección de datos no iniciados" + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[15] + OpHeader[14] + OpHeader[13] + OpHeader[12],16);

       Retorno[6] = "AddressOfEntryPoint, dirección de la primera instrucion que se ejecuta en memoria RVA" + ";" + OpHeader[19] + OpHeader[18] + OpHeader[17] + OpHeader[16];

       Retorno[7] = "BaseOfCode,dirección relativa de la base del código RVA" + ";" + OpHeader[23] + OpHeader[22] + OpHeader[21] + OpHeader[20];

       Retorno[8] = "ImageBase,dirección base preferida RVAbp" + ";" + OpHeader[31] + OpHeader[30] + OpHeader[29] + OpHeader[28] + OpHeader[27] + OpHeader[26] + OpHeader[25] + OpHeader[24];

       Retorno[9] = "SectionAlignment, alineación de las secciones >= a FileAlignment Pagina32-4096bytes" + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[35] + OpHeader[34] + OpHeader[33] + OpHeader[32],16);

       Retorno[10] = "FileAlignment,factor de alineación 512Bytes-64K potencias de 2" + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[39] + OpHeader[38] + OpHeader[37] + OpHeader[36],16);

       Retorno[11] = "MajorOperatingSystemVersion," + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[41] + OpHeader[40],16);

       Retorno[12] = "MinorOperatingSystemVersion," + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[43] + OpHeader[42],16);

       Retorno[13] = "MajorImageVersion," + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[45] + OpHeader[44],16);

       Retorno[14] = "MinorImageVersion," + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[47] + OpHeader[46],16);

       Retorno[15] = "MajorSubsystemVersion," + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[49] + OpHeader[48],16);

       Retorno[16] = "MinorSubsystemVersion," + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[51] + OpHeader[50],16);

       Retorno[17] = "Win32VersionValue," + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[52] + OpHeader[53] + OpHeader[54] + OpHeader[55],16);

       Retorno[18] = "SizeOfImage,un múltiplo de SectionAlignment" + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[59] + OpHeader[58] + OpHeader[57] + OpHeader[56],16);

       Retorno[19] = "SizeOfHeaders,tamaño de todos los encabezados redondeado a un múltiplo de FileAlignment" + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[63] + OpHeader[62] + OpHeader[61] + OpHeader[60],16);

       Retorno[20] = "CheckSum,algoritmo utilizado se toma de la librería IMAGEHELP.DLL" + ";" + OpHeader[67] + OpHeader[66] + OpHeader[65] + OpHeader[64]; //++

       Retorno[21] = "Subsystem, tipo de subsistema necesario" + ";" + OpHeader[69] + OpHeader[68];

       Retorno[22] = "DllCharacteristics, punto de entrada para las DLL" + ";" + OpHeader[71] + OpHeader[70];

       Retorno[23] = "SizeOfStackReserve, tamaño que se debe reservar en la pila" + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[79] + OpHeader[78] + OpHeader[77] + OpHeader[76] + OpHeader[75] + OpHeader[74] + OpHeader[73] + OpHeader[72],16);

       Retorno[24] = "SizeOfStackCommit, Tamaño utilizado por la pila en men" + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[87] + OpHeader[86] + OpHeader[85] + OpHeader[84] + OpHeader[83] + OpHeader[82] + OpHeader[81] + OpHeader[80],16);

       Retorno[25] = "SizeOfHeapReserve, tamaño reservado para la asignación dinámica de memoria" + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[95] + OpHeader[94] + OpHeader[93] + OpHeader[92] + OpHeader[91] + OpHeader[90] + OpHeader[89] + OpHeader[88],16);

       Retorno[26] = "SizeOfHeapCommit, tamaño utilizado para la asignación dinámica de memoria" + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[103] + OpHeader[102] + OpHeader[101] + OpHeader[100] + OpHeader[99] + OpHeader[98] + OpHeader[97] + OpHeader[96],16);

       Retorno[27] = "LoaderFlags, tamaño de los loaderFlags. Su valor es reservado y siempre es cero." + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[107] + OpHeader[106] + OpHeader[105] + OpHeader[104], 16);

       Retorno[28] = "NumberOfRvaAndSizes, Cantidad de DataDirectory" + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[111] + OpHeader[110] + OpHeader[109] + OpHeader[108],16);

       return Retorno;
   }    /* TOTAL 112 BYTES */

   public static string[] IMAGE_OPTIONAL_HEADER32_96(string[] OpHeader)
   {
       string[] Retorno = new string[30];

       Retorno[0] = "Magic, 010B -32  020B -64   0107 -ROM  0000 -dual" + ";" + OpHeader[1] + OpHeader[0];

       Retorno[1] = "MajorLinkerVersion, enlazador" + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[2],16);

       Retorno[2] = "MinorLinkerVersion, enlazador" + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[3],16);

       Retorno[3] = "SizeOfCode, tamaño del codigo maquina en todas las secciones" + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[7] + OpHeader[6] + OpHeader[5] + OpHeader[4], 16);

       Retorno[4] = "SizeOfInitializedData, tamaño de la sección de datos iniciados" + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[11] + OpHeader[10] + OpHeader[9] + OpHeader[8], 16);

       Retorno[5] = "SizeOfUninitializedData, tamaño de la sección de datos no iniciados" + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[15] + OpHeader[14] + OpHeader[13] + OpHeader[12], 16);

       Retorno[6] = "AddressOfEntryPoint, dirección de la primera instrucion que se ejecuta en memoria RVA" + ";" + OpHeader[19] + OpHeader[18] + OpHeader[17] + OpHeader[16];

       Retorno[7] = "BaseOfCode,dirección relativa de la base del código RVA" + ";" + OpHeader[23] + OpHeader[22] + OpHeader[21] + OpHeader[20];

       Retorno[8]= "campo+ Base de datos ,La dirección relativa a la base de la imagen de la sección de principio de datos cuando se carga en la memoria RVA" + ";" + OpHeader[27] + OpHeader[26] + OpHeader[25] + OpHeader[24];

       Retorno[9] = "ImageBase,dirección base preferida RVAbp" + ";"  + OpHeader[31] + OpHeader[30] + OpHeader[29] + OpHeader[28];

       Retorno[10] = "SectionAlignment, alineación de las secciones >= a FileAlignment Pagina32-4096bytes" + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[35] + OpHeader[34] + OpHeader[33] + OpHeader[32], 16);

       Retorno[11] = "FileAlignment,factor de alineación 512Bytes-64K potencias de 2" + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[39] + OpHeader[38] + OpHeader[37] + OpHeader[36], 16);

       Retorno[12] = "MajorOperatingSystemVersion," + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[41] + OpHeader[40],16);

       Retorno[13] = "MinorOperatingSystemVersion," + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[43] + OpHeader[42],16);

       Retorno[14] = "MajorImageVersion," + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[45] + OpHeader[44],16);

       Retorno[15] = "MinorImageVersion," + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[47] + OpHeader[46],16);

       Retorno[16] = "MajorSubsystemVersion," + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[49] + OpHeader[48],16);

       Retorno[17] = "MinorSubsystemVersion," + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[51] + OpHeader[50],16);

       Retorno[18] = "Win32VersionValue," + ";" + OpHeader[52] + OpHeader[53] + OpHeader[54] + OpHeader[55];

       Retorno[19] = "SizeOfImage,un múltiplo de SectionAlignment" + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[59] + OpHeader[58] + OpHeader[57] + OpHeader[56], 16);

       Retorno[20] = "SizeOfHeaders,tamaño de todos los encabezados redondeado a un múltiplo de FileAlignment" + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[63] + OpHeader[62] + OpHeader[61] + OpHeader[60], 16);

       Retorno[21] = "CheckSum,algoritmo utilizado se toma de la librería IMAGEHELP.DLL" + ";" + OpHeader[64] + OpHeader[65] + OpHeader[66] + OpHeader[67];

       Retorno[22] = "Subsystem, tipo de subsistema necesario" + ";" + OpHeader[68] + OpHeader[69];

       Retorno[23] = "DllCharacteristics, punto de entrada para las DLL" + ";" + OpHeader[71] + OpHeader[70];

       Retorno[24] = "SizeOfStackReserve, tamaño que se debe reservar en la pila" + ";" + TotalConversor.ConVertBaseDecimal( OpHeader[75] + OpHeader[74] + OpHeader[73] + OpHeader[72], 16);

       Retorno[25] = "SizeOfStackCommit, Tamaño utilizado por la pila en men" + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[79] + OpHeader[78] + OpHeader[77] + OpHeader[76], 16);

       Retorno[26] = "SizeOfHeapReserve, tamaño reservado para la asignación dinámica de memoria" + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[83] + OpHeader[82] + OpHeader[81] + OpHeader[80], 16);

       Retorno[27] = "SizeOfHeapCommit, tamaño utilizado para la asignación dinámica de memoria" + ";" + TotalConversor.ConVertBaseDecimal( OpHeader[87] + OpHeader[86] + OpHeader[85] + OpHeader[84], 16);

       Retorno[28] = "LoaderFlags, tamaño de los loaderFlags. Su valor es reservado y siempre es cero." + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[91] + OpHeader[90] + OpHeader[89] + OpHeader[88], 16);

       Retorno[29] = "NumberOfRvaAndSizes, Cantidad de DataDirectory" + ";" + TotalConversor.ConVertBaseDecimal(OpHeader[95] + OpHeader[94] + OpHeader[93] + OpHeader[92], 16);

       return Retorno;
   }    /* TOTAL 96 BYTES */

   public static string[] IMAGE_SECTION_HEADER_40(string[] SeHeader)
   {
       string[] Retorno = new string[10];

       Retorno[0] = "Name[IMAGE_SIZEOF_SHORT_NAME], 8-byte ANSI name" + ";" + TotalConversor.HextoStringASCII( SeHeader[0] + SeHeader[1] + SeHeader[2] + SeHeader[3] + SeHeader[4] + SeHeader[5] + SeHeader[6] + SeHeader[7]);

       Retorno[1] = "Misc, PhysicalAddress dirección física o VirtualSize tamaño de la sección antes del redondeo" + ";" + TotalConversor.ConVertBaseDecimal(SeHeader[11] + SeHeader[10] + SeHeader[9] + SeHeader[8],16);

       Retorno[2] = "VirtualAddress, dirección del primer byte de la sección RVA" + ";" + SeHeader[15] + SeHeader[14] + SeHeader[13] + SeHeader[12];

       Retorno[3] = "SizeOfRawData, tamaño de los datos inicializados" + ";" + TotalConversor.ConVertBaseDecimal(SeHeader[19] + SeHeader[18] + SeHeader[17] + SeHeader[16],16);

       Retorno[4] = "PointerToRawData, puntero a la primera pagina RVA" + ";" + SeHeader[23] + SeHeader[22] + SeHeader[21] + SeHeader[20];

       Retorno[5] = "PointerToRelocations, puntero a la primera if reubicación RVA" + ";" + SeHeader[27] + SeHeader[26] + SeHeader[25] + SeHeader[24];

       Retorno[6] = "PointerToLinenumbers, puntero a la primer if numerado RVA" + ";" + SeHeader[31] + SeHeader[30] + SeHeader[29] + SeHeader[28];

       Retorno[7] = "NumberOfRelocations" + ";" + TotalConversor.ConVertBaseDecimal(SeHeader[33] + SeHeader[32],16);

       Retorno[8] = "NumberOfLinenumbers" + ";" + TotalConversor.ConVertBaseDecimal(SeHeader[35] + SeHeader[34],16);

       Retorno[9] = "Characteristics" + ";" + SeHeader[39] + SeHeader[38] + SeHeader[37] + SeHeader[36]; //++

       return Retorno;
   } // 40 bytes


   public static string[] IMAGE_DATA_DIRECTORY_8(string[] DiHeader)
   {
       string[] Retorno = new string[2];

       Retorno[0] = "VirtualAddress RVA" + ";" + DiHeader[3] + DiHeader[2] + DiHeader[1] + DiHeader[0];

       Retorno[1] = "Size" + ";" + TotalConversor.ConVertBaseDecimal(DiHeader[7] + DiHeader[6] + DiHeader[5] + DiHeader[4], 16); //  TamañoDirectorio / bytes de la estructura del mismo = numero de estructuras  que apuntan a funciones de las dll(s)

       return Retorno;

   } // 8 bytes ojo hay 16 definidos total 128 bytes

   public static string[] IMAGE_EXPORT_DIRECTORY_40(string[] DiHeader) // The .edata Section (Image Only)  ojo   TamañoDirectorio / 40 = X estructuras, cada una apunta a una matriz de  funciones  de una dll, la ultima estructura es null
   { //  DataDirectory

       string[] Retorno = new string[11];


       Retorno[0] = "Characteristics, Export Flags Reserved, must be 0" + ";" + DiHeader[0] + DiHeader[1] + DiHeader[2] + DiHeader[3];

       Retorno[1] = "TimeDateStamp," + ";" + TotalConversor.ConvertExaFechaEsamblado(DiHeader[7] + DiHeader[6] + DiHeader[5] + DiHeader[4]);

       Retorno[2] = "Major Version," + ";" + DiHeader[9] + DiHeader[8];

       Retorno[3] = "Minor Version," + ";" + DiHeader[11] + DiHeader[10];

       Retorno[4] = "Name, RVA La dirección de la cadena ASCII que contiene el nombre de la DLL RVA" + ";" + DiHeader[15] + DiHeader[14] + DiHeader[13] + DiHeader[12];

       Retorno[5] = "Base, El número ordinal inicial DE LAS FUNCIONES" + ";" + TotalConversor.ConVertBaseDecimal(DiHeader[19] + DiHeader[18] + DiHeader[17] + DiHeader[16],16);

       Retorno[6] = "NumberOfFunctions, El número de funciones exportadas por nombre u ordinal" + ";" + TotalConversor.ConVertBaseDecimal(DiHeader[23] + DiHeader[22] + DiHeader[21] + DiHeader[20],16);

       Retorno[7] = "NumberOfName, número de nombres exportados" + ";" + TotalConversor.ConVertBaseDecimal(DiHeader[27] + DiHeader[26] + DiHeader[25] + DiHeader[24],16);

       Retorno[8] = "AddressOfFunctions, RVA apunta a una matriz de valores de 32 bits RVA" + ";" + DiHeader[31] + DiHeader[30] + DiHeader[29] + DiHeader[28];

       Retorno[9] = "AddressOfName, RVA apunta a una matriz de valores de 32 bits RVA" + ";" + DiHeader[35] + DiHeader[34] + DiHeader[33] + DiHeader[32];

       Retorno[10] = "AddressOfNameOrdinal, RVA apunta a una matriz de valores de 16 bits RVA" + ";" + DiHeader[39] + DiHeader[38] + DiHeader[37] + DiHeader[36];

       return Retorno;

   } // 40 Bytes The .edata Section (Image Only)


   public static string[] IMAGE_IMPORT_DESCRIPTOR_20(string[] DiHeader) // The .idata Section              ojo   TamañoDirectorio / 20 = X estructuras, cada una apunta a una matriz de  funciones  de una dll, la ultima estructura es null
   { //  DataDirectory

       string[] Retorno = new string[5];


       Retorno[0] = " ImportLookup, Table RVA *Original apunta a una matriz de nombres ú ordinal y termina en puntero nulo RVA" + ";" + DiHeader[3] + DiHeader[2] + DiHeader[1] + DiHeader[0]; // apunta a 32 o 64 bits

       Retorno[1] = "TimeDateStamp, valor=  0 o F si es importacion " + ";" + TotalConversor.ConvertExaFechaEsamblado(DiHeader[7] + DiHeader[6] + DiHeader[5] + DiHeader[4]);

       Retorno[2] = " ForwarderChain, El índice de la primera redirección de la cadena obsoleto" + ";" + DiHeader[11] + DiHeader[10]+ DiHeader[9] + DiHeader[8] ;

       Retorno[3] = " Name,  RVA-base ASCII string, nombre de la DLL importada, null-terminated  RVA" + ";" + DiHeader[15] + DiHeader[14] + DiHeader[13] + DiHeader[12];

       Retorno[4] = "PIMAGE_THUNK_DATA ,Table RVA *Actual apunta a un matriz de punteros VA de las funciones importadas y termina en un puntero nulo dentro del PE OJO_VA" + ";" + DiHeader[19] + DiHeader[18] + DiHeader[17] + DiHeader[16]; // apunta a 32 o 64 bits
       // una vez cargado apuntan a la misma estructura(original y actual)
       return Retorno;

   } // 20 Bytes The .idata Section (Image Only)

   public static string Import_String_ASCII(string[] DiHeader) // The .idata Section
   { //  DataDirectory

       string Retorno;

       Retorno = TotalConversor.HextoStringASCII(string.Concat (DiHeader));

       return Retorno;

   } // Nº ? Bytes import name



   public static string[] IMAGE_IMPORT_Lookup_8_4(string[] DiHeader) // The .idata Section
   { //  DataDirectory_Import  ordinal o nombre de la funcion importada de la DLL, Bits 63 to 32 are zero. se importa por nombre

       string[] Retorno = new string[3];



       if (DiHeader.Length > 4) { Retorno[0] = " OrdinalNameFlag,  Ordinal/Name Flag bit field " + ";" + DiHeader[7]; } else { Retorno[0] = " OrdinalNameFlag,  " + ";" + DiHeader[3]; }


       Retorno[1] = "OrdinalNumber, Ordinal Flag bit field is 1" + ";"  + TotalConversor.ConVertBaseDecimal(DiHeader[1] + DiHeader[0],16); // 63 to 16 must be 0.  or 31 to 16 must be 0, SOLO SI EL BIT MAS SIGNIFICATIVO ES 1.  nos da directamente el ordinal de la funcion importada.
       // investigando la DLL obtenemos la función utilizada
       Retorno[2] = "HintName, Table RVA  Ordinal/Name Flag bit field is 0 RVA" + ";" + DiHeader[3] + DiHeader[2] + DiHeader[1] + DiHeader[0]; // if 64 bits los Bits 63 to 32 are zero. se importa por nombre Ordinal/Name Flag bit field is 0


       return Retorno;

   } // 8_4 Bytes The .idata. storted in r.data Section (Image Only)
 

   public static string[] IMAGE_RESOURCE_DIRECTORY_NODE_HEADER_16(string[] DiHeader) // The .rsrc Section  
   {

       string[] Retorno = new string[6];

       Retorno[0] = "DWORD Characteristics" + ";" + DiHeader[0] + DiHeader[1] + DiHeader[2] + DiHeader[3]; // Flags Unknown
       Retorno[1] = "DWORD TimeDateStamp" + ";" + TotalConversor.ConvertExaFechaEsamblado( DiHeader[7] + DiHeader[6] + DiHeader[5] + DiHeader[4]);
       Retorno[2] = "WORD MajorVersion" + ";" + TotalConversor.ConVertBaseDecimal( DiHeader[9] + DiHeader[8],16);
       Retorno[3] = "WORD MinorVersion" + ";" + TotalConversor.ConVertBaseDecimal(DiHeader[11] + DiHeader[10],16);
       Retorno[4] = "WORD NumberOfNamedEntries" + ";" + TotalConversor.ConVertBaseDecimal(DiHeader[13] + DiHeader[12],16); // El número de entradas de directorio inmediatamente después de la tabla que utilizan cadenas para identificar las entradas de Tipo, Nombre o Idioma
       Retorno[5] = "WORD NumberOfIdEntries" + ";" + TotalConversor.ConVertBaseDecimal(DiHeader[15] + DiHeader[14],16); // El número de entradas del directorio inmediatamente después de las entradas de Nombre, que utilizan ID numéricos para las entradas de Tipo, Nombre o Idioma.

       return Retorno;

   } // 16 bytes

   public static string[] Resource_Directory_Node_Entry_8(string[] DiHeader) // Resource data descriptor  The .rsrc Section
   {

       string[] Retorno = new string[3];

       Retorno[0] = "DWORD Name Offset or Integer ID" + ";" + DiHeader[3] + DiHeader[2] + DiHeader[1] + DiHeader[0]; // determinado anteriormente  mirar???????
       
       string Binario = TotalConversor.ConVertByteExaBinary(DiHeader[7]);

     if (Binario.Substring(0, 1) == "1") { Retorno[2] = "NewDirectory"; DiHeader[7] = TotalConversor.HexQuitarBitAlto(DiHeader[7]) ; } else { Retorno[2] = "DataEntry"; }

       Retorno[1] = "DWORD Data Entry Offset or Sudirectory Offset" + ";" + DiHeader[7] + DiHeader[6] + DiHeader[5] + DiHeader[4];  // Bit alto 1. Los 31 bits inferiores son la dirección de otra tabla de directorio de recursos (el siguiente nivel hacia abajo).Bit alto 0. Dirección de una entrada de datos de recursos (una hoja).

       return Retorno;

   } // 8 bytes

   public static string[] Resource_Data_Entry_16(string[] DiHeader)  // The .rsrc Section
   {

       string[] Retorno = new string[4];

       Retorno[0] = "Data RVA" + ";" + DiHeader[3] + DiHeader[2] + DiHeader[1] + DiHeader[0]; // La dirección de una unidad de datos de recursos en el área de datos de recursos
       Retorno[1] = "Size" + ";" + TotalConversor.ConVertBaseDecimal(DiHeader[7] + DiHeader[6] + DiHeader[5] + DiHeader[4],16);  // El tamaño, en bytes, de los datos de recursos a los que apunta el campo Data RVA.
       Retorno[2] = "Codepage" + ";" + TotalConversor.ConVertBaseDecimal(DiHeader[11] + DiHeader[10] + DiHeader[9] + DiHeader[8],16);  // La página de códigos que se utiliza para decodificar valores de puntos de código dentro de los datos de recursos. Normalmente, la página de códigos sería la página de códigos Unicode.
       Retorno[3] = "Reserved, must be 0" + ";" + DiHeader[15] + DiHeader[14] + DiHeader[13] + DiHeader[12];

       return Retorno;

   } // 16 bytes

                                                // String resource data
  // The string resource data consists of 16 string descriptors per section.Strings whose identifiers differ only in the bottom 4 bits are placed in the same section.
   public static string[] Resource_Directory_Node_Name_o_Data_String_2_64(string[] DiHeader) // Resource node name string The .rsrc Section
   {

       string[] Retorno = new string[3];

       int Longitud = 2 * (Convert.ToInt32(TotalConversor.ConVertBaseDecimal(DiHeader[1] + DiHeader[0],16)));  // este es un recuento de "WORD = 2" bytes X longitud
       Retorno[0] = "WORD Lenght" + ";" + Longitud.ToString(); // El tamaño de la cadena en bytes, sin incluir el campo de longitud en sí.
       if (Longitud > 62) { Retorno[2] = "Nombre mas grande que 62"; Longitud = 62; } else { Retorno[2] ="Ok"; }
       ArraySegment<String> myArrSegMid = new ArraySegment<String>(DiHeader, 2, Longitud); ////  48
      //  Retorno[1] = "Unicode String" + ";" + TotalConversor.ConVertByteExaCadena(myArrSegMid.ToArray()); ;  // The variable-length Unicode string data, word-aligned.
     
       Retorno[1] = "? Unicode String" + ";" + TotalConversor.HextoStringUnicode(string.Concat (myArrSegMid.ToArray()));   // The variable-length Unicode string data, word-aligned. UTF-16 little-endian sin carácter de fin de cadena.


       return Retorno;

   } // 64 bytes












   public static string[] RESOURSE_VS_VERSIONINFO_CABEZERA_6(string[] DiHeader) // //  30  VS_VERSIONINFO "VS_VERSION_INFO",StringFileInfo "StringFileInfo",StringTable "<language ID Un número hexadecimal de 8 dígitos unicode +4 idioma -4 página de códigos formato>",String ex:"ProductName",VarFileInfo "VarFileInfo",Var idioma y  página de códigos varios DWORDs COMPATIBLES.
   { //  DataDirectory

       string[] Retorno = new string[3];    

       Retorno[0] = "Long-" + ";" + TotalConversor.ConVertBaseDecimal(DiHeader[1] + DiHeader[0],16);  //  WORD La longitud, en bytes, de la estructura VS_VERSIONINFO
       string LongHija = TotalConversor.ConVertBaseDecimal(DiHeader[3] + DiHeader[2], 16); //
       if (LongHija == "0") { LongHija = "LongHija 0" + ";" + LongHija; } else { LongHija = "LongHija-" + ";" + LongHija; }  //
       Retorno[1] = LongHija; // La longitud, en bytes, del VS_FIXEDFILEINFO y hijas  // WORD
       Retorno[2] =  TotalConversor.ConVertBaseDecimal( DiHeader[5] + DiHeader[4],16); // Es 1 si datos de texto y 0 si datos binarios

       return Retorno;

   } //




   // Obtenemos el string y...  con 64 bytes creo que cubrimos casi todos
   // hemos separado la estructura original para controlar las longitudes variables de los string(s), a la vez que obtenemos el puntero a la siguiente estructura.
   public static string[] RESOURSE_VS_VERSIONINFO_Unicode_string_L_64(string[] DiHeader, int Inicio) //
   { //  DataDirectory
       string[] Retorno = new string[3];
       string[] paso= TotalConversor.StringPading(DiHeader, Inicio);

       Retorno[0] = paso[0] +";-UnicodeL" ;  //  30  VS_VERSIONINFO "VS_VERSION_INFO",StringFileInfo "StringFileInfo",StringTable "<language ID Un número hexadecimal de 8 dígitos unicode +4 idioma -4 página de códigos formato>",String ex:"ProductName",VarFileInfo "VarFileInfo",Var idioma y  página de códigos varios DWORDs COMPATIBLES.
       Retorno[1] = "Puntero-;" + TotalConversor.ConvertStrimDecExa( paso[1]); // puntero a la siguiente estructura
       Retorno[2] = paso[2];  // si es igual a "ok"  todo salio perfecto....jeje
       return Retorno;

   } //



   public static string[] RESOURSE_VS_VERSIONINFO_VS_FIXEDFILEINFO_52(string[] DiHeader) //
   { //  DataDirectory

       string[] Retorno = new string[13];

       Retorno[0] = "DWORD dwSignature (FEEF04BD)" + ";" + DiHeader[3] + DiHeader[2] + DiHeader[1] + DiHeader[0];  //
       Retorno[1] = "DWORD dwStrucVersion" + ";" + DiHeader[7] + DiHeader[6] + DiHeader[5] + DiHeader[4];   //El número de versión binaria  PRIMARIA Y SEGUNDARIA WORD WORD  / Version  Stored as 2 x 16 - bit values, e.g.  "00 00 01 00" ⇒ 1.0
       Retorno[2] = "DWORD dwFileVersionMS" + ";" + DiHeader[11] + DiHeader[10] + DiHeader[9] + DiHeader[8];  //versiónMS binaria del archivo. se usa con dwFileVersionLS para formar un valor de 64 bits que se usa para comparaciones numéricas. / File version (upper 32-bit) Stored as 2 x 16-bit values, e.g. "00 00 06 00" ⇒ 6.0
       Retorno[3] = "DWORD dwFileVersionLS" + ";" + DiHeader[15] + DiHeader[14] + DiHeader[13] + DiHeader[12];  //versiónLS binaria del archivo. se usa con dwFileVersionMS para formar un valor de 64 bits que se usa para comparaciones numéricas. / File version (lower 32-bit) Stored as 2 x 16-bit values, e.g. "02 40 70 17" ⇒ 6000.16386
       Retorno[4] = "DWORD dwProductVersionMS" + ";" + DiHeader[19] + DiHeader[18] + DiHeader[17] + DiHeader[16];  //Los 32 bits más significativos del número de versión binaria del producto con el que se distribuyó este archivo. Este miembro se usa con dwProductVersionLS para formar un valor de 64 bits que se usa para comparaciones numéricas.
       Retorno[5] = "DWORD dwProductVersionLS" + ";" + DiHeader[23] + DiHeader[22] + DiHeader[21] + DiHeader[20];  //Los 32 bits MENOS significativos del número de versión binaria del producto con el que se distribuyó este archivo. Este miembro se usa con dwProductVersionMS para formar un valor de 64 bits que se usa para comparaciones numéricas.
       Retorno[6] = "DWORD dwFileFlagsMask" + ";" + DiHeader[27] + DiHeader[26] + DiHeader[25] + DiHeader[24];  //Contiene una máscara de bits que especifica los bits válidos en dwFileFlags. Un bit es válido solo si se definió cuando se creó el archivo.File flags bitmask 0x0000003f
       Retorno[7] = "DWORD dwFileFlags" + ";" + RESOURSE_VS_FIXEDFILEINFO_dwFileFlags(DiHeader[31] + DiHeader[30] + DiHeader[29] + DiHeader[28]);  //Contiene una máscara de bits que especifica los atributos booleanos del archivo. Este miembro puede incluir uno o más de los siguientes valores.
       Retorno[8] = "DWORD dwFileOS" + ";" + RESOURSE_VS_FIXEDFILEINFO_dwFileOS(DiHeader[35] + DiHeader[34] + DiHeader[33] + DiHeader[32]);  //El sistema operativo para el que se diseñó este archivo. Este miembro puede tener uno de los siguientes valores.
       Retorno[9] = "DWORD dwFileType" + ";" + RESOURSE_VS_FIXEDFILEINFO_dwFileType(DiHeader[39] + DiHeader[38] + DiHeader[37] + DiHeader[36]);  //El tipo general de archivo. Este miembro puede tener uno de los siguientes valores. Los demás valores están reservados.
       Retorno[10] = "DWORD dwFileSubtype" + ";" + (DiHeader[43] + DiHeader[42] + DiHeader[41] + DiHeader[40]);  //La función del archivo. Los valores posibles dependen del valor de dwFileType. Para todos los valores de dwFileType que no se describen en la siguiente lista, dwFileSubtype es cero.
       if (Retorno[9].Contains("VFT_DRV")){Retorno[10] = "DWORD dwFileSubtype" + ";" + RESOURSE_VS_FIXEDFILEINFO_VFT_DRV_dwFileSubtype_(DiHeader[43] + DiHeader[42] + DiHeader[41] + DiHeader[40]); }
       if (Retorno[9].Contains("VFT_FONT")) { Retorno[10] = "DWORD dwFileSubtype" + ";" + RESOURSE_VS_FIXEDFILEINFO_VFT_FONT_dwFileSubtype_(DiHeader[43] + DiHeader[42] + DiHeader[41] + DiHeader[40]); }
       Retorno[11] = "DWORD dwFileDateMS" + ";" + DiHeader[47] + DiHeader[46] + DiHeader[45] + DiHeader[44];  //Los 32 bits más significativos de la fecha y hora de creación binaria de 64 bits del archivo.
       Retorno[12] = "DWORD dwFileDateLS" + ";" + DiHeader[51] + DiHeader[50] + DiHeader[49] + DiHeader[48];  //Los 32 bits menos significativos de la fecha y hora de creación binaria de 64 bits del archivo.

       return Retorno;

   } //

   public static string[] RESOURSE_VS_VERSIONINFO_VS_MUI_(string[] DiHeader) // UNICODE Literal TXT
   { //  DataDirectory

       string[] Retorno = new string[13];

       Retorno[0] = "DWORD Signature (FECDFECD)" + ";" + DiHeader[3] + DiHeader[2] + DiHeader[1] + DiHeader[0];  //
       Retorno[1] = "DWORD Size" + ";" + DiHeader[7] + DiHeader[6] + DiHeader[5] + DiHeader[4];   //
       Retorno[2] = "DWORD RC Config Version 10000 " + ";" + DiHeader[11] + DiHeader[10] + DiHeader[9] + DiHeader[8];  //
       Retorno[3] = "DWORD Unknown" + ";" + DiHeader[15] + DiHeader[14] + DiHeader[13] + DiHeader[12];  //
       Retorno[4] = "DWORD File type 0x00000011 = normal 0x00000012 = MUI file" + ";" + DiHeader[19] + DiHeader[18] + DiHeader[17] + DiHeader[16];  //
       Retorno[5] = "DWORD System attributes" + ";" + DiHeader[23] + DiHeader[22] + DiHeader[21] + DiHeader[20];  //
       Retorno[6] = "DWORD Ultimate fallback location 0x01 = internal 0x02 = external" + ";" + DiHeader[27] + DiHeader[26] + DiHeader[25] + DiHeader[24];  //
       Retorno[7] = "OWORD Service Checksum" + ";" + DiHeader[31] + DiHeader[30] + DiHeader[29] + DiHeader[28];  // 16 BYTES 8 WORD
       Retorno[8] = "OWORD Checksum" + ";" + DiHeader[35] + DiHeader[34] + DiHeader[33] + DiHeader[32];  // 16 BYTES 8 WORD
       Retorno[9] = "DOWORD Unknown" + ";" + DiHeader[39] + DiHeader[38] + DiHeader[37] + DiHeader[36];  // 24 BYTES 12 WORD
       // Value descriptors
       Retorno[10] = "DWORD Main name type data offset" + ";" + DiHeader[43] + DiHeader[42] + DiHeader[41] + DiHeader[40];  //AVI FTR ORDERSTREAM TYPELIB UIFILE XML MUI      
       Retorno[11] = "DWORD Main name type data size" + ";" + DiHeader[47] + DiHeader[46] + DiHeader[45] + DiHeader[44];  //
       Retorno[12] = "DWORD Main ID types data offset" + ";" + DiHeader[51] + DiHeader[50] + DiHeader[49] + DiHeader[48];  //      1-24                                                  Retorno[13] = "DWORD Main ID types data size" + ";" DiHeader[39] + DiHeader[38] + DiHeader[37] + DiHeader[36];  //
       Retorno[14] = "DWORD MUI name type data offset" + ";" + DiHeader[43] + DiHeader[42] + DiHeader[41] + DiHeader[40];  //   MOFTYPE MUI WEVT_TEMPLATE
       Retorno[15] = "DWORD MUI name type data size" + ";" + DiHeader[47] + DiHeader[46] + DiHeader[45] + DiHeader[44];  //
       Retorno[16] = "DWORD MUI ID types data offset" + ";" + DiHeader[51] + DiHeader[50] + DiHeader[49] + DiHeader[48];  //
       Retorno[17] = "DWORD MUI ID types data size" + ";" + DiHeader[39] + DiHeader[38] + DiHeader[37] + DiHeader[36];  // 24 BYTES 12 WORD
       Retorno[18] = "DWORD Language data offset" + ";" + DiHeader[43] + DiHeader[42] + DiHeader[41] + DiHeader[40];  //    
       Retorno[19] = "DWORD Language data size" + ";" + DiHeader[47] + DiHeader[46] + DiHeader[45] + DiHeader[44];  //
       Retorno[20] = "DWORD Ultimate fallback language data offset" + ";" + DiHeader[51] + DiHeader[50] + DiHeader[49] + DiHeader[48];  //
       Retorno[21] = "DWORD Ultimate fallback language data size" + ";" + DiHeader[51] + DiHeader[50] + DiHeader[49] + DiHeader[48];  //
       // VALUE DATA 64-bit aligned

       return Retorno;

   } //


   public static string[] RESOURSE_VS_VERSIONINFO_VS_WEVT_TEMPLATE_(string[] DiHeader) // UNICODE Literal TXT
   { //  DataDirectory
       string[] Retorno = new string[6];

       Retorno[0] = "DWORD Signature (CRIM)" + ";" + DiHeader[3] + DiHeader[2] + DiHeader[1] + DiHeader[0];  //
       Retorno[1] = "DWORD Size" + ";" + DiHeader[7] + DiHeader[6] + DiHeader[5] + DiHeader[4];   // Including the compiled resource instrumentation manifest header
       Retorno[2] = "WORD Major version 3" + ";" + DiHeader[11] + DiHeader[10] + DiHeader[9] + DiHeader[8];  //
       Retorno[3] = "WORD Minor version 1" + ";" + DiHeader[15] + DiHeader[14] + DiHeader[13] + DiHeader[12];  //
       Retorno[4] = "DWORD Number of event providers" + ";" + DiHeader[19] + DiHeader[18] + DiHeader[17] + DiHeader[16];  //
       Retorno[5] = "DEWORD*Number Array of event provider descriptors" + ";" + DiHeader[23] + DiHeader[22] + DiHeader[21] + DiHeader[20];  // 20 BYTES  10 WORD


       return Retorno;

   } //

   public static string[] RESOURSE_VS_VERSIONINFO_TABLA_WEVT_TEMPLATE_(string[] DiHeader) // UNICODE Literal TXT
   { //  DataDirectory
       string[] Retorno = new string[2];
       Retorno[0] = "ODWORD  Contains a GUID" + ";" + DiHeader[3] + DiHeader[2] + DiHeader[1] + DiHeader[0];  // 16 BYTES 8 WORD
       Retorno[1] = "DWORD  data offset " + ";" + DiHeader[7] + DiHeader[6] + DiHeader[5] + DiHeader[4];   // start of the instrumentation manifest


       return Retorno;

   } //

   public static string[] Resource_MESSAGE_Table_Header_4(string[] DiHeader)  // The .rsrc Section The message-table header (MESSAGE_RESOURCE_DATA) is variable of size and consists of
   {

       string[] Retorno = new string[1];

       Retorno[0] = "NumberNodeTabla" + ";" + DiHeader[3] + DiHeader[2] + DiHeader[1] + DiHeader[0]; // Number of message-table entry descriptors

       return Retorno;

   } // 4 bytes

   public static string[] Resource_MESSAGE_Table_Entry_12(string[] DiHeader)  // The .rsrc Section The message-table entry descriptor (MESSAGE_RESOURCE_BLOCK) is 12 bytes of size and consist of
   {

       string[] Retorno = new string[12];

       Retorno[0] = "DWORD IdPrimer" + ";" + DiHeader[3] + DiHeader[2] + DiHeader[1] + DiHeader[0]; // Identificador del primer mensaje
       Retorno[1] = "DWORD IdUltimo" + ";" + DiHeader[7] + DiHeader[6] + DiHeader[5] + DiHeader[4]; // Identificador del último mensaje
       Retorno[2] = "DWORD OffsetPrimer" + ";" + DiHeader[11] + DiHeader[10] + DiHeader[9] + DiHeader[8]; // Offset of the first message

       return Retorno;

   } // 12 bytes

   public static string[] Resource_MESSAGE_Entry_4_(string[] DiHeader)  // The .rsrc Section The message-table string entry (MESSAGE_RESOURCE_ENTRY) is variable of size and consists of:
   {

       string[] Retorno = new string[3];

       Retorno[0] = "WORD Size" + ";" + DiHeader[1] + DiHeader[0]; //
       Retorno[1] = "WORD Flags" + ";" + DiHeader[3] + DiHeader[2]; // 0x00 = extended ASCII string with codepage /  0x01 = UTF-16 string
       Retorno[2] = "? String_L_Padin32" + ";" + "?"; //
       return Retorno;

   } // 4 + ?








   public static string[] IMAGE_DELAY_IMPORT_DESCRIPTOR_32(string[] DiHeader) // The .idata Section (Image Only)
   { //  DataDirectory

       string[] Retorno = new string[8];

       Retorno[0] = "Attributes,Must be zero." + ";" + DiHeader[3] + DiHeader[2] + DiHeader[1] + DiHeader[0];  // 1  31 reservado
       Retorno[1] = "Name RVA,of the name of the DLL" + ";" + DiHeader[7] + DiHeader[6] + DiHeader[5] + DiHeader[4];
       Retorno[2] = "Module Handle RVA, of the module handle ." + ";" + DiHeader[11] + DiHeader[10] + DiHeader[9] + DiHeader[8];
       Retorno[3] = "Delay Import Table RVA, of the delay-load import address table IAT." + ";" + DiHeader[15] + DiHeader[14] + DiHeader[13] + DiHeader[12];
       Retorno[4] = "Delay Import Name Table RVA, de la tabla de nombres  Esto coincide con el diseño de la tabla de nombres de importación." + ";" + DiHeader[19] + DiHeader[18] + DiHeader[17] + DiHeader[16];
       Retorno[5] = "Bound Delay Import Table RVA, of the bound delay-load address table, if it exists." + ";" + DiHeader[23] + DiHeader[22] + DiHeader[21] + DiHeader[20];
       Retorno[6] = "Unload Delay Import Table RVA, tabla de direcciones de carga , si existe. copia exacta de la tabla de direcciones de importación" + ";" + DiHeader[27] + DiHeader[26] + DiHeader[25] + DiHeader[24];
       Retorno[7] = "Time Stamp,The timestamp of the DLL." + ";" + DiHeader[31] + DiHeader[30] + DiHeader[29] + DiHeader[28];

       return Retorno;

   } // 32 Bytes
}

FFernandez

#8
Constantes



Código (cpp) [Seleccionar]

public static string MachineTypes_HEADER_2(string Maquina)
   {
       var Machine = new Dictionary<string, string>
       {
           ["0000"] = " The content of this field is assumed to be applicable to any machine type",                  
           ["01D3"] = "Matsushita AM33",                
           ["8664"] = "x64",
           ["01C0"] = "ARM little endian",
           ["AA64"] = "ARM64 little endian",
           ["01C4"] = "ARM Thumb-2 little endian",
           ["0EBC"] = "EFI byte code",
           ["014C"] = "Intel 386 or later processors and compatible processors",
           ["0200"] = "Intel Itanium processor family",
           ["9041"] = "Mitsubishi M32R little endian",
           ["0266"] = "MIPS16",
           ["0366"] = "MIPS with FPU",
           ["0466"] = "MIPS16 with FPU",
           ["01F0"] = "Power PC little endian",
           ["01F1"] = "Power PC with floating point support",
           ["0166"] = "MIPS little endian",
           ["5032"] = "RISC-V 32-bit address space",
           ["5064"] = "RISC-V 64-bit address space",
           ["5128"] = "RISC-V 128-bit address space",
           ["01A2"] = "Hitachi SH3",
           ["01A3"] = "Hitachi SH3 DSP",
           ["01A6"] = "Hitachi SH4",
           ["01A8"] = "Hitachi SH5",
           ["01C2"] = "Thumb",
           ["0169"] = "MIPS little-endian WCE v2",
           ["None"] = Maquina + " None"  // return new

       };

       if (Machine.ContainsKey(Maquina) == false) { Maquina = "None"; }

       return Machine[Maquina];
   }


   public static string CharacteristicsFile_HEADER_2(string Maquina)
   {
       var Machine = new Dictionary<string, string>
       {
           ["0001"] = "IMAGE_FILE_RELOCS_STRIPPED",    // Image only, Windows CE, and Microsoft Windows NT and later. This indicates that the file does not contain base relocations and must therefore be loaded at its preferred base address. If the base address is not available, the loader reports an error. The default behavior of the linker is to strip base relocations from executable (EXE) files.
           ["0002"] = "IMAGE_FILE_EXECUTABLE_IMAGE",    // Image only. This indicates that the image file is valid and can be run. If this flag is not set, it indicates a linker error.
           ["0004"] = "IMAGE_FILE_LINE_NUMS_STRIPPED",    // COFF line numbers have been removed. This flag is deprecated and should be zero.
           ["0008"] = "IMAGE_FILE_LOCAL_SYMS_STRIPPED",    // COFF symbol table entries for local symbols have been removed. This flag is deprecated and should be zero.
           ["0010"] = "IMAGE_FILE_AGGRESSIVE_WS_TRIM",    // Obsolete. Aggressively trim working set. This flag is deprecated for Windows 2000 and later and must be zero.
           ["0020"] = "IMAGE_FILE_LARGE_ADDRESS_ AWARE",    // Application can handle > 2-GB addresses.
           ["0040"] = "IMAGE_FILE_FUTURE_USE", // This flag is reserved for future use.
           ["0080"] = "IMAGE_FILE_BYTES_REVERSED_LO",    // Little endian: the least significant bit (LSB) precedes the most significant bit (MSB) in memory. This flag is deprecated and should be zero.
           ["0100"] = "IMAGE_FILE_32BIT_MACHINE",    // Machine is based on a 32-bit-word architecture.
           ["0200"] = "IMAGE_FILE_DEBUG_STRIPPED",    // Debugging information is removed from the image file.
           ["0400"] = "IMAGE_FILE_REMOVABLE_RUN_ FROM_SWAP",    // If the image is on removable media, fully load it and copy it to the swap file.
           ["0800"] = "IMAGE_FILE_NET_RUN_FROM_SWAP",    // If the image is on network media, fully load it and copy it to the swap file.
           ["1000"] = "IMAGE_FILE_SYSTEM",    // The image file is a system file, not a user program.
           ["2000"] = "IMAGE_FILE_DLL",    // The image file is a dynamic-link library (DLL). Such files are considered executable files for almost all purposes, although they cannot be directly run.
           ["4000"] = "IMAGE_FILE_UP_SYSTEM_ONLY",    // The file should be run only on a uniprocessor machine.
           ["8000"] = "IMAGE_FILE_BYTES_REVERSED_HI",    // Big endian: the MSB precedes the LSB in memory. This flag is deprecated and should be zero.
           ["None"] = Maquina + " None"  // return new

       };

       if (Machine.ContainsKey(Maquina) == false) { Maquina = "None"; }

       return Machine[Maquina];

   } //



   public static string Subsystem_2(string Maquina)
   {
       var Machine = new Dictionary<string, string>
       {
           ["0"] = "IMAGE_SUBSYSTEM_UNKNOWN",   //An unknown subsystem
           ["1"] = "IMAGE_SUBSYSTEM_NATIVE",   //Device drivers and native Windows processes
           ["2"] = "IMAGE_SUBSYSTEM_WINDOWS_GUI",   //The Windows graphical user interface (GUI) subsystem
           ["3"] = "IMAGE_SUBSYSTEM_WINDOWS_CUI",   //The Windows character subsystem
           ["5"] = "IMAGE_SUBSYSTEM_OS2_CUI",   //The OS/2 character subsystem
           ["7"] = "IMAGE_SUBSYSTEM_POSIX_CUI",   //The Posix character subsystem
           ["8"] = "IMAGE_SUBSYSTEM_NATIVE_WINDOWS",   //Native Win9x driver
           ["9"] = "IMAGE_SUBSYSTEM_WINDOWS_CE_GUI",   //Windows CE
           ["10"] = "IMAGE_SUBSYSTEM_EFI_APPLICATION",   //An Extensible Firmware Interface (EFI) application
           ["11"] = "IMAGE_SUBSYSTEM_EFI_BOOT_ SERVICE_DRIVER",   //An EFI driver with boot services
           ["12"] = "IMAGE_SUBSYSTEM_EFI_RUNTIME_ DRIVER",   //An EFI driver with run-time services
           ["13"] = "IMAGE_SUBSYSTEM_EFI_ROM",   //An EFI ROM image
           ["14"] = "IMAGE_SUBSYSTEM_XBOX",   //XBOX
           ["16"] = "IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION",   //Windows boot application.
           ["None"] = Maquina + " None"  // return new

       };

       if (Machine.ContainsKey(Maquina) == false) { Maquina = "None"; }

       return Machine[Maquina];

   } //

   public static string DllCharacteristics_OPTIONAL_2(string Maquina)
   {
       var Machine = new Dictionary<string, string>
       {
           ["0001"] = "IMAGE_LIBRARY_PROCESS_INIT",  // Reserved, must be zero.
           ["0002"] = "IMAGE_LIBRARY_PROCESS_TERM",  // Reserved, must be zero.
           ["0004"] = "IMAGE_LIBRARY_THREAD_INIT",  // Reserved, must be zero.
           ["0008"] = "IMAGE_LIBRARY_THREAD_TERM",  // Reserved, must be zero.
           ["0020"] = "IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA",  //Image can handle a high entropy 64-bit virtual address space.
           ["0040"] = "IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE",  // DLL can be relocated at load time.
           ["0080"] = "IMAGE_DLLCHARACTERISTICS_ FORCE_INTEGRITY",  // Code "Integrity checks are enforced.
           ["0100"] = "IMAGE_DLLCHARACTERISTICS_ NX_COMPAT",  // Image "Is NX compatible.
           ["0200"] = "IMAGE_DLLCHARACTERISTICS_ NO_ISOLATION",  //  Isolation aware, but do not "Isolate the "Image.
           ["0400"] = "IMAGE_DLLCHARACTERISTICS_ NO_SEH",  // Does not use structured exception (SE) handling. No SE handler may be called "In this "Image.
           ["0800"] = "IMAGE_DLLCHARACTERISTICS_ NO_BIND",  // Do not bind the "Image.
           ["1000"] = "IMAGE_DLLCHARACTERISTICS_APPCONTAINER",  //  Image must execute "In an AppContainer.
           ["2000"] = "IMAGE_DLLCHARACTERISTICS_ WDM_DRIVER",  // A WDM driver.
           ["4000"] = "IMAGE_DLLCHARACTERISTICS_GUARD_CF",  //  Image supports Control Flow Guard.
           ["8000"] = "IMAGE_DLLCHARACTERISTICS_ TERMINAL_SERVER_AWARE", // Terminal Server aware.
           ["None"] = Maquina + " None"  // return new

       };

       if (Machine.ContainsKey(Maquina) == false) { Maquina = "None"; }

       return Machine[Maquina];

   } //


   public static string Characteristics_SECTION_HEADER_4(string Maquina)
   {
       var Machine = new Dictionary<string, string>
       {
           ["00000000"] = "IMAGE_SCN_TYPE_REG",  // Reserved for future use.
           ["00000001"] = "IMAGE_SCN_TYPE_DSECT or IMAGE_SCN_SCALE_INDEX",  // Reserved for future use. Tls index is scaled
           ["00000002"] = "IMAGE_SCN_TYPE_NOLOAD",  // Reserved for future use.
           ["00000004"] = "IMAGE_SCN_TYPE_GROUP",  // Reserved for future use.
           ["00000008"] = "IMAGE_SCN_TYPE_NO_PAD ",  // The section should not be padded to the next boundary. This flag is obsolete and is replaced by IMAGE_SCN_ALIGN_1BYTES. This is valid only for object files.
           ["00000010"] = "IMAGE_SCN_TYPE_COPY",  // Reserved for future use.
           ["00000020"] = "IMAGE_SCN_CNT_CODE ",  // The section contains executable code.
           ["00000040"] = "IMAGE_SCN_CNT_INITIALIZED_DATA ",  // The section contains initialized data.
           ["00000080"] = "IMAGE_SCN_CNT_UNINITIALIZED_ DATA ",  // The section contains uninitialized data.
           ["00000100"] = "IMAGE_SCN_LNK_OTHER ",  // Reserved for future use.
           ["00000200"] = "IMAGE_SCN_LNK_INFO ",  // The section contains comments or other information. The .drectve section has this type. This is valid for object files only.
           ["00000400"] = "IMAGE_SCN_MEM_PROTECTED - Obsolete",  // Reserved for future use.
           ["00000800"] = "IMAGE_SCN_LNK_REMOVE ",  // The section will not become part of the image. This is valid only for object files.
           ["00001000"] = "IMAGE_SCN_LNK_COMDAT ",  // The section contains COMDAT data. For more information, see COMDAT Sections (Object Only). This is valid only for object files.
           ["00002000"] = "reservado",  // reservado
           ["00004000"] = "IMAGE_SCN_NO_DEFER_SPEC_EXC",  // Reset speculative exceptions
           ["00008000"] = "IMAGE_SCN_GPREL ",  // The section contains data referenced through the global pointer (GP).
           ["00010000"] = "IMAGE_SCN_MEM_SYSHEAP - Obsolete",  // Obsolete
           ["00020000"] = "IMAGE_SCN_MEM_PURGEABLE Or IMAGE_SCN_MEM_16BIT",  // Reserved for future use.
           ["00040000"] = "IMAGE_SCN_MEM_LOCKED ",  // Reserved for future use.
           ["00080000"] = "IMAGE_SCN_MEM_PRELOAD ",  // Reserved for future use.
           ["00100000"] = "IMAGE_SCN_ALIGN_1BYTES ",  // Align data on a 1-byte boundary. Valid only for object files.
           ["00200000"] = "IMAGE_SCN_ALIGN_2BYTES ",  // Align data on a 2-byte boundary. Valid only for object files.
           ["00300000"] = "IMAGE_SCN_ALIGN_4BYTES ",  // Align data on a 4-byte boundary. Valid only for object files.
           ["00400000"] = "IMAGE_SCN_ALIGN_8BYTES ",  // Align data on an 8-byte boundary. Valid only for object files.
           ["00500000"] = "IMAGE_SCN_ALIGN_16BYTES ",  // Align data on a 16-byte boundary. Valid only for object files.
           ["00600000"] = "IMAGE_SCN_ALIGN_32BYTES ",  // Align data on a 32-byte boundary. Valid only for object files.
           ["00700000"] = "IMAGE_SCN_ALIGN_64BYTES ",  // Align data on a 64-byte boundary. Valid only for object files.
           ["00800000"] = "IMAGE_SCN_ALIGN_128BYTES ",  // Align data on a 128-byte boundary. Valid only for object files.
           ["00900000"] = "IMAGE_SCN_ALIGN_256BYTES ",  // Align data on a 256-byte boundary. Valid only for object files.
           ["00A00000"] = "IMAGE_SCN_ALIGN_512BYTES ",  // Align data on a 512-byte boundary. Valid only for object files.
           ["00B00000"] = "IMAGE_SCN_ALIGN_1024BYTES ",  // Align data on a 1024-byte boundary. Valid only for object files.
           ["00C00000"] = "IMAGE_SCN_ALIGN_2048BYTES ",  // Align data on a 2048-byte boundary. Valid only for object files.
           ["00D00000"] = "IMAGE_SCN_ALIGN_4096BYTES ",  // Align data on a 4096-byte boundary. Valid only for object files.
           ["00E00000"] = "IMAGE_SCN_ALIGN_8192BYTES ",  // Align data on an 8192-byte boundary. Valid only for object files.
           ["00F00000"] = "IMAGE_SCN_ALIGN_MASK",  // unused
           ["01000000"] = "IMAGE_SCN_LNK_NRELOC_OVFL ",  // The section contains extended relocations. > 16 Bits NumberOfRelocations >= 0xffff => is stored in the 32-bit VirtualAddress field of the first relocation
           ["02000000"] = "IMAGE_SCN_MEM_DISCARDABLE ",  // The section can be discarded as needed.
           ["04000000"] = "IMAGE_SCN_MEM_NOT_CACHED ",  // The section cannot be cached.
           ["08000000"] = "IMAGE_SCN_MEM_NOT_PAGED ",  // The section is not pageable.
           ["10000000"] = "IMAGE_SCN_MEM_SHARED ",  // The section can be shared in memory.
           ["20000000"] = "IMAGE_SCN_MEM_EXECUTE ",  // The section can be executed as code.
           ["40000000"] = "IMAGE_SCN_MEM_READ ",  // The section can be read.
           ["80000000"] = "IMAGE_SCN_MEM_WRITE ",  // The section can be written to.
           ["None"] = Maquina + " None"  // return new

       };

       if(Machine.ContainsKey(Maquina) == false) { Maquina = "None"; }

       return Machine[Maquina];

   } //

   public static string CodePage_4(string Maquina)
   {
       var Machine = new Dictionary<string, string>
       {
           ["0"] = "default to ANSI code page",
           ["37"] = "IBM037 IBM EBCDIC US-Canada",
           ["437"] = "IBM437 OEM United States",
           ["500"] = "IBM500 IBM EBCDIC International",
           ["708"] = "ASMO-708 Arabic (ASMO 708)",
           ["709"] = " Arabic (ASMO-449+, BCON V4)",
           ["710"] = " Arabic - Transparent Arabic",
           ["720"] = "DOS-720 Arabic (Transparent ASMO); Arabic (DOS)",
           ["737"] = "ibm737 OEM Greek (formerly 437G); Greek (DOS)",
           ["775"] = "ibm775 OEM Baltic; Baltic (DOS)",
           ["850"] = "ibm850 OEM Multilingual Latin 1; Western European (DOS)",
           ["852"] = "ibm852 OEM Latin 2; Central European (DOS)",
           ["855"] = "IBM855 OEM Cyrillic (primarily Russian)",
           ["857"] = "ibm857 OEM Turkish; Turkish (DOS)",
           ["858"] = "IBM00858 OEM Multilingual Latin 1 + Euro symbol",
           ["860"] = "IBM860 OEM Portuguese; Portuguese (DOS)",
           ["861"] = "ibm861 OEM Icelandic; Icelandic (DOS)",
           ["862"] = "DOS-862 OEM Hebrew; Hebrew (DOS)",
           ["863"] = "IBM863 OEM French Canadian; French Canadian (DOS)",
           ["864"] = "IBM864 OEM Arabic; Arabic (864)",
           ["865"] = "IBM865 OEM Nordic; Nordic (DOS)",
           ["866"] = "cp866 OEM Russian; Cyrillic (DOS)",
           ["869"] = "ibm869 OEM Modern Greek; Greek, Modern (DOS)",
           ["870"] = "IBM870 IBM EBCDIC Multilingual/ROECE (Latin 2); IBM EBCDIC Multilingual Latin 2",
           ["874"] = "windows-874 Thai (Windows)",
           ["875"] = "cp875 IBM EBCDIC Greek Modern",
           ["932"] = "shift_jis ANSI/OEM Japanese; Japanese (Shift-JIS)",
           ["936"] = "gb2312 ANSI/OEM Simplified Chinese (PRC, Singapore); Chinese Simplified (GB2312)",
           ["949"] = "ks_c_5601-1987 ANSI/OEM Korean (Unified Hangul Code)",
           ["950"] = "big5 ANSI/OEM Traditional Chinese (Taiwan; Hong Kong SAR, PRC); Chinese Traditional (Big5)",
           ["1026"] = "IBM1026 IBM EBCDIC Turkish (Latin 5)",
           ["1047"] = "IBM01047 IBM EBCDIC Latin 1/Open System",
           ["1140"] = "IBM01140 IBM EBCDIC US-Canada (037 + Euro symbol); IBM EBCDIC (US-Canada-Euro)",
           ["1141"] = "IBM01141 IBM EBCDIC Germany (20273 + Euro symbol); IBM EBCDIC (Germany-Euro)",
           ["1142"] = "IBM01142 IBM EBCDIC Denmark-Norway (20277 + Euro symbol); IBM EBCDIC (Denmark-Norway-Euro)",
           ["1143"] = "IBM01143 IBM EBCDIC Finland-Sweden (20278 + Euro symbol); IBM EBCDIC (Finland-Sweden-Euro)",
           ["1144"] = "IBM01144 IBM EBCDIC Italy (20280 + Euro symbol); IBM EBCDIC (Italy-Euro)",
           ["1145"] = "IBM01145 IBM EBCDIC Latin America-Spain (20284 + Euro symbol); IBM EBCDIC (Spain-Euro)",
           ["1146"] = "IBM01146 IBM EBCDIC United Kingdom (20285 + Euro symbol); IBM EBCDIC (UK-Euro)",
           ["1147"] = "IBM01147 IBM EBCDIC France (20297 + Euro symbol); IBM EBCDIC (France-Euro)",
           ["1148"] = "IBM01148 IBM EBCDIC International (500 + Euro symbol); IBM EBCDIC (International-Euro)",
           ["1149"] = "IBM01149 IBM EBCDIC Icelandic (20871 + Euro symbol); IBM EBCDIC (Icelandic-Euro)",
           ["1200"] = "utf-16 Unicode UTF-16, little endian byte order (BMP of ISO 10646); available only to managed applications",
           ["1201"] = "unicodeFFFE Unicode UTF-16, big endian byte order; available only to managed applications",
           ["1250"] = "windows-1250 ANSI Central European; Central European (Windows)",
           ["1251"] = "windows-1251 ANSI Cyrillic; Cyrillic (Windows)",
           ["1252"] = "windows-1252 ANSI Latin 1; Western European (Windows)",
           ["1253"] = "windows-1253 ANSI Greek; Greek (Windows)",
           ["1254"] = "windows-1254 ANSI Turkish; Turkish (Windows)",
           ["1255"] = "windows-1255 ANSI Hebrew; Hebrew (Windows)",
           ["1256"] = "windows-1256 ANSI Arabic; Arabic (Windows)",
           ["1257"] = "windows-1257 ANSI Baltic; Baltic (Windows)",
           ["1258"] = "windows-1258 ANSI/OEM Vietnamese; Vietnamese (Windows)",
           ["1361"] = "Johab Korean (Johab)",
           ["10000"] = "macintosh MAC Roman; Western European (Mac)",
           ["10001"] = "x-mac-japanese Japanese (Mac)",
           ["10002"] = "x-mac-chinesetrad MAC Traditional Chinese (Big5); Chinese Traditional (Mac)",
           ["10003"] = "x-mac-korean Korean (Mac)",
           ["10004"] = "x-mac-arabic Arabic (Mac)",
           ["10005"] = "x-mac-hebrew Hebrew (Mac)",
           ["10006"] = "x-mac-greek Greek (Mac)",
           ["10007"] = "x-mac-cyrillic Cyrillic (Mac)",
           ["10008"] = "x-mac-chinesesimp MAC Simplified Chinese (GB 2312); Chinese Simplified (Mac)",
           ["10010"] = "x-mac-romanian Romanian (Mac)",
           ["10017"] = "x-mac-ukrainian Ukrainian (Mac)",
           ["10021"] = "x-mac-thai Thai (Mac)",
           ["10029"] = "x-mac-ce MAC Latin 2; Central European (Mac)",
           ["10079"] = "x-mac-icelandic Icelandic (Mac)",
           ["10081"] = "x-mac-turkish Turkish (Mac)",
           ["10082"] = "x-mac-croatian Croatian (Mac)",
           ["12000"] = "utf-32 Unicode UTF-32, little endian byte order; available only to managed applications",
           ["12001"] = "utf-32BE Unicode UTF-32, big endian byte order; available only to managed applications",
           ["20000"] = "x-Chinese_CNS CNS Taiwan; Chinese Traditional (CNS)",
           ["20001"] = "x-cp20001 TCA Taiwan",
           ["20002"] = "x_Chinese-Eten Eten Taiwan; Chinese Traditional (Eten)",
           ["20003"] = "x-cp20003 IBM5550 Taiwan",
           ["20004"] = "x-cp20004 TeleText Taiwan",
           ["20005"] = "x-cp20005 Wang Taiwan",
           ["20105"] = "x-IA5 IA5 (IRV International Alphabet No. 5, 7-bit); Western European (IA5)",
           ["20106"] = "x-IA5-German IA5 German (7-bit)",
           ["20107"] = "x-IA5-Swedish IA5 Swedish (7-bit)",
           ["20108"] = "x-IA5-Norwegian IA5 Norwegian (7-bit)",
           ["20127"] = "us-ascii US-ASCII (7-bit)",
           ["20261"] = "x-cp20261 T.61",
           ["20269"] = "x-cp20269 ISO 6937 Non-Spacing Accent",
           ["20273"] = "IBM273 IBM EBCDIC Germany",
           ["20277"] = "IBM277 IBM EBCDIC Denmark-Norway",
           ["20278"] = "IBM278 IBM EBCDIC Finland-Sweden",
           ["20280"] = "IBM280 IBM EBCDIC Italy",
           ["20284"] = "IBM284 IBM EBCDIC Latin America-Spain",
           ["20285"] = "IBM285 IBM EBCDIC United Kingdom",
           ["20290"] = "IBM290 IBM EBCDIC Japanese Katakana Extended",
           ["20297"] = "IBM297 IBM EBCDIC France",
           ["20420"] = "IBM420 IBM EBCDIC Arabic",
           ["20423"] = "IBM423 IBM EBCDIC Greek",
           ["20424"] = "IBM424 IBM EBCDIC Hebrew",
           ["20833"] = "x-EBCDIC-KoreanExtended IBM EBCDIC Korean Extended",
           ["20838"] = "IBM-Thai IBM EBCDIC Thai",
           ["20866"] = "koi8-r Russian (KOI8-R); Cyrillic (KOI8-R)",
           ["20871"] = "IBM871 IBM EBCDIC Icelandic",
           ["20880"] = "IBM880 IBM EBCDIC Cyrillic Russian",
           ["20905"] = "IBM905 IBM EBCDIC Turkish",
           ["20924"] = "IBM00924 IBM EBCDIC Latin 1/Open System (1047 + Euro symbol)",
           ["20932"] = "EUC-JP Japanese (JIS 0208-1990 and 0212-1990)",
           ["20936"] = "x-cp20936 Simplified Chinese (GB2312); Chinese Simplified (GB2312-80)",
           ["20949"] = "x-cp20949 Korean Wansung",
           ["21025"] = "cp1025 IBM EBCDIC Cyrillic Serbian-Bulgarian",
           ["21027"] = " (deprecated)",
           ["21866"] = "koi8-u Ukrainian (KOI8-U); Cyrillic (KOI8-U)",
           ["28591"] = "iso-8859-1 ISO 8859-1 Latin 1; Western European (ISO)",
           ["28592"] = "iso-8859-2 ISO 8859-2 Central European; Central European (ISO)",
           ["28593"] = "iso-8859-3 ISO 8859-3 Latin 3",
           ["28594"] = "iso-8859-4 ISO 8859-4 Baltic",
           ["28595"] = "iso-8859-5 ISO 8859-5 Cyrillic",
           ["28596"] = "iso-8859-6 ISO 8859-6 Arabic",
           ["28597"] = "iso-8859-7 ISO 8859-7 Greek",
           ["28598"] = "iso-8859-8 ISO 8859-8 Hebrew; Hebrew (ISO-Visual)",
           ["28599"] = "iso-8859-9 ISO 8859-9 Turkish",
           ["28603"] = "iso-8859-13 ISO 8859-13 Estonian",
           ["28605"] = "iso-8859-15 ISO 8859-15 Latin 9",
           ["29001"] = "x-Europa Europa 3",
           ["38598"] = "iso-8859-8-i ISO 8859-8 Hebrew; Hebrew (ISO-Logical)",
           ["50220"] = "iso-2022-jp ISO 2022 Japanese with no halfwidth Katakana; Japanese (JIS)",
           ["50221"] = "csISO2022JP ISO 2022 Japanese with halfwidth Katakana; Japanese (JIS-Allow 1 byte Kana)",
           ["50222"] = "iso-2022-jp ISO 2022 Japanese JIS X 0201-1989; Japanese (JIS-Allow 1 byte Kana - SO/SI)",
           ["50225"] = "iso-2022-kr ISO 2022 Korean",
           ["50227"] = "x-cp50227 ISO 2022 Simplified Chinese; Chinese Simplified (ISO 2022)",
           ["50229"] = " ISO 2022 Traditional Chinese",
           ["50930"] = " EBCDIC Japanese (Katakana) Extended",
           ["50931"] = " EBCDIC US-Canada and Japanese",
           ["50933"] = " EBCDIC Korean Extended and Korean",
           ["50935"] = " EBCDIC Simplified Chinese Extended and Simplified Chinese",
           ["50936"] = " EBCDIC Simplified Chinese",
           ["50937"] = " EBCDIC US-Canada and Traditional Chinese",
           ["50939"] = " EBCDIC Japanese (Latin) Extended and Japanese",
           ["51932"] = "euc-jp EUC Japanese",
           ["51936"] = "EUC-CN EUC Simplified Chinese; Chinese Simplified (EUC)",
           ["51949"] = "euc-kr EUC Korean",
           ["51950"] = " EUC Traditional Chinese",
           ["52936"] = "hz-gb-2312 HZ-GB2312 Simplified Chinese; Chinese Simplified (HZ)",
           ["54936"] = "GB18030 Windows XP and later: GB18030 Simplified Chinese (4 byte); Chinese Simplified (GB18030)",
           ["57002"] = "x-iscii-de ISCII Devanagari",
           ["57003"] = "x-iscii-be ISCII Bangla",
           ["57004"] = "x-iscii-ta ISCII Tamil",
           ["57005"] = "x-iscii-te ISCII Telugu",
           ["57006"] = "x-iscii-as ISCII Assamese",
           ["57007"] = "x-iscii-or ISCII Odia",
           ["57008"] = "x-iscii-ka ISCII Kannada",
           ["57009"] = "x-iscii-ma ISCII Malayalam",
           ["57010"] = "x-iscii-gu ISCII Gujarati",
           ["57011"] = "x-iscii-pa ISCII Punjabi",
           ["65000"] = "utf-7 Unicode (UTF-7)",
           ["65001"] = "utf-8 Unicode (UTF-8)",
           ["None"] = Maquina + " None" // return new

       };

       if (Machine.ContainsKey(Maquina) == false) { Maquina = "None"; }

       return Machine[Maquina];
   }

public static string Resourse_Types_MAKEINTRESOURCE(string Maquina)
   {
       var Machine = new Dictionary<string, string>
       {
           ["9"] = "RT_ACCELERATOR", // Accelerator table.
           ["21"] = "RT_ANICURSOR", // Animated cursor.
           ["22"] = "RT_ANIICON", // Animated icon.
           ["2"] = "RT_BITMAP", // Bitmap resource.
           ["1"] = "RT_CURSOR", // Hardware-dependent cursor resource.
           ["5"] = "RT_DIALOG", // Dialog box.
           ["17"] = "RT_DLGINCLUDE", //  Por ejemplo, 1 DLGINCLUDE "MyFile.h"
           ["8"] = "RT_FONT", // Font resource.
           ["7"] = "RT_FONTDIR", // Font directory resource.
           ["12"] = "RT_GROUP_CURSOR", // RT_CURSOR + 11 Hardware-independent cursor resource.
           ["14"] = "RT_GROUP_ICON", // RT_ICON  + 11 Hardware-independent icon resource.
           ["23"] = "RT_HTML", // HTML resource.
           ["3"] = "RT_ICON", // Hardware-dependent icon resource.
           ["24"] = "RT_MANIFEST", // Side-by-Side Assembly Manifest.
           ["4"] = "RT_MENU", // Menu resource.
           ["11"] = "RT_MESSAGETABLE", // Message-table entry.
           ["19"] = "RT_PLUGPLAY", // Plug and Play resource.
           ["10"] = "RT_RCDATA", // Application-defined resource (raw data).
           ["6"] = "RT_STRING", // String-table entry.
           ["16"] = "RT_VERSION", // Version resource.
           ["20"] = "RT_VXD", // VXD.
           ["None"] = Maquina + " None"  // return new

       };

       if (Machine.ContainsKey(Maquina) == false) { Maquina = "None"; }

       return Machine[Maquina];

   } //


FFernandez

#9
Constantes


Código (cpp) [Seleccionar]
 public static string Language_Int(string Maquina)
   {
       var Machine = new Dictionary<string, string>
       {

           ["1025"] = "Arabic - Saudi Arabia",  // ar-SA
           ["1026"] = "Bulgarian",  // bg-BG
           ["1027"] = "Catalan",  // ca-ES
           ["1028"] = "Chinese - Taiwan",  // zh-TW
           ["1029"] = "Czech",  // cs-CZ
           ["1030"] = "Danish",  // da-DK
           ["1031"] = "German - Germany",  // de-DE
           ["1032"] = "Greek",  // el-GR
           ["1033"] = "English - United States",  // en-US
           ["1034"] = "Spanish - Spain (Traditional Sort)",  // es-ES
           ["1035"] = "Finnish",  // fi-FI
           ["1036"] = "French - France",  // fr-FR
           ["1037"] = "Hebrew",  // he-IL
           ["1038"] = "Hungarian",  // hu-HU
           ["1039"] = "Icelandic",  // is-IS
           ["1040"] = "Italian - Italy",  // it-IT
           ["1041"] = "Japanese",  // ja-JP
           ["1042"] = "Korean",  // ko-KR
           ["1043"] = "Dutch - Netherlands",  // nl-NL
           ["1044"] = "Norwegian (Bokmål)",  // nb-NO
           ["1045"] = "Polish",  // pl-PL
           ["1046"] = "Portuguese - Brazil",  // pt-BR
           ["1047"] = "Rhaeto-Romanic",  // rm-CH
           ["1048"] = "Romanian",  // ro-RO
           ["1049"] = "Russian",  // ru-RU
           ["1050"] = "Croatian",  // hr-HR
           ["1051"] = "Slovak",  // sk-SK
           ["1052"] = "Albanian - Albania",  // sq-AL
           ["1053"] = "Swedish",  // sv-SE
           ["1054"] = "Thai",  // th-TH
           ["1055"] = "Turkish",  // tr-TR
           ["1056"] = "Urdu - Pakistan",  // ur-PK
           ["1057"] = "Indonesian",  // id-ID
           ["1058"] = "Ukrainian",  // uk-UA
           ["1059"] = "Belarusian",  // be-BY
           ["1060"] = "Slovenian",  // sl-SI
           ["1061"] = "Estonian",  // et-EE
           ["1062"] = "Latvian",  // lv-LV
           ["1063"] = "Lithuanian",  // lt-LT
           ["1064"] = "Tajik",  // tg-Cyrl-TJ
           ["1065"] = "Persian",  // fa-IR
           ["1066"] = "Vietnamese",  // vi-VN
           ["1067"] = "Armenian - Armenia",  // hy-AM
           ["1068"] = "Azeri (Latin)",  // az-Latn-AZ
           ["1069"] = "Basque",  // eu-ES
           ["1070"] = "Sorbian",  // wen-DE
           ["1071"] = "F.Y.R.O. Macedonian",  // mk-MK
           ["1072"] = "Sutu",  // st-ZA
           ["1073"] = "Tsonga",  // ts-ZA
           ["1074"] = "Tswana",  // tn-ZA
           ["1075"] = "Venda",  // ven-ZA
           ["1076"] = "Xhosa",  // xh-ZA
           ["1077"] = "Zulu",  // zu-ZA
           ["1078"] = "Afrikaans - South Africa",  // af-ZA
           ["1079"] = "Georgian",  // ka-GE
           ["1080"] = "Faroese",  // fo-FO
           ["1081"] = "Hindi",  // hi-IN
           ["1082"] = "Maltese",  // mt-MT
           ["1083"] = "Sami",  // se-NO
           ["1084"] = "Gaelic (Scotland)",  // gd-GB
           ["1085"] = "Yiddish",  // yi
           ["1086"] = "Malay - Malaysia",  // ms-MY
           ["1087"] = "Kazakh",  // kk-KZ
           ["1088"] = "Kyrgyz (Cyrillic)",  // ky-KG
           ["1089"] = "Swahili",  // sw-que
           ["1090"] = "Turkmen",  // tk-TM
           ["1091"] = "Uzbek (Latin)",  // uz-Latn-UZ
           ["1092"] = "Tatar",  // tt-RU
           ["1093"] = "Bengali (India)",  // bn-IN
           ["1094"] = "Punjabi",  // pa-IN
           ["1095"] = "Gujarati",  // gu-IN
           ["1096"] = "Oriya",  // or-IN
           ["1097"] = "Tamil",  // ta-IN
           ["1098"] = "Telugu",  // te-IN
           ["1099"] = "Kannada",  // kn-IN
           ["1100"] = "Malayalam",  // ml-IN
           ["1101"] = "Assamese",  // as-IN
           ["1102"] = "Marathi",  // mr-IN
           ["1103"] = "Sanskrit",  // sa-IN
           ["1104"] = "Mongolian (Cyrillic)",  // mn-MN
           ["1105"] = "Tibetan - People's Republic of China",  // bo-CN
           ["1106"] = "Welsh",  // cy-GB
           ["1107"] = "Khmer",  // km-KH
           ["1108"] = "Lao",  // lo-LA
           ["1109"] = "Burmese",  // my-MM
           ["1110"] = "Galician",  // gl-ES
           ["1111"] = "Konkani",  // kok-IN
           ["1112"] = "Manipuri",  // mni
           ["1113"] = "Sindhi - India",  // sd-IN
           ["1114"] = "Syriac",  // syr-SY
           ["1115"] = "Sinhalese - Sri Lanka",  // si-LK
           ["1116"] = "Cherokee - United States",  // chr-US
           ["1117"] = "Inuktitut",  // iu-Cans-CA
           ["1118"] = "Amharic - Ethiopia",  // am-ET
           ["1119"] = "Tamazight (Arabic)",  // tmz
           ["1120"] = "Kashmiri (Arabic)",  // ks-Arab-IN
           ["1121"] = "Nepali",  // ne-NP
           ["1122"] = "Frisian - Netherlands",  // fy-NL
           ["1123"] = "Pashto",  // ps-AF
           ["1124"] = "Filipino",  // fil-PH
           ["1125"] = "Divehi",  // dv-MV
           ["1126"] = "Edo",  // bin-NG
           ["1127"] = "Fulfulde - Nigeria",  // fuv-NG
           ["1128"] = "Hausa - Nigeria",  // ha-Latn-NG
           ["1129"] = "Ibibio - Nigeria",  // ibb-NG
           ["1130"] = "Yoruba",  // yo-NG
           ["1131"] = "Quecha - Bolivia",  // quz-BO
           ["1132"] = "Sepedi",  // nso-ZA
           ["1136"] = "Igbo - Nigeria",  // ig-NG
           ["1137"] = "Kanuri - Nigeria",  // kr-NG
           ["1138"] = "Oromo",  // gaz-ET
           ["1139"] = "Tigrigna - Ethiopia",  // ti-ER
           ["1140"] = "Guarani - Paraguay",  // gn-PY
           ["1141"] = "Hawaiian - United States",  // haw-US
           ["1142"] = "Latin",  // la
           ["1143"] = "Somali",  // so-SO
           ["1144"] = "Yi",  // ii-CN
           ["1145"] = "Papiamentu",  // pap-AN
           ["1152"] = "Uighur - China",  // ug-Arab-CN
           ["1153"] = "Maori - New Zealand",  // mi-NZ
           ["2049"] = "Arabic - Iraq",  // ar-IQ
           ["2052"] = "Chinese - People's Republic of China",  // zh-CN
           ["2055"] = "German - Switzerland",  // de-CH
           ["2057"] = "English - United Kingdom",  // en-GB
           ["2058"] = "Spanish - Mexico",  // es-MX
           ["2060"] = "French - Belgium",  // fr-BE
           ["2064"] = "Italian - Switzerland",  // it-CH
           ["2067"] = "Dutch - Belgium",  // nl-BE
           ["2068"] = "Norwegian (Nynorsk)",  // nn-NO
           ["2070"] = "Portuguese - Portugal",  // pt-PT
           ["2072"] = "Romanian - Moldava",  // ro-MD
           ["2073"] = "Russian - Moldava",  // ru-MD
           ["2074"] = "Serbian (Latin)",  // sr-Latn-CS
           ["2077"] = "Swedish - Finland",  // sv-FI
           ["2080"] = "Urdu - India",  // ur-IN
           ["2092"] = "Azeri (Cyrillic)",  // az-Cyrl-AZ
           ["2108"] = "Gaelic (Ireland)",  // ga-IE
           ["2110"] = "Malay - Brunei Darussalam",  // ms-BN
           ["2115"] = "Uzbek (Cyrillic)",  // uz-Cyrl-UZ
           ["2117"] = "Bengali (Bangladesh)",  // bn-BD
           ["2118"] = "Punjabi (Pakistan)",  // pa-PK
           ["2128"] = "Mongolian (Mongolian)",  // mn-Mong-CN
           ["2129"] = "Tibetan - Bhutan",  // bo-BT
           ["2137"] = "Sindhi - Pakistan",  // sd-PK
           ["2143"] = "Tamazight (Latin)",  // tzm-Latn-DZ
           ["2144"] = "Kashmiri (Devanagari)",  // ks-Deva-IN
           ["2145"] = "Nepali - India",  // ne-IN
           ["2155"] = "Quecha - Ecuador",  // quz-EC
           ["2163"] = "Tigrigna - Eritrea",  // ti-ET
           ["3073"] = "Arabic - Egypt",  // ar-EG
           ["3076"] = "Chinese - Hong Kong SAR",  // zh-HK
           ["3079"] = "German - Austria",  // de-AT
           ["3081"] = "English - Australia",  // en-AU
           ["3082"] = "Spanish - Spain (Modern Sort)",  // es-ES
           ["3084"] = "French - Canada",  // fr-CA
           ["3098"] = "Serbian (Cyrillic)",  // sr-Cyrl-CS
           ["3179"] = "Quecha - Peru",  // quz-PE
           ["4097"] = "Arabic - Libya",  // ar-LY
           ["4100"] = "Chinese - Singapore",  // zh-SG
           ["4103"] = "German - Luxembourg",  // de-LU
           ["4105"] = "English - Canada",  // en-CA
           ["4106"] = "Spanish - Guatemala",  // es-GT
           ["4108"] = "French - Switzerland",  // fr-CH
           ["4122"] = "Croatian (Bosnia/Herzegovina)",  // hr-BA
           ["5121"] = "Arabic - Algeria",  // ar-DZ
           ["5124"] = "Chinese - Macao SAR",  // zh-MO
           ["5127"] = "German - Liechtenstein",  // de-LI
           ["5129"] = "English - New Zealand",  // en-NZ
           ["5130"] = "Spanish - Costa Rica",  // es-CR
           ["5132"] = "French - Luxembourg",  // fr-LU
           ["5146"] = "Bosnian (Bosnia/Herzegovina)",  // bs-Latn-BA
           ["6145"] = "Arabic - Morocco",  // ar-MO
           ["6153"] = "English - Ireland",  // en-IE
           ["6154"] = "Spanish - Panama",  // es-PA
           ["6156"] = "French - Monaco",  // fr-MC
           ["7169"] = "Arabic - Tunisia",  // ar-TN
           ["7177"] = "English - South Africa",  // en-ZA
           ["7178"] = "Spanish - Dominican Republic",  // es-DO
           ["7180"] = "French - West Indies",  // fr-029
           ["8193"] = "Arabic - Oman",  // ar-OM
           ["8201"] = "English - Jamaica",  // en-JM
           ["8202"] = "Spanish - Venezuela",  // es-VE
           ["8204"] = "French - Reunion",  // fr-RE
           ["9217"] = "Arabic - Yemen",  // ar-YE
           ["9225"] = "English - Caribbean",  // en-029
           ["9226"] = "Spanish - Colombia",  // es-CO
           ["9228"] = "French - Democratic Rep. of Congo",  // fr-CG
           ["10241"] = "Arabic - Syria",  // ar-SY
           ["10249"] = "English - Belize",  // en-BZ
           ["10250"] = "Spanish - Peru",  // es-PE
           ["10252"] = "French - Senegal",  // fr-SN
           ["11265"] = "Arabic - Jordan",  // ar-JO
           ["11273"] = "English - Trinidad",  // en-TT
           ["11274"] = "Spanish - Argentina",  // es-AR
           ["11276"] = "French - Cameroon",  // fr-CM
           ["12289"] = "Arabic - Lebanon",  // ar-LB
           ["12297"] = "English - Zimbabwe",  // en-ZW
           ["12298"] = "Spanish - Ecuador",  // es-EC
           ["12300"] = "French - Cote d'Ivoire",  // fr-CI
           ["13313"] = "Arabic - Kuwait",  // ar-KW
           ["13321"] = "English - Philippines",  // en-PH
           ["13322"] = "Spanish - Chile",  // es-CL
           ["13324"] = "French - Mali",  // fr-ML
           ["14337"] = "Arabic - U.A.E.",  // ar-AE
           ["14345"] = "English - Indonesia",  // en-ID
           ["14346"] = "Spanish - Uruguay",  // es-UY
           ["14348"] = "French - Morocco",  // fr-MA
           ["15361"] = "Arabic - Bahrain",  // ar-BH
           ["15369"] = "English - Hong Kong SAR",  // en-HK
           ["15370"] = "Spanish - Paraguay",  // es-PY
           ["15372"] = "French - Haiti",  // fr-HT
           ["16385"] = "Arabic - Qatar",  // ar-QA
           ["16393"] = "English - India",  // en-IN
           ["16394"] = "Spanish - Bolivia",  // es-BO
           ["17417"] = "English - Malaysia",  // en-MY
           ["17418"] = "Spanish - El Salvador",  // es-SV
           ["18441"] = "English - Singapore",  // en-SG
           ["18442"] = "Spanish - Honduras",  // es-HN
           ["19466"] = "Spanish - Nicaragua",  // es-NI
           ["20490"] = "Spanish - Puerto Rico",  // es-PR
           ["21514"] = "Spanish - United States",  // es-US
           ["58378"] = "Spanish - Latin America",  // es-419
           ["58380"] = "French - North Africa",  // fr-015
           ["None"] = Maquina + " None" // return new

       };

       if (Machine.ContainsKey(Maquina) == false) { Maquina = "None"; }

       return Machine[Maquina];
   }
public static string RESOURSE_VS_FIXEDFILEINFO_dwFileFlags(string Maquina)
    {
        var Machine = new Dictionary<string, string>
        {

            ["00000001"] = "VS_FF_DEBUG",  //  El archivo contiene información de depuración o se compila con las funciones de depuración habilitadas.

            ["00000010"] = "VS_FF_INFOINFERRED",  // La estructura de la versión del archivo se creó de forma dinámica; por lo tanto, algunos de los miembros de esta estructura pueden estar vacíos o incorrectos. Esta bandera nunca debe establecerse en los datos VS_VERSIONINFO de un archivo.

            ["00000004"] = "VS_FF_PATCHED",  // El archivo ha sido modificado y no es idéntico al archivo de envío original del mismo número de versión.

            ["00000002"] = "VS_FF_PRERELEASE",  // El archivo es una versión de desarrollo, no un producto comercializado.

            ["00000008"] = "VS_FF_PRIVATEBUILD",  // El archivo no se creó utilizando los procedimientos de publicación estándar.Si se establece este indicador, la estructura StringFileInfo debe contener una entrada PrivateBuild entry.


            ["00000020"] = "VS_FF_SPECIALBUILD",  // El archivo fue creado por la empresa original utilizando procedimientos de publicación estándar, pero es una variación del archivo normal del mismo número de versión. Si se establece este indicador, la estructura StringFileInfo debe contener una entrada SpecialBuild entry.

            ["None"] = Maquina + " None"  // return new

        };

        if (Machine.ContainsKey(Maquina) == false) { Maquina = "None"; }

        return Machine[Maquina];
    }

    public static string RESOURSE_VS_FIXEDFILEINFO_dwFileOS(string Maquina)
    {
        var Machine = new Dictionary<string, string>
        {

            ["00010000"] = "VOS_DOS",  //The file was designed for MS-DOS.
            ["00040000"] = "VOS_NT",  //The file was designed for Windows NT.
            ["00000001"] = "VOS__WINDOWS16",  //The file was designed for 16-bit Windows.
            ["00000004L"] = "VOS__WINDOWS32",  //The file was designed for 32-bit Windows.
            ["00020000L"] = "VOS_OS216",  //The file was designed for 16-bit OS/2.
            ["00030000L"] = "VOS_OS232",  //The file was designed for 32-bit OS/2.
            ["00000002L"] = "VOS__PM16",  //The file was designed for 16-bit Presentation Manager.
            ["00000003L"] = "VOS__PM32",  //The file was designed for 32-bit Presentation Manager.
            ["00000000L"] = "VOS_UNKNOWN",  //The operating system for which the file was designed is unknown to the system.
            ["00010001"] = "VOS_DOS_WINDOWS16",  //The file was designed for 16-bit Windows running on MS-DOS.
            ["00010004"] = "VOS_DOS_WINDOWS32",  //The file was designed for 32-bit Windows running on MS-DOS.
            ["00040004"] = "VOS_NT_WINDOWS32",  //The file was designed for Windows NT.
            ["00020002"] = "VOS_OS216_PM16",  //The file was designed for 16-bit Presentation Manager running on 16-bit OS/2.
            ["00030003"] = "VOS_OS232_PM32",  //The file was designed for 32-bit Presentation Manager running on 32-bit OS/2.
            ["None"] = Maquina + " None"  // return new

        };

        if (Machine.ContainsKey(Maquina) == false) { Maquina = "None"; }

        return Machine[Maquina];
    }

    public static string RESOURSE_VS_FIXEDFILEINFO_dwFileType(string Maquina)
    {
        var Machine = new Dictionary<string, string>
        {

            ["00000001"] = "VFT_APP",  //The file contains an application.
            ["00000002"] = "VFT_DLL",  //The file contains a DLL.
            ["00000003"] = "VFT_DRV",  //The file contains a device driver. If dwFileType is VFT_DRV, dwFileSubtype contains a more specific description of the driver.
            ["00000004"] = "VFT_FONT",  //The file contains a font. If dwFileType is VFT_FONT, dwFileSubtype contains a more specific description of the font file.
            ["00000007"] = "VFT_STATIC_LIB",  //The file contains a static-link library.
            ["00000000"] = "VFT_UNKNOWN",  //The file type is unknown to the system.
            ["00000005"] = "VFT_VXD",  //The file contains a virtual device.
            ["None"] = Maquina + " None"  // return new

        };

        if (Machine.ContainsKey(Maquina) == false) { Maquina = "None"; }

        return Machine[Maquina];
    }

    // Todos los valores de dwFileSubtype que no se enumeran aquí están reservados.
    public static string RESOURSE_VS_FIXEDFILEINFO_VFT_DRV_dwFileSubtype_(string Maquina)
    {
        var Machine = new Dictionary<string, string>
        {

            ["0000000A"] = "VFT2_DRV_COMM",  //The file contains a communications driver.
            ["00000004"] = "VFT2_DRV_DISPLAY",  //The file contains a display driver.
            ["00000008"] = "VFT2_DRV_INSTALLABLE",  //The file contains an installable driver.
            ["00000002"] = "VFT2_DRV_KEYBOARD",  //The file contains a keyboard driver.
            ["00000003"] = "VFT2_DRV_LANGUAGE",  //The file contains a language driver.
            ["00000005"] = "VFT2_DRV_MOUSE",  //The file contains a mouse driver.
            ["00000006"] = "VFT2_DRV_NETWORK",  //The file contains a network driver.
            ["00000001"] = "VFT2_DRV_PRINTER",  //The file contains a printer driver.
            ["00000009"] = "VFT2_DRV_SOUND",  //The file contains a sound driver.
            ["00000007"] = "VFT2_DRV_SYSTEM",  //The file contains a system driver.
            ["0000000C"] = "VFT2_DRV_VERSIONED_PRINTER",  //The file contains a versioned printer driver.
            ["00000000"] = "VFT2_UNKNOWN",  //The driver type is unknown by the system.

            ["None"] = Maquina + " None"  // return new

        };

        if (Machine.ContainsKey(Maquina) == false) { Maquina = "None"; }

        return Machine[Maquina];
    }
    public static string RESOURSE_VS_FIXEDFILEINFO_VFT_FONT_dwFileSubtype_(string Maquina)
    {
        var Machine = new Dictionary<string, string>
        {

            ["00000001"] = "VFT2_FONT_RASTER",  //The file contains a raster font.
            ["00000003"] = "VFT2_FONT_TRUETYPE",  //The file contains a TrueType font.
            ["00000002"] = "VFT2_FONT_VECTOR",  //The file contains a vector font.
            ["00000000"] = "VFT2_UNKNOWN",  //The font type is unknown by the system.
            ["None"] = Maquina + " None"  // return new

        };

        if (Machine.ContainsKey(Maquina) == false) { Maquina = "None"; }

        return Machine[Maquina];
    }