Go4Expert

Go4Expert (http://www.go4expert.com/)
-   Win32 (http://www.go4expert.com/articles/win32-tutorials/)
-   -   OS version detection for 32 and 64 bit OS. (http://www.go4expert.com/articles/os-version-detection-32-64-bit-os-t1472/)

shabbir 26Sep2006 13:02

OS version detection for 32 and 64 bit OS.
 
1 Attachment(s)
I needed to check the OS and on different OS the different path needed to be followed and so the host operating system version was needed for an application I was developing.

Background



First I would like to make a table where we know what are the platformId, MajorVersion, MinorVersion of each of the Window'sOS. Here are the PlatformId, Major and Minor Version Numbers of the 32-bit Windows operating systems Table
Code:

+----------+------------+-------+-------+
| Version  | PlatformId | Major | Minor |
+----------+------------+-------+-------+
| Win95    |      1    |  4  |  0  |
| Win98    |      1    |  4  |  10  |
| WinME    |      1    |  4  |  90  |
| WinNT351 |      2    |  3  |  51  |
| WinNT4  |      2    |  4  |  0  |
| Win2000  |      2    |  5  |  0  |
| WinXP    |      2    |  5  |  1  |
| Win2003  |      2    |  5  |  2  |
| WinCE    |      3    |  ?  |  ?  |
| WinLH    |      2    |  6  |  0  |
+----------+------------+-------+-------+

Coding



Now lets begin the OS detection code and for that we need some constants. Lets define the constants first
Code: C++

typedef enum OSVersion
{
    WIN95 = 1,
    WIN98 = 2,
    WINME = 3,
    WINNT351 = 4,
    WINNT4 = 5,
    WIN2000 = 6,
    WINXP = 7,
    WIN2003 = 8,
    WINCE = 9,
    WINLH = 10,
    WIN64BIT = 11
} OS_VERSION;

Now lets write a general routine to detect the OS. Here is the function to detect the OS.
Code: C++

OS_VERSION GetHostOS()
{
    BOOL bIs64BitOS = FALSE;
    BOOL bIsWin95 = FALSE;
    BOOL bIsWin98 = FALSE;
    BOOL bIsWinME = FALSE;
    BOOL bIsWinNT351 = FALSE;
    BOOL bIsWinNT4 = FALSE;
    BOOL bIsWin2000 = FALSE;
    BOOL bIsWinXP = FALSE;
    BOOL bIsWin2003 = FALSE;
    BOOL bIsWinLH = FALSE;
   
    // We check if the OS is 64 Bit
    typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);

    LPFN_ISWOW64PROCESS
    fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(
    GetModuleHandle("kernel32"),"IsWow64Process");
 
    if (NULL != fnIsWow64Process)
    {
        if (!fnIsWow64Process(GetCurrentProcess(),&bIs64BitOS))
        {
            // handle error
        }
    }

    OSVERSIONINFO osvi;
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    ::GetVersionEx( &osvi );
   
    bIsWin95 =
       (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) &&
       (osvi.dwMajorVersion == 4) &&
       (osvi.dwMinorVersion == 0);

    bIsWin98 =
       (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) &&
       (osvi.dwMajorVersion == 4) &&
       (osvi.dwMinorVersion == 10);

    bIsWinME =
       (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) &&
       (osvi.dwMajorVersion == 4) &&
       (osvi.dwMinorVersion == 90);

    bIsWinNT351 =
       (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) &&
       (osvi.dwMajorVersion == 3) &&
       (osvi.dwMinorVersion == 51);

    bIsWinNT4 =
       (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) &&
       (osvi.dwMajorVersion == 4) &&
       (osvi.dwMinorVersion == 0);

    bIsWin2000 =
       (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) &&
       (osvi.dwMajorVersion == 5) &&
       (osvi.dwMinorVersion == 0);

    bIsWinXP =
       (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) &&
       (osvi.dwMajorVersion == 5) &&
       (osvi.dwMinorVersion == 1);

    bIsWin2003 =
       (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) &&
       (osvi.dwMajorVersion == 5) &&
       (osvi.dwMinorVersion == 2);

    bIsWinLH =
        (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) &&
        (osvi.dwMajorVersion == 6);

    if( bIs64BitOS ) return WIN64BIT;
    if( bIsWin95 ) return WIN95;
    if( bIsWin98 ) return WIN98;
    if( bIsWinME ) return WINME;
    if( bIsWinNT351 ) return WINNT351;
    if( bIsWinNT4 ) return WINNT4;
    if( bIsWin2000 ) return WIN2000;
    if( bIsWinXP ) return WINXP;
    if( bIsWin2003 ) return WIN2003;
    if( bIsWinLH ) return WINLH;

    return WINXP;
}

I have skipped the WINCE but that can be easily added with the help of the above table.

aisha.ansari84 5Mar2008 18:47

Re: OS version detection for 32 and 64 bit OS.
 
wow something like this is also possible

rahul.mca2001 6Mar2008 13:19

Re: OS version detection for 32 and 64 bit OS.
 
i tried it works

Farrukh 10Aug2010 12:29

Re: OS version detection for 32 and 64 bit OS.
 
I'm trying to download OsVersion.zip, but it is downloading as "attachment.php" and when I rename it to OsVersion.zip, it is found corrupted. :(

Farrukh 10Aug2010 12:30

Re: OS version detection for 32 and 64 bit OS.
 
But on the 2nd try, I downloaded and renamed to zip and it worked fine :)

Going to try that

msdnguide 27May2011 20:14

Re: OS version detection for 32 and 64 bit OS.
 
On solaris there is a command called isainfo that describe instruction set architectures. It will tell if OS is in 32 bit or 64 bit


All times are GMT +5.5. The time now is 22:05.