News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

OSVERSIONINFOEX Structure problem

Started by ChillyWilly, September 23, 2010, 07:23:23 PM

Previous topic - Next topic

ChillyWilly

converting from msdn to check for Windows7
http://msdn.microsoft.com/en-us/library/ms724429%28v=VS.85%29.aspx


.IF (osvi.dwMajorVersion == 6) && (osvi.dwMinorVersion == 1)
                .IF osvi.wProductType == VER_NT_WORKSTATION
                   INVOKE lstrcat, pszOS, CTEXT("Windows 7")
                INVOKE GetProcAddress, hMod, CTEXT("GetProductInfo")
                mov pGPI, eax
                lea eax, dwType
                push eax
                push 0
                push 0
                push 0
                push 6
                call pGPI
                .IF dwType == PRODUCT_ULTIMATE
                   INVOKE lstrcat, pszPF, CTEXT("Ultimate Edition")
                .ELSEIF dwType == PRODUCT_PROFESSIONAL
                   INVOKE lstrcat, pszPF, CTEXT("Professional")
                .ELSEIF dwType == PRODUCT_HOME_PREMIUM
                   INVOKE lstrcat, pszPF, CTEXT("Home Premium Edition")
                .ELSEIF dwType == PRODUCT_HOME_BASIC
                   INVOKE lstrcat, pszPF, CTEXT("Home Basic Edition")
                .ELSEIF dwType == PRODUCT_ENTERPRISE
                   INVOKE lstrcat, pszPF, CTEXT("Enterprise Edition")
                .ELSEIF dwType == PRODUCT_BUSINESS
                   INVOKE lstrcat, pszPF, CTEXT("Business Edition")
                .ELSEIF dwType == PRODUCT_STARTER
                   INVOKE lstrcat, pszPF, CTEXT("Starter Edition")
                .ELSEIF dwType == PRODUCT_CLUSTER_SERVER
                   INVOKE lstrcat, pszPF, CTEXT("Cluster Server Edition")
                .ELSEIF dwType == PRODUCT_DATACENTER_SERVER
                   INVOKE lstrcat, pszPF, CTEXT("Datacenter Edition")
                .ELSEIF dwType == PRODUCT_DATACENTER_SERVER_CORE
                   INVOKE lstrcat, pszPF, CTEXT("Datacenter Edition (core installation)")
                .ELSEIF dwType == PRODUCT_ENTERPRISE_SERVER
                   INVOKE lstrcat, pszPF, CTEXT("Enterprise Edition")
                .ELSEIF dwType == PRODUCT_ENTERPRISE_SERVER_CORE
                   INVOKE lstrcat, pszPF, CTEXT("Enterprise Edition (core installation)")
                .ELSEIF dwType == PRODUCT_ENTERPRISE_SERVER_IA64
                   INVOKE lstrcat, pszPF, CTEXT("Enterprise Edition for Itanium-based Systems")
                .ELSEIF dwType == PRODUCT_SMALLBUSINESS_SERVER
                   INVOKE lstrcat, pszPF, CTEXT("Small Business Server")
                .ELSEIF dwType == PRODUCT_SMALLBUSINESS_SERVER_PREMIUM
                   INVOKE lstrcat, pszPF, CTEXT("Small Business Server Premium Edition")
                .ELSEIF dwType == PRODUCT_STANDARD_SERVER
                   INVOKE lstrcat, pszPF, CTEXT("Standard Edition")
                .ELSEIF dwType == PRODUCT_STANDARD_SERVER_CORE
                   INVOKE lstrcat, pszPF, CTEXT("Standard Edition (core installation)")
                .ELSEIF dwType == PRODUCT_WEB_SERVER
                   INVOKE lstrcat, pszPF, CTEXT("Web Server Edition")
                .ENDIF   
                .IF sysinfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64
                    INVOKE lstrcat, pszOS, CTEXT( ", 64-bit" )
                .ELSEIF sysinfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL
                    INVOKE lstrcat, pszOS, CTEXT(", 32-bit")
                .ENDIF
            .ELSE
                INVOKE lstrcat, pszOS, CTEXT("Windows Server 2008 R2")
                 .ENDIF



all of them work except this line
                .ELSEIF dwType == PRODUCT_PROFESSIONAL
                   INVOKE lstrcat, pszPF, CTEXT("Professional")

I get an error:    error A2006: undefined symbol : PRODUCT_PROFESSIONAL

lingo


frktons

Quote from: ChillyWilly on September 23, 2010, 07:23:23 PM
converting from msdn to check for Windows7
http://msdn.microsoft.com/en-us/library/ms724429%28v=VS.85%29.aspx


