VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 3078|回复: 15

[分享] Win7-X64系统下VC获得进程路径信息

[复制链接]
51_avatar_middle
online_admins 发表于 2015-8-25 13:17:25 | 显示全部楼层 |阅读模式
大家好,之前驿站给大家制作的Vip教程中有讲解到如何制作一款任务管理器,其中都可以正常的获取到目标进程的路径位置信息。当时的开发环境是 WinXP-Sp3。
随着时间的推移,目前来说很多人的系统都升级到了Win7-x64位版本。今天一个会员就问我说之前教程中的代码无法正常的获取到进程的路径信息,代码如下:

  1. BOOL CMFCTestDlg::GetProcessList()
  2. {
  3.         BOOL result = FALSE;
  4.         HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  5.         if (hSnap == INVALID_HANDLE_VALUE)
  6.                 return FALSE;

  7.         int idx = 0;
  8.         CString strID;
  9.         HANDLE hProcess = NULL;
  10.         CString strPath, strSys(_T("SystemRoot"));

  11.         PROCESSENTRY32 info = { 0 };
  12.         info.dwSize = sizeof(PROCESSENTRY32);

  13.         BOOL bRet = Process32First(hSnap,&info);

  14.         while (bRet)
  15.         {
  16.                 hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, info.th32ProcessID);
  17.                 if (hProcess)
  18.                 {
  19.                         strPath.Empty();
  20.                         GetModuleFileNameEx(hProcess, NULL, strPath.GetBufferSetLength(MAX_PATH), MAX_PATH);
  21.                         strPath.ReleaseBuffer();
  22.                         strPath.TrimLeft(_T("\\?"));
  23.                         if (strPath.Left(strSys.GetLength()).CompareNoCase(strSys) == 0)
  24.                         {
  25.                                 TCHAR szWin[MAX_PATH] = { 0 };
  26.                                 GetWindowsDirectory(szWin,MAX_PATH);
  27.                                 strPath.Replace(strSys,szWin);

  28.                         }
  29.                         SHFILEINFO shInfo = { 0 };
  30.                         SHGetFileInfo(strPath, 0, &shInfo, sizeof(SHFILEINFO), SHGFI_SMALLICON | SHGFI_ICON);
  31.                 }

  32.                 idx = m_TaskList.InsertItem(m_TaskList.GetItemCount(), info.szExeFile);
  33.                 strID.Empty();
  34.                 strID.Format(_T("%d"), info.th32ProcessID);
  35.                 m_TaskList.SetItemText(idx, 1, strID);
  36.                 m_TaskList.SetItemText(idx, 2, strPath);

  37.                 bRet = Process32Next(hSnap, &info);
  38.         }

  39.         return TRUE;
  40. }
复制代码


//////////////////////////////////////////////////////////////////////////////////
// 备注:本篇文章来自 vc驿站:https://www.cctry.com/thread-256682-1-1.html
// C、C++、VC++ 各种学习资源,免费教程,期待您的加入!
//////////////////////////////////////////////////////////////////////////////////

看完之后感觉没什么问题,我问他是什么系统,他说Win7-x64,我第一个想到的就是权限问题,但他说也提权了,提权函数如下:

  1. BOOL CMFCTestDlg::AdjustPrivileges()
  2. {
  3.         HANDLE hToken = NULL;
  4.         TOKEN_PRIVILEGES tp = { 0 };
  5.         TOKEN_PRIVILEGES oldtp = { 0 };
  6.         DWORD dwSize = sizeof(TOKEN_PRIVILEGES);
  7.         LUID luid = { 0 };

  8.         if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
  9.                 if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
  10.                         return TRUE;
  11.                 else
  12.                         return FALSE;
  13.         }
  14.         if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)) {
  15.                 CloseHandle(hToken);
  16.                 return FALSE;
  17.         }

  18.         tp.PrivilegeCount = 1;
  19.         tp.Privileges[0].Luid = luid;
  20.         tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

  21.         /* Adjust Token Privileges */
  22.         if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &oldtp, &dwSize)) {
  23.                 CloseHandle(hToken);
  24.                 return FALSE;
  25.         }

  26.         // close handles
  27.         CloseHandle(hToken);
  28.         return TRUE;
  29. }
复制代码


这个函数针对WinXp系统应该好用,针对Win7系统不一定好用,我说改下工程属性,将程序默认的执行级别改成管理员运行,如下图:
Win7-X64系统下VC获得进程路径信息

按照我说的改了,还是不行,如下图:
Win7-X64系统下VC获得进程路径信息

