Hi Viktor,

Il 30/03/2009 9.19, Viktor Szakáts ha scritto:
It's correctly detected, but could be made more accurate by using some additional techniques to distinguish between Server 2003 and XP x64. The same version number is returned for both of these OSes by MS, which is a bit misleading.


No, please check below function and compare with that in SVN.


Best Regards,
Francesco

//
// Product types
// This list grows with each OS release.
//
// There is no ordering of values to ensure callers
// do an equality test i.e. greater-than and less-than
// comparisons are not useful.
//
// NOTE: Values in this list should never be deleted.
//       When a product-type 'X' gets dropped from a
//       OS release onwards, the value of 'X' continues
//       to be used in the mapping table of GetProductInfo.
//

#define PRODUCT_UNDEFINED                           0x00000000

#define PRODUCT_ULTIMATE                            0x00000001
#define PRODUCT_HOME_BASIC                          0x00000002
#define PRODUCT_HOME_PREMIUM                        0x00000003
#define PRODUCT_ENTERPRISE                          0x00000004
#define PRODUCT_HOME_BASIC_N                        0x00000005
#define PRODUCT_BUSINESS                            0x00000006
#define PRODUCT_STANDARD_SERVER                     0x00000007
#define PRODUCT_DATACENTER_SERVER                   0x00000008
#define PRODUCT_SMALLBUSINESS_SERVER                0x00000009
#define PRODUCT_ENTERPRISE_SERVER                   0x0000000A
#define PRODUCT_STARTER                             0x0000000B
#define PRODUCT_DATACENTER_SERVER_CORE              0x0000000C
#define PRODUCT_STANDARD_SERVER_CORE                0x0000000D
#define PRODUCT_ENTERPRISE_SERVER_CORE              0x0000000E
#define PRODUCT_ENTERPRISE_SERVER_IA64              0x0000000F
#define PRODUCT_BUSINESS_N                          0x00000010
#define PRODUCT_WEB_SERVER                          0x00000011
#define PRODUCT_CLUSTER_SERVER                      0x00000012
#define PRODUCT_HOME_SERVER                         0x00000013
#define PRODUCT_STORAGE_EXPRESS_SERVER              0x00000014
#define PRODUCT_STORAGE_STANDARD_SERVER             0x00000015
#define PRODUCT_STORAGE_WORKGROUP_SERVER            0x00000016
#define PRODUCT_STORAGE_ENTERPRISE_SERVER           0x00000017
#define PRODUCT_SERVER_FOR_SMALLBUSINESS            0x00000018
#define PRODUCT_SMALLBUSINESS_SERVER_PREMIUM        0x00000019
#define PRODUCT_HOME_PREMIUM_N                      0x0000001A
#define PRODUCT_ENTERPRISE_N                        0x0000001B
#define PRODUCT_ULTIMATE_N                          0x0000001C
#define PRODUCT_WEB_SERVER_CORE                     0x0000001D
#define PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT    0x0000001E
#define PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY      0x0000001F
#define PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING     0x00000020
#define PRODUCT_SMALLBUSINESS_SERVER_PRIME          0x00000021
#define PRODUCT_HOME_PREMIUM_SERVER                 0x00000022
#define PRODUCT_SERVER_FOR_SMALLBUSINESS_V          0x00000023
#define PRODUCT_STANDARD_SERVER_V                   0x00000024
#define PRODUCT_DATACENTER_SERVER_V                 0x00000025
#define PRODUCT_ENTERPRISE_SERVER_V                 0x00000026
#define PRODUCT_DATACENTER_SERVER_CORE_V            0x00000027
#define PRODUCT_STANDARD_SERVER_CORE_V              0x00000028
#define PRODUCT_ENTERPRISE_SERVER_CORE_V            0x00000029
#define PRODUCT_HYPERV                              0x0000002A

#define PRODUCT_UNLICENSED                          0xABCDABCD


#if _WIN32_WINNT >= 0x0501
WINBASEAPI void WINAPI
GetNativeSystemInfo(
    OUT LPSYSTEM_INFO lpSystemInfo
    );
#endif


