[KERNEL32]
[reactos.git] / base / applications / network / telnet / src / tnmisc.cpp
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 }