看来必须调试调试看看了,GetModuleFileNameEx 函数是获取路径信息的,调试一看返回值为0,GetLastError 的错误码是:299 - ERROR_PARTIAL_COPY
查阅MSDN,如下:
If this function is called from a 32-bit application running on WOW64, it can only enumerate the modules of a 32-bit process. If the process is a 64-bit process, this function fails and the last error code is ERROR_PARTIAL_COPY (299).

//////////////////////////////////////////////////////////////////////////////////
// 备注:本篇文章来自 vc驿站:https://www.cctry.com/thread-256682-1-1.html
// C、C++、VC++ 各种学习资源,免费教程,期待您的加入!
//////////////////////////////////////////////////////////////////////////////////

问题的原因在于:我们的程序是32位的,而我们试图枚举一个64位进程的模块时就会报错。

那怎么办呢?一般都是向下兼容,32位的程序没办法枚举64位进程的模块,但是反过来,64位的程序应该可以枚举32位进程的模块。于是乎按照这个想法来实现,将我们的工程改成64位的程序:

1、打开配置管理器,如下图:
Win7-X64系统下VC获得进程路径信息

Win7-X64系统下VC获得进程路径信息

2、新建活动解决方案,如下图:
Win7-X64系统下VC获得进程路径信息

下拉选择x64:
Win7-X64系统下VC获得进程路径信息

Win7-X64系统下VC获得进程路径信息

之后确认关闭对话框即可。

3、回到vs2010中确认当前的配置是x64,如下图:
Win7-X64系统下VC获得进程路径信息

4、一般经过上面几步的设置之后,我们的工程就可以编译win64的程序了,其他方面都默认配置好了,详情见:
https://msdn.microsoft.com/en-us/library/9yb4317s.aspx

5、编译,执行程序如下:
Win7-X64系统下VC获得进程路径信息


好了,到这里基本就写完了,希望能帮助到大家!

//////////////////////////////////////////////////////////////////////////////////
// 备注:本篇文章来自 vc驿站:https://www.cctry.com/thread-256682-1-1.html
// C、C++、VC++ 各种学习资源,免费教程,期待您的加入!
//////////////////////////////////////////////////////////////////////////////////

工程代码下载:
游客,如果您要查看本帖隐藏内容请回复

评分

参与人数 1驿站币 +2 热心值 +2 收起 理由
44_avatar_small hahacker + 2 + 2 感谢分享!

查看全部评分





上一篇:[野狐行网游研究][三期][8.21更新]
下一篇:最愛的boost容器之 any
10_avatar_middle
在线会员 发表于 2015-8-25 14:59:41 | 显示全部楼层
这个好!!!!支持 !!!!
19_avatar_middle
在线会员 发表于 2015-8-25 18:20:19 | 显示全部楼层
支持老大
67_avatar_middle
在线会员 发表于 2015-8-25 21:51:24 | 显示全部楼层
have a look look
92_avatar_middle
online_vip 发表于 2015-8-26 08:24:35 | 显示全部楼层
支持老大,点赞Win7-X64系统下VC获得进程路径信息
41_avatar_middle
在线会员 发表于 2015-8-26 19:14:59 | 显示全部楼层
学习了,增加了经验值。。。
75_avatar_middle
online_vip 发表于 2015-8-27 18:42:53 | 显示全部楼层
感谢分享!
28_avatar_middle
在线会员 发表于 2015-8-29 16:28:00 | 显示全部楼层
学习了 +++++++++++++
44_avatar_middle
online_vip 发表于 2016-1-4 12:56:55 | 显示全部楼层
啥也不说了,老大就是牛B,跟着老大学习是不会错的。
34_avatar_middle
online_vip 发表于 2016-1-9 18:35:59 | 显示全部楼层
谢谢,下载源码下来自己设计一下。
72_avatar_middle
在线会员 发表于 2016-1-23 01:13:42 | 显示全部楼层
看看是什么情况
97_avatar_middle
在线会员 发表于 2016-7-22 20:19:36 | 显示全部楼层
666666666666666666
96_avatar_middle
在线会员 发表于 2016-8-15 14:50:15 | 显示全部楼层
谢谢了喜欢啊
93_avatar_middle
online_vip 发表于 2016-10-19 14:33:05 | 显示全部楼层
RE: Win7-X64系统下VC获得进程路径信息 [修改]
55_avatar_middle
在线会员 发表于 2018-7-19 17:27:46 | 显示全部楼层
谢谢分享!!
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-5-23 20:04

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表