// from microsoft SDK
HB_FUNC( XGUI_API_GETWINVERSTRING )
{
   OSVERSIONINFOEX osvi;
   SYSTEM_INFO si;
   BOOL bOsVersionInfoEx;

   char szResult[ STR_LEN ];
   char szBuff[ 80 ];

   //szResult = ( char * ) hb_xgrab( STR_LEN + 2 );
   strcpy( szResult, "" );

   // Try calling GetVersionEx using the OSVERSIONINFOEX structure.
   // If that fails, try using the OSVERSIONINFO structure.

   ZeroMemory(&si, sizeof(SYSTEM_INFO));
   ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
   osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

   if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
   {
      osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
      if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) )
         hb_retc( "version unknown" );
         return;
   }


   switch (osvi.dwPlatformId)
   {
      // Test for the Windows NT product family.

      case VER_PLATFORM_WIN32_NT:

      // Test for the specific product.

      if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0 )
      {
         // alternative call for BCC55
         typedef BOOL (WINAPI *PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD);

         PGPI pGPI;
         DWORD dwType;

         if( osvi.wProductType == VER_NT_WORKSTATION )
         {
             strcat( szResult, "Microsoft Windows Vista " );
         }
         else
         {
             strcat( szResult, "Windows Server 2008 " );
         }

         pGPI = (PGPI) GetProcAddress(
            GetModuleHandle(TEXT("kernel32.dll")),
            "GetProductInfo");

         pGPI( 6, 0, 0, 0, &dwType);

         switch( dwType )
         {
            case PRODUCT_ULTIMATE:
               strcat( szResult, "Ultimate Edition" );
               break;
            case PRODUCT_HOME_PREMIUM:
               strcat( szResult, "Home Premium Edition" );
               break;
            case PRODUCT_HOME_BASIC:
               strcat( szResult, "Home Basic Edition" );
               break;
            case PRODUCT_ENTERPRISE:
               strcat( szResult, "Enterprise Edition" );
               break;
            case PRODUCT_BUSINESS:
               strcat( szResult, "Business Edition" );
               break;
            case PRODUCT_STARTER:
               strcat( szResult, "Starter Edition" );
               break;
            case PRODUCT_CLUSTER_SERVER:
               strcat( szResult, "Cluster Server Edition" );
               break;
            case PRODUCT_DATACENTER_SERVER:
               strcat( szResult, "Datacenter Edition" );
               break;
            case PRODUCT_DATACENTER_SERVER_CORE:
strcat( szResult, "Datacenter Edition (core installation)" );
               break;
            case PRODUCT_ENTERPRISE_SERVER:
               strcat( szResult, "Enterprise Edition" );
               break;
            case PRODUCT_ENTERPRISE_SERVER_CORE:
strcat( szResult, "Enterprise Edition (core installation)" );
               break;
            case PRODUCT_ENTERPRISE_SERVER_IA64:
strcat( szResult, "Enterprise Edition for Itanium-based Systems" );
               break;
            case PRODUCT_SMALLBUSINESS_SERVER:
               strcat( szResult, "Small Business Server" );
               break;
            case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM:
               strcat( szResult, "Small Business Server Premium Edition" );
               break;
            case PRODUCT_STANDARD_SERVER:
               strcat( szResult, "Standard Edition" );
               break;
            case PRODUCT_STANDARD_SERVER_CORE:
               strcat( szResult, "Standard Edition (core installation)" );
               break;
            case PRODUCT_WEB_SERVER:
               strcat( szResult, "Web Server Edition" );
               break;
         }
         if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 )
            strcat( szResult, ", 64-bit " );
         else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL )
            strcat( szResult, ", 32-bit ");

      }

      if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )
      {
         // alternative call for BCC55
         typedef VOID (WINAPI *LPFN_GETNATIVESYSTEMINFO) (SYSTEM_INFO *);

         LPFN_GETNATIVESYSTEMINFO fnGetNativeSystemInfo =
(LPFN_GETNATIVESYSTEMINFO) GetProcAddress( GetModuleHandle("kernel32"), "GetNativeSystemInfo");

         if (NULL != fnGetNativeSystemInfo)
         {
            (fnGetNativeSystemInfo) (&si);
         }
         //GetNativeSystemInfo(&si);

         if( GetSystemMetrics(SM_SERVERR2) )
            strcat( szResult, "Microsoft Windows Server 2003 \"R2\" " );
         else if ( osvi.wSuiteMask==VER_SUITE_STORAGE_SERVER )
            strcat( szResult, "Windows Storage Server 2003");
         else if( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_IA64 &&
                  osvi.wProductType == VER_NT_WORKSTATION )
         {
strcat( szResult, "Microsoft Windows XP Professional x64 Edition " );
         }
         else strcat( szResult, "Microsoft Windows Server 2003, " );
      }

      if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )
         strcat( szResult, "Microsoft Windows XP " );

      if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )
         strcat( szResult, "Microsoft Windows 2000 " );

      if ( osvi.dwMajorVersion <= 4 )
         strcat( szResult, "Microsoft Windows NT " );

      // Test for specific product on Windows NT 4.0 SP6 and later.
      if( bOsVersionInfoEx )
      {
         // Test for the workstation type.
if ( osvi.wProductType == VER_NT_WORKSTATION && osvi.dwMajorVersion < 6 )
         {
            if( osvi.dwMajorVersion == 4 )
               strcat( szResult, "Workstation 4.0 " );
            else if( osvi.wSuiteMask & VER_SUITE_PERSONAL )
               strcat( szResult, "Home Edition " );
            else strcat( szResult, "Professional " );
         }

         // Test for the server type.
         else if ( osvi.wProductType == VER_NT_SERVER ||
                   osvi.wProductType == VER_NT_DOMAIN_CONTROLLER )
         {
            if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==2)
            {
if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_IA64 )
               {
                   if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
strcat( szResult, "Datacenter Edition for Itanium-based Systems" );
                   else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
strcat( szResult, "Enterprise Edition for Itanium-based Systems" );
               }

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

               else
               {
                   if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
                      strcat( szResult, "Datacenter Edition " );
                   else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
                      strcat( szResult, "Enterprise Edition " );
                   else if ( osvi.wSuiteMask == VER_SUITE_BLADE )
                      strcat( szResult, "Web Edition " );
                   else strcat( szResult, "Standard Edition " );
               }
            }
            else if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==0)
            {
               if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
                  strcat( szResult, "Datacenter Server " );
               else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
                  strcat( szResult, "Advanced Server " );
               else strcat( szResult, "Server " );
            }
            else  // Windows NT 4.0
            {
               if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
                  strcat( szResult, "Server 4.0, Enterprise Edition " );
               else strcat( szResult, "Server 4.0 " );
            }
         }
      }
      // Test for specific product on Windows NT 4.0 SP5 and earlier
      else
      {
         HKEY hKey;
         char szProductType[BUFSIZE];
         DWORD dwBufLen=BUFSIZE;
         LONG lRet;

         lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
            "SYSTEM\\CurrentControlSet\\Control\\ProductOptions",
            0, KEY_QUERY_VALUE, &hKey );
         if( lRet != ERROR_SUCCESS )
         {
             hb_retc( "version unknown" );
             return;
            //return FALSE;
         }

         lRet = RegQueryValueEx( hKey, "ProductType", NULL, NULL,
            (LPBYTE) szProductType, &dwBufLen);
         RegCloseKey( hKey );

         if( (lRet != ERROR_SUCCESS) || (dwBufLen > BUFSIZE) )
         {
             hb_retc( "version unknown" );
            return;
            //return FALSE;
         }

         if ( lstrcmpi( "WINNT", szProductType) == 0 )
            strcat( szResult, "Workstation " );
         if ( lstrcmpi( "LANMANNT", szProductType) == 0 )
            strcat( szResult, "Server " );
         if ( lstrcmpi( "SERVERNT", szProductType) == 0 )
            strcat( szResult, "Advanced Server " );
