Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Windows核心编程:第14章 探索虚拟内存

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

作者头像
gongluck
发布于 2019-02-22 01:49:39
发布于 2019-02-22 01:49:39
46700
代码可运行
举报
文章被收录于专栏:C++C++
运行总次数:0
代码可运行

Github

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//第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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-08-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Windows核心编程:第7章 线程调度、优先级和关联性
Github https://github.com/gongluck/Windows-Core-Program.git //第7章 线程调度、优先级和关联性.cpp: 定义应用程序的入口点。 // #include "stdafx.h" #include "第7章 线程调度、优先级和关联性.h" //线程函数 DWORD WINAPI ThreadProc(PVOID param) { return 0; } int APIENTRY wWinMain(_In_ HINSTANCE hInst
gongluck
2018/06/22
1.1K0
Windows核心编程:第6章 线程基础
Github https://github.com/gongluck/Windows-Core-Program.git //第6章 线程基础.cpp: 定义应用程序的入口点。 // #include "stdafx.h" #include "第6章 线程基础.h" #include <process.h> //线程函数 DWORD WINAPI ThreadProc(PVOID param) { return 0; } unsigned __stdcall ThreadProc2(void* p
gongluck
2018/06/22
4630
Windows核心编程:第3章 内核对象
Github https://github.com/gongluck/Windows-Core-Program.git //第3章 内核对象.cpp: 定义应用程序的入口点。 // #include "stdafx.h" #include "第3章 内核对象.h" int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance,
gongluck
2018/06/22
3440
Windows核心编程:第5章 作业
Github https://github.com/gongluck/Windows-Core-Program.git //第5章 作业.cpp: 定义应用程序的入口点。 // #include "stdafx.h" #include "第5章 作业.h" int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _
gongluck
2018/06/22
8950
AWE 内存管理
AWE (Address Windows Extension) 可以使用开启 PAE 后普通应用程序无法使用到的内存,这部分内存系统可能无法识别,但通过 AWE 则可以完美访问。操作 AWE 内存的具体步骤如下,大部分内容来自北风网视频教程。 1、开窗 VirtualAlloc + MEM_PHYSICAL,明确告知系统,这段保留的空间未来将存放我自己申请的物理内存。 2、分配物理内存 AllocateUserPhysicalPages,按页面个数来分配,不是按字节分配的,最少一个页面 4K 的物理内存。 3、将申请好的物理内存映射到窗口中(相当于提交)MapUserPhysicalPages。 4、对已经提交的内存读写… 5、释放物理内存页面。
我与梦想有个约会
2023/10/21
2780
AWE 内存管理
Windows核心编程:第8章 用户模式下的线程同步
https://github.com/gongluck/Windows-Core-Program.git
gongluck
2019/02/22
5510
Windows核心编程:第13章 内存体系结构
https://github.com/gongluck/Windows-Core-Program.git
gongluck
2019/02/22
4630
Windows核心编程:第10章 同步设备IO与异步设备IO
https://github.com/gongluck/Windows-Core-Program.git
gongluck
2019/02/22
8530
Windows核心编程:第4章 进程
Github https://github.com/gongluck/Windows-Core-Program.git //第4章 进程.cpp: 定义应用程序的入口点。 // #include "stdafx.h" #include "第4章 进程.h" #include <shellapi.h> #pragma warning(disable:4996)//GetVersionEx int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
gongluck
2018/06/22
6300
Windows核心编程:第12章 纤程
https://github.com/gongluck/Windows-Core-Program.git
gongluck
2019/02/22
8390
windows虚拟内存管理
内存管理是操作系统非常重要的部分,处理器每一次的升级都会给内存管理方式带来巨大的变化,向早期的8086cpu的分段式管理,到后来的80x86 系列的32位cpu推出的保护模式和段页式管理。在应用程序中我们无时不刻不在和内存打交道,我们总在不经意间的进行堆内存和栈内存的分配释放,所以内存是我们进行程序设计必不可少的部分。
Masimaro
2019/02/25
2.2K0
红队 | Windows注入的一些方式
在渗透过程中有时候为了权限维持或者其他等一些操作,比如以前的搜狗输入法可以替换dll文件当用户切换输入法就会去加载我们替换的dll文件,dll文件可以自己编写一些net user或者其他的一些方法,也可以通过msf等来生成dll文件进行替换。
HACK学习
2021/08/13
1.1K0
查看虚拟内存信息
以前介绍过 VMMap 工具是可以查看一个进程中的虚拟内存信息的,其内部的实现原理就是调用 VirtualQueryEx 函数(支持查看其他进程)得到一个进程的虚拟内存信息。根据学习的视频我也自己实现了一下,但我们用到的是 VirtualQuery 来查看自身进程的内容。
我与梦想有个约会
2023/10/21
2490
7.1 实现进程内存块枚举
在Windows操作系统中,每个进程的虚拟地址空间都被划分为若干内存块,每个内存块都具有一些属性,如内存大小、保护模式、类型等。这些属性可以通过VirtualQueryEx函数查询得到。
王瑞MVP
2023/09/22
4830
7.1 实现进程内存块枚举
windows平台下,c++获取cpu型号,读取注册表获取系统软硬件信息代码
http://blog.csdn.net/wangyaninglm/article/details/41940287
流川疯
2022/11/26
2.6K0
windows平台下,c++获取cpu型号,读取注册表获取系统软硬件信息代码
ZwQuerySystemInfoMation函数使用
函数很简单.就4个参数. 参数已就是传个类型.代表你要查询什么类型.这个函数很强大.基本什么都是可以查询 参数2: 就是一个缓冲区.这个缓冲区是根据你查询的类型.当查询到数据.就会放到这个缓冲区.所以缓冲区可以接受你指定查询类型的数据.所以你想使用强转为一样的类型即可. 参数3: 缓冲区大小. 参数4: 返回大小
IBinary
2019/07/02
1.3K0
Windows核心编程:第1章 错误处理
Github https://github.com/gongluck/Windows-Core-Program.git //第1章 错误处理.cpp: 定义应用程序的入口点。 // #include "stdafx.h" #include "第1章 错误处理.h" int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _
gongluck
2018/06/22
4110
C/C++ 遍历进程内存块
期待的效果就像 PCHuntor 里的那样,如下: 上代码 #include "stdafx.h" #include <Windows.h> #include <vector> #include <iostream> #include <assert.h> #include <psapi.h> #include <tlhelp32.h> using namespace std; /*枚举指定进程所有内存块 assert(hProcess != nullptr); 参数: hProcess:
王瑞MVP
2022/12/28
6170
C/C++ 遍历进程内存块
windows 多任务与进程
多任务的本质就是并行计算,它能够利用至少2处理器相互协调,同时计算同一个任务的不同部分,从而提高求解速度,或者求解单机无法求解的大规模问题。以前的分布式计算正是利用这点,将大规模问题分解为几个互不不相关的问题,将这些计算问题交给局域网中的其他机器计算完成,然后再汇总到某台机器上,显示结果,这样就充分利用局域网中的计算机资源。 相对的,处理完一步接着再处理另外一步,将这样的传统计算模式称为串行计算。 在提高处理器的相关性能主要有两种方式,一种是提高单个处理器处理数据的速度,这个主要表现在CPU主频的调高上,而当前硬件总有一个上限,以后再很难突破,所以现在的CPU主要采用的是调高CPU的核数,这样CPU的每个处理器都处理一定的数据,总体上也能带来性能的提升。 在某些单核CPU上Windows虽然也提供了多任务,但是这个多任务是分时多任务,也就是每个任务只在CPU中执行一个固定的时间片,然后再切换到另一个任务,由于每个任务的时间片很短,所以给人的感觉是在同一时间运行了多个任务。单核CPU由于需要来回的在对应的任务之间切换,需要事先保存当前任务的运行环境,然后通过轮循算法找到下一个运行的任务,再将CPU中寄存器环境改成新任务的环境,新任务运行到达一定时间,又需要重复上述的步骤,所以在单核CPU上使用多任务并不能带来性能的提升,反而会由在任务之间来回切换,浪费宝贵的资源,多任务真正使用场合是多核的CPU上。 windows上多任务的载体是进程和线程,在windows中进程是不执行代码的,它只是一个载体,负责从操作系统内核中分配资源,比如每个进程都有4GB的独立的虚拟地址空间,有各自的内核对象句柄等等。线程是资源分配的最小单元,真正在使用这些资源的是线程。每个程序都至少有一个主线程。线程是可以被执行的最小的调度单位。
Masimaro
2018/08/31
1.2K0
WINDOWS核心编程--Windows程序内部运行机制
现代的桌面应用基本上很少使用原始的 Windows API 进行开发了,因为使用原始 API 堆砌出来的应用代码逻辑非常繁琐,特别是窗口消息的处理非常不方便,大多数直接使用 C# 或者 QT 这种跨平台的开发库,而那种直接封装 Windows API 而存在的 MFC 早已半步入土。
20岁爱吃必胜客
2022/11/13
1.6K0
WINDOWS核心编程--Windows程序内部运行机制
相关推荐
Windows核心编程:第7章 线程调度、优先级和关联性
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验