#include "system.h"

using namespace std;

int System(const char* cmd)
{
   STARTUPINFOA si;
   SECURITY_ATTRIBUTES sa;
   PROCESS_INFORMATION pi;
   DWORD rd = 0;
   int rc = 0;
   DWORD exit_code;
   int size = strlen(cmd) + 1024;
   char* buffer = new char[size];

   memset(buffer, 0, size);
   strcpy(buffer, "C:\\Windows\\system32\\cmd.exe /c ");
   strcat(buffer, cmd);

   memset((void*)&si, 0, sizeof(si));
   memset((void*)&sa, 0, sizeof(sa));
   memset((void*)&pi, 0, sizeof(pi));

   sa.lpSecurityDescriptor = NULL;
   sa.nLength = sizeof(SECURITY_ATTRIBUTES);
   sa.bInheritHandle = TRUE;
   
   GetStartupInfo(&si);
   si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
   si.wShowWindow = SW_HIDE;
   si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
   si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
   si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);

   rc = (int)CreateProcess(NULL,
                 (LPSTR)buffer,
                 NULL,
                 NULL,
                 TRUE,
                 0,
                 NULL,
                 NULL,
                 &si,
                 &pi);
   
   if(rc == 0) {
      delete [] buffer;
      return 1;
   }

   WaitForSingleObject(pi.hProcess, INFINITE);
   WaitForSingleObject(pi.hThread, INFINITE);

   GetExitCodeProcess(pi.hProcess, &exit_code);

   if(exit_code == STILL_ACTIVE) {
      delete [] buffer;
      return 1;
   }

   CloseHandle(pi.hProcess);
   CloseHandle(pi.hThread);
   
   if(exit_code == 0)
      rc = 0;
   else
      rc = 1;

   delete [] buffer;
   
   return rc;
}
