php每个进程分配缓冲区,进程工作集WorkingSet (PSAPI 01)

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

#include

#include

#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;

}

进程枚举之PSAPI函数

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

windows下使用C&num;获取特定进程网络流量

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

Windows工作集内存

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

windows进程&sol;线程创建过程 --- windows操作系统学习

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

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

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

进程内外的session

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

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

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

python — 进程

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

Windows操作系统下创建进程的过程

进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位.程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体.而进程则 ...

随机推荐

eclipse出现感叹号的解决办法

当eclipse导入项目出现红叉但无提示错误时,去看:1>菜单路径----Window/Show View/Console2>菜单路径----Window/Show View/Error ...

OSPF虚链路配置&period;示例2

先看一个拓扑图 黄色区域是area0,即骨干区域,如果如图示RT1与RT6之间的链路断了,那么会出现骨干区域被“分裂”的情况,很明显骨干区域是不能被分割开的,出现这种状况的时候可能会影响到整个自制系统 ...

NULL不能和任何字段比较和运算

UPDATE dbo.PayPalPaymentInfo SET GrossAmount=TotalPrice+TaxAmount WHERE GrossAmount IS NULL --如果TaxA ...

C语言变量的理解

1.定义: 变量是一段有名字的连续存储空间.在源代码中通过定义变量来申请并命名这样的存储空间,并通过变量的名字来使用这段存储空间.下面,我们来理解怎样定义一个变量.例如去住酒店.第一步,前台登记:住几 ...

OC基础10:基本的C语言特性1

"OC基础"这个分类的文章是我在自学Stephen G.Kochan的过程中的笔记. 1.  函数和方法的区别? (1).方法包 ...

&lbrack;Usaco2007 Dec&rsqb;宝石手镯&lbrack;01背包&rsqb;&lbrack;水&rsqb;

Description 贝茜在珠宝店闲逛时,买到了一个中意的手镯.很自然地,她想从她收集的 N(1 <= N <= 3,402)块宝石中选出最好的那些镶在手镯上.对于第i块宝石,它的重量为 ...

python学习&colon;hashlib模块使用

#!/usr/bin/env python   import sys import hashlib   def md5sum(f):     m = hashlib.md5()     with op ...

(一〇六)iPad开发之UIPopoverController的使用

很多App里都有一种点击显示的悬浮气泡菜单,例如下图: 在iPad上可以使用UIPopoverController实现这个功能,popoverController继承自NSObject而不是UIVie ...

python with as的用法

With语句是什么? 有一些任务,可能事先需要设置,事后做清理工作.对于这种场景,Python的with语句提供了一种非常方便的处理方式.一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取 ...

Python从入门到精通之Fifth!

字典  类名:dict   字典是无序的. 字典的创建  info = {"k1":{1:"abc",[1,2,3]},"k2":True} ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值