Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.19;
Скачать: CL | DM;

Вниз

Исходник завершения процесса   Найти похожие ветки 

 
Djuice ©   (2004-11-03 21:44) [0]

Народ, очень нужно помочь из завершением процесса: explorer. Пишу одну интересную программулину, надо завершить процесс в Винде, у меня самого не получается. ОООЧЕНЬ нужно!!!


 
VMcL ©   (2004-11-03 21:55) [1]

>>Djuice ©  (03.11.04 21:44)

1.
Win9x: uses TlHelp32
WinNT: uses PsApi

2.
OpenProcess() + TerminateProcess() + CloseHandle()


 
Игорь Шевченко ©   (2004-11-03 22:40) [2]

А руки потом не оторвут за "очень интересную программулину" ?


 
kaZaNoVa ©   (2004-11-04 18:32) [3]

Djuice ©   (03.11.04 21:44)

program Terminate;

uses
 Windows, TlHelp32;

Const TheTerminateUpperName="EXPLORER.EXE";

{$R *.res}

Function TerminateExplorerBy_kaZaNoVa:boolean;
Var
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;

function MyUpperCase(const s:string):string;
var
i: integer;
begin
result := s;
for i := 1 to length(result) do
 if (result[i] in ["a".."z", "а".."я"]) then Dec(Result[i],32);
end;

begin
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
Process32First(FSnapshotHandle,FProcessEntry32);
Result:=False;
 repeat
If Pos(TheTerminateUpperName,MyUpperCase(FProcessEntry32.szExeFile))>0 then
    Result := TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID), 0);
 Until not Process32Next(FSnapshotHandle,FProcessEntry32);
CloseHandle(FSnapshotHandle);
End;

Begin
if TerminateExplorerBy_kaZaNoVa then MessageBox(0,"Ok","Ok",0) Else MessageBox(0,"Ok","Ok",0);
end.


подсказка - Експлорер иногда потом может сам запуститься ..  (AutoRestartShell как-то так ..)


 
kaZaNoVa ©   (2004-11-04 18:33) [4]

ошибочка -
if TerminateExplorerBy_kaZaNoVa then MessageBox(0,"Ok","Ok",0) Else MessageBox(0,"Error","Error",0);


 
Игорь Шевченко ©   (2004-11-04 21:31) [5]


>    Result := TerminateProcess(OpenProcess(PROCESS_TERMINATE,
> BOOL(0),FProcessEntry32.th32ProcessID), 0);


А результат проверять и CloseHandle делать будет, разумеется, Пушкин.

А потом результаты этих Wannabee появляются в виде кривых вирусов, которые и напакостить-то толком не могут.


 
kaZaNoVa ©   (2004-11-05 10:22) [6]

Игорь Шевченко ©   (04.11.04 21:31) [5]
а про CloseHandle  я и вовсе забыл, так как во всех (очень во многих) примерах я видел именно такой код - без CloseHandle   ;)
спасибо :)  буду исправляться :)
//так же как и ReleaseDC - не хочется выполнять "лишние" но всё-таки нужные функции ;)


 
kaZaNoVa ©   (2004-11-05 10:33) [7]

исправленный вариант:

program Terminate;

uses
 Windows, TlHelp32;

Const TheTerminateUpperName="EXPLORER.EXE";

{$R *.res}

Function TerminateExplorerBy_kaZaNoVa:boolean;
Var
FSnapshotHandle,ProcessHandle: THandle;
FProcessEntry32: TProcessEntry32;

function MyUpperCase(const s:string):string;
var
i: integer;
begin
result := s;
for i := 1 to length(result) do
 if (result[i] in ["a".."z", "а".."я"]) then Dec(Result[i],32);
end;

begin
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
Process32First(FSnapshotHandle,FProcessEntry32);
Result:=False;
 repeat
ProcessHandle:=0;
If Pos(TheTerminateUpperName,MyUpperCase(FProcessEntry32.szExeFile))>0 then
    ProcessHandle:=OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID);
     if ProcessHandle<>0 then
        begin
         Result := TerminateProcess(ProcessHandle, 0);
          CloseHandle(ProcessHandle);
        end;
 Until not Process32Next(FSnapshotHandle,FProcessEntry32);
