天天看點

列舉程序和子產品

#include <windows.h>
#include <Tlhelp32.h>
#include <stdio.h>

bool ProcessProc(void);
bool ProcessModule(DWORD);


int main (void)
{
	ProcessProc();


	return 0;
}

bool ProcessProc(void)
{
	//擷取程序快照
	HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
	if (hProcessSnap)
	{
		PROCESSENTRY32 pe32;
		pe32.dwSize=sizeof(PROCESSENTRY32);
		if (!Process32First(hProcessSnap,&pe32)) //查找第一個程序
		{
			printf("列舉程序失敗\n");
			CloseHandle(hProcessSnap);
			return false;
		}
		do 
		{
			printf("%s\t\t\t%d\n",pe32.szExeFile,pe32.th32ProcessID); //可執行子產品的名字//程序标示符
			ProcessModule(pe32.th32ProcessID);//擷取程序子產品資訊

		} while (Process32Next(hProcessSnap,&pe32));//查找下一個程序


	}
	else
	{
		printf("擷取程序快照失敗\n");
		return true;
	}
	
	return true;
}


bool ProcessModule(DWORD pid)
{

	HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pid);
	if (hProcessSnap)
	{ 
		MODULEENTRY32 me32;
		me32.dwSize=sizeof(MODULEENTRY32);
		Module32First(hProcessSnap,&me32);//擷取程序第一個子產品資訊
		do 
		{
			//printf("子產品路徑:%s\n",me32.szExePath);
			printf("子產品名:%s\n",me32.szModule);
			printf("子產品基址:0x%08X\n",(DWORD)me32.modBaseAddr);

		} 
		while (Module32Next(hProcessSnap,&me32));
		CloseHandle(hProcessSnap);
		return true;
	}
	else
	{
		printf("擷取程序快照失敗\n");
		return false;
	}
	return true;
}
           

繼續閱讀