PSAPI和ToolHelpAPI学习笔记
- 标 题: PSAPI学习笔记
- 作 者:北极星2003
- 时 间:2005-07-24 18:36
- 链 接:http://bbs.pediy.com/showthread.php?threadid=15430
关键字:PSAPI Functions
EmptyWorkingSet***
EnumDeviceDrivers**
EnumPageFiles
EnumProcesses*
EnumProcessModules*
GetDeviceDriverBaseName**
GetDeviceDriverFileName**
GetMappedFileName
GetModuleBaseName*
GetModuleFileNameEx*
GetModuleInformation*
GetPerformanceInfo
GetProcessImageFileName
GetProcessMemoryInfo*
GetWsChanges***
InitializeProcessForWsWatch***
QueryWorkingSet***
**红色为.NET新增**
实践应用:
1).枚举进程、模块以及相关信息
使用PSAPI:
EnumProcess,
EnumProcessModule,
GetProcessMemoryInfo,
GetModuleBaseName,
GetModuleFileNameEx,
GetModuleInformation,
#include <windows.h>
#include <fstream>
#include <iomanip>
#include "psapi.h" #pragma comment ( lib, "psapi.lib" ) using namespace std ; int main( )
{
ofstream fout ( "EnumProcessAndModule.txt" ) ; DWORD dwProcessId[1024], cbNeededProcess; if ( !EnumProcesses( dwProcessId, sizeof(dwProcessId), &cbNeededProcess ) )
return 0; for ( unsigned int i = 0; i < ( cbNeededProcess/sizeof(DWORD) ); i++ )
{
char szProcessName[MAX_PATH] = "unknown"; HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, dwProcessId[i] );
if ( NULL != hProcess )
{
HMODULE hMods[1024];
DWORD cbNeededModule ; if ( EnumProcessModules( hProcess, hMods, sizeof(hMods), &cbNeededModule ) )
{
PROCESS_MEMORY_COUNTERS ProcessMemCounters ; GetProcessMemoryInfo ( hProcess, &ProcessMemCounters, sizeof(ProcessMemCounters) ) ; fout << "ProcessId : " << dwProcessId[i] << endl ;
fout << "Process Memory information:" << endl ;
fout << "PageFaultCount :" << hex << setw(8) << ProcessMemCounters.PageFaultCount << endl ;
fout << "PeakWorkingSetSize :" << hex << setw(8) << ProcessMemCounters.PeakWorkingSetSize << endl ;
fout << "WorkingSetSize :" << hex << setw(8) << ProcessMemCounters.WorkingSetSize << endl ;
fout << "QuotaPeakPagedPoolUsage :" << hex << setw(8) << ProcessMemCounters.QuotaPeakPagedPoolUsage << endl ;
fout << "QuotaPagedPoolUsage :" << hex << setw(8) << ProcessMemCounters.QuotaPagedPoolUsage << endl ;
fout << "QuotaPeakNonPagedPoolUsage :" << hex << setw(8) << ProcessMemCounters.QuotaPeakNonPagedPoolUsage << endl ;
fout << "QuotaNonPagedPoolUsage :" << hex << setw(8) << ProcessMemCounters.QuotaNonPagedPoolUsage << endl ;
fout << "PagefileUsage :" << hex << setw(8) << ProcessMemCounters.PagefileUsage << endl ;
fout << "PeakPagefileUsage :" << hex << setw(8) << ProcessMemCounters.PeakPagefileUsage << endl ; for ( unsigned int j = 0; j < ( cbNeededModule/sizeof(DWORD) ); j++ )
{
char szModuleName[MAX_PATH]; if ( GetModuleFileNameEx ( hProcess, hMods[j], szModuleName, sizeof(szModuleName) ) )
{
fout << '\t' << szModuleName << setw(8) << hex << "(0x" << hMods[j] << ")" << endl ; MODULEINFO ModuleInfo ; if ( GetModuleInformation ( hProcess, hMods[j], &ModuleInfo, sizeof(ModuleInfo) ) )
{
fout << "\t\tBaseOfDll : " << ModuleInfo.lpBaseOfDll << endl ;
fout << "\t\tSizeOfImage : " << ModuleInfo.SizeOfImage << endl ;
fout << "\t\tEntryPoint : " << ModuleInfo.EntryPoint << endl ;
}
}
} fout << endl << endl ;
} CloseHandle( hProcess );
} } return 0 ;
}
二.枚举设备驱动信息
使用PSAPI:
EnumDeviceDrivers
GetDeviceDriverBaseName
GetDeviceDriverFileName
#include <windows.h>
#include <fstream>
#include "psapi.h" #pragma comment ( lib, "psapi.lib" ) using namespace std ; int main()
{
ofstream fout ( "DeviceDrivers.txt" ) ; LPVOID lpImageBase[1024] ;
DWORD cbNeeded ; if ( EnumDeviceDrivers( lpImageBase, sizeof(lpImageBase), &cbNeeded ) )
{
for ( unsigned int i = 0; i < ( cbNeeded/sizeof(LPVOID) ); i++ )
{
char szDeviceDriveBaseName[128] ;
char szDeviceDriveFileName[1024] ; GetDeviceDriverBaseName ( lpImageBase[i], szDeviceDriveBaseName, sizeof(szDeviceDriveBaseName) ) ;
GetDeviceDriverFileName ( lpImageBase[i], szDeviceDriveFileName, sizeof(szDeviceDriveFileName) ) ; fout << "BaseName : " << szDeviceDriveBaseName << endl ;
fout << "FileName : " << szDeviceDriveFileName << endl << endl ;
}
} return 0 ;
}
三.WorkingSet Info
使用PSAPI:
注:在执行下面这个程序的时候最好打开“任务管理器”,观察NOTEPAD.EXE的内存使用情况(在程序中是以NOTEPAD.EXE为例)
#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 = ; //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 << "waiting for 5 second..." << 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 ;
}
说明:EmptyWorkingSet有整理内存的功能,对系统中的所有进程执行该功能,即可以实现内存整理。( 内存整理工具也不过如此吧 ~v~ )
--------------------------------------------------------------------------------
作者 :北极星2003
邮箱 :zhangjingsheng_nbu@yahoo.com.cn
PSAPI和ToolHelpAPI学习笔记的更多相关文章
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- HTML学习笔记
HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...
- DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记
今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...
随机推荐
- C#异常处理及心得
C sharp中的异常用于处理系统级和应用程序级的错误状态,它是一种结构化.统一的类型安全的处理机制.c#的异常 机制非常类似于c++的异常处理机制,但是还是有一些重要的区别: 1,在 C# 中,所有 ...
- 《TCP/IP具体解释卷2:实现》笔记--接口层
接口层包含在本地网上发送和接收分组的硬件与软件. 我们用设备驱动程序来表示与硬件及网络接口通信的软件,网络接口是指在一个特定网络上硬件与设备驱动器之间的接口. Net/3接口层试图在网络协议和连接到一 ...
- Mongo命令批量更新某一数组字段的顺序
db.table.find().forEach(function (doc) { var oldValue = doc.Column1; var newValue = [sa[1] ...
- LINUX下的Mail服务器的搭建
电子邮件是因特网上最为流行的应用之一.如同邮递员分发投递传统邮件一样,电子邮件也是异步的,也就是说人们是在方便的时候发送和阅读邮件的,无须预先与别人协同.与传统邮件不同的是,电子邮件既迅速,又易于分发 ...
- (字符串)最长公共字串(Longest-Common-SubString,LCS)
题目: 给定两个字符串X,Y,求二者最长的公共子串,例如X=[aaaba],Y=[abaa].二者的最长公共子串为[aba],长度为3. 子序列是不要求连续的,字串必须是连续的. 思路与代码: 1.简 ...
- 基于Teigha.Net实现CAD到SHP的转换方案
CAD在测绘领域运用广泛,所以,现在有很多成果都是CAD格式,但其自身存在很多局限性,需将其转为支持更加广泛,存储更加完善的 SHP文件.ArcGIS中直接提供相关转换工具,但不能转换Xdata,Ar ...
- 解决百度编辑器在编辑视频时src丢失的问题
问题描述:使用的是最新的UEditor 1.4.3.3版本,在上传完视频后,编辑的时候出现视频的src丢失的问题 解决方式:修改ueditor.config.js文件,将 img: ['src', ' ...
- ADO.Net 之 数据库连接池(二)
连接到数据库服务器通常由几个需要很长时间的步骤组成.必须建立物理通道(例如套接字或命名管道),必须与服务器进行初次握手,必须分析连接字符串信息,必须由服务器对连接进行身份验证,必须运行检查以便在当前事 ...
- [转]intellij 13新建javaweb项目并用tomcat 7启动
来自:http://blog.csdn.net/little__zm/article/details/19570535 对intellij不熟,找了很多文章,只这篇最为顺利.其他都有各种各校的问题,先 ...
- Hadoop,HBase集群环境搭建的问题集锦(二)
10.艾玛, Datanode也启动不了了? 找到log: Caused by: java.net.UnknownHostException: Invalid host name: local hos ...