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. NOIP2012借教室

    题目描述 Description 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海 ...

  2. Sitecore系统教程即时查阅编辑内容

    实时模式中的Sitecore 作为开发人员,我们经常需要在本地环境中使用代码和内容.在本地,能够立即看到任何内容更改,以节省时间和提高效率是有意义的.这是在实时模式下运行Sitecore.默认情况下, ...

  3. 在oracle中如何把前台传过来的日期字符串转换成正确格式

    insert into ibill_sys_version(versionId,productCode,versionCode,versionDesc,versionUrl, upgradeWay,u ...

  4. 文件上传中UUID的解读

    UUID简介如下:1.简介UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software F ...

  5. jQuery 筛选器1

    jQuery 筛选器1 筛选器1: 在选择器选择的基础上在选择一次 // 当前点击的标签$(this) $(this) // .next() 获取当标签的下一个标签 $(this).next(); / ...

  6. springboot跑定时任务

    使用@Scheduled注解实现 1.在启动类上加上@EnableScheduling 开启定时任务 2.新建一个任务类,在方法上添加@Scheduled注解 @Componentpublic cla ...

  7. ldap 集成harbor

    harbor: 1.6 默认配置文件在harbor.cfg,我们可以先不添加配置,直接在harbor web界面进行配置(harbor 1.6 如果db 启动失败提示postgresql 数据目录已存 ...

  8. 动态从数据库获取数据,省市县三级联动,有校验,导出Excel模板

    话不多说,看效果图,直接上代码. sheet  商户表 hideSheet ,功能完成后隐藏的Sheet,用于储存下拉框中的信息,(以一定的规则将所需数据存储在表格中). 下面是代码 部分数据需要在导 ...

  9. linux --- 10.常见命令

    1.在登录Linux时,一个具有唯一进程ID号的shell将被调用,这个ID是什么()A.NID B.PID C.UID C.CID 2.下面那个用户存放用户密码信息()A./boot B./etc ...

  10. 【C++】10.18日的C++笔记

    使用memset初始化一个类会导致类中的指针和虚函数表出现问题.相关链接 使用memset(a,1,sizeof(a))初始化a数组不会达到预期的效果,因为memset会把每个字节赋值为1就会变成16 ...