Click here to Skip to main content
15,886,362 members
Articles / Programming Languages / C++

Win32 process suspend/resume tool

Rate me:
Please Sign up or sign in to vote.
4.68/5 (27 votes)
3 Oct 2002CPOL4 min read 381.4K   13.8K   63   46
A small handy command line tool for suspending/resuming the running of entire processes on Windows

Why pause and resume processes?

Anyone using the Windows NT product line (Windows 2000 and Windows XP) must have used the task manager utility. This utility, activated by pressing CTRL+SHIFT+ESC, brings up a list of the active processes and allows you several actions for controlling them: starting new processes, stopping processes and setting their priority. When you have some process that is taking a lot of resources (normally CPU time), you can easily assign it the lowest priority and the system will take care of assigning only the remaining resources or the "idle time" on the machine.

Well, a feature I always missed from Windows and present on other operating systems is the ability of pausing and resuming a process. Some daily situations you could face where this feature would be useful (actually, the ones I use it for):

  • You have a time-consuming operation, e.g. a big build, and want to pause it for doing something quickly and resuming it after doing this
  • You have some P2P software or download running and want to pause and resume it without reconnecting and want to browse some pages quickly
  • A program starts a disk trashing operation and you want to send and e-mail
  • A program starts working in a way it shouldn't for just a moment and you want to attach a debugger to it
  • You have a buggy process running and want to kill it fast

How it is done

The main problem is: there is no SuspendProcess API function. And there is no documented or safe way of doing this.

The only simple way of doing this is via SuspendThread/ResumeThread. This pair of API functions allows you to suspend and resume a thread. More than that, for the sake of safety, they maintain an internal "suspend count'. Each time you call SuspendThread, it increments this counter. ResumeThread, on the other hand, decreases this counter. If this was not done this way, the caller of SuspendThread would have no way of knowing how to restore the original state of the thread. Calling ResumeThread after calling SuspendThread effectively restores the original thread's state.

Knowing this, it is very straightforward suspending a process: it is just a matter of listing all the threads on a process, opening a handle for each of them and calling SuspendThread. The resuming is done the same way.

The ToolHelp32 API has functions for easily listing threads and processes on a system. Actually, there are two functions that do this on my code that were shamelessly borrowed from MSDN samples.

So, I wrote this little command line utility (I have an idea for integrating it with the task manager, but I have not the time for doing it right now).

How to use it

I suggest you to put the executable anywhere on the PATH. The Windows directory would be fine. Always compile this program without DLL dependencies on the CRT, so the program will start faster. You could be starting this program under very adverse conditions, so looking for a MSVCRT*.DLL and loading it could make a huge difference in the startup time.

As with most command line tools, it is meant to be used from the command prompt, by clicking on the "Command Prompt" shortcut or opening Start/Run and executing cmd.exe. The usage for the program is very simple:

pausep PID [/r]

If you type only pausep without arguments, the program will display its usage and a list of running processes and their PID. If you type pausep PID, the program will call SuspendThread on all the process's threads. This will suspend the threads or increment their suspend count. If you pass the "/r" argument, the program will do the opposite action, i.e., resuming the thread. Note that if you pausep the same process 3 times without resuming, you will need to use pausep /r it for 3 times too.

The risks with this approach

Not all programs are well written. Not all programs are made to be suspended, specially the multithreaded ones. Programs that implement timeouts may behave abnormally if you pause and resume them. When you pause and resume threads in an arbitrary order, like with this utility, you can create deadlocks.

So, only use this program when you know what you are doing.

The standard disclaimer

As I said before, this is not the safest tool in the world. Use it at your own risk: if you use it, you can loose data, profit, have hardware problems, cause radioactive contamination and start a world war. But, for me, it works fine and never had a problem.

Well, the code in this article is free for you to use any way you want. If you improve it, drop me a note, so I can keep the code in sync. If you make money with this code, you are a genius! You deserve the money. Just remember to send me a "thank you" and give me some tips. I will not reject any money you send me too.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
CEO
Brazil Brazil
I develop software since I was 11. In the past 20 years, I developed software and used very different machines and languages, since Z80 based ones (ZX81, MSX) to mainframe computers. I still have passion for ASM, though no use for it anymore.
Professionally, I developed systems for managing very large databases, mainly on Sybase and SQL Server. Most of the solutions I write are for the financial market, focused on credit systems.
To date, I learned about 20 computer languages. As the moment, I'm in love with C# and the .NET framework, although I only can say I’m very proficient at C#, VB.NET(I’m not proud of this), T/SQL, C++ and libraries like ATL and STL.
I hate doing user interfaces, whether Web based or not, and I’m quite good at doing server side work and reusable components.
I’m the technical architect and one of the authors of Crivo, the most successful automated credit and risk assessment system available in Brazil.

