2010-07-05 177 views
2

我得到了一个小问题:构建Windows(32/64位版本)

为了获得OS的体系结构,问题是我的编程语言不支持这样的功能。因此,我需要阅读这些信息形式的Windows DLL(如kernel32.dll)
我曾尝试获取功能GetNativeSystemInfo/GetVersionEx/GetSystemInfo的信息。
不幸的是我不能得到的架构:/

是否有一些其他的功能来读取任何Windows DLL的架构?
(它dosnt需要是KERNEL32它可以是任何的DLL,但它必须在Win XP +存在)

随着信息:使用古普塔(SQLWindows /团队devoloper)

EDIT1 IM:

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位,我得到:
alt text http://img714.imageshack.us/img714/1954/32bit.gif

在64位,我得到:
alt text http://img691.imageshack.us/img691/8978/64bit.gif

我能得到每次0 OEMID 32位?或者更好的是64位版本的Windows上填写的OemID everytiem?

Thx求助!

电贺
AURO

回答

3

GetNativeSystemInfo肯定是要使用该功能。如果您的应用是原生64位应用,则GetNativeSystemInfoGetSystemInfo相同;否则,如果它在WOW64下运行,它将返回真正的系统属性,即使它在模拟的32位环境中运行。

GetNativeSystemInfo填充一个SYSTEM_INFO结构中,wProcessorArchitecture构件,其告诉您系统是否是32位(可能PROCESSOR_ARCHITECTURE_INTEL)或64位(可能PROCESSOR_ARCHITECTURE_AMD64)。

如果你的语言没有为这场比赛的胜利API函数的包装,使用它,你可以聘请LoadLibraryGetProcAddress像往常一样,和你需要定义当然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_INTELPROCESSOR_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单词更感兴趣,而不是wProcessorArchitecture的增补dwOemId以及完全不感兴趣的单词wReserved

+0

看到我的EDIT1 ...... – domiSchenk 2010-07-06 06:41:25

+0

看起来像我不能使用GetNativeSystemInfo coze其没有明确的可读性。有没有办法从注册表中读取它? im不知道是否HKLM \ Sorftware \微软\的Windows NT \ currentVersion \ BuildLabEx保存... – domiSchenk 2010-07-06 07:39:04

+0

它是完全可读的;看到我的更新。 – 2010-07-06 12:43:07

0

我想你这个样子,

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; 
    } 
}