1 #include "precomp.h" 2 3 // from the PVAX (http://www.ccas.ru/~posp/popov/spawn.htm) 4 // Create a process with pipes to stdin/out/err 5 BOOL CreateHiddenConsoleProcess(LPCTSTR szChildName, PROCESS_INFORMATION* ppi, 6 LPHANDLE phInWrite, LPHANDLE phOutRead, 7 LPHANDLE phErrRead) { 8 BOOL fCreated; 9 STARTUPINFO si; 10 SECURITY_ATTRIBUTES sa; 11 HANDLE hInRead = INVALID_HANDLE_VALUE; 12 HANDLE hOutWrite = INVALID_HANDLE_VALUE; 13 HANDLE hErrWrite = INVALID_HANDLE_VALUE; 14 15 // Create pipes 16 // initialize security attributes for handle inheritance (for WinNT) 17 sa.nLength = sizeof( sa ); 18 sa.bInheritHandle = TRUE; 19 sa.lpSecurityDescriptor = NULL; 20 21 // create STDIN pipe 22 if( !CreatePipe( &hInRead, phInWrite, &sa, 0 )) { 23 hInRead = INVALID_HANDLE_VALUE; 24 goto error; 25 } 26 27 // create STDOUT pipe 28 if( !CreatePipe( phOutRead, &hOutWrite, &sa, 0 )) { 29 hOutWrite = INVALID_HANDLE_VALUE; 30 goto error; 31 } 32 33 // create STDERR pipe 34 if( !CreatePipe( phErrRead, &hErrWrite, &sa, 0 )) { 35 hErrWrite = INVALID_HANDLE_VALUE; 36 goto error; 37 } 38 39 // process startup information 40 memset( &si, 0, sizeof( si )); 41 si.cb = sizeof( si ); 42 si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; 43 // child process' console must be hidden for Win95 compatibility 44 si.wShowWindow = SW_HIDE; 45 // assign "other" sides of pipes 46 si.hStdInput = hInRead; 47 si.hStdOutput = hOutWrite; 48 si.hStdError = hErrWrite; 49 50 // Create a child process (suspended) 51 fCreated = CreateProcess( NULL, 52 (LPTSTR)szChildName, 53 NULL, 54 NULL, 55 TRUE, 56 0, 57 NULL, 58 NULL, 59 &si, 60 ppi ); 61 62 if( !fCreated ) 63 goto error; 64 65 CloseHandle( hInRead ); 66 CloseHandle( hOutWrite ); 67 CloseHandle( hErrWrite ); 68 69 return TRUE; 70 71 error: 72 if (hInRead != INVALID_HANDLE_VALUE) CloseHandle( hInRead ); 73 if (hOutWrite != INVALID_HANDLE_VALUE) CloseHandle( hOutWrite ); 74 if (hErrWrite != INVALID_HANDLE_VALUE) CloseHandle( hErrWrite ); 75 CloseHandle( ppi->hProcess ); 76 CloseHandle( ppi->hThread ); 77 78 hInRead = 79 hOutWrite = 80 hErrWrite = 81 ppi->hProcess = 82 ppi->hThread = INVALID_HANDLE_VALUE; 83 84 return FALSE; 85 } 86 87 BOOL SpawnProcess(char *cmd_line, PROCESS_INFORMATION *pi) { 88 STARTUPINFO si; 89 90 memset(&si, 0, sizeof(si)); 91 si.cb = sizeof(si); 92 93 return CreateProcess(cmd_line, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, 94 CREATE_NEW_CONSOLE, NULL, NULL, &si, pi); 95 } 96 97 // crn@ozemail.com.au 98 int GetWin32Version(void) { 99 // return win32 version; 0 = Win32s, 1 = Win95, 2 = WinNT, 3 = Unknown -crn@ozemail.com.au 100 LPOSVERSIONINFO osv; 101 DWORD retval; 102 103 osv = new OSVERSIONINFO; 104 105 osv->dwOSVersionInfoSize = sizeof (OSVERSIONINFO); 106 GetVersionEx (osv); 107 retval = osv->dwPlatformId; 108 delete osv; 109 return (retval); 110 } 111 112 // Paul Brannan 8/7/98 113 // This code is from Michael 'Hacker' Krelin (author of KINSole) 114 // (slightly modified) 115 HWND TelnetGetConsoleWindow() { 116 DWORD pid = GetCurrentProcessId(), wpid; 117 char title[512], *t = title; 118 HWND hrv = NULL; 119 120 #ifndef __BORLANDC__ // Ioannou Dec. 8, 1998 121 if(!GetConsoleTitle(title, sizeof(title))) t = NULL; 122 123 for(;;) { 124 if((hrv = FindWindowEx(NULL, hrv, "tty", t)) == NULL) break; 125 if(!GetWindowThreadProcessId(hrv, &wpid)) continue; 126 if(wpid == pid) return hrv; 127 } 128 #endif 129 130 return GetForegroundWindow(); 131 } 132 133 // Sets the icon of the console window to hIcon 134 // If hIcon is 0, then use a default icon 135 // hConsoleWindow must be set before calling SetIcon 136 bool SetIcon(HWND hConsoleWindow, HANDLE hIcon, LPARAM *pOldBIcon, LPARAM *pOldSIcon, 137 const char *icondir) { 138 if(!hConsoleWindow) return false; 139 140 // FIX ME!!! The LoadIcon code should work with any compiler! 141 // (Paul Brannan 12/17/98) 142 #ifndef __BORLANDC__ // Ioannou Dec. 8, 1998 143 if(!hIcon) { 144 char filename[MAX_PATH]; // load from telnet.ico 145 _snprintf(filename, MAX_PATH - 1, "%s%s", icondir, "telnet.ico"); 146 filename[MAX_PATH - 1] = '\0'; 147 148 // Note: loading the icon from a file doesn't work on NT 149 // There is no LoadImage in Borland headers - only LoadIcon 150 hIcon = LoadImage(NULL, filename, IMAGE_ICON, 0, 0, LR_DEFAULTSIZE + 151 LR_LOADFROMFILE); 152 } 153 #else 154 // load the icon from the resource file -crn@ozemail.com.au 16/12/98 155 if(!hIcon) { 156 hIcon = LoadIcon ((HANDLE)GetWindowLongPtr(hConsoleWindow, 157 GWL_HINSTANCE), "TELNETICON"); 158 } 159 #endif 160 161 if(hIcon) { 162 #ifdef ICON_BIG 163 *pOldBIcon = SendMessage(hConsoleWindow, WM_SETICON, ICON_BIG, 164 (LPARAM)hIcon); 165 #endif 166 #ifdef ICON_SMALL 167 *pOldSIcon = SendMessage(hConsoleWindow, WM_SETICON, ICON_SMALL, 168 (LPARAM)hIcon); 169 #endif 170 return true; 171 } else { 172 // Otherwise we get a random icon at exit! (Paul Brannan 9/13/98) 173 return false; 174 } 175 } 176 177 // Allows SetIcon to be called again by resetting the current icon 178 // Added 12/17/98 by Paul Brannan 179 void ResetIcon(HWND hConsoleWindow, LPARAM oldBIcon, LPARAM oldSIcon) { 180 #ifdef ICON_BIG 181 SendMessage(hConsoleWindow, WM_SETICON, ICON_BIG, (LPARAM)oldBIcon); 182 #endif 183 #ifdef ICON_SMALL 184 SendMessage(hConsoleWindow, WM_SETICON, ICON_SMALL, (LPARAM)oldSIcon); 185 #endif 186 } 187