0x01  相关API

1.QueryWorkingSet

得到刚加入指定进程工作集的页信息

BOOL QueryWorkingSet(
HANDLE hProcess ,
PVOID pv ,
DWORD cb
);

参数:

hProcess - [in]进程句柄。句柄必须有PROCESS_QUERY_INFORMATION和PROCESS_VM_READ权限。
pv - [out]指向接收信息的存储的指针。
cb - [in]pv存储的大小,字节为单位。

返回值

成功返回非零值。失败返回0。可调用GetLastError得到错误信息。

2.GetWsChanges

检索自上次调用此函数或InitializeProcessForWsWatch函数以来已添加到指定进程的工作集的页面的信息 。

BOOL WINAPI GetWsChanges(
_In_HANDLE hProcess,
_Out_ PPSAPI_WS_WATCH_INFORMATION lpWatchInfo,
_In_ DWORD cb
);  

  参数:

hProcess    [in]处理过程的句柄。该句柄必须具有PROCESS_QUERY_INFORMATION 访问权限。有关更多信息,请参阅 进程安全和访问权限。
lpWatchInfo [out]指向用户分配的缓冲区的指针,该缓冲区接收PSAPI_WS_WATCH_INFORMATION结构数组 。该数组以FaultingPc成员为NULL 的结构终止。
cb [in]lpWatchInfo缓冲区的大小,以字节为单位。

   返回值:

如果函数成功,则返回值为非零。

如果函数失败,返回值为零。要获得扩展错误信息,可调用 GetLastError。

如果 lpWatchInfo缓冲区不足以包含所有工作集合更改记录,则GetLastError返回 ERROR_INSUFFICIENT_BUFFER ; 缓冲区返回空。为缓冲区重新分配一个更大的内存块并再次调用。

3.EmptyWorkingSet

从指定进程的工作集中删除尽可能多的页面。

BOOL WINAPI EmptyWorkingSet(
_In_ HANDLE hProcess
);

参数:

hProcess [in] 处理过程的句柄。该句柄必须具有PROCESS_QUERY_INFORMATION或PROCESS_QUERY_LIMITED_INFORMATION访问权限和PROCESS_SET_QUOTA访问权限。

返回值:

如果函数成功,则返回值为非零。

如果函数失败,返回值为零。要获得扩展错误信息,可调用 GetLastError。

// WorkingSet.cpp : 定义控制台应用程序的入口点。
// http://www.howsoftworks.net/windows/system-services/queryworkingset.html #include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <fstream>
#include "psapi.h"
#define MAX_NUM 10000 #pragma comment ( lib, "psapi.lib" ) using namespace std; ofstream fout("WorkingSetInformation.txt"); void ShowErrorMessage()
{
DWORD dwErrorCode = GetLastError(); HLOCAL hLocal = NULL;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL,
dwErrorCode,
MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
(PTSTR)&hLocal,
0,
NULL
); fout << '\t' << "ErrorCode : " << dwErrorCode << endl;
fout << '\t' << "ErrorMessage : " << (char*)hLocal << endl; LocalFree(hLocal);
} int main()
{
//get notepad's PID from "Windows task maganent" DWORD dwProcessId = 10084; //change it HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
if (InitializeProcessForWsWatch(hProcess))
{
/******************************
* QueryWorkingSet
*******************************/ PVOID pv[MAX_NUM] = { 0 }; if (!QueryWorkingSet(hProcess, pv, sizeof(pv)))
{
fout << "QueryWorkingSet Failed!" << endl; ShowErrorMessage();
}
else
{
for (unsigned int i = 0; i < MAX_NUM; i++)
{
if (pv[i] != NULL)
{
if (i == 0)
fout << "TotalNum : " << hex << pv[i] << endl; else
fout << '\t' << i << " pv : " << hex << pv[i] << endl;
}
else
{
break;
}
}
} fout << endl << endl; /******************************
* GetWsChanges
*******************************/ cout << "5 Second Wait" << endl; Sleep(5000); PSAPI_WS_WATCH_INFORMATION WatchInfo[MAX_NUM] = { 0 }; if (!GetWsChanges(hProcess, WatchInfo, sizeof(WatchInfo)))
{
fout << "GetWsChanges Failed!" << endl; ShowErrorMessage();
}
else
{
for (unsigned int i = 0; i < MAX_NUM; i++)
{
if (WatchInfo[i].FaultingPc != NULL || WatchInfo[i].FaultingVa != NULL)
{
fout << "Pc指针 : " << WatchInfo[i].FaultingPc << endl;
fout << "Va缓冲区大小 : " << WatchInfo[i].FaultingVa << endl << endl;
}
else
{
break;
}
}
} fout << endl << endl; /******************************
* EmptyWorkingSet
*******************************/ if (!EmptyWorkingSet(hProcess))
{
fout << "EmptyWorkingSet Failed!" << endl; ShowErrorMessage();
}
else
{
PVOID pv[MAX_NUM] = { 0 }; if (!QueryWorkingSet(hProcess, pv, sizeof(pv)))
{
fout << "EmptyWorkingSet Failed!" << endl; ShowErrorMessage();
}
else
{
for (unsigned int i = 0; i < MAX_NUM; i++)
{
if (pv[i] != NULL)
{
if (i == 0)
fout << "TotalNum : " << hex << pv[i] << endl; else
fout << '\t' << i << " pv : " << hex << pv[i] << endl;
}
else
{
break;
}
}
}
}
} CloseHandle(hProcess); return 0;
}

  

