Windows核心编程:第14章 探索虚拟内存

Github

https://github.com/gongluck/Windows-Core-Program.git

//第14章 探索虚拟内存.cpp: 定义应用程序的入口点。
//

#include "stdafx.h"
#include "第14章 探索虚拟内存.h"

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPWSTR    lpCmdLine,
    _In_ int       nCmdShow)
{
    //系统信息
    SYSTEM_INFO sysinfo = { 0 };
    GetSystemInfo(&sysinfo);

    //获取逻辑处理器的详细信息
    PSYSTEM_LOGICAL_PROCESSOR_INFORMATION pBuffer = nullptr;
    DWORD dwSize = 0;
    BOOL bRet = GetLogicalProcessorInformation(pBuffer, &dwSize);
    DWORD lErr = GetLastError(); //ERROR_INSUFFICIENT_BUFFER;
    pBuffer = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)malloc(dwSize);
    bRet = GetLogicalProcessorInformation(pBuffer, &dwSize);
    for (DWORD i = 0; i < dwSize / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION); i++)
    {
        pBuffer[i].Relationship == RelationProcessorCore ?
            "指定的逻辑处理器共享一个处理器核心。ProcessorCore成员包含额外的信息。" : "";
        pBuffer[i].ProcessorCore.Flags == 1 ?
            "如果这个成员的值是1,那么由ProcessorMask成员的值来识别的逻辑处理器,就像在超线程或SMT中一样。否则,被识别的逻辑处理器不共享功能单元。" : "";
        pBuffer[i].Relationship == RelationCache ?
            "The specified logical processors share a cache. The Cache member contains additional information. " : "";
    }
    free(pBuffer);
    pBuffer = nullptr;

    //Windows 32-bit On Windows 64-bit (WOW64)
    BOOL iswow = FALSE;
    bRet = IsWow64Process(GetCurrentProcess(), &iswow);//只有32位程序运行在WOW64上时iswow才被置为TRUE。

    //获取原来的系统信息(取代GetSystemInfo)
    GetNativeSystemInfo(&sysinfo);

    //虚拟内存状态
    MEMORYSTATUSEX memstatusex = { 0 };//ex增强在支持4GB内存大小长度
    memstatusex.dwLength = sizeof(memstatusex);
    bRet = GlobalMemoryStatusEx(&memstatusex);
    memstatusex.ullTotalPhys;//物理内存总量
    memstatusex.ullAvailPhys;//可分配的内存总量
    memstatusex.ullTotalVirtual;//进程私有空间大小
    memstatusex.ullAvailVirtual;//进程闲置空间大小

    //确定地址空间的状态
    MEMORY_BASIC_INFORMATION info = { 0 };
    lErr = VirtualQueryEx(GetCurrentProcess(), (LPCVOID)0x55, &info, sizeof(info));
    switch (info.State)//State 用于指明所有相邻页面的状态。
    {
    case MEM_FREE://空闲状态。该区域的虚拟地址不受任何内存的支持。该地址空间没有被保留。该状态下AllocationBase、AllocationProtect、Protect和Type等成员均未定义。
        break;
    case MEM_RESERVE://指明页面被保留,但是没有分配任何物理内存。该状态下Protect成员未定。
        break;
    case MEM_COMMIT://指明已分配物理内存或者系统页文件。
        break;
    default:
        break;
    }

    system("pause");
    return 0;
}

原文地址:https://www.cnblogs.com/gongluck/p/9497620.html

时间: 2024-11-05 12:14:16

Windows核心编程:第14章 探索虚拟内存的相关文章

第14章 探索虚拟内存

14.1 系统信息 (1)获取系统信息GetSystemInfo函数中的SYSTEM_INFO参数 字段 描述 WORD wProcessorArchitecture或 wReserved 联合体.为今后扩展而保留,请勿使用 DWORD dwPageSize 表示CPU页面的大小.在x86和x64机器中,该值为4KB(4096字节),在IA-64机器中,该值为8K字节(8192字节) LPVOID lpMinimumApplicationAddress 给出每个进程可用地址空间中最小的内存地址.

第14章 探索虚拟内存(2)

