PoEdu培训 Windows班 第四十三课 Windows 内存(三) 64位系统及其内存对齐
文章类别: 培训笔记 0 评论

PoEdu培训 Windows班 第四十三课 Windows 内存(三) 64位系统及其内存对齐

文章类别: 培训笔记 0 评论

Windows 内存(三) 64位系统及其内存对齐

内存对齐

页面大小获取

#include <Windows.h>
#include <cstdio>

INT main()
{
    SYSTEM_INFO sysInfo;
    GetSystemInfo(&sysInfo);
    printf("%d\n", sysInfo.dwPageSize); // 页面大小
    return 0;
}

我们上节课所学, 页面大小都是4KB
那么我们为什么要去获取, 而不写死呢?
其实不然

微软为了让64兼容32, 给系统新增了一个模拟层, 它叫WOW64

判断运行的系统位数

IsWow64Process

请每次使用都查询文档

BOOL WINAPI IsWow64Process(
  _In_  HANDLE hProcess,
  _Out_ PBOOL  Wow64Process
);

当32位进程运行在64位系统下, Wow64Process会为 TRUE
当64位进程运行在64位系统下, Wow64Process会为 FALSE

IsOS

BOOL IsOS(
  _In_ DWORD dwOS
);

dwOS的取值如下

Name Value Description
OS_WINDOWS 0 该程序在下列 windows 版本之一上运行:
  • Windows 95
  • Windows 98
  • Windows Me

<p>相当于 VER_PLATFORM_WIN32_WINDOWS。请注意, 此时这些系统都不受支持。OS_WINDOWS 在所有支持的系统上返回 FALSE
<tr>
<td>OS_NT</td>
<td>1</td>
<td>总是返回
<span style="font-weight:bold">TRUE</span>.</td></tr>

<tr>
<td>OS_WIN95ORGREATER</td>
<td>2</td>
<td>总是返回
<span style="font-weight:bold">FALSE</span>.</td></tr>

<tr>
<td>OS_NT4ORGREATER</td>
<td>3</td>
<td>总是返回
<span style="font-weight:bold">FALSE</span>.</td></tr>

<tr>
<td>OS_WIN98ORGREATER</td>
<td>5</td>
<td>总是返回
<span style="font-weight:bold">FALSE</span>.</td></tr>

<tr>
<td>OS_WIN98_GOLD</td>
<td>6</td>
<td>总是返回
<span style="font-weight:bold">FALSE</span>.</td></tr>

<tr>
<td>OS_WIN2000ORGREATER</td>
<td>7</td>
<td>程序在 Windows 2000 或其后继者之一上运行。</td></tr>

<tr>
<td>OS_WIN2000PRO</td>
<td>8</td>
<td>不要使用这个值; 使用 OS_PROFESSIONAL.</td></tr>

<tr>
<td>OS_WIN2000SERVER</td>
<td>9</td>
<td>不要使用这个值; 使用 OS_SERVER.</td></tr>

<tr>
<td>OS_WIN2000ADVSERVER</td>
<td>10</td>
<td>不要使用这个值; 使用 OS_ADVSERVER.</td></tr>

<tr>
<td>OS_WIN2000DATACENTER</td>
<td>11</td>
<td>不要使用这个值; 使用 OS_DATACENTER.</td></tr>

<tr>
<td>OS_WIN2000TERMINAL</td>
<td>12</td>
<td>该程序在 "远程管理" 模式或 "应用程序服务器" 模式下的 Windows 2000 终端服务器上运行, 或在 "终端服务器" 模式下或 "管理模式的远程桌面" 上的 Windows server 2003 (或其后继者之一)。请考虑使用更具体的值, 如 OS_TERMINALSERVER、OS_TERMINALREMOTEADMIN 或 OS_PERSONALTERMINALSERVER。</td></tr>

<tr>
<td>OS_EMBEDDED</td>
<td>13</td>
<td>程序运行在 Windows 嵌入式, 任何版本。相当于 VER_SUITE_EMBEDDEDNT。</td></tr>

<tr>
<td>OS_TERMINALCLIENT</td>
<td>14</td>
<td>该程序作为终端服务器客户端运行。等价于 GetSystemMetrics (SM_REMOTESESSION)。</td></tr>

<tr>
<td>OS_TERMINALREMOTEADMIN</td>
<td>15</td>
<td>该程序在远程管理模式下的 Windows 2000 终端服务器或 Windows server 2003 (或其后继者之一) 中运行, 用于管理模式的远程桌面 (这些是默认的安装模式)。这相当于 VER_SUITE_TERMINAL && VER_SUITE_SINGLEUSERTS。</td></tr>

<tr>
<td>OS_WIN95_GOLD</td>
<td>16</td>
<td>总是返回
<span style="font-weight:bold">FALSE</span>.</td></tr>

<tr>
<td>OS_MEORGREATER</td>
<td>17</td>
<td>总是返回
<span style="font-weight:bold">FALSE</span>.</td></tr>

<tr>
<td>OS_XPORGREATER</td>
<td>18</td>
<td>总是返回
<span style="font-weight:bold">FALSE</span>.</td></tr>

