Ver Mensaje Individual
  #3  
Antiguo 20-04-2018
Mav Mav is offline
Miembro
 
Registrado: jun 2007
Posts: 39
Reputación: 0
Mav Va por buen camino
hola

Gracias Casimiro, lo probé, funciona tambien, he pobado otra cosa que aparentemente funciona, aunque
cogido por un pelo, no me convence del todo:
Código Delphi [-]
program Project1;


uses
 WinApi.Windows;
// {$R *.RES}

 function GetFlagZ:Boolean;
  asm
    xor eax, eax
    mov ax, es
    ror ax, 3
    and eax, 1
    //test eax, eax
  end;

begin

   GetflagZ;
   if  GetflagZ  then
   MessageBox(0,'You are running 64 bit','Architecture',MB_OK or MB_ICONINFORMATION)
   else
   MessageBox(0,'You are running 32 bit','Architecture',MB_OK or MB_ICONINFORMATION);

end.
...se supone que en este caso eax va a ser uno o cero, cero en caso de 32 bits ( flag ZF a 1), uno en caso de 64 bits (flag ZF a cero), entonces le estoy haciendo
trampas al compilador....
Se puede también ver si es 32 ó 64 accediendo al TEB (https://en.wikipedia.org/wiki/Win32_...ormation_Block) así:
......................
..........................
4 FS:[0x3C] NT Address of CSR Client Thread
4 FS:[0x40] NT Win32 Thread Information
124 FS:[0x44] NT, Wine Win32 client information (NT), user32 private data (Wine), 0x60 = LastError (Win95), 0x74 = LastError (WinME)

4 FS:[0xC0] NT Reserved for Wow64. Contains a pointer to FastSysCall in Wow64.

4 FS:[0xC4] NT Current Locale
4 FS:[0xC8] NT FP Software Status Register
.......................
.................
Código Delphi [-]
program winteb;

uses
WinApi.Windows;

//{$R *.res}

   var
    caption:  PChar =  'Arquitectura';
    message2: PChar =  'Estas en 32 bits';
    message1: PChar =  'Estas en 64 bits';

begin
 asm
     xor eax,eax
     mov eax, [fs:$0C0 ]
     test eax,eax
   je @@tredos
     push MB_OK+MB_ICONINFORMATION
     push caption
     push message1
     push 0
    call MessageBox
     jmp @@exit
   @@tredos  :
     push MB_OK+MB_ICONINFORMATION
     push caption
     push message2
     push 0
   call MessageBox
  @@exit:
     push 0
    call ExitProcess

 end;

end.
...en este caso no se le pueden hacer trampas al compilador, no funciona..pero se me ha ocurrido otra cosa, vi en el código de "Detours":
Código Delphi [-]
function ___IsCPUIDSupported: Boolean;
asm
  {$IFDEF CPUX86}
  PUSH ECX
  PUSHFD
  POP EAX { EAX = EFLAGS }
  MOV ECX, EAX  { Save the original EFLAGS value . }
... voy a crear una funcion que me de como result los eflagss y luego
sólo habria que comprobar si el bit correspondiente al ZeroFlag está a cero o uno.....
Ya os lo contaré...
Saludos
Responder Con Cita