[ACCEPTED]-How can I freeze the execution of a program?-windows-xp

Accepted answer
Score: 14

You can freeze it with Process Explorer: Right-click on 3 your program and select Suspend.

Here is some sample 2 code for programmatic freezing from http://www.c-plusplus.de/forum/viewtopic-var-p-is-1460293.html, edited 1 and omitted error checking for brevity:

#include <windows.h>

_NtSuspendProcess NtSuspendProcess =
    (_NtSuspendProcess) GetProcAddress( GetModuleHandle( "ntdll" ),
                                        "NtSuspendProcess" ); 
HANDLE ProcessHandle = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pid);
NtSuspendProcess( ProcessHandle );
Score: 6

If you want to do it programatically you 16 can use the approach described here.

What is 15 does, is enumerating all the threads in 14 a process and then suspending them. There 13 is no SuspendProcess API, so this is a simulation 12 of such a call.

Beware that this can potentionally 11 have some bad side effects. It depend on 10 the process and how it is written.

I don't 9 know of any other way to do it in the Win32/64 8 API world. If you go lower to the kernel 7 land and use the NT* APIs you have "NtSuspendProcess" API 6 available. But this is undocumented so it 5 can change with any version of windows or 4 even with any service pack (not very likely 3 though).

The declaration of "NtSuspendProcess" can 2 be found in the JEDI ports of the windows 1 APIs.

Score: 4

You can use my ProcessInfo component to suspend all 4 threads belonging to the process. The approach 3 is similar to what Runner explained to you. The 2 code would be something like this:

var
  Process : TProcessItem;
  AThread: TThreadItem;
begin
  Process := ProcessInfo1.RunningProcesses.FindByName('notepad.exe');
  if Assigned(Process) then
  begin
    for AThread in Process.Threads do
      AThread.SuspendThread;
  end;
end;

You can 1 download source code of ProcessInfo form here

Score: 2
function OpenThread(dwDesiredAccess: DWORD; InheritHandle: Boolean; dwThreadID: DWORD): THandle; stdcall; external 'kernel32.dll';

function ResumeProcess(PID: DWORD):Boolean;
var
  tid, snap: THandle;
  TE32: TThreadEntry32;
begin
  Result := False;
  snap := CreateToolHelp32SnapShot(TH32CS_SNAPTHREAD, 0);
  TE32.dwSize := SizeOf(TThreadEntry32);
  Thread32First(snap, TE32);
  repeat
    if TE32.th32OwnerProcessID = PID then begin
      tid := OpenThread($0002, FALSE, TE32.th32ThreadID);
      ResumeThread(tid);
      Result := TRUE;
      CloseHandle(tid);
    end;
  until Thread32Next(snap, TE32) = false;
  CloseHandle(snap);
end;

function SuspendProcess(PID: DWORD): Boolean;
var
  tid, snap: THandle;
  TE32: TThreadEntry32;
begin
  Result := False;
  snap := CreateToolHelp32SnapShot(TH32CS_SNAPTHREAD, 0);
  TE32.dwSize := SizeOf(TThreadEntry32);
  Thread32First(snap, TE32);
  repeat
    if TE32.th32OwnerProcessID = PID then begin
      tid := OpenThread($0002, FALSE, TE32.th32ThreadID);
      SuspendThread(tid);
      Result := TRUE;
      CloseHandle(tid);
    end;
  until Thread32Next(snap, TE32) = false;
  CloseHandle(snap);
end;

Hope this helps

0

More Related questions