首页
社区
课程
招聘
[求助]编写任务管理器遇到问题
发表于: 2011-10-29 11:37 5464

[求助]编写任务管理器遇到问题

2011-10-29 11:37
5464
void CTaskMgrDlg::ProcessList()
{
		HANDLE hProcessSnap;
		int nIndex;
		HANDLE hProcess;
		PROCESSENTRY32 pe32;
		DWORD dwPriorityClass;
		HANDLE hToken;
		int isok;
		DWORD cbName = 1024;
		TCHAR szDomain[2048] = {0};
		SID_NAME_USE peUse;
		DWORD cbReferencedDomainName =1024;
		char buf[2048];
		CString err;
		TCHAR szName[2048] = {0};
		TOKEN_PRIVILEGES MyTokenPrivilegs;
		MyTokenPrivilegs.PrivilegeCount=1;
		MyTokenPrivilegs.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
		DWORD dwNumBytesRet;
		hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
		if (hProcessSnap==INVALID_HANDLE_VALUE)
		{
				MessageBox(L"hProcessSnap",L"error");
		}
		pe32.dwSize=sizeof(PROCESSENTRY32);
		if (!Process32First(hProcessSnap,&pe32))
		{
			 CloseHandle( hProcessSnap );     
			 MessageBox(L"Process32First",L"error");
		}	
		do 
		{		
				hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pe32.th32ProcessID);
			
				if( hProcess!=NULL )
				{	
					isok = OpenProcessToken( hProcess, 0x20008/*TOKEN_ALL_ACCESS_P*/, &hToken);
					if (isok)
					{
						if (LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&MyTokenPrivilegs.Privileges[0].Luid))
						{
							AdjustTokenPrivileges(hToken,FALSE,&MyTokenPrivilegs,0x10,(PTOKEN_PRIVILEGES)NULL,0);
						}
						else
						{
							MessageBox(L"LookupPrivilegeValue 失败");
						}

						isok = GetTokenInformation(hToken, TokenUser, &buf, 0x400, &dwNumBytesRet);
						if(isok)
						{	
							isok = LookupAccountSid(NULL, (DWORD *)(*(DWORD *)buf),
								szName, &cbName, szDomain, 
								&cbReferencedDomainName, &peUse);
							if (isok)
							{
								CString str(szName); 
								this->list.SetItemText(nIndex,2,szName);
							}
							else
							{
								err.Format(_T("错误代码:%d"),GetLastError());

								MessageBox(err,L"error");
								CloseHandle(hToken);
							}


						} 
						else
						{
							MessageBox(L"GetTokenInformation 失败",L"error");
							CloseHandle(hToken);
						}
					}
					else
					{
						err.Format(_T("OpenProcessToken错误代码:%d"),GetLastError());
						MessageBox(err,L"error");
					}
				


				}
				else
				{
					err.Format(_T("OpenProcess错误代码:%d"),GetLastError());
					MessageBox(err,L"error");
				}
				nIndex=this->list.GetItemCount();
				this->list.InsertItem(nIndex,pe32.szExeFile);
				szPID.Format(_T("%d"),pe32.th32ProcessID);
				 this->list.SetItemText(nIndex,1,szPID);
				

		} while(Process32Next(hProcessSnap,&pe32));



}


小弟荒废很久。现在重新开始学习。但是其中有些错。查看OpenProcess函数返回值。错误代码为6. 但是也就三个参数。应该是这么传的(不知道哪里错),请大家帮忙看一下

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 1683
活跃值: (674)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
Process32First 找到的第一个进程,是IDLE进程,这玩意你要是打得开,你就牛B了。。
2011-10-29 13:41
0
雪    币: 181
活跃值: (134)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
3
我已经过虑掉去打开IDle这个进程了。
2011-10-29 13:42
0
雪    币: 181
活跃值: (134)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
4
但是。提示没有访问权限了。
2011-10-29 14:29
0
雪    币: 1683
活跃值: (674)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
先提权,再去打开,不要先去打开,再去提权。。。
2011-10-29 14:43
0
雪    币: 181
活跃值: (134)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
6
void CTaskMgrDlg::UpdatePrivilege()
{
	OSVERSIONINFO vi;
	ZeroMemory(&vi, sizeof(vi));
	CString err;
	vi.dwOSVersionInfoSize = sizeof(vi);
	GetVersionEx(&vi);
	if (vi.dwPlatformId != VER_PLATFORM_WIN32_NT)
		return;
	if (GetCurrentProcessId()==0)
	{
		return;
	}
	HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, GetCurrentProcessId());

	if (hProcess)
	{
		HANDLE hToken;
		if (OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken))
		{
			LUID luid;
			if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
			{
				TOKEN_PRIVILEGES tp;
				tp.PrivilegeCount = 1;
				tp.Privileges[0].Luid = luid;
				tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

				AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
			}
			else
			{
				err.Format(_T("----LookupPrivilegeValue:%d"),GetLastError());
				MessageBox(err);
			}
			CloseHandle(hToken);
		}
		else
		{
			err.Format(_T("----OpenProcessToken:%d"),GetLastError());
			MessageBox(err);
		}
	}
	else
	{
		err.Format(_T("----OpenProcess:%d"),GetLastError());
		MessageBox(err);
	}
	
}


