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
CreateHiddenConsoleProcess(LPCTSTR szChildName,PROCESS_INFORMATION * ppi,LPHANDLE phInWrite,LPHANDLE phOutRead,LPHANDLE phErrRead)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 
SpawnProcess(char * cmd_line,PROCESS_INFORMATION * pi)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
GetWin32Version(void)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)
TelnetGetConsoleWindow()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
SetIcon(HWND hConsoleWindow,HANDLE hIcon,LPARAM * pOldBIcon,LPARAM * pOldSIcon,const char * icondir)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 			GWLP_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
ResetIcon(HWND hConsoleWindow,LPARAM oldBIcon,LPARAM oldSIcon)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