Reputation: 2176
I was attempting to do a Windows command prompt re-code in C#. I was wondering how the command prompt knows when to wait for the process started to exit, and when not to wait for the called process to exit.
For example, if you type in the command prompt "notepad", Notepad will launch, but you can still execute other commands. However, if you open a utility such as more.com, ping.exe, or another utility, it will wait for the executing program to finish before letting you execute another command.
How does the command prompt know when to wait for exit, and how can this behavior be emulated in C#?
Upvotes: 88
Views: 4574
Reputation: 3809
The default from a command prompt is to spawn the GUI program in a separate process/fork. However, you can run notepad (or other GUI program) inline with your command prompt / shell script:
start /w notepad.exe
This way, the command prompt / shell script only continues after the notepad.exe process has terminated.
Hope this helps, TW
Upvotes: 8
Reputation: 5012
If the application is a Win32 GUI application, it will just run and command prompt won't wait for it to exit.
If the application is a console application, it will run in the command prompt and you'll need to wait for it to finish to get the command prompt back.
EDIT:
OK. It seems you need technical explanation. If you want to emulate the same feature in your application, you can check IMAGE_OPTIONAL_HEADER
of EXE files here.
Inside IMAGE_OPTIONAL_HEADER
, there is:
WORD Subsystem;
If SubSystem == 0x02
it means it's a GUI application.
If SubSystem == 0x03
it means it's a command prompt app.
EDIT 2:
If you want to see it in action:
Download http://www.ntcore.com/exsuite.php
Copy calc.exe or notepad.exe to your desktop
Open copied calc.exe in CFF Explorer
Navigate to Nt Headers -> Optional Headers
Change SubSystem from 0x002 to 0x003
Save it
Now run the new modified calc and you'll see the command prompt wait for it to be terminated.
Upvotes: 121
Reputation: 5600
When you start a new process, a GUI application in this context that actually works outside the boundaries of the prompt, the prompt will not wait. But, if you run a command that works entirely under the boundaries of the current instance of a prompt, it waits.
So, command notepad
just starts the Notepad application and leaves control of application. While, command ipconfig
runs under a domain (no this is not application domain), of the prompt.
To extremely generalize, when you use Process.Start
in your C# equivalent, do not wait. It anyway will not.
Upvotes: 3