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

15 篇文章 0 订阅
以下是做进程管理器所用到的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 lpMinimumApplicationAddr ess;       //最小寻址空间
      LPVOID lpMaximumApplicationAddr ess;       //最大寻址空间
      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 QuotaPeakNonPagedPoolUsa ge; //使用非分页缓存池高峰
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);得到进程的令牌句柄
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值