VC做任务管理器涉及到的函数

来源:互联网 发布:淘宝购物车放多久 编辑:程序博客网 时间:2024/05/03 17:20
以下是做进程管理器所用到的API函数。
若是链接错误,则加上
#include <pdh.h>
#pragma comment ( lib , "Pdh.lib" )


第一组函数:枚举进程信息

HANDLE WINAPI CreateToolhelp32Snapshot(
  DWORD dwFlags,       
  DWORD th32ProcessID  
);


BOOL WINAPI Process32First(
  HANDLE hSnapshot,      
  LPPROCESSENTRY32 lppe  
);


BOOL WINAPI Process32Next(
  HANDLE hSnapshot,      
  LPPROCESSENTRY32 lppe  
);
BOOL CloseHandle(
  HANDLE hObject   // handle to object
);

=================================================================================
第二组函数: //返回当前系统信息
VOID GetSystemInfo(SYSTEM_INFO  si);
 
typedef struct _SYSTEM_INFO {
    union {
        DWORD dwOemId;          // Obsolete field...do not use
        struct {
            WORD wProcessorArchitecture;    //处理器的体系结构
            WORD wReserved;                 //保留
        };
    };
    DWORD  dwPageSize;                      //分页大小
    LPVOID lpMinimumApplicationAddress;     //最小寻址空间
    LPVOID lpMaximumApplicationAddress;     //最大寻址空间
    DWORD_PTR dwActiveProcessorMask;        //处理器掩码,0..31表示不同的处理器
    DWORD dwNumberOfProcessors;             //处理器数目
    DWORD dwProcessorType;                  //处理器类型
    DWORD dwAllocationGranularity;          //虚拟内存空间的粒度
    WORD wProcessorLevel;              //处理器等级
    WORD wProcessorRevision;                //处理器版本
} SYSTEM_INFO, *LPSYSTEM_INFO;


第三组 ,用于获取进程相关的时间
         成功调用返回true,失败则返回false
BOOL GetProcessTimes(
  HANDLE hProcess,           // handle to process         进程句柄
  LPFILETIME lpCreationTime, // process creation time     进程的创建时间
  LPFILETIME lpExitTime,     // process exit time         进程的退出时间
  LPFILETIME lpKernelTime,   // process kernel-mode time  进程在内核模式下的所有时间
  LPFILETIME lpUserTime      // process user-mode time    进程在用户模式下的所有时间
);

关于FILETIME结构的说明
typedef struct _FILETIME
{
DWORD  dwLowDateTime;   //时间的低32位
        DWORD  dwHightDateTime; //时间的高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(
  HANDLE Process,                          // handle to process
  PPROCESS_MEMORY_COUNTERS ppsmemCounters, // buffer
  DWORD cb                                 // size of buffer
);

BOOL QueryWorkingSet(
  HANDLE hProcess,  // handle to process
  PVOID pv,         // information buffer
  DWORD cb          // size of buffer
);

关于进程的内存使用的结构体
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
====================================================================================
第五组
获取GUI对象

DWORD GetGuiResources (
  HANDLE hProcess,  // handle to process
  DWORD uiFlags     // GUI object type
);

===================================================================================
第六组
获取指定的进程的所有的I/O操作

BOOL GetProcessIoCounters(
  HANDLE hProcess,           // handle to process
  PIO_COUNTERS lpIoCounters  // I/O accouting information
);
涉及到的结构体
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(
  LPTSTR lptstrFilename,  // file name
  LPDWORD lpdwHandle      // set to zero
);

BOOL GetFileVersionInfo(
  LPTSTR lptstrFilename,  // file name
  DWORD dwHandle,         // ignored
  DWORD dwLen,            // size of buffer
  LPVOID lpData           // version information buffer
);


BOOL VerQueryValue(
  const LPVOID pBlock, // buffer for version resource
  LPTSTR lpSubBlock,   // value to retrieve
  LPVOID *lplpBuffer,  // buffer for version value pointer
  PUINT puLen          // version length
);

==========================================================================
获取文件版本信息
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\n",lpBuffer);
}

sprintf( subblock,  TEXT("\\StringFileInfo\\xx\\CompanyName"),lpTranslate[i].wLanguage,lpTranslate[i].wCodePage); 
if(VerQueryValue(lpData, subblock, &lpBuffer, &uLen) )
{
printf("公司名:%s\n",lpBuffer);
}

sprintf( subblock,  TEXT("\\StringFileInfo\\xx\\FileVersion"),lpTranslate[i].wLanguage,lpTranslate[i].wCodePage);
if(VerQueryValue(lpData, subblock, &lpBuffer, &uLen) )
{
printf("文件版本:%s\n",lpBuffer);
}
}
return TRUE;
}



//会话ID,权限获取,用户名,文件路径,命令参数,页面错误增量
会话ID我知道怎么做了
OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken);
GetTokenInformation(hToken, TokenSessionId, &dwId, sizeof(DWORD), &dwLen);
printf("%d\n", dwId);

MSDN中函数原型申明:
BOOL OpenProcessToken(  
   HANDLE ProcessHandle,  //要修改访问权限的进程句柄
   DWORD DesiredAccess,   //指定你要进行的操作类型
   PHANDLE TokenHandle    //返回的访问令牌指针
);

HANDLE hToken;     //令牌句柄
OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES, &hToken);得到进程的令牌句柄
0 0
原创粉丝点击