Получение архитектуры Windows (32/64 битная версия) - PullRequest
2 голосов
/ 05 июля 2010

У меня возникла небольшая проблема:

Я пытаюсь получить архитектуру ОС, проблема в том, что мой язык программирования не поддерживает такие функции.Поэтому мне нужно прочитать эту информацию из Windows DLL (например, kernel32.dll)
Я пытался получить информацию с функциями GetNativeSystemInfo/GetVersionEx/GetSystemInfo.
К сожалению, я не смог получить архитектуру: /

Существуют ли другие функции для чтения архитектуры в любой Windows DLL?
(это не обязательно должно быть kernel32, это может быть любая DLL, но она должна существовать в win xp +)

Как информация:я использую Gupta (SQLWindows / Team devoloper)

Edit1:

typedef struct _SYSTEM_INFO {
  union {
    DWORD  dwOemId;
    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;

вот информация от MSDN , я пытался вызвать эту функциюс параметрами 10 и 12 (структуры поддержки Gupta dosnt).
На 32-битном я получаю:
альтернативный текст http://img714.imageshack.us/img714/1954/32bit.gif

на 64-битном я получаю:
альтернативныйтекст http://img691.imageshack.us/img691/8978/64bit.gif

я получаю каждый раз, когда 0 OemID на 32 бит?или лучше OemID Everytiem заполнен на 64-битной версии Windows?

Спасибо за помощь!

Привет
Авро

Ответы [ 2 ]

3 голосов
/ 05 июля 2010

GetNativeSystemInfo - определенно используемая функция.Если ваше приложение является собственным 64-разрядным приложением, GetNativeSystemInfo совпадает с GetSystemInfo;в противном случае, если он работает под WOW64, он вернет истинные системные свойства, даже если он запущен в эмулированной 32-битной среде.

GetNativeSystemInfo заполняет структуру SYSTEM_INFO, wProcessorArchitecture член которого сообщает вам, является ли система 32-битной (вероятно, PROCESSOR_ARCHITECTURE_INTEL) или 64-битной (вероятно, PROCESSOR_ARCHITECTURE_AMD64).

Если ваш язык не имеет оболочки для этогоФункция Win API, чтобы использовать ее, вы можете использовать LoadLibrary и GetProcAddress как обычно, и вам, конечно, нужно определить структуру SYSTEM_INFO.

Обновить

Я быопределить

typedef struct _SYSTEM_INFO {
  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;

Затем wProcessorArchitecture = 0 в (общей) 32-битной системе и wProcessorArchitecture = 9 в (общей) 64-битной системе.Это просто константы PROCESSOR_ARCHITECTURE_INTEL и PROCESSOR_ARCHITECTURE_AMD64 соответственно.Это обычные 32-битные и 64-битные архитектуры.PROCESSOR_ARCHITECTURE_IA64 = 6 немного необычнее, как, конечно, PROCESSOR_ARCHITECTURE_UNKNOWN = 65535.

Обновление

Да, я вижу вашу проблему.В C union означает, что вы выбираете один вариантов за раз.То есть структура имеет вид

DWORD     dwOemId;
DWORD     dwPageSize;
LPVOID    lpMinimumApplicationAddress;
LPVOID    lpMaximumApplicationAddress;
DWORD_PTR dwActiveProcessorMask;
DWORD     dwNumberOfProcessors;
DWORD     dwProcessorType;
DWORD     dwAllocationGranularity;
WORD      wProcessorLevel;
WORD      wProcessorRevision;

или

WORD      wProcessorArchitecture;
WORD      wReserved;
DWORD     dwPageSize;
LPVOID    lpMinimumApplicationAddress;
LPVOID    lpMaximumApplicationAddress;
DWORD_PTR dwActiveProcessorMask;
DWORD     dwNumberOfProcessors;
DWORD     dwProcessorType;
DWORD     dwAllocationGranularity;
WORD      wProcessorLevel;
WORD      wProcessorRevision;

Поскольку один DWORD состоит из столько байтов (4), сколько двух слов (2 × 2)), альтернативы - это всего лишь два способа адресации (и именования) данных всей структуры.В нашем случае нас больше интересует слово wProcessorArchitecture, а не увеличение dwOemId из wProcessorArchitecture и совершенно неинтересные wReserved слова.

0 голосов
/ 01 июля 2016

Я думаю, что тебе так нравится,

BOOL SafeGetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo)
{
    BOOL bRet = FALSE;

    do 
    {
        if (lpSystemInfo == NULL)
        {
            break;
        }

        typedef void(WINAPI *GetNativeSystemInfoProc) (LPSYSTEM_INFO lpSystemInfo);
        GetNativeSystemInfoProc pFun = (GetNativeSystemInfoProc)GetProcAddress(GetModuleHandle(TEXT("kernel32")), "GetNativeSystemInfo");
        if (NULL != pFun)
        {
            pFun(lpSystemInfo);
        }
        else
        {
            GetSystemInfo(lpSystemInfo);
        }

        bRet = TRUE;
    } while (FALSE);
    return bRet;
}


BOOL GetOSDisplayString( LPTSTR pszOS)
{
    GRS_USEPRINTF();

    OSVERSIONINFOEX osvi = {sizeof(OSVERSIONINFOEX)};
    SYSTEM_INFO si = {};
    BOOL bOsVersionInfoEx;
    DWORD dwType;

    if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
    {
        return FALSE;
    }

    //GetSystemInfo(&si);
    if (SafeGetNativeSystemInfo(&si) == FALSE)
    {
        return FALSE;
    }

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

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

            }
            else if( 1 == osvi.dwMinorVersion )
            {
                if( osvi.wProductType == VER_NT_WORKSTATION )
                {
                    StringCchCat(pszOS, BUFSIZE, _T("Windows 7 "));
                }
                else
                {
                    StringCchCat(pszOS, BUFSIZE, _T("Windows Unknown "));
                }
            }
            else
            {
                StringCchCat(pszOS, BUFSIZE, _T("Windows Unknown "));
            }

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

            if ( si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 )
            {
                StringCchCat(pszOS, BUFSIZE, _T( ", 64-bit" ));
            }
            else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64)
            {
                StringCchCat(pszOS, BUFSIZE, _T(", 64-bit"));
            }
            else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_ALPHA64)
            {
                StringCchCat(pszOS, BUFSIZE, _T(", 64-bit"));
            }
            else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL )
            {
                StringCchCat(pszOS, BUFSIZE, _T(", 32-bit"));
            }
        }

        if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )
        {
            if( GetSystemMetrics(SM_SERVERR2) )
            {
                StringCchCat(pszOS, BUFSIZE, _T( "Windows Server 2003 R2, "));
            }
            else if ( osvi.wSuiteMask==VER_SUITE_STORAGE_SERVER )
            {
                StringCchCat(pszOS, BUFSIZE, _T( "Windows Storage Server 2003"));
            }
            else if( osvi.wProductType == VER_NT_WORKSTATION &&
                si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
            {
                StringCchCat(pszOS, BUFSIZE, _T( "Windows XP Professional x64 Edition"));
            }
            else 
            {
                StringCchCat(pszOS, BUFSIZE, _T("Windows Server 2003, "));
            }
            if ( osvi.wProductType != VER_NT_WORKSTATION )
            {
                if ( si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 )
                {
                    if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
                    {
                        StringCchCat(pszOS, BUFSIZE, _T( "Datacenter Edition for Itanium-based Systems" ));
                    }
                    else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
                    {
                        StringCchCat(pszOS, BUFSIZE, _T( "Enterprise Edition for Itanium-based Systems" ));
                    }
                }

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

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

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

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

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

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

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

        TCHAR buf[80];

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

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