<tr>
<td>OS_HOME</td>
<td>19</td>
<td>总是返回
<span style="font-weight:bold">FALSE</span>.</td></tr>

<tr>
<td>OS_PROFESSIONAL</td>
<td>20</td>
<td>该程序运行在 Windows NT 工作站或 Windows 2000 (或其后继者之一) 的专业。相当于 VER_PLATFORM_WIN32_NT && VER_NT_WORKSTATION。</td></tr>

<tr>
<td>OS_DATACENTER</td>
<td>21</td>
<td>该程序在 Windows 数据中心服务器或 Windows 服务器数据中心版上运行, 任何版本。等同于 (VER_NT_SERVER || VER_NT_DOMAIN_CONTROLLER) && VER_SUITE_DATACENTER。</td></tr>

<tr>
<td>OS_ADVSERVER</td>
<td>22</td>
<td>该程序运行在 Windows 高级服务器或 Windows 服务器企业版, 任何版本。等同于 (VER_NT_SERVER || VER_NT_DOMAIN_CONTROLLER) && VER_SUITE_ENTERPRISE && !VER_SUITE_DATACENTER.</td></tr>

<tr>
<td>OS_SERVER</td>
<td>23</td>
<td>该程序运行在 Windows 服务器 (标准) 或 Windows 服务器标准版, 任何版本。对于 VER_SUITE_DATACENTER、VER_SUITE_ENTERPRISE、VER_SUITE_SMALLBUSINESS 或 VER_SUITE_SMALLBUSINESS_RESTRICTED, 此值将不会返回 TRUE。</td></tr>

<tr>
<td>OS_TERMINALSERVER</td>
<td>24</td>
<td>该程序在 "应用程序服务器" 模式下的 windows 2000 终端服务器上运行, 或在 "终端服务器" 模式下的 windows server 2003 (或其后继者之一) 上执行。这相当于 VER_SUITE_TERMINAL && VER_SUITE_SINGLEUSERTS。</td></tr>

<tr>
<td>OS_PERSONALTERMINALSERVER</td>
<td>25</td>
<td>该程序是运行在 Windows XP (或其后继者之一), 家庭版或专业。这相当于 VER_SUITE_SINGLEUSERTS && !VER_SUITE_TERMINAL.</td></tr>

<tr>
<td>OS_FASTUSERSWITCHING</td>
<td>26</td>
<td>启用快速用户切换。</td></tr>

<tr>
<td>OS_WELCOMELOGONUI</td>
<td>27</td>
<td>总是返回
<span style="font-weight:bold">FALSE</span>.</td></tr>

<tr>
<td>OS_DOMAINMEMBER</td>
<td>28</td>
<td>计算机加入域.</td></tr>

<tr>
<td>OS_ANYSERVER</td>
<td>29</td>
<td>程序在任何 windows 服务器产品上运行。等同于 VER_NT_SERVER || VER_NT_DOMAIN_CONTROLLER</td></tr>

<tr>
<td>OS_WOW6432</td>
<td>30</td>
<td>该程序是一个32位程序运行在64位的Windows上.</td></tr>

<tr>
<td>OS_WEBSERVER</td>
<td>31</td>
<td>总是返回
<span style="font-weight:bold">FALSE</span>.</td></tr>

<tr>
<td>OS_SMALLBUSINESSSERVER</td>
<td>32</td>
<td>该程序正在运行的微软小企业服务器与限制性的客户端许可证生效。相当于 VER_SUITE_SMALLBUSINESS_RESTRICTED。</td></tr>

<tr>
<td>OS_TABLETPC</td>
<td>33</td>
<td>该程序是运行在 Windows XP 平板电脑版, 或其后继者之一。</td></tr>

<tr>
<td>OS_SERVERADMINUI</td>
<td>34</td>
<td>应该向用户提供管理员 UI。可以在服务器计算机上拥有服务器管理用户界面。此值通知应用程序管理员的配置文件已漫游到服务器, 并且用户界面应适合管理员。否则, 用户将显示管理员和管理员设置的混合。</td></tr>

<tr>
<td>OS_MEDIACENTER</td>
<td>35</td>
<td>该程序运行在 Windows XP 媒体中心版上, 或其后继者之一。等价于 GetSystemMetrics (SM_MEDIACENTER)。</td></tr>

<tr>
<td>OS_APPLIANCE</td>
<td>36</td>
<td>程序正在 Windows Appliance Server 上运行.</td></tr></table>

我们需要其中的OS_WOW6432

小例子

#include <Windows.h>
#include <Shlwapi.h>

int main()
{
    BOOL bIs64;
    // GetCurrentProcess()或INVALID_HANDLE_VALUE
    IsWow64Process(INVALID_HANDLE_VALUE, &bIs64);
    if (bIs64)
        print("32bit Program runing under Wow64\n");
    if (IsOS(OS_WOW6432))
        print("32bit Program runing under Wow64\n");

    return 0;
}

未完待续...

如有错误,请提出指正!谢谢.

回复