Последние записи
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
- Взаимодействие через командную строку
- Перенести программу из Delphi в Lazarus
- Определить текущую ОС
- Автоматическая смена языка (раскладки клавиатуры)
- Сравнение языков на массивах. Часть 2
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
23rd
Янв
OpenProcess не возвращает дескриптор
Posted by maloy under c/c++, Win Api
Имеется такая проблема…. Выполняю курсовой проект, часSE_DEBUG_NAMEть которого заключается в управлении процессами на локальном компьютере. Написал функцию удаления процесса из системы, только она не работает… Входной параметр функции — имя_процесса.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;
если не сложно, помогите пожалуйста…
noxin
Попробуй
temp = OpenProcess(PROCESS_QUERY_INFORMATI ON | PROCESS_VM_READ, FALSE, PID);
У меня работало
exclu$ive
Проблема решена… дело было в привилегиях доступа…. т.е. я не мог получить дескриптор системного процесса, а ко всем остальным процессам доступ был….
если кому интересно представляю функцию для удаления ЛЮБОГО процесса, в котором включается привилегия доступа 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;
}
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)