码迷,mamicode.com
首页 > 其他好文 > 详细

第14章 探索虚拟内存

时间:2015-10-02 21:13:22      阅读:399      评论:0      收藏:0      [点我收藏+]

标签:

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,在注册表的
        //HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\0下的"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\0"
END

2 TEXTINCLUDE 
BEGIN
    "#include ""winres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE 
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_SYSINFO DIALOGEX 0, 0, 173, 108
STYLE DS_SETFONT | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "系统信息"
FONT 10, "宋体", 400, 0, 0x86
BEGIN
    RTEXT           "处理器架构:",IDC_STATIC,10,8,68,8,SS_NOPREFIX
    RTEXT           "ID_PROCARCH",IDC_PROCARCH,81,8,80,8,SS_NOPREFIX
    RTEXT           "处理器级别:",IDC_STATIC,10,18,68,8,SS_NOPREFIX
    RTEXT           "ID_PROCLEVEL",IDC_PROCLEVEL,81,18,80,8,SS_NOPREFIX
    RTEXT           "处理器修订版本:",IDC_STATIC,10,28,68,8,SS_NOPREFIX
    RTEXT           "ID_PROCREV",IDC_PROCREV,81,28,80,8,SS_NOPREFIX
    RTEXT           "处理器的数量:",IDC_STATIC,10,38,68,8,SS_NOPREFIX
    RTEXT           "ID_NUMOFPROCS",IDC_NUMOFPROCS,81,38,80,8,SS_NOPREFIX
    RTEXT           "可用处理器掩码:",IDC_STATIC,10,48,68,8,SS_NOPREFIX
    RTEXT           "ID_ACTIVEPROCMASK",IDC_ACTIVEPROCMASK,81,48,80,8,SS_NOPREFIX
    RTEXT           "分配粒度(字节):",IDC_STATIC,10,58,68,8,SS_NOPREFIX
    RTEXT           "ID_ALLOCGRAN",IDC_ALLOCGRAN,81,58,80,8,SS_NOPREFIX
    RTEXT           "页面大小(字节):",IDC_STATIC,10,68,68,8,SS_NOPREFIX
    RTEXT           "ID_PAGESIZE",IDC_PAGESIZE,81,68,80,8,SS_NOPREFIX
    RTEXT           "进程可用最小地址:",IDC_STATIC,10,78,68,8,SS_NOPREFIX
    RTEXT           "ID_MINAPPADDR",IDC_MINAPPADDR,81,78,80,8,SS_NOPREFIX
    RTEXT           "进程可用最大地址:",IDC_STATIC,10,88,68,8,SS_NOPREFIX
    RTEXT           "ID_MAXAPPADDR",IDC_MAXAPPADDR,81,88,80,8,SS_NOPREFIX
END


/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
    IDD_SYSINFO, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 166
        TOPMARGIN, 7
        BOTTOMMARGIN, 101
    END
END
#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// Icon
//

// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_SYSINFO             ICON                    "SysInfo.ico"
#endif    // 中文(简体,中国) resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED

 

第14章 探索虚拟内存

标签:

原文地址:http://www.cnblogs.com/5iedu/p/4852712.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!