Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to execute a simple command line with CreateProcess?

I'd like to execute a simple command line but without to make a window appear. Therefore I can't use System and have to use CreateProcess as far as I know. So I have the following code for example:

//.../

CreateProcess(NULL,input,NULL,NULL,false,NORMAL_PRIORITY_CLASS | 
 CREATE_NO_WINDOW,NULL,NULL,&startInf,&procInf);//)

//.../

If input is a line like "ping www.google.com -n 2" it seems to work. What I need is the deletion-function though. Therefore I tried a lot of variations like:

input = "rd /S /Q \"D:\\ALEX_DATEN\\PC\\C++\\bla\"";

and

  input = "rd /S /Q \"D:/DATEN/PC/C++/bla\"";

But nothing happens and the function returns failure :/ If I write it as a .bat file (without using the "\" escaping chars) the deleting works perfectly!

Does anyone know what I'm doing wrong?

P.s. no, I'm not writing a destructive virus.. if that would have been my target, I would have definitely have found simpler ways...

like image 235
DragonGamer Avatar asked Oct 06 '22 07:10

DragonGamer


1 Answers

Some system command like rd, del and ... are not actual executable Images (e.g. .exe Files), so you can't execute/run them using CreateProcess they are built-in commands that known to cmd(command interpreter of windows) so you should create cmd and pass your command to it:

wchar_t cmd[ MAX_PATH ];
size_t nSize = _countof(cmd);
_wgetenv_s( &nSize, cmd, L"COMSPEC" );
BOOL b = CreateProcessW( cmd, input, NULL, NULL, FALSE,
    NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW, NULL, NULL, &startInf, &procInf );

Note: Please see arguments of cmd, you have to use /C to pass your command. So your command is as follow:

wchar_t input[] = L"some command";
wchar_t cmd[MAX_PATH] ;
// initialize cmd
wchar_t cmdline[ MAX_PATH + 50 ];
swprintf_s( cmdline, L"%s /c %s", cmd, input );
STARTUPINFOW startInf;
memset( &startInf, 0, sizeof startInf );
startInf.cb = sizeof(startInf);
// If you want to redirect result of command, set startInf.hStdOutput to a file
// or pipe handle that you can read it, otherwise we are done!
PROCESS_INFORMATION procInf;
memset( &procInf, 0, sizeof procInf );
BOOL b = CreateProcessW( NULL, cmdline, NULL, NULL, FALSE,
    NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW, NULL, NULL, &startInf, &procInf );
DWORD dwErr = 0;
if( b ) {
    // Wait till cmd do its job
    WaitForSingleObject( procInf.hProcess, INFINITE );
    // Check whether our command succeeded?
    GetExitCodeProcess( procInfo.hProcess, &dwErr );
    // Avoid memory leak by closing process handle
    CloseHandle( procInfo.hProcess );
} else {
    dwErr = GetLastError();
}
if( dwErr ) {
    // deal with error here
}
like image 169
BigBoss Avatar answered Oct 10 '22 03:10

BigBoss