mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 01:55:19 +00:00
c98929fa7e
svn path=/trunk/; revision=2458
185 lines
5 KiB
C++
185 lines
5 KiB
C++
#include <windows.h>
|
|
#include <stdlib.h>
|
|
#include <memory.h>
|
|
|
|
#include "tnmisc.h"
|
|
|
|
// from the PVAX (http://www.ccas.ru/~posp/popov/spawn.htm)
|
|
// Create a process with pipes to stdin/out/err
|
|
BOOL CreateHiddenConsoleProcess(LPCTSTR szChildName, PROCESS_INFORMATION* ppi,
|
|
LPHANDLE phInWrite, LPHANDLE phOutRead,
|
|
LPHANDLE phErrRead) {
|
|
BOOL fCreated;
|
|
STARTUPINFO si;
|
|
SECURITY_ATTRIBUTES sa;
|
|
HANDLE hInRead;
|
|
HANDLE hOutWrite;
|
|
HANDLE hErrWrite;
|
|
|
|
// Create pipes
|
|
// initialize security attributes for handle inheritance (for WinNT)
|
|
sa.nLength = sizeof( sa );
|
|
sa.bInheritHandle = TRUE;
|
|
sa.lpSecurityDescriptor = NULL;
|
|
|
|
// create STDIN pipe
|
|
if( !CreatePipe( &hInRead, phInWrite, &sa, 0 ))
|
|
goto error;
|
|
|
|
// create STDOUT pipe
|
|
if( !CreatePipe( phOutRead, &hOutWrite, &sa, 0 ))
|
|
goto error;
|
|
|
|
// create STDERR pipe
|
|
if( !CreatePipe( phErrRead, &hErrWrite, &sa, 0 ))
|
|
goto error;
|
|
|
|
// process startup information
|
|
memset( &si, 0, sizeof( si ));
|
|
si.cb = sizeof( si );
|
|
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
|
|
// child process' console must be hidden for Win95 compatibility
|
|
si.wShowWindow = SW_HIDE;
|
|
// assign "other" sides of pipes
|
|
si.hStdInput = hInRead;
|
|
si.hStdOutput = hOutWrite;
|
|
si.hStdError = hErrWrite;
|
|
|
|
// Create a child process (suspended)
|
|
fCreated = CreateProcess( NULL,
|
|
(LPTSTR)szChildName,
|
|
NULL,
|
|
NULL,
|
|
TRUE,
|
|
0,
|
|
NULL,
|
|
NULL,
|
|
&si,
|
|
ppi );
|
|
|
|
if( !fCreated )
|
|
goto error;
|
|
|
|
CloseHandle( hInRead );
|
|
CloseHandle( hOutWrite );
|
|
CloseHandle( hErrWrite );
|
|
|
|
return TRUE;
|
|
|
|
error:
|
|
CloseHandle( hInRead );
|
|
CloseHandle( hOutWrite );
|
|
CloseHandle( hErrWrite );
|
|
CloseHandle( ppi->hProcess );
|
|
CloseHandle( ppi->hThread );
|
|
|
|
hInRead =
|
|
hOutWrite =
|
|
hErrWrite =
|
|
ppi->hProcess =
|
|
ppi->hThread = INVALID_HANDLE_VALUE;
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL SpawnProcess(char *cmd_line, PROCESS_INFORMATION *pi) {
|
|
STARTUPINFO si;
|
|
|
|
memset(&si, 0, sizeof(si));
|
|
si.cb = sizeof(si);
|
|
|
|
return CreateProcess(cmd_line, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS,
|
|
CREATE_NEW_CONSOLE, NULL, NULL, &si, pi);
|
|
}
|
|
|
|
// crn@ozemail.com.au
|
|
int GetWin32Version(void) {
|
|
// return win32 version; 0 = Win32s, 1 = Win95, 2 = WinNT, 3 = Unknown -crn@ozemail.com.au
|
|
LPOSVERSIONINFO osv;
|
|
DWORD retval;
|
|
|
|
osv = new OSVERSIONINFO;
|
|
|
|
osv->dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
|
|
GetVersionEx (osv);
|
|
retval = osv->dwPlatformId;
|
|
delete osv;
|
|
return (retval);
|
|
}
|
|
|
|
// Paul Brannan 8/7/98
|
|
// This code is from Michael 'Hacker' Krelin (author of KINSole)
|
|
// (slightly modified)
|
|
HWND GetConsoleWindow() {
|
|
DWORD pid = GetCurrentProcessId(), wpid;
|
|
char title[512], *t = title;
|
|
HWND hrv = NULL;
|
|
|
|
#ifndef __BORLANDC__ // Ioannou Dec. 8, 1998
|
|
if(!GetConsoleTitle(title, sizeof(title))) t = NULL;
|
|
|
|
for(;;) {
|
|
if((hrv = FindWindowEx(NULL, hrv, "tty", t)) == NULL) break;
|
|
if(!GetWindowThreadProcessId(hrv, &wpid)) continue;
|
|
if(wpid == pid) return hrv;
|
|
}
|
|
#endif
|
|
|
|
return GetForegroundWindow();
|
|
}
|
|
|
|
// Sets the icon of the console window to hIcon
|
|
// If hIcon is 0, then use a default icon
|
|
// hConsoleWindow must be set before calling SetIcon
|
|
bool SetIcon(HWND hConsoleWindow, HANDLE hIcon, LPARAM *pOldBIcon, LPARAM *pOldSIcon,
|
|
const char *icondir) {
|
|
if(!hConsoleWindow) return false;
|
|
|
|
// FIX ME!!! The LoadIcon code should work with any compiler!
|
|
// (Paul Brannan 12/17/98)
|
|
#ifndef __BORLANDC__ // Ioannou Dec. 8, 1998
|
|
if(!hIcon) {
|
|
char filename[128]; // load from telnet.ico
|
|
strncpy(filename, icondir, sizeof(filename));
|
|
strncat(filename, "telnet.ico", sizeof(filename));
|
|
filename[sizeof(filename) - 1] = 0;
|
|
|
|
// Note: loading the icon from a file doesn't work on NT
|
|
// There is no LoadImage in Borland headers - only LoadIcon
|
|
hIcon = LoadImage(NULL, filename, IMAGE_ICON, 0, 0, LR_DEFAULTSIZE +
|
|
LR_LOADFROMFILE);
|
|
}
|
|
#else
|
|
// load the icon from the resource file -crn@ozemail.com.au 16/12/98
|
|
if(!hIcon) {
|
|
hIcon = LoadIcon ((HANDLE)GetWindowLong(hConsoleWindow,
|
|
GWL_HINSTANCE), "TELNETICON");
|
|
}
|
|
#endif
|
|
|
|
if(hIcon) {
|
|
#ifdef ICON_BIG
|
|
*pOldBIcon = SendMessage(hConsoleWindow, WM_SETICON, ICON_BIG,
|
|
(LPARAM)hIcon);
|
|
#endif
|
|
#ifdef ICON_SMALL
|
|
*pOldSIcon = SendMessage(hConsoleWindow, WM_SETICON, ICON_SMALL,
|
|
(LPARAM)hIcon);
|
|
#endif
|
|
return true;
|
|
} else {
|
|
// Otherwise we get a random icon at exit! (Paul Brannan 9/13/98)
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Allows SetIcon to be called again by resetting the current icon
|
|
// Added 12/17/98 by Paul Brannan
|
|
void ResetIcon(HWND hConsoleWindow, LPARAM oldBIcon, LPARAM oldSIcon) {
|
|
#ifdef ICON_BIG
|
|
SendMessage(hConsoleWindow, WM_SETICON, ICON_BIG, (LPARAM)oldBIcon);
|
|
#endif
|
|
#ifdef ICON_SMALL
|
|
SendMessage(hConsoleWindow, WM_SETICON, ICON_SMALL, (LPARAM)oldSIcon);
|
|
#endif
|
|
}
|