Я вижу, что на ваш вопрос 2 (вы работаете на Win64?) Уже дан ответ. Просто помните, что для того, чтобы ваш код был ориентирован на будущее, вы должны учитывать, что в (гипотетическом) 64-битном приложении Delphi, работающем на Win64, IsWow64Process также будет возвращать FALSE.
Что касается вашего первого вопроса - у вас 64-битный ЦП - вы можете проверить аппаратное обеспечение на наличие соответствующего флага функции CPUID, как показано в приведенном ниже коде.
<code>
function Is64BitProcessor: boolean;
begin
Result:=false;
if CpuidAvailable = true then Result := Has64BitFeatureFlag;
end;
, который использует следующие две функции низкого уровня:
function CPUIDavailable:boolean;
asm // if EFLAGS bit 21 can be modified then CPUID is available
pushfd //Save Flags
pushfd //Copy flags to EAX
pop eax
mov ecx,eax //Make another copy in ECX
btc eax,21 //Complement bit 21
push eax //Copy EAX to flags
popfd
pushfd //Copy flags back to EAX
pop eax
cmp eax,ecx //Compare "old" flags value with potentially modified "new" value
setne al //Set return value
popfd //Restore flags
end;</p>
<p>function Has64BitFeatureFlag: boolean;
asm
//IF CPUID.80000001h.EDX[bit29]=1 THEN it's a 64bit processor.
//But we first need to check whether there's a function 80000001h.
push ebx //Save EBX as CPUID will modify EBX
push esi //Save ESI as we'll use ESI internally</p>
<pre><code>xor eax,eax //Setting EAX = input param for CPUID to 0
cpuid //Call CPUID.0
//Returns -> EAX = max "standard" EAX input value
mov esi, eax //Saving MaxStdInput Value
mov eax,80000000h //Setting EAX = input param for CPUID to $80000000
cpuid //Call CPUID.80000000h
//Returns -> EAX = max "extended" EAX input value
//If 80000000h call is unsupported (no 64-bit processor),
//cpuid should return the same as in call 0
cmp eax, esi
je @No64BitProcessor //IF EAX{MaxExtInput} = ESI{MaxStdInput} THEN goto No64BitProcessor;
cmp eax, 80000001h
jb @No64BitProcessor //IF EAX{MaxExtInput} < $80000001 THEN goto No64BitProcessor;
mov eax,80000001h //Call $80000001 is supported, setting EAX:=$80000001
cpuid //Call CPUID.80000001h
//Checking "AMD long mode"/"Intel EM64T" feature bit (i.e., 64bit processor)
bt edx, 29 //by checking CPUID.80000001h.EDX[bit29]
setc al //IF Bit29=1 then AL{Result}:=1{true; it's a 64-bit processor}
jmp @Exit //Exit {Note that Delphi may actually recode this as POP ESI; POP EBX; RET}
@ No64BitProcessor:
xor eax, eax // Результат {AL / EAX}: = 0 {false; это 32-битный процессор};
@Выход:
pop esi // Восстановление ESI
pop ebx // Восстановление EBX
конец;
EDIT1: примечание к CPUIDavailable
: Это, конечно, предполагается, что> = 32-битный процессор x86 (80386 или новее), но Delphi Win32-код все равно не будет работать на более ранних машинах. Инструкция CPUID была введена в конце 80486 процессоров.