Estaba intentando volver a codificar el símbolo del sistema de Windows en C #. Me preguntaba cómo el símbolo del sistema sabe cuándo esperar a que el proceso comience a salir y cuándo no esperar a que salga el proceso llamado.
Por ejemplo, si escribe en el símbolo del sistema "bloc de notas", el Bloc de notas se iniciará, pero aún puede ejecutar otros comandos. Sin embargo, si abre una utilidad como more.com, ping.exe u otra utilidad, esperará a que finalice el programa en ejecución antes de permitirle ejecutar otro comando.
¿Cómo sabe el símbolo del sistema cuándo esperar la salida y cómo se puede emular este comportamiento en C #?
c#
windows
command-prompt
Justin Krejcha
fuente
fuente
Respuestas:
Si la aplicación es una aplicación GUI de Win32, simplemente se ejecutará y el símbolo del sistema no esperará a que se cierre.
Si la aplicación es una aplicación de consola, se ejecutará en el símbolo del sistema y deberá esperar a que termine para recuperar el símbolo del sistema.
EDITAR:
OKAY. Parece que necesita una explicación técnica. Si desea emular la misma función en su aplicación, puede verificar los
IMAGE_OPTIONAL_HEADER
archivos EXE aquí .En el interior
IMAGE_OPTIONAL_HEADER
hay:If SubSystem == 0x02
significa que es una aplicación GUI.If SubSystem == 0x03
significa que es una aplicación de símbolo del sistema.EDITAR 2:
Si quieres verlo en acción:
Descarga http://www.ntcore.com/exsuite.php
Copie calc.exe o notepad.exe en su escritorio
Abra calc.exe copiado en CFF Explorer
Navegue a Nt Headers -> Opcional Headers
Cambiar el subsistema de 0x002 a 0x003
Guárdalo
Ahora ejecute el nuevo calc modificado y verá que el símbolo del sistema espera a que termine.
fuente
El valor predeterminado de un símbolo del sistema es generar el programa GUI en un proceso / bifurcación separado. Sin embargo, puede ejecutar el bloc de notas (u otro programa de GUI) en línea con su símbolo del sistema / script de shell:
De esta manera, el script de línea de comandos / shell solo continúa después de que el proceso notepad.exe haya finalizado.
Espero que esto ayude, TW
fuente
Cuando inicia un nuevo proceso, una aplicación GUI en este contexto que realmente funciona fuera de los límites del mensaje, el mensaje no esperará. Pero, si ejecuta un comando que funciona completamente dentro de los límites de la instancia actual de un indicador, espera.
Entonces, el comando
notepad
simplemente inicia la aplicación Bloc de notas y deja el control de la aplicación. Mientras, el comando seipconfig
ejecuta bajo un dominio (no, esto no es un dominio de aplicación ), del indicador.Para generalizar extremadamente, cuando use
Process.Start
en su equivalente de C #, no espere. De todos modos no lo hará.fuente