主要使用 EnumProcesses 函数
ULONG ulPid = 0;
//保存进程缓存区
DWORD dwProcIdArray[MAX_PATH * 4] = { 0 };
ULONG ulProcArrayLen = 0;
/* 枚举进程 */
if (!EnumProcesses(dwProcIdArray, sizeof(dwProcIdArray), &ulProcArrayLen))
return ulPid;
/* 枚举进程信息 */
for (int i = 0; i < (ulProcArrayLen / sizeof(DWORD)); i++)
{
printf("%d",dwProcIdArray[i]);
}
参数说明:
第一个参数 保存进程缓存区
第二个参数 缓存区大小,以字节为单位
第三个参数 返回实际写入的大小,以字节为单位
PS:
若第三个参数等于第二个参数,即写入的大小和缓存区的大小是相等的,则可能需要考虑缓存区是否太小导致没有写入全部的进程,此时需要给缓存区分配更大的空间
主要流程如下:
1)使用 OpenProcess 函数打开进程句柄
2)使用 GetModuleFileName/GetProcessImageFileName/QueryFullProcessImageName 函数获取进程完整路径
ps:
Windows 2000 建议 GetModuleFileName()
Windows XP x32 建议 GetProcessImageFileName()
Windows XP x64 建议 GetProcessImageFileName()
Windows Vista 建议 QueryFullProcessImageName()
Windows 7 以后 建议 QueryFullProcessImageName()
TCHAR szImagePath[MAX_PATH * 2 - 1] = { 0 };
HANDLE hProcess;
if (!pwszFullPath)
return FALSE;
//dwPID 进程id
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, dwPID);
if (!hProcess)
return FALSE;
if (!GetProcessImageFileName(hProcess, szImagePath, MAX_PATH * 2 - 1))
{
CloseHandle(hProcess);
return FALSE;
}
主要流程如下:
1)使用 OpenProcess 打开进程句柄
2)使用 GetProcessTimes 获取进程相关时间
FILETIME CreationTime,ExitTime,KernelTime,UserTime;
HANDLE hProcess;
if (!pwszFullPath)
return FALSE;
//dwPID 进程id
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, dwPID);
if (!hProcess)
return FALSE;
if (!GetProcessTimes(hProcess, &CreationTime, &ExitTime,&KernelTime,&UserTime))
{
CloseHandle(hProcess);
return FALSE;
}
参数说明:
第二个参数 进程创建时间结构体
第三个参数 进程退出时间结构体
PS:
所有时间都使用 FILETIME 数据结构表示。 这种结构包含两个 32 位值,这些值组合成 64 位计数 100 纳秒的时间单位。
进程创建和退出时间是时间点,表示为自 1601 年 1 月 1 日 1601 年 1 月 1 日午夜以来在英格兰格林威治运行的时间量。 应用程序可以使用多个函数将此类值转换为更通用的表单。
主要流程如下:
1)创建快照
2)循环获取所有进程信息
HANDLE hProcessSnap; // 进程快照句柄
PROCESSENTRY32 stcPe32 = { 0 }; // 进程快照信息
BOOLEAN isSuccess = FALSE;
stcPe32.dwSize = sizeof(PROCESSENTRY32);
// 1. 创建一个进程相关的快照句柄
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
{
return FALSE;
}
// 2. 通过进程快照句柄获取第一个进程信息
if (!Process32First(hProcessSnap, &stcPe32))
{
CloseHandle(hProcessSnap);
return FALSE;
}
// 3. 循环遍历进程信息
do
{
//stcPe32:进程信息
} while (Process32Next(hProcessSnap, &stcPe32));
// 4. 关闭句柄退出函数
CloseHandle(hProcessSnap);