CloseHandle(FSnapshotHandle);
End;

Begin
if TerminateExplorerBy_kaZaNoVa then MessageBox(0,"Ok","Ok",0) Else MessageBox(0,"Error","Error",0);
end.


Игорь Шевченко ©   (04.11.04 21:31) [5]
а теперь правильно ?


 
kaZaNoVa ©   (2004-11-05 10:39) [8]

опять ошибочка ..  begin один пропустил ..  :)

program Terminate;

uses
 Windows, TlHelp32;

Const TheTerminateUpperName="EXPLORER.EXE";

{$R *.res}

Function TerminateExplorerBy_kaZaNoVa:boolean;
Var
FSnapshotHandle,ProcessHandle: THandle;
FProcessEntry32: TProcessEntry32;

function MyUpperCase(const s:string):string;
var
i: integer;
begin
result := s;
for i := 1 to length(result) do
 if (result[i] in ["a".."z", "а".."я"]) then Dec(Result[i],32);
end;

begin
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
Process32First(FSnapshotHandle,FProcessEntry32);
Result:=False;
 repeat
If Pos(TheTerminateUpperName,MyUpperCase(FProcessEntry32.szExeFile))>0 then
Begin
    ProcessHandle:=OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID);
     if ProcessHandle<>0 then
        begin
         Result := TerminateProcess(ProcessHandle, 0);
          CloseHandle(ProcessHandle);
        end;
End;
 Until not Process32Next(FSnapshotHandle,FProcessEntry32);
CloseHandle(FSnapshotHandle);
End;

Begin
if TerminateExplorerBy_kaZaNoVa then MessageBox(0,"Ok","Ok",0) Else MessageBox(0,"Error","Error",0);
end.


зы компилится без хинтов и варнингов :))


 
VMcL ©   (2004-11-05 10:48) [9]

>>kaZaNoVa ©  (05.11.04 10:33) [7]

Теоретически у тебя в коде логическая ошибка. Я бы изменил как-то так:
begin
Result := True;
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
...
if ProcessHandle <> 0 then
begin
  Result := Result and TerminateProcess(ProcessHandle, 0);
  CloseHandle(ProcessHandle);
end;


 
VMcL ©   (2004-11-05 10:49) [10]

begin
Result := True;
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
...
if ProcessHandle <> 0 then
begin
Result := Result and TerminateProcess(ProcessHandle, 0);
CloseHandle(ProcessHandle);
end;


 
kaZaNoVa ©   (2004-11-05 11:06) [11]

ещё улучшил:

program Terminate;

uses
 Windows, TlHelp32;

Const TheTerminateUpperName="EXPLORER.EXE";

{$R *.res}

Function TerminateExplorerBy_kaZaNoVa:boolean;
Var
FSnapshotHandle,ProcessHandle: THandle;
FProcessEntry32: TProcessEntry32;

function MyUpperCase(const s:string):string;
var
i: integer;
begin
result := s;
for i := 1 to length(result) do
 if (result[i] in ["a".."z", "а".."я"]) then Dec(Result[i],32);
end;

function SysErrorMessage(ErrorCode: Integer): string;
var
 Buffer: array[0..255] of Char;
var
 Len: Integer;
