2012-02-16 21 views
13

Estoy trabajando con Adobe Flash ocx cargándolo en mi programa C++. Se supone que el ocx es de 64 bits, pero por alguna razón tiene problemas cuando compilo con la plataforma x64. He leído sobre esto y encontré que es probable que alguna función reciba DWORD userData en lugar de void* userData a través de alguna estructura y luego la arroje a un puntero de objeto. Esto funciona bien en un entorno de 32 bits, pero falla en 64 bits.MASM Fixing 64 bit Truncation en una DLL

El desmontaje de las llamadas de función dentro de la OCX que causan el accidente son las siguientes líneas:

mov   ecx,r8d 

las primeras copias operación sólo bajas de 32-bits de R8D a ECX (ECX es de 32 bits).

cmp   dword ptr [rcx+11BCh],0 

La segunda operación accesos registro de 64 bits, donde la baja de 32 bits de contiene la dirección correcta y altos de 32 bits contiene un poco de chatarra. Llevando a un choque, por supuesto.

Solución

He leído que una posible solución es hacer lo siguiente:

  1. Crear un archivo asm que contiene el siguiente código:

    nop 
    nop 
    nop 
    
    mov ecx,r8d 
    cmp dword ptr [rcx+11BCh],0 
    
    nop 
    nop 
    nop 
    
    mov rcx,r8d // I've replaced ecx with rcx here 
    cmp dword ptr [rcx+11BCh],0 
    
  2. Construya un archivo obj usando este archivo asm y MASM.exe

  3. Abrir el archivo obj con un editor hexadecimal y localizar los años 90 que representan la nop
  4. En Flash OCX localizar la primera cadena de bytes entre los NOP y sustituirla por la nueva cadena de bytes que se produce después de los NOP . Esto lo cambiará de llamadas de función de 32 bits a 64 bits.

Problema

que han intentado esto haciendo el siguiente archivo de ASM y la construcción con ml64.exe (no tengo MASM.EXE pero creo que es el nuevo ml.exe versión de 32 bits de la misma, y ​​este código sólo se construiría con el ml64.exe, probablemente a causa de los 64 bits sólo los operadores):?

TITLE: Print String Assembly Program (test.asm) 

.Code 
main Proc 
nop 
nop 
nop 

mov ecx,r8d 
cmp dword ptr [rcx+11BCh],0 

nop 
nop 
nop 

mov rcx,r8 
cmp dword ptr [rcx+11BCh],0 

main ENDP 
END 

tuve problemas para conseguir que se acumule (seguí recibiendo errores sobre coincidencia de longitud de instrucción) hasta que cambiado r8d a r8 en la segunda sección.

Obtuve este obj para compilarlo, lo abrí con un editor hexadecimal y pude localizar las dos cadenas de bytes. Pero donde surge mi problema es que cuando busco la primera cadena de bytes que debe estar en el flash ocx, no puedo encontrarla. No está allí, así que no puedo reemplazarlo con el segundo.

¿Qué estoy haciendo mal?

Gracias!

+2

Puede ser la persona más inteligente en la comunidad Flash aquí. heh –

+0

ha Ojalá ... De hecho, me gustaría saber más sobre el montaje y podría hacer que esto funcione. Estoy casi seguro de que sé cuál es el problema, ¡parece que no puede arreglarlo! –

+0

¿Está diciendo que resolvió su problema editando manualmente el archivo Flash OCX? – Gabe

Respuesta

0
  1. Crear un archivo asm que contiene el siguiente código:

    nop 
    nop 
    nop 
    
    mov ecx,r8d 
    cmp dword ptr [rcx+11BCh],0 
    
    nop 
    nop 
    nop 
    
    mov rcx,r8d // I've replaced ecx with rcx here 
    cmp dword ptr [rcx+11BCh],0 
    
  2. crear un archivo obj utilizando este archivo asm y MASM.EXE

  3. Abrir el archivo obj con un editor hexadecimal y localice los 90 que representan el nop
  4. En Flash ocx, busque la primera cadena de bytes entre los nops y reemplácela con la nueva cadena de bytes que aparece después de los nops. Esto lo cambiará de llamadas de función de 32 bits a 64 bits.

hice la siguiente archivo asm y construido con ml64.exe

TITLE: Print String Assembly Program (test.asm) 

.Code 
main Proc 
nop 
nop 
nop 

mov ecx,r8d 
cmp dword ptr [rcx+11BCh],0 

nop 
nop 
nop 

mov rcx,r8 
cmp dword ptr [rcx+11BCh],0 

main ENDP 
END 

Tengo este obj para construir, y lo abrió con un editor hexadecimal y fue capaz de localizar las dos cadenas de bytes. Encontré la primera cadena de bytes en Flash OCX y la cambié a la segunda. (El único cambio real fue de 41 a 49 en las cadenas)