Annotation of mozptch/ProcessViewer.pas, revision 1.2

1.1       oertel      1: {
                      2:        ProcessViewer Unit V1.0
                      3:        by Leo, March 2001
                      4:   email: leo@leoworld.de
                      5:        Pages: www.leoworld.de, www.trojancheck.de, www.antispector.de
                      6:   This Unit is freeware and I don't give support for this. Feel free to change some
                      7:        things and develope your own Unit from this.
                      8: 
                      9: 
                     10:        See the file ProcessViewer.txt for informations about the properties and methods.
                     11: }
                     12: 
                     13: unit ProcessViewer;
                     14: 
                     15: interface
1.2     ! oertel     16: {$IFDEF MSWINDOWS}
1.1       oertel     17: uses
                     18:        Windows, Dialogs, SysUtils, Classes, ShellAPI, TLHelp32, Forms;
                     19: 
                     20: const
                     21:        SleepForReCheck=5000;
                     22: 
                     23: type TProcessInfo=record
                     24:        FileName: string;
                     25:        Caption: string;
                     26:        Visible: boolean;
                     27:        Handle: DWord;
                     28:        PClass: string;
                     29:        ThreadID: DWord;
                     30:        PID: DWord;
                     31: end;
                     32: 
                     33: 
                     34: var
                     35:        DateiList,CaptionList,VisibleList,HandleList,ClassList,ThreadIdList,PIDList: TStringList;
                     36:        ProcessInfo: array of TProcessInfo;
                     37: 
                     38: function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): Bool; stdcall;
                     39: function KillProcessByPID(PID: DWord): boolean;
                     40: function KillProcessByFileName(FileName: string; KillAll: boolean): boolean;
                     41: procedure GetProcessList;
                     42: function GetFileNameFromHandle(Handle: hwnd):string;
                     43: function IsFileActive(FileName: String): boolean;