sprintf( szBuff, "%d.%d ", osvi.dwMajorVersion, osvi.dwMinorVersion );
         strcat( szResult, szBuff );
      }

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

      if( osvi.dwMajorVersion == 4 &&
          lstrcmpi( osvi.szCSDVersion, "Service Pack 6" ) == 0 )
      {
         HKEY hKey;
         LONG lRet;

         // Test for SP6 versus SP6a.
         lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009",
            0, KEY_QUERY_VALUE, &hKey );
         if( lRet == ERROR_SUCCESS )
         {
sprintf( szBuff, "Service Pack 6a (Build %d)", osvi.dwBuildNumber & 0xFFFF );
            strcat( szResult, szBuff );
         }
         else // Windows NT 4.0 prior to SP6a
         {
            sprintf( szBuff, "%s (Build %d)",
               osvi.szCSDVersion,
               osvi.dwBuildNumber & 0xFFFF);
            strcat( szResult, szBuff );
         }

         RegCloseKey( hKey );
      }
      else // not Windows NT 4.0
      {
         sprintf( szBuff, "%s (Build %d)",
            osvi.szCSDVersion,
            osvi.dwBuildNumber & 0xFFFF);
         strcat( szResult, szBuff );
      }

      break;

      // Test for the Windows Me/98/95.
      case VER_PLATFORM_WIN32_WINDOWS:

      if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
      {
          strcat( szResult, "Microsoft Windows 95 ");
          if (osvi.szCSDVersion[1]=='C' || osvi.szCSDVersion[1]=='B')
             strcat( szResult, "OSR2 " );
      }

      if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
      {
          strcat( szResult, "Microsoft Windows 98 ");
          if ( osvi.szCSDVersion[1]=='A' || osvi.szCSDVersion[1]=='B')
             strcat( szResult, "SE " );
      }

      if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
      {
          strcat( szResult, "Microsoft Windows Millennium Edition");
      }
      break;

      case VER_PLATFORM_WIN32s:

      strcat( szResult, "Microsoft Win32s\n");
      break;
   }

   hb_retc( szResult );
}

_______________________________________________
Harbour mailing list
Harbour@harbour-project.org
http://lists.harbour-project.org/mailman/listinfo/harbour

Reply via email to