进程工作集WorkingSet (PSAPI 01)的更多相关文章

  1. 进程枚举之PSAPI函数

    使用PSAPI (Process StatusAPI)函数 这是一种Windows NT/2000下的方法.核心是使用EnumProcesses函数.它的原型如下: BOOL EnumProcesse ...

  2. v78.01 鸿蒙内核源码分析(消息映射篇) | 剖析LiteIpc(下)进程通讯机制 | 百篇博客分析OpenHarmony源码

    百篇博客分析|本篇为:(消息映射篇) | 剖析LiteIpc(下)进程通讯机制 进程通讯相关篇为: v26.08 鸿蒙内核源码分析(自旋锁) | 当立贞节牌坊的好同志 v27.05 鸿蒙内核源码分析( ...

  3. windows下使用C#获取特定进程网络流量

    最近老板接了一个中船重工的项目,需要做一个有关海军软件系统的组件评估项目,项目中有一个子项目需要获取特定进程的各种系统参数,项目使用.NET平台.在获取特定进程各种系统参数时,其它诸如进程ID,进程名 ...

  4. Windows工作集内存

    Windows任务管理器默认情况下,“内存(私人工作集)”列处于选中状态. 私人工作集是工作集的一个子集,它是描述每个进程所使用的内存数量的技术术语.私人工作集专门描述了某个进程正在使用的且无法与其他 ...

  5. windows进程/线程创建过程 --- windows操作系统学习

    有了之前的对进程和线程对象的学习的铺垫后,我们现在可以开始学习windows下的进程创建过程了,我将尝试着从源代码的层次来分析在windows下创建一个进程都要涉及到哪些步骤,都要涉及到哪些数据结构. ...

  6. EPROCESS 进程/线程优先级 句柄表 GDT LDT 页表 《寒江独钓》内核学习笔记(2)

    在学习笔记(1)中,我们学习了IRP的数据结构的相关知识,接下来我们继续来学习内核中很重要的另一批数据结构: EPROCESS/KPROCESS/PEB.把它们放到一起是因为这三个数据结构及其外延和w ...

  7. 进程内外的session

    进程内session:缺点:当访问量大的时候,会导致进程内session的重启优点:存储速度快 进程外session: 01.将session存储在状态服务器中 asp.net state servi ...

  8. 修改进程占用内存SetProcessWorkingSetSize函数(多篇相关文章值得学习)

    物理内存和虚拟内存 物理内存,在应用中,自然是顾名思义,物理上,真实的插在板子上的内存是多大就是多大了.看机器配置的时候,看的就是这个物理内存. 如果执行的程序很大或很多,就会导致物理内存消耗殆尽.为 ...

  9. python — 进程

    目录 1. 进程 1.进程就是一个运行中的程序(是对正在运行程序的一个抽象). 2.程序和进程之间的区别: 程序只是一个文件 进程是这个文件被CPU运行起来了 程序是永久的,进程是暂时的. 3.进程- ...

随机推荐

  1. git 常用命令收集

    1. 查看某文件的历史递交记录git log --pretty=oneline 文件名 2. 查看远程仓库信息 git remote show origin 3. 查看用户名和修改用记名: git c ...

  2. webform-AJAX

    AJAX = 异步 JavaScript和XML(标准通用标记语言的子集).AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着 ...

  3. 微信小程序一些demo链接地址

    校园小情书小程序前端+后端源码 https://www.douban.com/group/topic/116974400/ 小程序源码疯狂猜成语小程序源码UI美观 https://www.douban ...

  4. tomcat的jks的私钥导出nginx需要的key文件

    方法一: 1.先用keytool导出pfx文件.第一个123456是jks密码,后边两个是新生成的pfx的密码 keytool -v -importkeystore -srckeystore D:\\ ...

  5. Windows安装MySQL5.7.23 zip包

    工欲善必先利其器 # 环境: Win7旗舰版 + MySQL5.7.23 # 用到的命令: mysqld --initialize -- 初识化 mysqld --install -- 添加到Wind ...

  6. HTTP长连接、短连接究竟是什么?

    1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议. IP协议主要解决网络路由和寻址 ...

  7. 清华集训2017 Day 2简要题解

    *注意:这套题目题面请在loj / uoj查看 从这里开始 题目列表(loj) Problem A 小 Y 和地铁 Problem B 小 Y 和二叉树 Problem C 小 Y 和恐怖的奴隶主 训 ...

  8. opencv3.0之后IPLimage转换成MAT的问题

    转自http://www.cnblogs.com/edver/p/5187190.html IplImage * ipl = ...; cv::Mat m = cv::cvarrToMat(ipl); ...

  9. XGpio函数

    头文件 #include"xgpio.h" int XGpio_Initialize(XGpio * InstancePtr, u16 DeviceId) 功能:初始化GPIO 参 ...

  10. idea热部署+自动编译

    https://blog.csdn.net/z15732621582/article/details/79439359