14.4 确定地址空间的状态 14.4.1 查询内存状态API  (1)VirtualQuery(Ex)函数 参数 描述 HANDLE hProcess 要查询的另一个进程的句柄.(注意,这个参数只有VirtualQueryEx才有,VirtualQuery只能查本进程的信息) LPCVOID pvAddress 需要查询的虚拟内存地址 PMEMORY_BASIC_INFORMATION pmbi 返回的信息被放入该指针指向的MEMORY_BASIC_INFORMATION结构体. DWORD

windows核心编程第三章

3.1.1  内核对象的使用计数 内核对象由内核所拥有,而不是由进程所拥有.换句话说,如果你的进程调用了一个创建内核对象的函数,然后你的进程终止运行,那么内核对象不一定被撤消.在大多数情况下,对象将被撤消,但是如果另一个进程正在使用你的进程创建的内核对象,那么该内核知道,在另一个进程停止使用该对象前不要撤消该对象,必须记住的是,内核对象的存在时间可以比创建该对象的进程长. 3.2.1 创建内核对象 如果调用一个函数创建内核对象,但是调用失败了,那么返回的句柄值通常是0(N U L L).不过有少

Windows核心编程之核心总结(第一章 错误处理)(2018.5.26)

前沿 学习Windows核心编程是步入Windows编程殿堂的必经之路,2018年寒假重温了计算机操作系统知识,前阵子又过学习Windows程序设计方面的基础,正所谓打铁要乘热,所以我又入了Windows核心编程的坑啦,哈哈~ 学习目标 每一章的学习都要明确一个目标,就是你学完这一章之后你能做些什么?好的,我们一步步来学习第一章节错误处理.以下是这一章节的学习目标:1.了解Windows函数的错误机制2.了解GetLastError和SetLastError函数的使用3.了解FormatMess

【转】《windows核心编程》读书笔记

这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入,但应该是合理的.开头几章由于我追求简洁,往往是很多单独的字句,后面的内容更为连贯. 海量细节. 第1章    错误处理 1.         GetLastError返回的是最后的错误码,即更早的错误码可能被覆盖. 2.         GetLastError可能用于描述成功的原因(CreatEvent)

C++Windows核心编程读书笔记

转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%96%87/71405.shtml "C++Windows核心编程读书笔记": 关键词:c++windows 核心 编程 读书笔记 这篇笔记是我在读<windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和windows实际机制可能有出入,但应该是合理的.开头几章由于我追求简洁

Windows核心编程之核心总结(第三章 内核对象)(2018.6.2)

学习目标 第三章内核对象的概念较为抽象,理解起来着实不易,我不断上网找资料和看视频,才基本理解了内核对象的概念和特性,其实整本书给我的感觉就是完整代码太少了,没有多少实践的代码对内容的实现,而且书本给的源码例子,有太多我们不知道的知识,并且这些知识对本章主要内容来说是多余的,所以我们理解起来也非常困难.为了更好的学习这章,我补充了一些辅助性内容.这一章的学习目标:1.Windows会话和安全机制2.什么是内核对象?3.使用计数和安全描述符4.内核对象句柄表5.创建内核对象6.关闭内核对象7.跨进

读书笔记----《windows核心编程》第三章 内核对象1(句柄与安全性)

最近一直没有更新博客,因为一直在想一个问题,内核对象这一章内容很多很重要,自己没有掌握好也没有把握写好这一章,最后还是决定能写多少写多少,一面写一面学,后续学到新的再更新吧; <windows核心编程>提了几种内核对象: 访问令牌对象:与windows的安全性有关,目前不是很懂,了解后再写; 事件对象: Event对象,可跨进程同步; 由CreateEvent创建; 文件对象: File对象,比较常见; 由CreateFile创建; 文件映射对象: 通过文件映射可以方便的操作文件(如同文件数据

Windows核心编程第一章.错误处理

Windows核心编程第一章,错误处理. 一丶错误处理 1.核心编程学习总结 不管是做逆向,开始做开发.在Windows下.你都需要看一下核心编程这本书.这本书确实写得很好.所以自己在学习这本书的同时,也把自己所学的知识进行 总结,以及巩固. 2.常见的Windows函数返回类型总结 数据类型 作用 VOID 如果是Void表示函数不可能失败.极少数windows函数会返回void BOOL 表示这个函数会有失败情况.0失败.否则就是非0.但是一般都会使用TRUE FALSE来判断. HANDL