1.2     ! oertel     44: {$ENDIF}
1.1       oertel     45: implementation
1.2     ! oertel     46: {$IFDEF MSWINDOWS}
1.1       oertel     47: procedure GetProcessList;
                     48: var
                     49:        i,Laenge: integer;
                     50: begin
                     51: DateiList.Clear;
                     52: HandleList.Clear;
                     53: ClassList.Clear;
                     54: CaptionList.Clear;
                     55: VisibleList.Clear;
                     56: ThreadIdList.Clear;
                     57: PIDList.Clear;
                     58: EnumWindows(@EnumWindowsProc, 0);
                     59: Laenge:=DateiList.Count;
                     60: SetLength(ProcessInfo,Laenge);
                     61: for i:=0 to Laenge-1 do
                     62: begin
                     63:        DateiList[i]:=UpperCase(DateiList[i]);
                     64:        with ProcessInfo[i] do
                     65:        begin
                     66:                FileName:=DateiList[i];
                     67:                Caption:=CaptionList[i];
                     68:                Visible:=VisibleList[i]='1';
                     69:                Handle:=StrToInt64(HandleList[i]);
                     70:                PClass:=ClassList[i];
                     71:                ThreadID:=StrToInt64(ThreadIdList[i]);
                     72:                PID:=StrToInt64(PIDList[i]);
                     73:        end;
                     74: end;
                     75: end;
                     76: 
                     77: function IsFileActive(FileName: String): boolean;
                     78: var
                     79:        i: integer;
                     80: begin
                     81: result:=false;
                     82: if FileName='' then exit;
                     83: GetProcessList;
                     84: FileName:=UpperCase(ExtractFileName(FileName));
                     85: for i:=0 to Length(ProcessInfo)-1 do
                     86: begin
                     87:        if Pos(FileName,ProcessInfo[i].FileName)>0 then
                     88:        begin
                     89:                result:=true;
                     90:                break;
                     91:        end;
                     92: end;
                     93: end;
                     94: 
                     95: function GetFileNameFromHandle(Handle: hwnd):string;
                     96: var
                     97:        PID: DWord;
                     98:        aSnapShotHandle: THandle;
                     99:        ContinueLoop: Boolean;
                    100:        aProcessEntry32: TProcessEntry32;
                    101: begin
                    102: GetWindowThreadProcessID(Handle, @PID);
                    103: aSnapShotHandle := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
                    104: aProcessEntry32.dwSize := SizeOf(aProcessEntry32);
                    105: ContinueLoop := Process32First(aSnapShotHandle, aProcessEntry32);
                    106: while Integer(ContinueLoop) <> 0 do
                    107: begin
                    108:        if aProcessEntry32.th32ProcessID = PID then
                    109:        begin
                    110:                result:=aProcessEntry32.szExeFile;
                    111:                break;
                    112:        end;
                    113:        ContinueLoop := Process32Next(aSnapShotHandle, aProcessEntry32);
                    114: end;
                    115: CloseHandle(aSnapShotHandle);
                    116: end;
                    117: 
                    118: function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): Bool;
                    119: var
                    120:        Capt,Cla: array[0..255] of char;
                    121:        Datei: string;
                    122:        ident: dword;
                    123: begin
                    124: GetWindowText(hWnd, Capt, 255);
                    125: GetClassName(hwnd,Cla,255);
                    126: ThreadIdList.Add(IntToStr(GetWindowThreadProcessId(hwnd,nil)));
                    127: Datei:=GetFileNameFromhandle(hwnd);
                    128: DateiList.Add(Datei);
                    129: HandleList.Add(IntToStr(HWnd));
                    130: if IsWindowVisible(HWnd) then VisibleList.Add('1') else VisibleList.Add('0');
                    131: ClassList.Add(Cla);
                    132: CaptionList.Add(Capt);
                    133: GetWindowThreadProcessId(StrToInt(HandleList[HandleList.Count-1]),@ident);
                    134: PIDList.Add(IntToStr(ident));
                    135: Result:=true;
                    136: end;
                    137: 
                    138: function KillProcessByPID(PID : DWord): boolean;
                    139: var
                    140:        myhandle : THandle;
                    141:        i: integer;
                    142: begin
                    143: myhandle := OpenProcess(PROCESS_TERMINATE, False, PID);
                    144: TerminateProcess(myhandle, 0);
                    145: for i:=0 to SleepForReCheck do Application.ProcessMessages; //Genug Zeit geben
                    146: GetProcessList;
                    147: Result:=PIDList.IndexOf(IntToStr(PID))=-1;
                    148: end;
                    149: 
                    150: function KillProcessByFileName(FileName: string; KillAll: boolean): boolean;
                    151: var
                    152:        i: integer;
                    153:        FileFound: boolean;
                    154: begin
                    155: result:=false;
                    156: if FileName='' then exit;
                    157: FileName:=UpperCase(ExtractFileName(FileName));
                    158: result:=true;
                    159: GetProcessList;
                    160: if KillAll then
                    161: begin
                    162:        //Kill all
                    163:        FileFound:=false;
                    164:        repeat
                    165:                GetProcessList;
                    166:                FileFound:=false;
                    167:                for i:=0 to DateiList.Count-1 do
                    168:                begin
                    169:                        if Pos(Filename,DateiList[i])>0 then
                    170:                        begin
                    171:                                FileFound:=true;
                    172:                                break;
                    173:                        end;
                    174:                end;
                    175:                if i<DateiList.Count then
                    176:                begin
                    177:                        if not KillProcessByPID(StrToInt64(PIDList[i])) then
                    178:                        begin
                    179:                                result:=false;
                    180:                                exit;
                    181:                        end;
                    182:                end;
                    183:        until not FileFound;
                    184: end else
                    185: begin
                    186:        //Kill one
                    187:        for i:=0 to DateiList.Count-1 do
                    188:        begin
                    189:                if Pos(Filename,DateiList[i])>0 then break;
                    190:        end;
                    191:        if i<DateiList.Count then
                    192:        begin
                    193:                if not KillProcessByPID(StrToInt64(PIDList[i])) then
                    194:                begin
                    195:                        result:=false;
                    196:                        exit;
                    197:                end;
                    198:        end;
                    199: end;
                    200: end;
                    201: 
                    202: initialization
                    203: DateiList:=TStringList.Create;
                    204: HandleList:=TStringList.Create;
                    205: ClassList:=TStringList.Create;
                    206: CaptionList:=TStringList.Create;
                    207: VisibleList:=TStringList.Create;
                    208: ThreadIdList:=TStringList.Create;
                    209: PIDList:=TStringList.Create;
                    210: 
                    211: finalization
                    212: DateiList.Free;
                    213: HandleList.Free;
                    214: ClassList.Free;
                    215: CaptionList.Free;
                    216: VisibleList.Free;
                    217: ThreadIdList.Free;
                    218: PIDList.Free;
1.2     ! oertel    219: {$ENDIF}
1.1       oertel    220: end.

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>