Windwos C语言遍历进程的文件厂商
时间: 2023-11-30 13:03:41 浏览: 28
要遍历进程的文件厂商,首先需要获取进程的文件路径,然后通过该文件路径获取文件的版本信息,进而获取厂商信息。
以下是一个简单的示例代码,可以实现遍历当前系统中所有进程,并输出每个进程的文件厂商信息:
```c
#include <Windows.h>
#include <stdio.h>
int main()
{
HANDLE hProcessSnap;
PROCESSENTRY32 pe32;
// 获取进程快照
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
{
printf("CreateToolhelp32Snapshot failed.\n");
return 1;
}
// 遍历进程
pe32.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hProcessSnap, &pe32))
{
do
{
// 获取进程的文件路径
char szExeFile[MAX_PATH] = { 0 };
strcpy_s(szExeFile, MAX_PATH, pe32.szExeFile);
// 获取文件版本信息
DWORD dwHandle;
DWORD dwLen = GetFileVersionInfoSize(szExeFile, &dwHandle);
if (dwLen > 0)
{
BYTE* pBuffer = new BYTE[dwLen];
if (GetFileVersionInfo(szExeFile, dwHandle, dwLen, pBuffer))
{
VS_FIXEDFILEINFO* pFileInfo;
UINT uLen;
if (VerQueryValue(pBuffer, "\\", (LPVOID*)&pFileInfo, &uLen))
{
// 输出厂商信息
DWORD dwCompanyNameLen;
LPVOID lpCompanyName;
if (VerQueryValue(pBuffer, "\\StringFileInfo\\040904B0\\CompanyName", &lpCompanyName, &dwCompanyNameLen))
{
printf("Process: %ls, Company: %ls\n", pe32.szExeFile, (LPCSTR)lpCompanyName);
}
}
}
delete[] pBuffer;
}
} while (Process32Next(hProcessSnap, &pe32));
}
CloseHandle(hProcessSnap);
return 0;
}
```
该代码使用了Windows API函数 `CreateToolhelp32Snapshot` 和 `Process32First/Process32Next` 获取进程快照,并遍历了所有进程。对于每个进程,通过 `GetFileVersionInfo` 和 `VerQueryValue` 函数获取了文件版本信息,并输出了厂商信息。需要注意的是,该代码仅支持获取英文版Windows系统下的厂商信息,如果需要支持其他语言系统,需要修改 `VerQueryValue` 函数中的参数。