Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why %processor_architecture% always returns x86 instead of AMD64

I am trying to retrieve the environment variable to detect whether the system is 32 or 64 bit. But on 64 bit server the environment variable %processor_architecture% is returning x86 instead of AMD64.

Does anyone has any clue about this?

like image 716
alice7 Avatar asked Nov 15 '09 21:11

alice7


9 Answers

You may be getting the wrong environment variable. If your application is a 32-bit application running on a 64-bit OS the process version of this environment variable will return x86. If you want to find the architecture of the machine, you can grab it from the following registry entry:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment\PROCESSOR_ARCHITECTURE

Or if you're using .NET, then you can use this call to get it:

string arch = System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE", 
    EnvironmentVariableTarget.Machine);

From the command line you can try this:

reg query "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" /v PROCESSOR_ARCHITECTURE

There is even a more simple solution using cmd:

ECHO %PROCESSOR_ARCHITECTURE%
like image 118
Gerald Avatar answered Oct 15 '22 17:10

Gerald


You can also get this from an environment variable, PROCESSOR_ARCHITEW6432. See this article for more info.

like image 25
Patrick Cuff Avatar answered Oct 15 '22 19:10

Patrick Cuff


Are you actually running a 64-bit version of Windows? If you are running 32-bit Windows on a 64-bit-capable CPU, you will still get x86.

like image 26
bobince Avatar answered Oct 15 '22 18:10

bobince


Assuming 64bit PC with 64bit Windows installation.

%processor_architecture% returns x86 only when getting the value in 32bit programs. In 64bit programs it returns correctly AMD64.

Example: execute echo %processor_architecture% from:

  • 32bit Total Commander
  • 64bit Explorer
like image 33
SkyRaT Avatar answered Oct 15 '22 17:10

SkyRaT


AMD64 is a brand of CPU which is based on the x86 architecture. x86-64 more precisely, which is the 64-bit extension of x86.

This also relates to bobince's answer.

This Knowledge Base article shows you how to determine if your system is 32-bit or 64-bit

like image 40
Dan McGrath Avatar answered Oct 15 '22 18:10

Dan McGrath


MOST RELIABLE SOLUTION:

Method 1:
(Two step Validation with PROCESSOR_ARCHITECTURE and PROCESSOR_ARCHITEW6432)

set Arch=x64
if "%PROCESSOR_ARCHITECTURE%" == "x86" ( 
    if not defined PROCESSOR_ARCHITEW6432 set Arch=x86
) 

if "%Arch%" == "x64"    (
    msg * "yessss"
) else  (
    msg * "noooo"
)

Method 2:

reg Query "HKLM\Hardware\Description\System\CentralProcessor\0" | find /i "x32" > NUL && set OS=32BIT || set OS=64BIT

if %OS%==32BIT echo "YESSS"
if %OS%==64BIT echo "NOOO"

source: https://superuser.com/a/293143/249349

like image 42
T.Todua Avatar answered Oct 15 '22 19:10

T.Todua


I think part of the reason it is like this way is that the x86-64 architecture has to allow 32-bit programs to treat it as identical (as far as possible) to a 32-bit environment and make sure that 32-bit programs do not think it is 64-bit only (like the Itanium architecture).

This however makes it very frustrating to people who need to access the differences between the x86-64 architecture vs 32 bit architecture on Windows.

like image 25
John Thomas Avatar answered Oct 15 '22 19:10

John Thomas


I found on my Win7HB x64 system:

msgbox wscript.createobject("wscript.shell").environment("system").item("processor_architecture") ' always "AMD64"

msgbox wscript.createobject("wscript.shell").environment("process").item("processor_architecture") ' "AMD64" if launched via System32, "x86" if launched via SysWOW64
like image 42
omegastripes Avatar answered Oct 15 '22 18:10

omegastripes


Apologize for the grave dig. However, the processor architecture environmental variable is accessible via powershell ...

$env:PROCESSOR_ARCHITECTURE
like image 21
Edward J Beckett Avatar answered Oct 15 '22 19:10

Edward J Beckett