.IF (osvi.dwMajorVersion == 6) && (osvi.dwMinorVersion == 1)
                .IF osvi.wProductType == VER_NT_WORKSTATION
                   INVOKE lstrcat, pszOS, CTEXT("Windows 7")
                INVOKE GetProcAddress, hMod, CTEXT("GetProductInfo")
                mov pGPI, eax
                lea eax, dwType
                push eax
                push 0
                push 0
                push 0
                push 6
                call pGPI
                .IF dwType == PRODUCT_ULTIMATE
                   INVOKE lstrcat, pszPF, CTEXT("Ultimate Edition")
                .ELSEIF dwType == PRODUCT_PROFESSIONAL
                   INVOKE lstrcat, pszPF, CTEXT("Professional")
                .ELSEIF dwType == PRODUCT_HOME_PREMIUM
                   INVOKE lstrcat, pszPF, CTEXT("Home Premium Edition")
                .ELSEIF dwType == PRODUCT_HOME_BASIC
                   INVOKE lstrcat, pszPF, CTEXT("Home Basic Edition")
                .ELSEIF dwType == PRODUCT_ENTERPRISE
                   INVOKE lstrcat, pszPF, CTEXT("Enterprise Edition")
                .ELSEIF dwType == PRODUCT_BUSINESS
                   INVOKE lstrcat, pszPF, CTEXT("Business Edition")
                .ELSEIF dwType == PRODUCT_STARTER
                   INVOKE lstrcat, pszPF, CTEXT("Starter Edition")
                .ELSEIF dwType == PRODUCT_CLUSTER_SERVER
                   INVOKE lstrcat, pszPF, CTEXT("Cluster Server Edition")
                .ELSEIF dwType == PRODUCT_DATACENTER_SERVER
                   INVOKE lstrcat, pszPF, CTEXT("Datacenter Edition")
                .ELSEIF dwType == PRODUCT_DATACENTER_SERVER_CORE
                   INVOKE lstrcat, pszPF, CTEXT("Datacenter Edition (core installation)")
                .ELSEIF dwType == PRODUCT_ENTERPRISE_SERVER
                   INVOKE lstrcat, pszPF, CTEXT("Enterprise Edition")
                .ELSEIF dwType == PRODUCT_ENTERPRISE_SERVER_CORE
                   INVOKE lstrcat, pszPF, CTEXT("Enterprise Edition (core installation)")
                .ELSEIF dwType == PRODUCT_ENTERPRISE_SERVER_IA64
                   INVOKE lstrcat, pszPF, CTEXT("Enterprise Edition for Itanium-based Systems")
                .ELSEIF dwType == PRODUCT_SMALLBUSINESS_SERVER
                   INVOKE lstrcat, pszPF, CTEXT("Small Business Server")
                .ELSEIF dwType == PRODUCT_SMALLBUSINESS_SERVER_PREMIUM
                   INVOKE lstrcat, pszPF, CTEXT("Small Business Server Premium Edition")
                .ELSEIF dwType == PRODUCT_STANDARD_SERVER
                   INVOKE lstrcat, pszPF, CTEXT("Standard Edition")
                .ELSEIF dwType == PRODUCT_STANDARD_SERVER_CORE
                   INVOKE lstrcat, pszPF, CTEXT("Standard Edition (core installation)")
                .ELSEIF dwType == PRODUCT_WEB_SERVER
                   INVOKE lstrcat, pszPF, CTEXT("Web Server Edition")
                .ENDIF   
                .IF sysinfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64
                    INVOKE lstrcat, pszOS, CTEXT( ", 64-bit" )
                .ELSEIF sysinfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL
                    INVOKE lstrcat, pszOS, CTEXT(", 32-bit")
                .ENDIF
            .ELSE
                INVOKE lstrcat, pszOS, CTEXT("Windows Server 2008 R2")
                 .ENDIF



all of them work except this line
                .ELSEIF dwType == PRODUCT_PROFESSIONAL
                   INVOKE lstrcat, pszPF, CTEXT("Professional")

I get an error:    error A2006: undefined symbol : PRODUCT_PROFESSIONAL


This could be useful for the new testbed.
Can you post the entire sequence for checking also other windows systems version?

Thanks

Frank

Quote from: lingo on September 23, 2010, 08:26:43 PM
PRODUCT_PROFESSIONAL equ 30h  :wink

:U
Mind is like a parachute. You know what to do in order to use it :-)

ChillyWilly

Quote from: lingo on September 23, 2010, 08:26:43 PM
PRODUCT_PROFESSIONAL equ 30h  :wink

why would I have to this if the other ones dont need it?
@frank once i get this working correctly ill post it up
i found most of it from web

frktons

Quote from: ChillyWilly on September 23, 2010, 08:44:56 PM
Quote from: lingo on September 23, 2010, 08:26:43 PM
PRODUCT_PROFESSIONAL equ 30h  :wink

why would I have to this if the other ones dont need it?
@frank once i get this working correctly ill post it up
i found most of it from web

