PDA

View Full Version : بدست آوردن Handle یک پروسه با نام فایلش



NR_289
سه شنبه 13 اردیبهشت 1384, 16:43 عصر
چگونه میتوان نام فایل یک پروسه را بدست آورد.

من از کد زیر استفاده کردم ولی آن نام فایل سرویس ها یی مثل svchost.exe را برنمی گرداند.


const
TH32CS_SNAPPROCESS = $00000002;
SYNCHRONIZE = $00100000;
PROCESS_TERMINATE = $0001;

type
TProcessEntry32 = packed record
dwSize: DWORD;
cntUsage: DWORD;
th32ProcessID: DWORD; // this process
th32DefaultHeapID: DWORD;
th32ModuleID: DWORD; // associated exe
cntThreads: DWORD;
th32ParentProcessID: DWORD; // this process's parent process
pcPriClassBase: Longint; // Base priority of process's threads
dwFlags: DWORD;
szExeFile: array[0..MAX_PATH - 1] of Char;// Path
end;

function CreateToolhelp32Snapshot (dwFlags, th32ProcessID: DWORD): THandle stdcall;external kernel32 name 'CreateToolhelp32Snapshot';
function Process32First(hSnapshot: THandle; var lppe: TProcessEntry32): BOOL stdcall;external kernel32 name 'Process32First';
function Process32Next(hSnapshot: THandle; var lppe: TProcessEntry32): BOOL stdcall;external kernel32 name 'Process32Next';
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; stdcall;external kernel32 name 'OpenProcess';
function TerminateProcess(hProcess: THandle; uExitCode: UINT): BOOL; stdcall;external kernel32 name 'TerminateProcess';

Function FindInProcess(name:string;SearchInOther:Boolean;va r FileName:string):THandle;
var
fData: TProcessEntry32;
fHandler: THandle;
fFileN:string;

Function SearchProcess:THandle;
begin
fFileN:=fData.szExeFile;
fFileN:=extractFileName(fFileN);
result:=0;
name:=LowerCase(name);
fFileN:=LowerCase(fFileN);
If name=fFileN then
Result:=OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, False,fData.th32ProcessID)
else
If SearchInOther then
If pos(name,fFileN)<>0 then
Result:=OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, False,fData.th32ProcessID);
If Result<>0 then
FileName:=fData.szExeFile ;
//result:=fData.th32ProcessID;
end;

begin
fData.dwSize := SizeOf(fData);
fHandler := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
result:=0;
FileName:='';
try
if Process32First(fHandler, fData) then
begin
result:=SearchProcess;
If result<>0 then exit;

while Process32Next(fHandler, fData) do
begin
result:=SearchProcess;
If result<>0 then exit;
end;
end;
finally
CloseHandle(fHandler);
end;

end;

چه باید کرد؟

Touska
چهارشنبه 14 اردیبهشت 1384, 14:19 عصر
ببین این کد بدردت می خوره :


procedure TMainForm1.KillProcess(ApplicationName: String);
Var
aSnapshotHandle : THandle;
aProcessEntry32 : TProcessEntry32;
ListView1 : TListView;
I : Integer;
bContinue : BOOL; //Kill Proccess IF Running
NewItem : TListItem;
Ret: BOOL;
PrID: Integer; // processidentifier
Ph: THandle; // processhandle
begin
Try
ListView1 := TListView.Create(Self);
ListView1.Parent := MainForm1;
ListView1.Items.Clear;
aSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
aProcessEntry32.dwSize := SizeOf(aProcessEntry32);
bContinue := Process32First(aSnapshotHandle, aProcessEntry32);
while Integer(bContinue) <> 0 do
begin
NewItem := ListView1.Items.Add;
NewItem.Caption := ExtractFileName(aProcessEntry32.szExeFile);
NewItem.subItems.Add(IntToHex(aProcessEntry32.th32 ProcessID, 4));
NewItem.subItems.Add(aProcessEntry32.szExeFile);
bContinue := Process32Next(aSnapshotHandle, aProcessEntry32);
end;
CloseHandle(aSnapshotHandle);
With ListView1 Do
Begin
For I := 0 To Items.Count - 1 Do
Begin
IF Items.Item[I].Caption = ApplicationName Then
Begin
PrID := StrToInt('$' + Items.Item[I].SubItems[0]);
Ph := OpenProcess(1, BOOL(0), PrID);
Ret := TerminateProcess(Ph, 0);
IF Integer(Ret) = 0 Then
MessageDlg('Cannot terminate "' + Items.Item[I].Caption + '"',
mtInformation, [mbOK], 0)
Else
Items.Item[I].Delete;
Break;
End;
End;
End;
ListView1.Free;
Except
MessageDlg('Cannot close this program',mtError,[mbok],0);
End;
end;


این یک Kill Proccess هست. :flower: