14.1 系统信息
(1)获取系统信息GetSystemInfo函数中的SYSTEM_INFO参数
字段 |
描述 |
WORD wProcessorArchitecture或 wReserved |
联合体。为今后扩展而保留,请勿使用 |
DWORD dwPageSize |
表示CPU页面的大小。在x86和x64机器中,该值为4KB(4096字节),在IA-64机器中,该值为8K字节(8192字节) |
LPVOID lpMinimumApplicationAddress |
给出每个进程可用地址空间中最小的内存地址。由于每个进程的地址空间中最开始的64KB始终是空闲的,因此该值为65536或0x0000 1000。 |
LPVOID lpMaximumApplicationAddress |
给出每个进程的么有地址空间中最大的可用内存地址 |
DWORD_PTR dwActiveProcessorMask |
一个位掩码,用来表示哪些CPU处于活动状态(即可以用来运行线程) |
DWORD dwNumberOfProcessors |
表示机器中CPU的数量。双核处理器时该值为2。 |
DWORD dwProcessorType |
己经作废,请勿使用 |
DWORD dwAllocationGranularity |
表示用于预订地址空间区域的分配粒度。该值在Windows平台上都是65536.即64K。即区域的起始地址必须是64KB的整数倍。 |
WORD wProcessorLevel |
进一步细分处理器的体系结构。如表示Intel奔腾III或奔腾IV。如果需要确定CPU支持哪些特性,可以调用 IsProcessorFeaturePresent函数,而不是使用这个字段。 |
WORD wProcessorRevision |
进一步对wProcessorLevel进行细分。 |
(2)IsWow64Process:判断进程是否运行在WOW64环境下,即是否在64位操作系统上运行32位的应用程序。类似于旧的 WOW32 子系统,负责在 Windows 32 位版本下运行 16 位的代码。
参数 |
描述 |
HANDLE hProcess |
要判断的进程句柄 |
PBOOL pbWow64Process |
TRUE:32位应用程序运行在64位操作系统上 FALSE:32位应用程序运行在32位操作系统或64位应用程序运行在64位的操作系统上。 |
返回值 |
FALSE:最常见的原因是传效的参数无效。 TRUE:函数调用成功 |
备注: ①32位应用程序运行在64位操作系统时,GetSystemInfo得到的dwPageSize为4KB,这种情况下,为了获得64位操作系统实际的系统信息,可以调用GetNativeSystemInfo函数。 ②64位应用程序运行在64位操作系统时,GetSystemInfo得到的dwPageSize为8KB。 |
【SysInfo程序】获取系统信息
/************************************************************************* Module: SysInfo.cpp Notices:Copyright(c) 2008 Jeffrey Richter & Christophe Nasarre *************************************************************************/ #include "../../CommonFiles/CmnHdr.h" #include "resource.h" #include <tchar.h> #include <strsafe.h> ////////////////////////////////////////////////////////////////////////// //将数据转为字符,并用逗号分开 PTSTR BigNumToString(LONG lNum, PTSTR szBuf, DWORD chBufSize){ TCHAR szNum[100]; StringCchPrintf(szNum, _countof(szNum), TEXT("%d"), lNum); NUMBERFMT nf; nf.NumDigits = 0; nf.LeadingZero = FALSE; nf.Grouping = 3;//每3位一组 nf.lpDecimalSep = TEXT("."); nf.lpThousandSep = TEXT(","); nf.NegativeOrder = 0; GetNumberFormat(LOCALE_USER_DEFAULT, 0, szNum, &nf, szBuf, chBufSize); return(szBuf); } ////////////////////////////////////////////////////////////////////////// //显示对话框标题 void ShowBitness(HWND hwnd){ TCHAR szFullTitle[100]; TCHAR szTitle[32]; GetWindowText(hwnd, szTitle, _countof(szTitle)); #if defined(_WIN64) //64位的应用程序只能运行在64位的操作系统上 //因此,这里不需要特殊的检查 StringCchPrintf(szFullTitle, _countof(szFullTitle), TEXT("64位'%s'"), szTitle); #else BOOL bIsWow64 = FALSE; if (!IsWow64Process(GetCurrentProcess(),&bIsWow64)){ chFAIL("获取WOW64状态失败!"); return; } if (bIsWow64){ StringCchPrintf(szFullTitle, _countof(szFullTitle), TEXT("32位程序'%s'运行在64位OS上"), szTitle); } else{ StringCchPrintf(szFullTitle, _countof(szFullTitle), TEXT("32位程序'%s'运行在32位OS上"), szTitle); } #endif SetWindowText(hwnd, szFullTitle); } ////////////////////////////////////////////////////////////////////////// //显示CPU信息 void ShowCPUInfo(HWND hwnd, WORD wProcessorArchitecture, WORD wProcessorLevel, WORD wProcessorRevision){ TCHAR szCPUArch[64] = TEXT("(未知)"); TCHAR szCPULevel[64] = TEXT("(未知)"); TCHAR szCPURev[64] = TEXT("(未知)"); switch (wProcessorArchitecture) { //注意:AMD处理器被视为PROCESSOR_ARCHITECTUR_INTEL,在注册表的 //HKLMHARDWAREDESCRIPTIONSystemCentralProcessor 下的"VendorIdentifier"(代应商ID) //键的值为 "GenuineIntel" 或"AuthenticAMD" case PROCESSOR_ARCHITECTURE_INTEL: { _tcscpy_s(szCPUArch, _countof(szCPUArch), TEXT("Intel")); switch (wProcessorLevel) { case 3: case 4: //80386或80486 StringCchPrintf(szCPULevel, _countof(szCPULevel), TEXT("80%c86"), wProcessorLevel + '0'); StringCchPrintf(szCPURev, _countof(szCPURev), TEXT("%c%d"), HIBYTE(wProcessorRevision)+TEXT('A'), LOBYTE(wProcessorRevision)); break; case 5: _tcscpy_s(szCPULevel, _countof(szCPULevel), TEXT("奔腾")); StringCchPrintf(szCPURev, _countof(szCPURev), TEXT("Model %d,Stepping d"), HIBYTE(wProcessorRevision), LOBYTE(wProcessorRevision)); break; case 6: switch (HIBYTE(wProcessorRevision)) //Model { case 1: _tcscpy_s(szCPULevel, _countof(szCPULevel), TEXT("奔腾 Pro")); break; case 3: case 5: _tcscpy_s(szCPULevel, _countof(szCPULevel), TEXT("奔腾 II")); break; case 6: _tcscpy_s(szCPULevel, _countof(szCPULevel), TEXT("赛扬")); break; case 7: case 8: case 11: _tcscpy_s(szCPULevel, _countof(szCPULevel), TEXT("奔腾 III")); break; case 9: case 13: _tcscpy_s(szCPULevel, _countof(szCPULevel), TEXT("奔腾 M")); break; case 10: _tcscpy_s(szCPULevel, _countof(szCPULevel), TEXT("奔腾 至强")); break; case 15: _tcscpy_s(szCPULevel, _countof(szCPULevel), TEXT("Core 2 Duo")); break; default: _tcscpy_s(szCPULevel, _countof(szCPULevel), TEXT("未知奔腾")); break; } StringCchPrintf(szCPURev, _countof(szCPURev), TEXT("Model %d,Stepping %d"), HIBYTE(wProcessorRevision),LOBYTE(wProcessorRevision)); break; case 15: _tcscpy_s(szCPULevel, _countof(szCPULevel), TEXT("奔腾 4")); StringCchPrintf(szCPURev, _countof(szCPURev), TEXT("Model %d,Stepping %d"), HIBYTE(wProcessorRevision), LOBYTE(wProcessorRevision)); break; } } break; case PROCESSOR_ARCHITECTURE_IA64: _tcscpy_s(szCPULevel, _countof(szCPULevel), TEXT("IA-64")); StringCchPrintf(szCPULevel, _countof(szCPULevel), TEXT("%d"), wProcessorLevel); StringCchPrintf(szCPURev, _countof(szCPURev), TEXT("Model %c,Pass %d"), HIBYTE(wProcessorRevision)+TEXT('A'), LOBYTE(wProcessorRevision)); break; case PROCESSOR_ARCHITECTURE_AMD64: _tcscpy_s(szCPULevel, _countof(szCPULevel), TEXT("AMD64")); StringCchPrintf(szCPULevel, _countof(szCPULevel), TEXT("%d"), wProcessorLevel); StringCchPrintf(szCPURev, _countof(szCPURev), TEXT("Model %c,Pass %d"), HIBYTE(wProcessorRevision) + TEXT('A'), LOBYTE(wProcessorRevision)); break; case PROCESSOR_ARCHITECTURE_UNKNOWN: default: _tcscpy_s(szCPUArch, _countof(szCPUArch), TEXT("未知")); break; } SetDlgItemText(hwnd, IDC_PROCARCH, szCPUArch); SetDlgItemText(hwnd, IDC_PROCLEVEL, szCPULevel); SetDlgItemText(hwnd, IDC_PROCREV, szCPURev); } ////////////////////////////////////////////////////////////////////////// BOOL Dlg_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam){ chSETDLGICONS(hwnd, IDI_SYSINFO); //获得系统信息 SYSTEM_INFO sinf; GetSystemInfo(&sinf); //显示CPU信息 ShowCPUInfo(hwnd, sinf.wProcessorArchitecture, sinf.wProcessorLevel, sinf.wProcessorRevision); //显示页面大小 TCHAR szBuf[50]; SetDlgItemText(hwnd, IDC_PAGESIZE, BigNumToString(sinf.dwPageSize, szBuf, _countof(szBuf))); //显示进程可用的最小地址 StringCchPrintf(szBuf, _countof(szBuf), TEXT("0x%p"), sinf.lpMinimumApplicationAddress); SetDlgItemText(hwnd, IDC_MINAPPADDR, szBuf); //显示进程可用的最大地址 StringCchPrintf(szBuf, _countof(szBuf), TEXT("0x%p"), sinf.lpMaximumApplicationAddress); SetDlgItemText(hwnd, IDC_MAXAPPADDR, szBuf); //显示CPU掩码位 StringCchPrintf(szBuf, _countof(szBuf), TEXT("0x%016I64X"),(__int64) sinf.dwActiveProcessorMask); SetDlgItemText(hwnd, IDC_ACTIVEPROCMASK, szBuf); //显示CPU核数 SetDlgItemText(hwnd, IDC_NUMOFPROCS, BigNumToString(sinf.dwNumberOfProcessors, szBuf, _countof(szBuf))); //分配粒度 SetDlgItemText(hwnd, IDC_ALLOCGRAN, BigNumToString(sinf.dwAllocationGranularity, szBuf, _countof(szBuf))); //显示对话框标题 ShowBitness(hwnd); return TRUE; } ////////////////////////////////////////////////////////////////////////// void Dlg_OnCommand(HWND hwnd, int id, HWND hwndCtrl, UINT codeNotity){ switch (id) { case IDCANCEL: EndDialog(hwnd, id); break; } } ////////////////////////////////////////////////////////////////////////// INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ switch (uMsg) { chHANDLE_DLGMSG(hwnd, WM_INITDIALOG, Dlg_OnInitDialog); chHANDLE_DLGMSG(hwnd, WM_COMMAND, Dlg_OnCommand); } return FALSE; } ////////////////////////////////////////////////////////////////////////// int WINAPI _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPTSTR lpCmdLine, _In_ int nShowCmd) { DialogBox(hInstance, MAKEINTRESOURCE(IDD_SYSINFO), NULL, Dlg_Proc); return 0; }
//resource.h
//{{NO_DEPENDENCIES}} // Microsoft Visual C++ 生成的包含文件。 // 供 14_SysInfo.rc 使用 // #define IDD_SYSINFO 1 #define IDC_PROCARCH 100 #define IDC_PAGESIZE 101 #define IDC_MINAPPADDR 102 #define IDC_MAXAPPADDR 103 #define IDC_ACTIVEPROCMASK 104 #define IDC_NUMOFPROCS 105 #define IDC_PROCTYPE 106 #define IDC_ALLOCGRAN 107 #define IDC_PROCLEVEL 108 #define IDC_PROCREV 109 #define IDI_SYSINFO 110 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 103 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1001 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif
//SysInfo.rc
// Microsoft Visual C++ generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "winres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // 中文(简体,中国) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE BEGIN "resource.h " END 2 TEXTINCLUDE BEGIN "#include ""winres.h"" " "