Comments and Discussions

 
GeneralRe: Doesn't do much. Pin
WREY9-Oct-02 13:29
WREY9-Oct-02 13:29 
GeneralRe: Doesn't do much. Pin
Daniel Turini10-Oct-02 5:43
Daniel Turini10-Oct-02 5:43 
GeneralRe: Doesn't do much. Pin
WREY10-Oct-02 12:44
WREY10-Oct-02 12:44 
GeneralRe: Doesn't do much. Pin
Thomas Freudenberg11-Oct-02 8:26
Thomas Freudenberg11-Oct-02 8:26 
GeneralRe: Doesn't do much. Pin
otton7216-Sep-10 10:35
otton7216-Sep-10 10:35 
GeneralRe: Doesn't do much. Pin
dandy7210-Oct-02 11:28
dandy7210-Oct-02 11:28 
GeneralRe: Doesn't do much. Pin
WREY10-Oct-02 14:40
WREY10-Oct-02 14:40 
GeneralRe: Doesn't do much. Pin
dandy7211-Oct-02 4:04
dandy7211-Oct-02 4:04 
William,

I'm glad you're presenting your argument in a much more rational and level-headed manner than your previous post. Let me go over this one. I promise no hostility, and no AOL name-calling. Smile | :)

> Do you remember when you were just learning how to program, Console
> applications were what you were using to understand how to do things, along
> with the syntax of the language? Invariably, at some point you had to write
> a little program that would display a menu with various choices and the
> subsequent processing that had to be done based on what choice was made.
> They were starting points and stuff of "yester-years."

Ok, now I see where you're coming from. You're discussing the old text-mode DOS applications where each programmer had to design his own (and rather inconsistent) interface. Text menus and text navigation...yuck! I'm *totally* with you on this one. Anyone still intentionally designing his own little text mode menus-based apps in this day and age should *not* even be in this business--or at least should not be writing applications professionally.

When I talk about "command-line utilities" that still have some use today, what I have in mind is utilities that you launch with a command, might pass a few parameters to, and then it does its job and shuts down--the sort of utility that has no need for user interaction once it's launched.

An example of this would be XP's defrag.exe, versus the graphical defragger (dfrg.msc). The GUI one is a lot more user-friendly than defrag.exe, hell it's cool to watch. The "problem" with the GUI version is that it needs user interaction to defrag multiple drives. I just want to tell it to "defrag all my drives". I can't do that and then walk away for an hour, 'cuz you can only select one drive at a time, and it'll sit there and wait after it's done. So I have to stay in front of the system and sit on my hands until it's done, and then manually restart the same process for each and every drive and partition (I have lots).

On the other hand I can write the following batch file, start it and walk away:

DEFRAGALL.BAT

DEFRAG C:
DEFRAG D:
DEFRAG E:
DEFRAG F:
(...)
DEFRAG Z:

*That* is the value of command-line utilities--there's no easy way to do the same thing with the GUI version of the defragger. I've seen lots of threads in various boards from people attempting to do things such as automate the GUI version using WSH, Sleep() and SendKeys(). Talk about fugly. I'm glad MS added the command-line version in XP (I don't believe it existed on Win2K).

I think we're in definite agreement on this point: if an app needs to interact with the user after it's launched, in any way, shape or form, it really, really should have a full-blown GUI. What I wasn't agreeing with was your unilateral claim that "command-line programs have no place today". I think the distinction is in our definition of "command-line program"...you're including the old, interactive, text-mode, menu-based programs of yester-year (I *most definitely* agree they should die a horrible death). In my mind, a "command-line program" that still has some use today is the typical one-purpose, "launch and forget" utility such as defrag.exe. Nobody wants an Excel in text mode. <shivers>

Back to the article at hand--this process suspend/resume tool--would it benefit from a GUI? Yeah, why not? But does being command line-based make it useless? I say it doesn't. I could picture a process pegging a CPU at 100% utilization and wanting to suspend it ASAP--without having to sit through the system loading all the GUI overhead (the MFC DLLs are significant or, God forbid, the VB runtime and custom controls), especially when resources are already being severely taxed. I've sit through attempts to load Task Manager (easily taking 2, 3 minutes) just to kill the offending process. If I can instead launch CMD.EXE and use some command-line utility (I forget its name, it's in the resource kit) to kill the process in 10 seconds, then my blood pressure stays that much lower...
GeneralRe: Doesn't do much. Pin
WREY11-Oct-02 11:13
WREY11-Oct-02 11:13 
GeneralRe: Doesn't do much. Pin
dandy7215-Oct-02 4:03
dandy7215-Oct-02 4:03 
GeneralRe: Doesn't do much. Pin
WREY15-Oct-02 13:54
WREY15-Oct-02 13:54 
GeneralRe: Doesn't do much. Pin
dandy7216-Oct-02 3:01
dandy7216-Oct-02 3:01 
GeneralRe: Doesn't do much. Pin
gaz6615-Sep-04 13:16
gaz6615-Sep-04 13:16 
GeneralRe: Doesn't do much. Pin
Stuart Carnie21-Sep-03 10:12
Stuart Carnie21-Sep-03 10:12 
GeneralRe: Doesn't do much. Pin
jfk9127-Apr-04 15:22
jfk9127-Apr-04 15:22 
GeneralRe: Doesn't do much. Pin
User 988511-Oct-02 4:38
User 988511-Oct-02 4:38 
GeneralRe: Doesn't do much. Pin
Stephane Rodriguez.29-Sep-02 20:20
Stephane Rodriguez.29-Sep-02 20:20 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.