Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.06.2012, 11:15   #1
Лета
Пользователь
 
Регистрация: 10.06.2012
Сообщений: 44
По умолчанию OpenProcess

Здравствуйте.
Вот я пытаюсь с помощью функции OpenProcess получить HANDLE процесса по ID, который узнаю с помощью функций Process32First и Process32Next.
А она (функция OpenProcess) все время возвращает 0. В чем там проблема?

Код:
					SendMessage(hList,LB_RESETCONTENT,0,0);
					HANDLE h=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
					if(h==0)
					{
						MessageBox(hWnd,TEXT("Error"),0,MB_OK);
						break;
					}
					PROCESSENTRY32 process={sizeof(PROCESSENTRY32)};
					bool flag=Process32First(h,&process);
					if(flag)
					{
						HANDLE hp;
						//TCHAR capt[40];
						SendMessage(hList,LB_ADDSTRING,0,(LPARAM)process.szExeFile);
						hp=OpenProcess(PROCESS_TERMINATE,FALSE,process.th32ProcessID);
						v.push_back(hp);
						while(Process32Next(h,&process))
						{
							SendMessage(hList,LB_ADDSTRING,0,(LPARAM)process.szExeFile);
							hp=OpenProcess(PROCESS_TERMINATE,FALSE,process.th32ProcessID);
							v.push_back(hp);
						}
					}
Лета вне форума Ответить с цитированием
Старый 15.06.2012, 12:06   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
все время возвращает 0
я бы сказал, иногда может вернуть 0 (если пытаетесь открыть системный процесс):

Цитата:
If the specified process is the System Process (0x00000000), the function fails and the last error code is ERROR_INVALID_PARAMETER. If the specified process is the Idle process or one of the CSRSS processes, this function fails and the last error code is ERROR_ACCESS_DENIED because their access restrictions prevent user-level code from opening them.
а так, никаких нулей, все ок
Код:
procedure p();
var
  process: PROCESSENTRY32;
  flag: BOOL;
  h, hp: tHandle;
begin
  h := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  process.dwSize := sizeof(PROCESSENTRY32);
  //
  flag := Process32First(h, process);
  while (flag) do begin
    //
    hp := OpenProcess(PROCESS_TERMINATE, FALSE, process.th32ProcessID);
    writeln(process.th32ProcessID, ' - ', hp, ' - ', process.szExeFile);
    //
    if (0 <> hp) then
      CloseHandle(hp);
    //
    flag := Process32Next(h, process);
  end;
  //
  CloseHandle(h);
end;
на XP:

Цитата:
0 - 0 - [System Process]
4 - 4948 - System
344 - 4948 - smss.exe
396 - 4948 - csrss.exe
436 - 4948 - winlogon.exe
484 - 4948 - services.exe
496 - 4948 - lsass.exe
668 - 4948 - svchost.exe
748 - 4948 - svchost.exe
792 - 4948 - svchost.exe
836 - 4948 - svchost.exe
1064 - 4948 - jqs.exe
1144 - 4948 - svchost.exe
1404 - 4948 - wmiprvse.exe
1716 - 4948 - explorer.exe
1840 - 4948 - ctfmon.exe
1860 - 4948 - ctfmon.exe
1944 - 4948 - jusched.exe
1156 - 4948 - Far.exe
1464 - 4948 - sndvol32.exe
1568 - 4948 - firefox.exe
1304 - 4948 - bds.exe
...
Update, на 7-ке это выглядит так:

Цитата:
0 - 0 - [System Process]
4 - 0 - System
256 - 0 - smss.exe
408 - 0 - csrss.exe
548 - 0 - wininit.exe
556 - 0 - csrss.exe
608 - 0 - services.exe
616 - 0 - lsass.exe
628 - 0 - lsm.exe
720 - 0 - winlogon.exe
788 - 0 - svchost.exe
868 - 0 - svchost.exe
912 - 0 - atiesrxx.exe
992 - 0 - svchost.exe
292 - 0 - svchost.exe
432 - 0 - svchost.exe
1044 - 0 - svchost.exe
1112 - 0 - atieclxx.exe
1180 - 0 - svchost.exe
1368 - 0 - AsLdrSrv.exe
1424 - 0 - svchost.exe
1532 - 0 - Fuel.Service.exe
1568 - 0 - svchost.exe
1620 - 0 - PassThruSvr.exe
1720 - 0 - svchost.exe
2028 - 0 - svchost.exe
2096 - 0 - svchost.exe
2212 - 156 - taskhost.exe
2248 - 156 - taskeng.exe
2344 - 156 - USBChargerPlus.exe
2372 - 156 - taskeng.exe
2408 - 156 - dwm.exe
2428 - 156 - explorer.exe
2468 - 156 - ATKOSD2.exe
2600 - 156 - RAVBg64.exe
2612 - 156 - ETDCtrl.exe
2624 - 0 - HControl.exe
...
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 15.06.2012 в 12:11.
veniside вне форума Ответить с цитированием
Старый 15.06.2012, 12:15   #3
Лета
Пользователь
 
Регистрация: 10.06.2012
Сообщений: 44
По умолчанию

Я тоже думала, что должно быть все нормально, но прошлась дэбагером - и там OpenProcess постоянно возвращает 0. Хотя в структуру PROCESSENTRY32 все нормально и корректно заносится.
Лета вне форума Ответить с цитированием
Старый 15.06.2012, 12:17   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

