14.03.2009, 21:07
|
#151
|
активист
Сообщений: 1,102
|
Оригами
Идея снимать процесс вообще-то твоя была
Функция TermanateProcess способна установить практически любой процесс в операционной системе, зная его номер. Остановка производится остановкой всех потоков. Предупреждение об остановке процессу не посылается, что с одной стороны не позволяет корректно освободить занятые им ресурсы, с другой - не дает ему воспрепятствовать остановке.
Кусок кода Sint
Код:
procedure TBrk.NextProc(processID: DWORD);
var
szProcessName: array[0..MAX_PATH-1] of char;
hProcess: THandle;
hMod: HMODULE;
cbNeeded: DWORD;
begin
szProcessName:= 'unknown';
hProcess:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
FALSE, processID); // запрашиваем доступ на получении информации о процессе
if (hProcess <> Null) then
if EnumProcessModules(hProcess, @hMod, sizeof(hMod), cbNeeded) then
GetModuleBaseName(hProcess, hMod, szProcessName, sizeof(szProcessName)); // получаем имя процесса
CloseHandle(hProcess); // освобождаем дескриптор
if blk.IndexOf(szProcessName)>=0 then // если имя в "черном списке"
begin
hProcess:= OpenProcess(PROCESS_TERMINATE, FALSE, processID); // запрашиваем доступ на остановку процесса
if (hProcess=Null) then exit; // если нет доступа, то облом
TerminateProcess(hProcess, 0); // останавливаем процесс
CloseHandle(hProcess); // освобождаем дескриптор
AddDebug('>> siStopProc::NextProc >> Terminate %s (Process ID: %u)', [szProcessName, processID]);
MesProgressOp(sIced(Format('Блокирован %s (Process ID: %u)', [szProcessName, processID]), 3));
end
end;
procedure TBrk.timer1Timer(Sender: TObject);
// обработчик таймера, вызывается каждые 10 мс
var
cbNeeded, cProcesses: DWORD;
i: integer;
begin
if (not EnumProcesses(@aProcesses, sizeof(aProcesses), cbNeeded)) then exit; // если невозможно запросить список процессов, то облом
cProcesses := cbNeeded div sizeof(DWORD); // количество процессов
for i:= 0 to cProcesses-1 do NextProc(aProcesses[i]); // проверяем запущенные процессы
end;
|
|
|
|
 
|