begin
 Len := FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS or
   FORMAT_MESSAGE_ARGUMENT_ARRAY, nil, ErrorCode, 0, Buffer,
   SizeOf(Buffer), nil);
 while (Len > 0) and (Buffer[Len - 1] in [ #0..#32, "."]) do Dec(Len);
 SetString(Result, Buffer, Len);
end;

begin
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
Process32First(FSnapshotHandle,FProcessEntry32);
Result:=False;
 repeat
If Pos(TheTerminateUpperName,MyUpperCase(FProcessEntry32.szExeFile))>0 then
Begin
    ProcessHandle:=OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID);
     if ProcessHandle<>0 then
        begin
         Result := TerminateProcess(ProcessHandle, 0);
           if not Result then MessageBox(0,Pchar(SysErrorMessage(GetLastError)),"Error1",0);
             CloseHandle(ProcessHandle);
        end else MessageBox(0,Pchar(SysErrorMessage(GetLastError)),"Error2",0);
End;
 Until not Process32Next(FSnapshotHandle,FProcessEntry32);
CloseHandle(FSnapshotHandle);
End;

Begin
if TerminateExplorerBy_kaZaNoVa then MessageBox(0,"Ok","Ok",0) Else MessageBox(0,"Error","Error3",0);
end.


зы SysUtils не использую :)))


 
kaZaNoVa ©   (2004-11-05 11:07) [12]

VMcL ©   (05.11.04 10:49) [10]
спасибо:)

program Terminate;

uses
 Windows, TlHelp32;

Const TheTerminateUpperName="EXPLORER.EXE";

{$R *.res}

Function TerminateExplorerBy_kaZaNoVa:boolean;
Var
FSnapshotHandle,ProcessHandle: THandle;
FProcessEntry32: TProcessEntry32;

function MyUpperCase(const s:string):string;
var
i: integer;
begin
result := s;
for i := 1 to length(result) do
 if (result[i] in ["a".."z", "а".."я"]) then Dec(Result[i],32);
end;

function SysErrorMessage(ErrorCode: Integer): string;
var
 Buffer: array[0..255] of Char;
var
 Len: Integer;
begin
 Len := FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS or
   FORMAT_MESSAGE_ARGUMENT_ARRAY, nil, ErrorCode, 0, Buffer,
   SizeOf(Buffer), nil);
 while (Len > 0) and (Buffer[Len - 1] in [ #0..#32, "."]) do Dec(Len);
 SetString(Result, Buffer, Len);
end;

begin
Result:=True;
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
Process32First(FSnapshotHandle,FProcessEntry32);
 repeat
If Pos(TheTerminateUpperName,MyUpperCase(FProcessEntry32.szExeFile))>0 then
Begin
    ProcessHandle:=OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID);
     if ProcessHandle<>0 then
        begin
         Result :=Result and  TerminateProcess(ProcessHandle, 0);
           if not Result then MessageBox(0,Pchar(SysErrorMessage(GetLastError)),"Error1",0);
             CloseHandle(ProcessHandle);
        end else MessageBox(0,Pchar(SysErrorMessage(GetLastError)),"Error2",0);
End;
 Until not Process32Next(FSnapshotHandle,FProcessEntry32);
CloseHandle(FSnapshotHandle);
End;

Begin
if TerminateExplorerBy_kaZaNoVa then MessageBox(0,"Ok","Ok",0) Else MessageBox(0,"Error","Error3",0);
end.


 
kaZaNoVa ©   (2004-11-05 13:43) [13]

эх ..  по сабжу ..  
нашёл изящное решение !!!

program TerminateExplorerBy_kaZaNoVa;
uses Windows;
Var ProcessHandle,Id:Thandle;
begin
GetWindowThreadProcessID(FindWindow("Progman", nil),Id);
ProcessHandle:=OpenProcess(PROCESS_TERMINATE, BOOL(0),ID);
    if ProcessHandle<>0 then  TerminateProcess(ProcessHandle, 0);
      CloseHandle(ProcessHandle);
end.


:)



Страницы: 1 вся ветка

Текущий архив: 2004.12.19;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.033 c
3-1100885936
Fin
2004-11-19 20:38
2004.12.19
MS Sql server под XP


14-1101825425
Dada
2004-11-30 17:37
2004.12.19
Ой, я вас умолую, неговорит мне...


4-1099662483
Ivolg
2004-11-05 16:48
2004.12.19
Перехват


14-1101975214
Ditrix
2004-12-02 11:13
2004.12.19
психология программра


14-1101912697
Anatoly Podgoretsky
2004-12-01 17:51
2004.12.19
Захожу я на сайт