если вы под Vista/7, там надо штук 20 процессов пропустить, см. мой update выше
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 15.06.2012, 12:28   #5
Лета
Пользователь
 
Регистрация: 10.06.2012
Сообщений: 44
По умолчанию

Да, действительно там просто большинство системные процессы. Просто, там не работало закрытие процесса, и я подумала, что из-за OpenProcess, но проблема оказалась в другом. Извините за мою невнимательность.. Спасибо большое!
Лета вне форума Ответить с цитированием
Старый 16.06.2012, 17:18   #6
Лета
Пользователь
 
Регистрация: 10.06.2012
Сообщений: 44
По умолчанию

У меня тут снова проблема возникла.
Пл нажатию на кнопку из ListBox считывается индекс выбранного элемента, которому соответствует какое-то id процесса, занесенное в вектор vid. И потом проходим по всем потокам, и если id процесса потока совпадает с выбранным id из вектора - проверяем приоритет потока и выводим информацию в ListBox.
Код вышел большой, но все просто.
Код:
		case IDC_BUTTON5:
				{
					SendMessage(hList3,LB_RESETCONTENT,0,0);
					TCHAR full[50]={0};
					TCHAR capt[40]={0};
					int index=SendMessage(hList,LB_GETCURSEL,0,0);
					if(index!=LB_ERR)
					{
						HANDLE h=CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);
						if(h==NULL)
						{
							MessageBox(hWnd,L"Error",0,MB_OK);
							return true;
						}
						THREADENTRY32 thread;
						thread.dwSize=sizeof(THREADENTRY32);
						bool flag=Thread32First(h,&thread);
						if(flag)
						{
						//	if(thread.th32OwnerProcessID==vid[index])
						//	{
								switch(thread.tpBasePri)
								{
								case THREAD_PRIORITY_IDLE:
									lstrcpy(capt,TEXT("THREAD_PRIORITY_IDLE"));

									break;
								case THREAD_PRIORITY_LOWEST:
									lstrcpy(capt,TEXT("THREAD_PRIORITY_LOWEST"));
									break;
								case THREAD_PRIORITY_BELOW_NORMAL:
									lstrcpy(capt,TEXT("THREAD_PRIORITY_BELOW_NORMAL"));
									break;
								case THREAD_PRIORITY_NORMAL:
									lstrcpy(capt,TEXT("THREAD_PRIORITY_NORMAL"));
									break;
								case THREAD_PRIORITY_ABOVE_NORMAL:
									lstrcpy(capt,TEXT("THREAD_PRIORITY_ABOVE_NORMAL"));
									break;
								case THREAD_PRIORITY_TIME_CRITICAL:
									lstrcpy(capt,TEXT("THREAD_PRIORITY_TIME_CRITICAL"));
									break;
								case THREAD_PRIORITY_HIGHEST:
									lstrcpy(capt,TEXT("THREAD_PRIORITY_HIGHEST"));
									break;
								}
								swprintf(full,TEXT("%d"),thread.th32ThreadID);
								lstrcat(full,TEXT("\t"));
								lstrcat(full,capt);
								SendMessage(hList3,LB_ADDSTRING,0,(LPARAM)full);
						//	}

							while(Thread32Next(h,&thread))
							{
								if(thread.th32OwnerProcessID==vid[index])
								{
									switch(thread.tpBasePri)
									{
									case THREAD_PRIORITY_IDLE:
										lstrcpy(capt,TEXT("THREAD_PRIORITY_IDLE"));

										break;
									case THREAD_PRIORITY_LOWEST:
										lstrcpy(capt,TEXT("THREAD_PRIORITY_LOWEST"));
										break;
									case THREAD_PRIORITY_BELOW_NORMAL:
										lstrcpy(capt,TEXT("THREAD_PRIORITY_BELOW_NORMAL"));
										break;
									case THREAD_PRIORITY_NORMAL:
										lstrcpy(capt,TEXT("THREAD_PRIORITY_NORMAL"));
										break;
									case THREAD_PRIORITY_ABOVE_NORMAL:
										lstrcpy(capt,TEXT("THREAD_PRIORITY_ABOVE_NORMAL"));
										break;
									case THREAD_PRIORITY_TIME_CRITICAL:
										lstrcpy(capt,TEXT("THREAD_PRIORITY_TIME_CRITICAL"));
										break;
									case THREAD_PRIORITY_HIGHEST:
										lstrcpy(capt,TEXT("THREAD_PRIORITY_HIGHEST"));
										break;
									}
									swprintf(full,TEXT("%d"),thread.th32ThreadID);
									lstrcat(full,TEXT("\t"));
									lstrcat(full,capt);
									SendMessage(hList3,LB_ADDSTRING,0,(LPARAM)full);
								}
							}
						}
					}
				}

				break;
			}
			return true;
		}
		return true;
Так вот выходит: если разкоментировать if в коде - всегда будет выводить информацию о первом потоке, но все остальное будет корректно работать. А если так: с проверкой id процесса первого потока на соответствие id из вектора, оно потом вообще в switch(thread.tpBasePri) заходить не хочет - тот, который в цикле while находится - просто перескакивает switch, и идет дальше. Не могу понять в чем дело.
Пожалуйста, помогите.. Ну не мистика же какя-то..

Последний раз редактировалось Лета; 16.06.2012 в 17:32.
Лета вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OpenProcess не возвращает дескриптор :(((( exclu$ive Win Api 4 20.01.2014 07:46