以下是做进程管理器所用到的API函数。
若是链接错误,则加上
#include <pdh.h>
#pragma comment ( lib , "Pdh.lib" )
#pragma comment ( lib , "Pdh.lib" )
第一组函数:枚举进程信息
HANDLE WINAPI CreateToolhelp32Snapshot(
);
BOOL WINAPI Process32First(
);
BOOL WINAPI Process32Next(
);
BOOL CloseHandle(
);
=================================================================================
第二组函数: //返回当前系统信息
VOID GetSystemInfo(SYSTEM_INFO si);
typedef struct _SYSTEM_INFO {
} SYSTEM_INFO, *LPSYSTEM_INFO;
第三组 ,用于获取进程相关的时间
BOOL GetProcessTimes(
);
关于FILETIME结构的说明
typedef struct _FILETIME
{
DWORD dwLowDateTime; //时间的低32位
}FILETIME,*PFILETIME;
调用GetProcessTimes(hPro,&createTime,&exiTime,&kTime,&utime);
之后要把文件时间转化为系统时间,使用函数:
_SYSTEMTIME temp;
FileTimeToSystemTime(&createTime,&temp);
于是,我们就要了解结构体: _SYSTEMTIME
typedef struct _SYSTEMTIME
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;
(*)枚举进程的ID号
DWORD aProcesses[1024], cbNeeded, cProcesses;
if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
return 0;
然后数组aProcess中就放入了当前系统中的进程的ID号,cbNeeded放的是进程数目。
for ( i = 0; i < cbNeeded/sizeof(DWORD) ; i++ )
PrintMemoryInfo( aProcesses[i] );
(*)由指定的进程号ID,获得该进程的句柄方法:
HANDLE hProcess;
hProcess=OpenProcess(PROCESS_QUERY_INFORMATIION | PROCESS_VM_READ,
FALSE , processID );
if(hProcess==NULL) return;
====================================================================================
第四组 返回指定进程的内存使用信息
BOOL GetProcessMemoryInfo(
);
BOOL QueryWorkingSet(
);
关于进程的内存使用的结构体
typedef struct _PROCESS_MEMORY_COUNTERS
{
DWORD cb; //结构体大小
DWORD PageFaultCount; //缺页中断次数
SIZE_T PeakWorkingSetSize; //内存使用高峰值
SIZE_T WorkingSetSize; //当前内存使用值
SIZE_T QuotaPeakPagedPoolUsage; //使用页面缓存池高峰
SIZE_T QuotaPagedPoolUsage; //使用页面缓存池
SIZE_T QuotaPeakNonPagedPoolUsage; //使用非分页缓存池高峰
SIZE_T QuotaNonPagedPoolUsage; //使用非分页缓存池
SIZE_T PagefileUsage; //使用分页文件
SIZE_T PeakPagefileUsage; //使用分页文件高峰
} PROCESS_MEMORY_COUNTERS, *PPROCESS_MEMORY_COUNTERS;
(2)获取系统内存信息
GlobalMemoryStatus,Win32 API函数。
此函数用来获得当前可用的物理和虚拟内存信息,函数定义为:
VOID GlobalMemoryStatus
(
LPMEMORYSTATUS lpBuffer
);
此函数无返回值,参数是一个指向名为MEMORYSTATUS的结构的指针。函数的返回信息会被存储在MEMORYSTATUS结构中。
此函数用来替代用来支持16位应用程序的GetFreeSpace函数。
应用程序应该在申请内存前调用此函数以防止影响到其他程序运行。
这个函数的返回值是动态的,并且可能返回相同的值。
关于MEMORYSTATUS结构:
机构定义:
typedef struct _MEMORYSTATUS { // mst
DWORD dwLength; // sizeof(MEMORYSTATUS)
DWORD dwMemoryLoad; // percent of memory in use
DWORD dwTotalPhys; // bytes of physical memory
DWORD dwAvailPhys; // free physical memory bytes
DWORD dwTotalPageFile; // bytes of paging file
DWORD dwAvailPageFile; // free bytes of paging file
DWORD dwTotalVirtual; // user bytes of address space
DWORD dwAvailVirtual; // free user bytes
} MEMORYSTATUS, *LPMEMORYSTATUS;
结构成员的含义:
dwLength
MEMORYSTATUS结构的大小,在调GlobalMemoryStatus函数前用sizeof()函数求得,用来供函数检测结构的版本。
dwMemoryLoad
返回一个介于0~100之间的值,用来指示当前系统内存的使用率。
dwTotalPhys
返回总的物理内存大小,以字节(byte)为单位。
dwAvailPhys
返回可用的物理内存大小,以字节(byte)为单位。
dwTotalPageFile
显示可以存在页面文件中的字节数。注意这个数值并不表示在页面文件在磁盘上的真实物理大小。
dwAvailPageFile
返回可用的页面文件大小,以字节(byte)为单位。
dwTotalVirtual
返回调用进程的用户模式部分的全部可用虚拟地址空间,以字节(byte)为单位。
dwAvailVirtual
返回调用进程的用户模式部分的实际自由可用的虚拟地址空间,以字节(byte)为单位。
MEMORYSTATUS结构,
结构的定义如下:
MEMORYSTATUS STRUCT
dwLength DWORD ? ;本结构的长度
dwMemoryLoad DWORD ? ;已用内存的百分比
dwTotalPhys DWORD ? ;物理内存总量
dwAvailPhys DWORD ? ;可用物理内存
dwTotalPageFile DWORD ? ;交换文件总的大小
dwAvailPageFile DWORD ? ;交换文件中空闲部分大小
dwTotalVirtual DWORD ? ;用户可用的地址空间
dwAvailVirtual DWORD ? ;当前空闲的地址空间
MEMORYSTATUS ENDS
此函数用来获得当前可用的物理和虚拟内存信息,函数定义为:
VOID GlobalMemoryStatus
(
LPMEMORYSTATUS lpBuffer
);
此函数无返回值,参数是一个指向名为MEMORYSTATUS的结构的指针。函数的返回信息会被存储在MEMORYSTATUS结构中。
此函数用来替代用来支持16位应用程序的GetFreeSpace函数。
应用程序应该在申请内存前调用此函数以防止影响到其他程序运行。
这个函数的返回值是动态的,并且可能返回相同的值。
关于MEMORYSTATUS结构:
机构定义:
typedef struct _MEMORYSTATUS { // mst
DWORD dwLength; // sizeof(MEMORYSTATUS)
DWORD dwMemoryLoad; // percent of memory in use
DWORD dwTotalPhys; // bytes of physical memory
DWORD dwAvailPhys; // free physical memory bytes
DWORD dwTotalPageFile; // bytes of paging file
DWORD dwAvailPageFile; // free bytes of paging file
DWORD dwTotalVirtual; // user bytes of address space
DWORD dwAvailVirtual; // free user bytes
} MEMORYSTATUS, *LPMEMORYSTATUS;
结构成员的含义:
dwLength
MEMORYSTATUS结构的大小,在调GlobalMemoryStatus函数前用sizeof()函数求得,用来供函数检测结构的版本。
dwMemoryLoad
返回一个介于0~100之间的值,用来指示当前系统内存的使用率。
dwTotalPhys
返回总的物理内存大小,以字节(byte)为单位。
dwAvailPhys
返回可用的物理内存大小,以字节(byte)为单位。
dwTotalPageFile
显示可以存在页面文件中的字节数。注意这个数值并不表示在页面文件在磁盘上的真实物理大小。
dwAvailPageFile
返回可用的页面文件大小,以字节(byte)为单位。
dwTotalVirtual
返回调用进程的用户模式部分的全部可用虚拟地址空间,以字节(byte)为单位。
dwAvailVirtual
返回调用进程的用户模式部分的实际自由可用的虚拟地址空间,以字节(byte)为单位。
MEMORYSTATUS结构,
结构的定义如下:
MEMORYSTATUS STRUCT
dwLength DWORD ? ;本结构的长度
dwMemoryLoad DWORD ? ;已用内存的百分比
dwTotalPhys DWORD ? ;物理内存总量
dwAvailPhys DWORD ? ;可用物理内存
dwTotalPageFile DWORD ? ;交换文件总的大小
dwAvailPageFile DWORD ? ;交换文件中空闲部分大小
dwTotalVirtual DWORD ? ;用户可用的地址空间
dwAvailVirtual DWORD ? ;当前空闲的地址空间
MEMORYSTATUS ENDS
====================================================================================
第五组
获取GUI对象
DWORD GetGuiResources (
);
===================================================================================
第六组
获取指定的进程的所有的I/O操作
BOOL GetProcessIoCounters(
);
涉及到的结构体
typedef struct _IO_COUNTERS
{
ULONGLONG ReadOperationCount; //读操作的数目
ULONGLONG WriteOperationCount; //写操作的数目
ULONGLONG OtherOperationCount; //其他操作数目,除了读、写操作
ULONGLONG ReadTransferCount; //读取的字节数
ULONGLONG WriteTransferCount; //写入的字节数
ULONGLONG OtherTransferCount; //其他的操作的字节数
} IO_COUNTERS, *PIO_COUNTERS;
===================================================================================
第七组 获得文件的版本信息
以下三个函数的调用顺序必须满足
GetFileVersionInfoSize-->GetFileVersionInfo-->VerQueryValue
获得文件的版本信息的大小,如果这个文件的版本信息可以得到,则返回信息的字节大小,
否则返回0。只有调用完这个函数以后,才可以调用函数 GetFileVersionInfo,因为函数
GetFileVersionInfoSize的返回值指明了函数GetFileVersionInfoSize的缓冲区大小。
DWORD GetFileVersionInfoSize(
);
BOOL GetFileVersionInfo(
);
BOOL VerQueryValue(
);
==========================================================================
获取文件版本信息
struct LANGANDCODEPAGE {
WORD wLanguage;
WORD wCodePage;
}*lpTranslate;
BOOL MyGetFileVersion(char *pFileName)
{
DWORD dwSize = GetFileVersionInfoSize(pFileName,NULL);
if(dwSize<=0)
return FALSE;
LPVOID lpData = (LPVOID)malloc(dwSize);
if(!GetFileVersionInfo(pFileName,0,dwSize,lpData))
return FALSE;
UINT cbTranslate=0;
LANGANDCODEPAGE *lpTranslate = NULL;
VerQueryValue(lpData,TEXT("\VarFileInfo\Translation"),(LPVOID*)&lpTranslate,&cbTranslate);
CHAR subblock[256];
LPVOID lpBuffer=NULL;
UINT uLen=0;
for(UINT i=0; i<(cbTranslate/sizeof(struct LANGANDCODEPAGE)); i++)
{
sprintf( subblock, TEXT("\StringFileInfo\xx\LegalCopyright"),lpTranslate[i].wLanguage,lpTranslate[i].wCodePage);
if(VerQueryValue(lpData, subblock, &lpBuffer, &uLen) )
{
printf("版权:%s
",lpBuffer);
}
sprintf( subblock, TEXT("\StringFileInfo\xx\CompanyName"),lpTranslate[i].wLanguage,lpTranslate[i].wCodePage);
if(VerQueryValue(lpData, subblock, &lpBuffer, &uLen) )
{
printf("公司名:%s
",lpBuffer);
}
sprintf( subblock, TEXT("\StringFileInfo\xx\FileVersion"),lpTranslate[i].wLanguage,lpTranslate[i].wCodePage);
if(VerQueryValue(lpData, subblock, &lpBuffer, &uLen) )
{
printf("文件版本:%s
",lpBuffer);
}
}
return TRUE;
}
//会话ID,权限获取,用户名,文件路径,命令参数,页面错误增量
会话ID我知道怎么做了
OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken);
GetTokenInformation(hToken, TokenSessionId, &dwId, sizeof(DWORD), &dwLen);
printf("%d
", dwId);
MSDN中函数原型申明:
BOOL OpenProcessToken(
);
HANDLE hToken; //令牌句柄
OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES, &hToken);得到进程的令牌句柄