经典C程序例程:通过进程ID得到文件名

通过进程ID得到文件名

#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>

BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName);
void DispProcess(void);
void DispPrsFile(void);

//=================================================
typedef BOOL (_stdcall *ENUMPROCESSES)(  //注意这里要指明调用约定为-stdcall
 DWORD* pProcessIds,  //指向进程ID数组链  
 DWORD cb,    //ID数组的大小,用字节计数
 DWORD* pBytesReturned);   //返回的字节
//在psapi.dll中的函数EnumProcessModules用来枚举进程模块
typedef BOOL (_stdcall *ENUMPROCESSMODULES)(
 HANDLE hProcess,   //进程句柄
 HMODULE* lphModule, //指向模块句柄数组链
 DWORD cb,    //模块句柄数组大小,字节计数
 LPDWORD lpcbNeeded);   //存储所有模块句柄所需的字节数
//在psapi.dll中的函数GetModuleFileNameEx获得进程模块名
typedef DWORD (_stdcall *GETMODULEFILENAMEEX)(
 HANDLE hProcess,   //进程句柄
 HMODULE hModule,   //进程句柄
 LPTSTR lpFilename,   //存放模块全路径名
 DWORD nSize    //lpFilename缓冲区大小,字符计算
);
//=================================================
//=================================================
int main()
{
	//DispProcess();
	DispPrsFile();
	return 0;
}

//提升进程权限
BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName)
{
	
	TOKEN_PRIVILEGES tkp;

	LookupPrivilegeValue( NULL,szPrivName,&tkp.Privileges[0].Luid );//修改进程权限
	tkp.PrivilegeCount=1;
	tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
	AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限
	
	return( (GetLastError()==ERROR_SUCCESS) );
}
void DispProcess(void)
{
	HANDLE hSnapshot;
	PROCESSENTRY32 pe;
	BOOL bSucceed;
	TCHAR * szFileName = NULL;
	DWORD dwProcessID = 0;
	
	HANDLE hToken;
	if ( OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) )
	{
		if (EnablePrivilege(hToken,SE_DEBUG_NAME))
		{
			hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

			bSucceed = Process32First(hSnapshot, &pe);

			while(bSucceed)
			{
				printf("\n%d\t%s",pe.th32ProcessID,pe.szExeFile);
				bSucceed = Process32Next(hSnapshot, &pe);
			}
		}
	}
	CloseHandle(hSnapshot);
	system("pause");
}
void DispPrsFile(void)
{
	DWORD processid[1024],needed,processcount,i;
	HANDLE hProcess;
	HMODULE hModule;
	char path[MAX_PATH] = "",temp[256];
	HMODULE hPsDll = LoadLibrary("PSAPI.DLL");
	//=======================================================
	ENUMPROCESSES pEnumProcesses  = (ENUMPROCESSES)GetProcAddress(hPsDll, "EnumProcesses");
	ENUMPROCESSMODULES pEnumProcessModules  = (ENUMPROCESSMODULES)GetProcAddress(hPsDll, "EnumProcessModules");
	GETMODULEFILENAMEEX pGetModuleFileNameEx  = (GETMODULEFILENAMEEX)GetProcAddress(hPsDll, "GetModuleFileNameExA");
	//========================================================
	HANDLE hToken;
	
	if ( OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) )
	{
		if (EnablePrivilege(hToken,SE_DEBUG_NAME))
		{
			
			pEnumProcesses(processid, sizeof(processid), &needed);
			processcount=needed/sizeof(DWORD);
			for (i=0;i<processcount;i++)
			{
				hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,false,processid[i]);
				if (hProcess)
				{
					pEnumProcessModules(hProcess, &hModule, sizeof(hModule), &needed);
					pGetModuleFileNameEx(hProcess, hModule, path, sizeof(path));
					GetShortPathName(path,path,256);
					itoa(processid[i],temp,10);
					printf("%s --\t\t-- %s\n",path,temp);
				}
			}
		}
	}

	//CloseHandle(hPsDll);
	//CloseHandle(hModule);
	//CloseHandle(hProcess);

	itoa(processcount,temp,10);
	printf("\nProcess Count:%s\n\n",temp);
	
	system("pause");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文斗士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值