function IsWinXP: Boolean;
begin
Result := (Win32Platform = VER_PLATFORM_WIN32_NT) and
(Win32MajorVersion = 5) and (Win32MinorVersion = 1);
end;
function IsWin2k: Boolean;
begin
Result := (Win32MajorVersion >= 5) and
(Win32Platform = VER_PLATFORM_WIN32_NT);
end;
function IsWinNT4: Boolean;
begin
Result := Win32Platform = VER_PLATFORM_WIN32_NT;
Result := Result and (Win32MajorVersion = 4);
end;
function IsWin3X: Boolean;
begin
Result := Win32Platform = VER_PLATFORM_WIN32_NT;
Result := Result and (Win32MajorVersion = 3) and
((Win32MinorVersion = 1) or (Win32MinorVersion = 5) or
(Win32MinorVersion = 51));
end;
function InRunningProcesses(const FileName:String ; FullPath: Boolean): Boolean;
function ProcessFileName(PID: DWORD): string;
var
Handle: THandle;
begin
Result := '';
Handle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, PID);
if Handle <> 0 then
try
SetLength(Result, MAX_PATH);
if FullPath then
begin
if GetModuleFileNameEx(Handle, 0, PChar(Result), MAX_PATH) > 0 then
SetLength(Result, StrLen(PChar(Result)))
else
Result := '';
end
else
begin
if GetModuleBaseNameA(Handle, 0, PChar(Result), MAX_PATH) > 0 then
SetLength(Result, StrLen(PChar(Result)))
else
Result := '';
end;
finally
CloseHandle(Handle);
end;
end;
function InListTH: Boolean;
var
SnapProcHandle: THandle;
ProcEntry: TProcessEntry32;
NextProc: Boolean;
LocalFileName: string;
LocalResult:boolean;
begin
Result:=false;
SnapProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
LocalResult := (SnapProcHandle <> INVALID_HANDLE_VALUE);
if LocalResult then
try
ProcEntry.dwSize := SizeOf(ProcEntry);
NextProc := Process32First(SnapProcHandle, ProcEntry);
while NextProc do
begin
if ProcEntry.th32ProcessID = 0 then
begin
// PID 0 is always the "System Idle Process" but this name cannot be
// retrieved from the system and has to be fabricated.
LocalFileName := RsSystemIdleProcess;
end
else
begin
if IsWin2k or IsWinXP then
begin
LocalFileName := ProcessFileName(ProcEntry.th32ProcessID);
if LocalFileName = '' then
LocalFileName := ProcEntry.szExeFile;
end
else
begin
LocalFileName := ProcEntry.szExeFile;
if not FullPath then
LocalFileName := ExtractFileName(LocalFileName);
end;
end;
if UpperCase(LocalFileName)=UpperCase(FileName) then
begin
Result:=true;
Exit;
end;
NextProc := Process32Next(SnapProcHandle, ProcEntry);
end;
finally
CloseHandle(SnapProcHandle);
end;
end;
function InListPS: Boolean;
var
PIDs: array [0..1024] of DWORD;
Needed: DWORD;
I: Integer;
LocalFileName: string;
EnumResult:Boolean;
begin
Result:=false;
EnumResult := EnumProcesses(@PIDs, SizeOf(PIDs), Needed);
if EnumResult then
begin
for I := 0 to (Needed div SizeOf(DWORD)) - 1 do
begin
case PIDs[I] of
0:
// PID 0 is always the "System Idle Process" but this name cannot be
// retrieved from the system and has to be fabricated.
LocalFileName := RsSystemIdleProcess;
2:
// On NT 4 PID 2 is the "System Process" but this name cannot be
// retrieved from the system and has to be fabricated.
if IsWinNT4 then
LocalFileName := RsSystemProcess
else
LocalFileName := ProcessFileName(PIDs[I]);
8:
// On Win2K PID 8 is the "System Process" but this name cannot be
// retrieved from the system and has to be fabricated.
if IsWin2k or IsWinXP then
LocalFileName := RsSystemProcess
else
LocalFileName := ProcessFileName(PIDs[I]);
else
LocalFileName := ProcessFileName(PIDs[I]);
end;
if UpperCase(LocalFileName) = UpperCase(FileName) then
begin
Result:=true;
Exit;
end;
end;
end;
end;
begin
if IsWin3X or IsWinNT4 then
Result := InListPS
else
Result := InListTH;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if InRunningProcesses('c:\ok.exe',true) then
Caption:='True'
else
Caption:='false';
end;