윈도우 OS가 몇 비트 인지 알아오는 방법


윈도우 OS가 몇 비트 인지 알아오는 방법에는 2가지가 있습니다.



1. GetSystemInfo, GetNativeSystemInfo 함수 사용.


2. IsWow64Process 함수 사용.



GetSystemInfo 부터 알아 보겠습니다.



GetSystemInfo는 시스템 정보를 얻어오는 함수 입니다.



이렇게 정의 되어 있습니다.



WINBASEAPI VOID WINAPI GetSystemInfo( __out LPSYSTEM_INFO lpSystemInfo ) ;



얻어오는 인자 값으론 SYSTEM_INFO 라는 구조체를 사용 합니다.


typedef struct _SYSTEM_INFO {
    union {
        DWORD dwOemId;          // Obsolete field…do not use
        struct {
            WORD wProcessorArchitecture;
            WORD wReserved;
        };
    };
    DWORD dwPageSize;
    LPVOID lpMinimumApplicationAddress;
    LPVOID lpMaximumApplicationAddress;
    DWORD_PTR dwActiveProcessorMask;
    DWORD dwNumberOfProcessors;
    DWORD dwProcessorType;
    DWORD dwAllocationGranularity;
    WORD wProcessorLevel;
    WORD wProcessorRevision;
} SYSTEM_INFO, *LPSYSTEM_INFO;



OS의 비트를 알아올 때에는 CPU의 아키텍쳐를 이용해서 검사를 하게 됩니다.



왜 OS의 비트를 알아올 때 CPU를 검사 하느냐 하면 32비트의 CPU에서는 64비트의 OS가 깔리지 않습니다.



그러므로 32비트의 CPU를 사용하게 되면 무조건 32비트의 OS가 깔리겠죠?



64비트의 CPU를 사용하게 되면 32비트/64비트의 OS 모두 깔리게 됩니다. 그런데 깔리는 OS에 따라서 CPU의 정보도 바뀌게 됩니다. 32비트 OS면 CPU정보도 32비트, 64비트 OS면 CPU정보도 64비트.



그래서 CPU의 정보 만으로 사용하는 OS가 몇 비트 인지 알아 올 수 있게 됩니다.



다시 돌아가서~



위의 구조체를 보시면 wProcessorArchitecture라는 변수가 있습니다.



MSDN을 보시면 이렇게 정의 되어 있습니다.



wProcessorArchitecture
   The processor architecture of the installed operating system. This member can be one of the following values.

















Value Meaning

PROCESSOR_ARCHITECTURE_AMD64
                           9



       x64 (AMD or Intel)


PROCESSOR_ARCHITECTURE_IA64
                           6



Intel Itanium Processor Family (IPF)


PROCESSOR_ARCHITECTURE_INTEL
                           0




     x86


PROCESSOR_ARCHITECTURE_UNKNOWN
                        0xffff



     Unknown architecture.


 

PROCESSOR_ARCHITECTURE_AMD64 일때 64비트.


PROCESSOR_ARCHITECTURE_INTEL 일때 32비트.



왜 AMD64일때 AMD 아니면 Intel 이냐고 물어보신 다면.. 그건 저도 모릅니다.



테스트 해보니 Intel CPU든, AMD CPU든 64비트 CPU를 가지고 있으면 AMD64, 32비트 CPU를 가지고 있으면 INTEL로 넘어 오는 것을 확인 했습니다.



그러므로 CPU가 AMD인지 Intel 인지 확인 하시려고 저 것을 사용하면 안된다는 말입니다.


자 저것을 이용하면 32비트인지 64비트 인지 알아 올 수 있게 되죠.



근데 문제는 GetSystemInfo 라는 함수에 문제점이 있습니다. 64비트의 OS를 사용하더라도 현재 수행되고 있는 프로세스가 32비트로 만들어진 것이라면(64비트로 만들어진 것이면 상관없을 것입니다.) 자신이 32비트 환경에 있는 것으로 착각을 하게 되어 32비트로 인식을 해버리게 됩니다.



