Немного не по теме, но хочу спросить вот что :
Бывают разные процессы, которые не килятся из таск мэнеджера. Так вот можно ли програмным способом килить такие процессы ?
Это легко обойти Моя программа такие процессы килит - вообще килит все подряд Принцип в модификации токена процесса Я делаю так:
void CProcessTimeDlg::SmartKillProcess(DWORD ProcID)
//
//Завершение процесса
//
{
HANDLE hProcess=OpenProcess(PROCESS_TERMINATE,FALSE, ProcID);//Открываем процесс для убийства
//Если процесс открыть не удалось
if (hProcess == NULL){
//Проверка на ошибку доступа
if (GetLastError() != ERROR_ACCESS_DENIED)return;
//Иначе проверяем операционную систему
OSVERSIONINFO osvi;
// определяем версию операционной системы
osvi.dwOSVersionInfoSize = sizeof(osvi);
GetVersionEx(&osvi);
// мы больше ничего не можем сделать, если это не Windows NT
if (osvi.dwPlatformId != VER_PLATFORM_WIN32_NT)return;
// включим привилегию 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;
// используем токен процесса, если потоку не назначено
// никакого токена
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,
&hToken))return;
}
_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))
{
CloseHandle(hToken);
return;
}
if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
{
// привилегия SE_DEBUG_NAME отсутствует в токене
// вызывающего
CloseHandle(hToken);
return;
}
// попробуем открыть описатель процесса еще раз
hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, ProcID);
// восстанавливаем исходное состояние привилегии
AdjustTokenPrivileges(hToken, FALSE, &PrivOld, sizeof(PrivOld),NULL, NULL);
CloseHandle(hToken);
if (hProcess == NULL) return;
}
//Завершаем процесс
TerminateProcess(hProcess,(DWORD)-1);
CloseHandle(hProcess);
}