void CTaskMgrDlg::ProcessList()
{
		HANDLE hProcessSnap;
		int nIndex;
		HANDLE hProcess;
		PROCESSENTRY32 pe32;
		CString err;
		HANDLE hToken;
		int isok;
		DWORD cbName = 1024;
		TCHAR szName[1024] = {0};
		DWORD cbReferencedDomainName = 1024;
		TCHAR szDomain[1024] = {0};
		char buf[0x400];
		DWORD dwNumBytesRet;
		SID_NAME_USE peUse;

		PROCESS_MEMORY_COUNTERS promem;
		hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
		if (hProcessSnap==INVALID_HANDLE_VALUE)
		{
				MessageBox(L"hProcessSnap",L"error");
		}
		pe32.dwSize=sizeof(PROCESSENTRY32);
		if (!Process32First(hProcessSnap,&pe32))
		{
			 CloseHandle( hProcessSnap );     
			 MessageBox(L"Process32First",L"error");
		}	
		do 
		{		
				if (pe32.th32ProcessID==0)
				{
						continue;
				}
				
				hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pe32.th32ProcessID);
				UpdatePrivilege();
				isok = OpenProcessToken(hProcess, 0x20008/*TOKEN_ALL_ACCESS_P*/, &hToken);
				if(isok)
				{
					isok = GetTokenInformation(hToken, TokenUser, &buf, 0x400, &dwNumBytesRet);
					if(isok)
					{
						isok = LookupAccountSid(NULL, (DWORD *)(*(DWORD *)buf), szName, &cbName, szDomain, &cbReferencedDomainName, &peUse);
						if(isok)
						{
							szUser.Format(_T("%s"),szName);
							this->list.SetItemText(nIndex,2,szUser);
						} 
						else
						{
							err.Format(_T("LookupAccountSid:%d"),GetLastError());
							MessageBox(err);
						}

						CloseHandle(hToken);
					}
					else
					{
						err.Format(_T("GetTokenInformation:%d"),GetLastError());
						MessageBox(err);
					}

				}
				else
				{
					err.Format(_T("OpenProcessToken:%d"),GetLastError());
					MessageBox(err);
				}

			//	CloseHandle(hProcess);

					GetProcessMemoryInfo(hProcess, &promem, sizeof(promem));
					szMem.Format(_T("%d KB"),promem.WorkingSetSize/TransitionCount);
					nIndex=this->list.GetItemCount();
					this->list.InsertItem(nIndex,pe32.szExeFile);
					szPID.Format(_T("%d"),pe32.th32ProcessID);
					this->list.SetItemText(nIndex,1,szPID);
					this->list.SetItemText(nIndex,4,szMem);
		} while(Process32Next(hProcessSnap,&pe32));



}




又有新的问题了。提拒绝访问。不知道是不是权限提的不对
2011-10-29 15:23
0
雪    币: 181
活跃值: (134)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
7
看一下上面的代码.
2011-10-29 15:23
0
雪    币: 1683
活跃值: (674)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pe32.th32ProcessID);
        UpdatePrivilege();
你这不还是先打开,再提权嘛,换一下位置。。。
2011-10-29 17:02
0
雪    币: 181
活跃值: (134)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
9
如果位置换一下也是一样的。
2011-10-31 08:12
0
游客
登录 | 注册 方可回帖
返回
//