그래서 Windows XP 이상에서 지원되게 나온 것이 GetNativeSystemInfo 라는 함수 입니다.



그것은 32비트로 만들어진 프로세스도 32비트 환경인지 64비트 환경인지 정확하게 알아 냅니다.



물론 Windows XP 이하에선 당연히 안되죠.



GetNativeSystemInfo를 사용하기 위해선 kenel32.dll에서 함수를 가져와서 사용해야 합니다.



코드 )



//GetNativeSystemInfo 함수를 얻어오기 위한 함수 포인터.


typedef void ( WINAPI *PFN_GET_NATIVE_SYSTEM_INFO )( LPSYSTEM_INFO ) ;



//시스템 정보를 가져올 구조체.


SYSTEM_INFO SystemInfo ;



//GetNativeSystemInfo 함수를 얻어오기 위함.
 PFN_GET_NATIVE_SYSTEM_INFO pGetNativeSystemInfo ;



//kernel32.dll에서 GetNativeSystemInfo 함수를 가져옴.
 //윈도우 XP이상에서만 GetNativeSystemInfo를 지원하기 때문에
 //하위 윈도우에서는 NULL이 옴.

 pGetNativeSystemInfo = ( PFN_GET_NATIVE_SYSTEM_INFO )GetProcAddress( GetModuleHandle( TEXT( “kernel32.dll” ) ), “GetNativeSystemInfo” ) ;



//함수를 얻어 왔다면 GetNativeSystemInfo를 이용해서 SystemInfo를 얻어옴.
 if( pGetNativeSystemInfo )
 {
  pGetNativeSystemInfo( &SystemInfo ) ;
 }
 //얻어오지 못했다면 기본적으로 제공되는 GetSystemInfo를 이용.
 else
 {
  GetSystemInfo( &SystemInfo )  ;
 }



위의 방식대로 하게 되면 SystemInfo를 가져올 수 있습니다. SystemInfo.wProcessorArchitecture를 가지고 PROCESSOR_ARCHITECTURE_AMD64 인지, PROCESSOR_ARCHITECTURE_INTEL 인지만 판단해서 32비트 64비트를 판명하면 되게 됩니다.




두번째, IsWow64Process를 이용하는 방법입니다.



Wow라고 하셔서 World of Warcraft 라고 -_- 생각하기면 곤란하고 Window on Window 입니다.



자세한건 검색해 보세요. ^^ ( 64비트 윈도우안에 32비트를 돌아가게 윈도우 가 있다고 해서 wow라고 합니다. )



이방법 역시 간단합니다. kenel32.dll에서 isWow64Process 함수를 가져와서 사용하면 됩니다.



코드 )


//IsWow64PRocess 함수를 얻어오기 위한 함수 포인터.
typedef BOOL ( WINAPI *PFN_ISWOW64PROCESS )( HANDLE, PBOOL )   ;



//시스템 정보를 가져올 구조체.


SYSTEM_INFO SystemInfo ;


 //ISWow64Process 함수를 얻어오기 위함.
 PFN_ISWOW64PROCESS   pIsWow64Process   ;



BOOL Is64Process = FALSE ;



 //이것 역시 XP이상에서만 지원할 것임. ( 테스트는 안해봤음. )
 pIsWow64Process = ( PFN_ISWOW64PROCESS )GetProcAddress( GetModuleHandle( TEXT( “kernel32.dll” ) ), “IsWow64Process” ) ;



//NULL이 아니면 IsWow64Process 함수를 이용해서 OS가 몇 비트인지 얻어옴.
 if( pIsWow64Process )
 {
     pIsWow64Process( GetCurrentProcess(), &Is64Process ) ;
 }
 else
 {
     Is64Process = FALSE ;
 }



위와 같은 방법으로 하면 현재 64비트 환경인지 32비트 환경인지 알 수 있습니다.


답글 남기기

이메일 주소는 공개되지 않습니다.