Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

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

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

Купить рекламу на форуме 15-35 тыс рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2010, 23:30   #1
exclu$ive
Новичок
Джуниор
 
Регистрация: 24.03.2010
Сообщений: 2
По умолчанию OpenProcess не возвращает дескриптор :((((

Здравствуйте уважаемые коллеги! Имеется такая проблема.... Выполняю курсовой проект, часть которого заключается в управлении процессами на локальном компьютере. Написал функцию удаления процесса из системы, только она не работает... Входной параметр функции - имя_процесса.exе которое берётся из ListBox'a.... Здесь все хорошо, проблема заключается в том, что когда я пытаюсь взять хэндл нужного мне процесса по его ID у меня ничего не получается.... Функция OpenProcess() не работает.....
Вот функция:

Код:
int KillTask(string ExeFileName)
{
	bool Co;
	HANDLE FS;
	HANDLE temp = NULL;
	int result;
	result = 0;
	DWORD PID;
	FS = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
	ProcEntry.dwSize = sizeof(ProcEntry);
	Co = Process32First(FS, &ProcEntry);

	while (Co)
	{
		if ( ProcEntry.szExeFile == ExeFileName ) 
		{
			PID = ProcEntry.th32ProcessID;
                // вот здесь и не работает :'(((((
			temp = OpenProcess(PROCESS_TERMINATE, false, PID);
			result = (int)TerminateProcess(temp, 0);
		}
		Co = Process32Next(FS, &ProcEntry);
	}

	CloseHandle(FS);
	return result;
}
вызывается она здесь:

Код:
case ID_TASK_KILLPROCESS:
		SendMessage(hList, LB_GETTEXT, 7, (LPARAM)ExeName.c_str());
		KillTask(ExeName.c_str());
		ProcessList(); // функция выводит список процессов
		break;
если не сложно, помогите пожалуйста...

Последний раз редактировалось Stilet; 25.03.2010 в 08:23.
exclu$ive вне форума Ответить с цитированием
Старый 24.03.2010, 23:47   #2
noxin
Пользователь
 
Регистрация: 24.03.2010
Сообщений: 38
По умолчанию

Попробуй
temp = OpenProcess(PROCESS_QUERY_INFORMATI ON | PROCESS_VM_READ, FALSE, PID);
У меня работало
Если чем помог, оставьте отзыв...
noxin вне форума Ответить с цитированием
Старый 25.03.2010, 01:40   #3
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Вставь после OpenProcess вызов GetLastError + FormatMessage
пыщь
JTG вне форума Ответить с цитированием
Старый 31.03.2010, 18:30   #4
exclu$ive
Новичок
Джуниор
 
Регистрация: 24.03.2010
Сообщений: 2
По умолчанию

Проблема решена... дело было в привилегиях доступа.... т.е. я не мог получить дескриптор системного процесса, а ко всем остальным процессам доступ был....
если кому интересно представляю функцию для удаления ЛЮБОГО процесса, в котором включается привилегия доступа SE_DEBUG_NAME, которая в частности и являлась источником проблемы....

Код:
BOOL KillTask(string ExeFileName)
{
	bool Co;
	HANDLE FS;
	HANDLE hProcess = NULL;
	DWORD dwError;
	int result;
	FS = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
	ProcEntry.dwSize = sizeof(ProcEntry);
	Co = Process32First(FS, &ProcEntry);

	while (Co)
	{
		if ( ProcEntry.szExeFile == ExeFileName ) 
		{
			hProcess = OpenProcess(PROCESS_TERMINATE, false, ProcEntry.th32ProcessID);
			
			if (hProcess == NULL)
			{
				if (GetLastError() != ERROR_ACCESS_DENIED)
					return FALSE;

				OSVERSIONINFO osvi;

				// определяем версию операционной системы
				osvi.dwOSVersionInfoSize = sizeof(osvi);
				GetVersionEx(&osvi);

				// мы больше ничего не можем сделать, если это не Windows NT
				if (osvi.dwPlatformId != VER_PLATFORM_WIN32_NT)
					return SetLastError(ERROR_ACCESS_DENIED), FALSE;

				// включим привилегию SE_DEBUG_NAME и попробуем еще раз

				TOKEN_PRIVILEGES Priv, PrivOld;
				DWORD cbPriv = sizeof(PrivOld);
				HANDLE hToken;

				// получаем токен текущего потока 
				if (!OpenThreadToken(GetCurrentThread(), 
									 TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,
									 FALSE, &hToken))
				{
					if (GetLastError() != ERROR_NO_TOKEN)
						return FALSE;

					// используем токен процесса, если потоку не назначено
				// никакого токена
					if (!OpenProcessToken(GetCurrentProcess(),
										  TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,
										  &hToken))
						return FALSE;
				}

				_ASSERTE(ANYSIZE_ARRAY > 0);

				Priv.PrivilegeCount = 1;
				Priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
				LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &Priv.Privileges[0].Luid);

				// попробуем включить привилегию
				if (!AdjustTokenPrivileges(hToken, FALSE, &Priv, sizeof(Priv),
										   &PrivOld, &cbPriv))
				{
					dwError = GetLastError();
					CloseHandle(hToken);
					return SetLastError(dwError), FALSE;
				}

				if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
				{
					// привилегия SE_DEBUG_NAME отсутствует в токене
					// вызывающего
					CloseHandle(hToken);
					return SetLastError(ERROR_ACCESS_DENIED), FALSE;
				}

				// попробуем открыть описатель процесса еще раз
				hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, ProcEntry.th32ProcessID);
				dwError = GetLastError();
		        
				// восстанавливаем исходное состояние привилегии
				AdjustTokenPrivileges(hToken, FALSE, &PrivOld, sizeof(PrivOld),
									  NULL, NULL);
				CloseHandle(hToken);

				if (hProcess == NULL)
					return SetLastError(FALSE), NULL;
			}
			// пытаемся завершить процесс
			if (!TerminateProcess(hProcess, (UINT)-1))
			{
				dwError = GetLastError();
				CloseHandle(hProcess);
				return SetLastError(dwError), FALSE;
			}
		}
		Co = Process32Next(FS, &ProcEntry);
	}

	CloseHandle(FS);
	CloseHandle(hProcess);

	return TRUE;
}
exclu$ive вне форума Ответить с цитированием
Старый 20.01.2014, 06:46   #5
DrMcSheen
Новичок
Джуниор
 
Регистрация: 24.08.2009
Сообщений: 2
По умолчанию

Спасибо, очень пригодилось.
Только не хватает

#include <Tlhelp32.h>
и
PROCESSENTRY32 ProcEntry;
DrMcSheen вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция open() возвращает неверный дескриптор devl Общие вопросы C/C++ 8 12.01.2010 20:36
Дескриптор окна DeFace Win Api 10 11.10.2009 15:52
Из за чего пишет неверный дескриптор AquaKlaster Общие вопросы Delphi 9 12.09.2009 15:23
как получить дескриптор приложения в C#? fiatik Общие вопросы .NET 1 08.11.2008 08:18