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;
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;
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
MOV ECX, EAX
... 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