You have to define PRODUCT_PROFESSIONAL because it is probably
missing from the include files you are using, while the others are already inside
the includes.

Well the C version from Microsoft that you pointed me at works fine,
the ASM translation if quite hard for me, at he moment:


#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <strsafe.h>

#pragma comment(lib, "User32.lib")

#define BUFSIZE 256

typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
typedef BOOL (WINAPI *PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD);

BOOL GetOSDisplayString( LPTSTR pszOS)
{
   OSVERSIONINFOEX osvi;
   SYSTEM_INFO si;
   PGNSI pGNSI;
   PGPI pGPI;
   BOOL bOsVersionInfoEx;
   DWORD dwType;

   ZeroMemory(&si, sizeof(SYSTEM_INFO));
   ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));

   osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

   if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
      return 1;

   // Call GetNativeSystemInfo if supported or GetSystemInfo otherwise.

   pGNSI = (PGNSI) GetProcAddress(
      GetModuleHandle(TEXT("kernel32.dll")),
      "GetNativeSystemInfo");
   if(NULL != pGNSI)
      pGNSI(&si);
   else GetSystemInfo(&si);

   if ( VER_PLATFORM_WIN32_NT==osvi.dwPlatformId &&
        osvi.dwMajorVersion > 4 )
   {
      StringCchCopy(pszOS, BUFSIZE, TEXT("Microsoft "));

      // Test for the specific product.

      if ( osvi.dwMajorVersion == 6 )
      {
         if( osvi.dwMinorVersion == 0 )
         {
            if( osvi.wProductType == VER_NT_WORKSTATION )
                StringCchCat(pszOS, BUFSIZE, TEXT("Windows Vista "));
            else StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2008 " ));
         }

         if ( osvi.dwMinorVersion == 1 )
         {
            if( osvi.wProductType == VER_NT_WORKSTATION )
                StringCchCat(pszOS, BUFSIZE, TEXT("Windows 7 "));
            else StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2008 R2 " ));
         }
         
         pGPI = (PGPI) GetProcAddress(
            GetModuleHandle(TEXT("kernel32.dll")),
            "GetProductInfo");

         pGPI( osvi.dwMajorVersion, osvi.dwMinorVersion, 0, 0, &dwType);

         switch( dwType )
         {
            case PRODUCT_ULTIMATE:
               StringCchCat(pszOS, BUFSIZE, TEXT("Ultimate Edition" ));
               break;
            case PRODUCT_PROFESSIONAL:
               StringCchCat(pszOS, BUFSIZE, TEXT("Professional" ));
               break;
            case PRODUCT_HOME_PREMIUM:
               StringCchCat(pszOS, BUFSIZE, TEXT("Home Premium Edition" ));
               break;
            case PRODUCT_HOME_BASIC:
               StringCchCat(pszOS, BUFSIZE, TEXT("Home Basic Edition" ));
               break;
            case PRODUCT_ENTERPRISE:
               StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition" ));
               break;
            case PRODUCT_BUSINESS:
               StringCchCat(pszOS, BUFSIZE, TEXT("Business Edition" ));
               break;
            case PRODUCT_STARTER:
               StringCchCat(pszOS, BUFSIZE, TEXT("Starter Edition" ));
               break;
            case PRODUCT_CLUSTER_SERVER:
               StringCchCat(pszOS, BUFSIZE, TEXT("Cluster Server Edition" ));
               break;
            case PRODUCT_DATACENTER_SERVER:
               StringCchCat(pszOS, BUFSIZE, TEXT("Datacenter Edition" ));
               break;
            case PRODUCT_DATACENTER_SERVER_CORE:
               StringCchCat(pszOS, BUFSIZE, TEXT("Datacenter Edition (core installation)" ));
               break;
            case PRODUCT_ENTERPRISE_SERVER:
               StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition" ));
               break;
            case PRODUCT_ENTERPRISE_SERVER_CORE:
               StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition (core installation)" ));
               break;
            case PRODUCT_ENTERPRISE_SERVER_IA64:
               StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition for Itanium-based Systems" ));
               break;
            case PRODUCT_SMALLBUSINESS_SERVER:
               StringCchCat(pszOS, BUFSIZE, TEXT("Small Business Server" ));
               break;
            case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM:
               StringCchCat(pszOS, BUFSIZE, TEXT("Small Business Server Premium Edition" ));
               break;
            case PRODUCT_STANDARD_SERVER:
               StringCchCat(pszOS, BUFSIZE, TEXT("Standard Edition" ));
               break;
            case PRODUCT_STANDARD_SERVER_CORE:
               StringCchCat(pszOS, BUFSIZE, TEXT("Standard Edition (core installation)" ));
               break;
            case PRODUCT_WEB_SERVER:
               StringCchCat(pszOS, BUFSIZE, TEXT("Web Server Edition" ));
               break;
         }
      }

      if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )
      {
         if( GetSystemMetrics(SM_SERVERR2) )
            StringCchCat(pszOS, BUFSIZE, TEXT( "Windows Server 2003 R2, "));
         else if ( osvi.wSuiteMask & VER_SUITE_STORAGE_SERVER )
            StringCchCat(pszOS, BUFSIZE, TEXT( "Windows Storage Server 2003"));
         else if ( osvi.wSuiteMask & VER_SUITE_WH_SERVER )
            StringCchCat(pszOS, BUFSIZE, TEXT( "Windows Home Server"));
         else if( osvi.wProductType == VER_NT_WORKSTATION &&
                  si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
         {
            StringCchCat(pszOS, BUFSIZE, TEXT( "Windows XP Professional x64 Edition"));
         }
         else StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2003, "));

         // Test for the server type.
         if ( osvi.wProductType != VER_NT_WORKSTATION )
         {
            if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_IA64 )
            {
                if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
                   StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter Edition for Itanium-based Systems" ));
                else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
                   StringCchCat(pszOS, BUFSIZE, TEXT( "Enterprise Edition for Itanium-based Systems" ));
            }

            else if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 )
            {
                if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
                   StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter x64 Edition" ));
                else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
                   StringCchCat(pszOS, BUFSIZE, TEXT( "Enterprise x64 Edition" ));
                else StringCchCat(pszOS, BUFSIZE, TEXT( "Standard x64 Edition" ));
            }

            else
            {
                if ( osvi.wSuiteMask & VER_SUITE_COMPUTE_SERVER )
                   StringCchCat(pszOS, BUFSIZE, TEXT( "Compute Cluster Edition" ));
                else if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
                   StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter Edition" ));
                else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
                   StringCchCat(pszOS, BUFSIZE, TEXT( "Enterprise Edition" ));
                else if ( osvi.wSuiteMask & VER_SUITE_BLADE )
                   StringCchCat(pszOS, BUFSIZE, TEXT( "Web Edition" ));
                else StringCchCat(pszOS, BUFSIZE, TEXT( "Standard Edition" ));
            }
         }
      }

      if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )
      {
         StringCchCat(pszOS, BUFSIZE, TEXT("Windows XP "));
         if( osvi.wSuiteMask & VER_SUITE_PERSONAL )
            StringCchCat(pszOS, BUFSIZE, TEXT( "Home Edition" ));
         else StringCchCat(pszOS, BUFSIZE, TEXT( "Professional" ));
      }

      if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )
      {
         StringCchCat(pszOS, BUFSIZE, TEXT("Windows 2000 "));

         if ( osvi.wProductType == VER_NT_WORKSTATION )
         {
            StringCchCat(pszOS, BUFSIZE, TEXT( "Professional" ));
         }
         else
         {
            if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
               StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter Server" ));
            else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
               StringCchCat(pszOS, BUFSIZE, TEXT( "Advanced Server" ));
            else StringCchCat(pszOS, BUFSIZE, TEXT( "Server" ));
         }
      }

       // Include service pack (if any) and build number.

      if( _tcslen(osvi.szCSDVersion) > 0 )
      {
          StringCchCat(pszOS, BUFSIZE, TEXT(" ") );
          StringCchCat(pszOS, BUFSIZE, osvi.szCSDVersion);
      }

      TCHAR buf[80];

      StringCchPrintf( buf, 80, TEXT(" (build %d)"), osvi.dwBuildNumber);
      StringCchCat(pszOS, BUFSIZE, buf);

      if ( osvi.dwMajorVersion >= 6 )
      {
         if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 )
            StringCchCat(pszOS, BUFSIZE, TEXT( ", 64-bit" ));
         else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL )
            StringCchCat(pszOS, BUFSIZE, TEXT(", 32-bit"));
      }
     
      return TRUE;
   }

   else
   { 
      printf( "This sample does not support this version of Windows.\n");
      return FALSE;
   }
}

int __cdecl _tmain()
{
    TCHAR szOS[BUFSIZE];

    if( GetOSDisplayString( szOS ) )
        _tprintf( TEXT("\n%s\n"), szOS );
}




Thanks ChillyWilly, looking forward to seeing the complete version.

Frank
Mind is like a parachute. You know what to do in order to use it :-)

vozzie


frktons

Quote from: vozzie on September 24, 2010, 12:15:47 PM
Hy,

It won't be of much help, but I've done the translation to VB.Net here,

http://www.vbib.be/index.php?name=PNphpBB2&file=viewtopic&p=41996

Greetings

Maybe somebody could need it in VB NET, who knows?
Thanks anyway.

Frank
Mind is like a parachute. You know what to do in order to use it :-)

GregL


frktons

Mind is like a parachute. You know what to do in order to use it :-)