为什么用Module32First获取有些系统进程的信息会失败?

hehe02 2014-02-12 01:40:16
我是新手,最近在做一个MFC程序获取Windows系统当前活动窗口对应的进程名和路径。
进程快照可以遍历所有进程,但是我只想获取指定进程的指定模块的信息。
对于普通进程的窗口返回结果都是正确的,
但是对于某些进程的窗口,比如资源管理器,计算器,放大镜
返回的数据是乱码。
我已经根据网上提供的代码提高了程序的权限了!我是在VS2010的Debug模式下运行的。Win7,64位系统。
另外我还试过GetModuleFileNameEx了,结果也是失败的。。

比如这个。me32是返回的MODULEENTRY32结构。窗口对应的pid明明是3324

- me32 {dwSize=548 th32ModuleID=5832704 th32ProcessID=2009310858 ...} tagMODULEENTRY32
dwSize 548 unsigned long
th32ModuleID 5832704 unsigned long
th32ProcessID 2009310858 unsigned long
GlblcntUsage 5974800 unsigned long
ProccntUsage 16 unsigned long
+ modBaseAddr 0xfeeefeee <错误的指针> unsigned char *
modBaseSize 5832704 unsigned long
+ hModule 0x005ac440 {unused=1094259566 } HINSTANCE__ *
+ szModule 0x0030ec90 "" char [256]
+ szExePath 0x0030ed90 "燵矂瘢???蕜矂蔐矂" char [260]
源代码如下:
	
PromotePrivilege(TRUE);
HWND hwnd=GetForegroundWindow();
char str_Path[200];
char str_WindowsText[200];
GetWindowText(hwnd,str_WindowsText,200);
DWORD pid=0;
GetWindowThreadProcessId(hwnd,&pid);
MODULEENTRY32 me32;
me32.dwSize=sizeof(me32);
HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pid);
Module32First(hProcessSnap,&me32);
if(me32.th32ProcessID){
strcpy(str_Path,me32.szExePath);
}

求解释啊求解释!


...全文
790 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hehe02 2014-02-13
  • 打赏
  • 举报
回复
引用 3 楼 zwfgdlc 的回复:
64位进程可以枚举32位进程的模块,但32位进程不可以枚举64位进程的模块。 如果你想枚举64位进程的模块,试下把下面的代码编译为64位的程序.

int _tmain(int argc, _TCHAR* argv[])
{
	HMODULE hMods[512] = {0};
	DWORD cbNeeded = 0;
	TCHAR szModName[MAX_PATH];
	BOOL Wow64Process;

	HANDLE hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ|PROCESS_QUERY_LIMITED_INFORMATION, FALSE, 1032);
	IsWow64Process(hProcess, &Wow64Process); //判断是32位还是64位进程
	EnumProcessModulesEx(hProcess, hMods, sizeof(hMods), &cbNeeded, Wow64Process?LIST_MODULES_32BIT:LIST_MODULES_64BIT);
	
	for (UINT i = 0; i < (cbNeeded / sizeof(HMODULE)); i++ )
	{
		GetModuleFileNameEx(hProcess, hMods[i], szModName, _countof(szModName));
		_tprintf_s(TEXT("%s\n"),szModName);
	}
	CloseHandle(hProcess);

	return 0;
}
用了这个方法,好像成功了!真是谢谢!
zwfgdlc 2014-02-12
  • 打赏
  • 举报
回复
64位进程可以枚举32位进程的模块,但32位进程不可以枚举64位进程的模块。 如果你想枚举64位进程的模块,试下把下面的代码编译为64位的程序.

int _tmain(int argc, _TCHAR* argv[])
{
	HMODULE hMods[512] = {0};
	DWORD cbNeeded = 0;
	TCHAR szModName[MAX_PATH];
	BOOL Wow64Process;

	HANDLE hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ|PROCESS_QUERY_LIMITED_INFORMATION, FALSE, 1032);
	IsWow64Process(hProcess, &Wow64Process); //判断是32位还是64位进程
	EnumProcessModulesEx(hProcess, hMods, sizeof(hMods), &cbNeeded, Wow64Process?LIST_MODULES_32BIT:LIST_MODULES_64BIT);
	
	for (UINT i = 0; i < (cbNeeded / sizeof(HMODULE)); i++ )
	{
		GetModuleFileNameEx(hProcess, hMods[i], szModName, _countof(szModName));
		_tprintf_s(TEXT("%s\n"),szModName);
	}
	CloseHandle(hProcess);

	return 0;
}
zwfgdlc 2014-02-12
  • 打赏
  • 举报
回复
只能枚举32位进程的模块,对64位进程无效。 资源管理器,计算器,放大镜都是64位进程
oyljerry 2014-02-12
  • 打赏
  • 举报
回复
系统有做一些保护等,防止访问

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