From d4c8ef9ac5cdb18e217871a019e30597987c271d Mon Sep 17 00:00:00 2001 From: quamrulmina Date: Tue, 27 Oct 2015 19:05:38 -0500 Subject: [PATCH] Improved SSH client interactive mode and fixed control-c to work Console API is now used for interactive tty mode. Thus ssh.exe client can now pass each character to remote side as one types so that programs like more works correctly. Control-c now will stop the remote program instead of exiting the ssh.exe. --- channels.c | 8 +- clientloop.c | 14 +- contrib/win32/win32compat/Makefile.in | 3 +- contrib/win32/win32compat/ansiprsr.c | 2 +- contrib/win32/win32compat/ansiprsr.h | 17 + contrib/win32/win32compat/socket.c | 51 +- contrib/win32/win32compat/tncon.c | 762 ++++++++++++++++++++++++++ ssh.c | 4 +- 8 files changed, 845 insertions(+), 16 deletions(-) create mode 100644 contrib/win32/win32compat/tncon.c diff --git a/channels.c b/channels.c index e6fe9fc..b30e92a 100644 --- a/channels.c +++ b/channels.c @@ -1685,6 +1685,10 @@ channel_handle_rfd(Channel *c, fd_set *readset, fd_set *writeset) if (c->rfd != -1 && (force || FD_ISSET(c->rfd, readset))) { errno = 0; len = read(c->rfd, buf, sizeof(buf)); + #ifdef WIN32_FIXME + if (len == 0) + return 1; // in Win32 console read, there may be no data, but is ok + #endif if (len < 0 && (errno == EINTR || ((errno == EAGAIN || errno == EWOULDBLOCK) && !force))) return 1; @@ -2395,9 +2399,7 @@ channel_output_poll(void) } } } -#ifdef WIN32_FIXME -int lftocrlf = 0; -#endif + /* -- protocol input */ /* ARGSUSED */ diff --git a/clientloop.c b/clientloop.c index ebc89ac..6b9c60d 100644 --- a/clientloop.c +++ b/clientloop.c @@ -1348,14 +1348,14 @@ process_escapes(Channel *c, Buffer *bin, Buffer *bout, Buffer *berr, * and append it to the buffer. */ last_was_cr = (ch == '\r' || ch == '\n'); - #ifdef WIN32_FIXME - extern int lftocrlf ; // defined in channels.c file's channel_input_data() function for now - if ( (lftocrlf == 1) && ( ch == '\n') ) { + //#ifdef WIN32_FIXME + //extern int lftocrlf ; // defined in channels.c file's channel_input_data() function for now + //if ( (lftocrlf == 1) && ( ch == '\n') ) { // add a \r before \n if sshd server sent us ESC[20h during initial tty mode setting - buffer_put_char(bin, '\r'); - bytes++; - } - #endif + //buffer_put_char(bin, '\r'); + //bytes++; + //} + //#endif buffer_put_char(bin, ch); bytes++; } diff --git a/contrib/win32/win32compat/Makefile.in b/contrib/win32/win32compat/Makefile.in index 4eb0b48..78de177 100644 --- a/contrib/win32/win32compat/Makefile.in +++ b/contrib/win32/win32compat/Makefile.in @@ -19,7 +19,8 @@ LDFLAGS=-L. @LDFLAGS@ -L/lib/win32api WIN32COMPATFILES = daemon.o gettimeofday.o homedirhelp.o pwd.o sfds.o \ socket.o startupneeds.o strcasecmp.o syslog.o lsalogon.o lsastring.o \ - stringhelp.o deskright.o win32auth.o kerberos.o cng_cipher.o ansiprsr.o console.o tnnet.o conio.o + stringhelp.o deskright.o win32auth.o kerberos.o cng_cipher.o ansiprsr.o \ + console.o tnnet.o conio.o tncon.o WIN32COMPATLIB=@LIBWIN32COMPAT@ diff --git a/contrib/win32/win32compat/ansiprsr.c b/contrib/win32/win32compat/ansiprsr.c index 9522cb6..4abf200 100644 --- a/contrib/win32/win32compat/ansiprsr.c +++ b/contrib/win32/win32compat/ansiprsr.c @@ -51,7 +51,7 @@ // items used from other modules int NetWriteString(char* pszString, size_t cbString); TelParams Parameters; -extern int lftocrlf; +int lftocrlf = 0; extern int ScreenX; extern int ScreenY; diff --git a/contrib/win32/win32compat/ansiprsr.h b/contrib/win32/win32compat/ansiprsr.h index ebc49da..8ce75aa 100644 --- a/contrib/win32/win32compat/ansiprsr.h +++ b/contrib/win32/win32compat/ansiprsr.h @@ -55,11 +55,28 @@ unsigned char * ParseVT52(unsigned char * pszBuffer, unsigned char * pszBufferEn typedef struct _TelParams { + int fLogging; + FILE *fplogfile; + + char *pInputFile; + + char * szDebugInputFile; + BOOL fDebugWait; + int timeOut; int fLocalEcho; int fTreatLFasCRLF; int fSendCROnly; int nReceiveCRLF; + //_crlftype nReceiveCRLF; + char sleepChar; + char menuChar; + + SOCKET Socket; + BOOL bVT100Mode; + + char *pAltKey; + } TelParams; #endif \ No newline at end of file diff --git a/contrib/win32/win32compat/socket.c b/contrib/win32/win32compat/socket.c index 27ca505..28fb8eb 100644 --- a/contrib/win32/win32compat/socket.c +++ b/contrib/win32/win32compat/socket.c @@ -54,6 +54,7 @@ extern void debug3(const char *fmt,...); extern void error(const char *fmt,...); extern void fatal(const char *fmt,...); +int glob_itissshclient = 0; // ssh client turns it to 1 static int winsock_initialized = 0; extern int logfd; @@ -1545,7 +1546,26 @@ int socketpair(int socks[2]) return SOCKET_ERROR; } +int DataAvailable ( HANDLE h ) +{ + INPUT_RECORD irec = {0}; + DWORD events_read = 0; + + int ret = PeekConsoleInput (h, &irec, 1, &events_read); + + if (!ret) + { + return 0; + } + + if (events_read) // && irec.EventType == KEY_EVENT) + { + return events_read ; + } + + return 0; +} int peekConsoleRead(int sfd) { DWORD sleep_time = 0; @@ -2391,8 +2411,9 @@ int WSHELPread(int sfd, char *dst, unsigned int max) SOCKET sock; int ret = -1; + int sfd_type = get_sfd_type(sfd); - switch(get_sfd_type(sfd)) + switch (sfd_type) { case SFD_TYPE_SOCKET: { @@ -2450,8 +2471,9 @@ int WSHELPread(int sfd, char *dst, unsigned int max) case SFD_TYPE_FD: case SFD_TYPE_PIPE: - case SFD_TYPE_CONSOLE: + //case SFD_TYPE_CONSOLE: { + ret = _read(sfd_to_fd(sfd), dst, max); if (FD_ISSET(sfd_to_fd(sfd), &debug_sfds)) @@ -2470,6 +2492,25 @@ int WSHELPread(int sfd, char *dst, unsigned int max) sfd, GetLastError()); } + break; + } + case SFD_TYPE_CONSOLE: + { + //if (sfd_type == SFD_TYPE_CONSOLE) { + // we could be send here due to ctrl-c input, so no data to read + //if ( DataAvailable (sfd_to_handle(sfd)) <=0 ) + //return 1; // no data to read + //} + ret = ReadConsoleForTermEmul( sfd_to_handle(sfd), dst, max); + + if (ret < 0) + { + error("read from pipe/console sfd [%d] failed with error code [%d]", + sfd, GetLastError()); + } + if (ret == 0) + return 0; //1; + break; } case 99: @@ -2519,7 +2560,11 @@ int WSHELPwrite(int sfd, const char *buf, unsigned int max) int ret = -1; - switch(get_sfd_type(sfd)) + int sfd_type = get_sfd_type(sfd); + if ( (glob_itissshclient) && ( sfd_type == SFD_TYPE_CONSOLE ) ) + sfd_type = SFD_TYPE_PIPE ; // client write type uses _write() in place ofn console insertion + + switch(sfd_type) { case SFD_TYPE_SOCKET: { diff --git a/contrib/win32/win32compat/tncon.c b/contrib/win32/win32compat/tncon.c new file mode 100644 index 0000000..7e4d913 --- /dev/null +++ b/contrib/win32/win32compat/tncon.c @@ -0,0 +1,762 @@ +/* + * Author: Microsoft Corp. + * + * Copyright (c) 2015 Microsoft Corp. + * All rights reserved + * + * Microsoft openssh win32 port + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/* tncon.c + * + * Console reading calls for building an emulator over Windows Console. MS win32 port of ssh.exe client uses it. + * +*/ +#include +#include +#include +#include + +#include +#include + +#include "ansiprsr.h" +#include "tncon.h" +#include "tnnet.h" + +extern bool gbVTAppMode; + +char *glob_out = NULL ; +int glob_outlen = 0; +int glob_space = 0; + +// For our case, in NetWriteString2(), we do not use socket, but write the out going data to +// a global buffer setup by ReadConsoleForTermEmul() function below +int NetWriteString2(SOCKET sock, char* source, size_t len, int options) +{ + while ( len > 0 ) { + //printf("[%c]", *source); + if (glob_outlen >= glob_space) + return glob_outlen; // no more room to copy, this much got done + *glob_out++ = *source++ ; + len--; + glob_outlen++; + } + + return glob_outlen; +} + +TelParams Parameters; +TelParams* pParams = &Parameters ; + +void ConInputInitParams(void) +{ + memset( &Parameters, '\0', sizeof( TelParams ) ); + + // set default values + Parameters.szDebugInputFile = NULL; + Parameters.fDebugWait= FALSE; + Parameters.nReceiveCRLF = ENUM_LF; + Parameters.fSendCROnly = TRUE; //FALSE; + Parameters.sleepChar = '`'; + Parameters.menuChar = '\035'; // CTRL-] + Parameters.pAltKey = "\x01"; // default + + HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE); + DWORD dwMode; + GetConsoleMode(hInput, &dwMode); + SetConsoleMode(hInput, (dwMode & ~(ENABLE_LINE_INPUT | + ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT)) | ENABLE_WINDOW_INPUT ); + + extern int glob_itissshclient; + glob_itissshclient = 1; // tell our contrib/win32/win32compat/socket.c code it is for ssh client side + +} + +unsigned char NAWSSTR[] = { "\xff\xfa\x1f\x00\x00\x00\x00\xff\xf0"}; + +extern int ScreenY; +extern int ScreenX; + +extern int ScrollTop; +extern int ScrollBottom; + +int DataAvailableCount ( HANDLE h ) +{ + INPUT_RECORD irec[64]; + + DWORD events_read = 0; + + int ret = PeekConsoleInput (h, &irec, 64, &events_read); + + if (!ret) + { + return 0; + } + + if (events_read) // && irec.EventType == KEY_EVENT) + { + return events_read ; + } + + return 0; +} + +int ReadConsoleForTermEmul( HANDLE hInput, char *destin, int destinlen) +{ + //HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE); + HANDLE hHandle[] = {hInput, NULL}; + DWORD nHandle = 1; + DWORD dwInput; + unsigned char szResponse[50]; + INPUT_RECORD InputRecord; + DWORD dwControlKeyState, rc; + BOOL bCapsOn, bShift; + char aChar; + unsigned char octets[20]; + + glob_out = destin ; + glob_space = destinlen ; + glob_outlen = 0; + + int dataavail = DataAvailableCount (hInput) ; + + while (dataavail > 0) + { + if (glob_outlen >= destinlen) + return glob_outlen ; // user given space is full, so return with whatever we read so far + + //rc = WaitForMultipleObjects(nHandle, hHandle, FALSE, INFINITE); + rc = WAIT_OBJECT_0 ; + switch (rc) + { + case WAIT_OBJECT_0: + { + ReadConsoleInputW(hInput, &InputRecord, 1, &dwInput); + dataavail--; + switch (InputRecord.EventType) + { + case WINDOW_BUFFER_SIZE_EVENT: + memcpy(szResponse,NAWSSTR,9); + szResponse[4] = ConScreenSizeX(); + szResponse[6] = ConWindowSizeY(); // visible window size - not buffer + ScreenX = ConScreenSizeX(); + ScreenY = ConWindowSizeY(); // visible window size - not buffer + //NetWriteString2(pParams->Socket,(char *) szResponse, 9,0); // it needs to got out to remote sshd + break; + + case FOCUS_EVENT: + case MENU_EVENT: + break; + + case KEY_EVENT: + // Remove all of the keys we don't care about + bCapsOn = (InputRecord.Event.KeyEvent.dwControlKeyState & CAPSLOCK_ON); + bShift = (InputRecord.Event.KeyEvent.dwControlKeyState & SHIFT_PRESSED); + dwControlKeyState = InputRecord.Event.KeyEvent.dwControlKeyState & ~(CAPSLOCK_ON | ENHANCED_KEY | NUMLOCK_ON | SCROLLLOCK_ON ); + if (InputRecord.Event.KeyEvent.uChar.UnicodeChar) + { + if (InputRecord.Event.KeyEvent.bKeyDown) + { + ConRestoreViewRect(); + int n = WideCharToMultiByte(GetConsoleCP(),0,&(InputRecord.Event.KeyEvent.uChar.UnicodeChar),1,(LPSTR)octets,20,NULL,NULL); + + if (pParams->fLocalEcho){ +// ConWriteCharW( InputRecord.Event.KeyEvent.uChar.UnicodeChar ); + ConWriteString((char *)octets,n); + } + if ((dwControlKeyState == LEFT_ALT_PRESSED) || + (dwControlKeyState == RIGHT_ALT_PRESSED)) + NetWriteString2(pParams->Socket, (char *)pParams->pAltKey, 1, 0); + + switch (InputRecord.Event.KeyEvent.uChar.UnicodeChar) + { + case 0xd: + if (pParams->fSendCROnly) + NetWriteString2(pParams->Socket, "\r", 1, 0); + else + NetWriteString2(pParams->Socket, "\r\n", 2, 0); + break; + + case VK_ESCAPE: + NetWriteString2(pParams->Socket, (char *)ESCAPE_KEY, 1, 0); + break; + + default: + NetWriteString2(pParams->Socket, (char *)octets, n, 0); + break; + } + } + } + else + { + //Non Unicode key + if (InputRecord.Event.KeyEvent.bKeyDown) + { + + switch(InputRecord.Event.KeyEvent.wVirtualKeyCode) + { + case VK_UP: + NetWriteString2(pParams->Socket, (char *)(gbVTAppMode?APP_UP_ARROW:UP_ARROW), 3, 0); + break; + case VK_DOWN: + NetWriteString2(pParams->Socket, (char *)(gbVTAppMode?APP_DOWN_ARROW:DOWN_ARROW), 3, 0); + break; + case VK_RIGHT: + NetWriteString2(pParams->Socket, (char *)(gbVTAppMode?APP_RIGHT_ARROW:RIGHT_ARROW), 3, 0); + break; + case VK_LEFT: + NetWriteString2(pParams->Socket, (char *)(gbVTAppMode?APP_LEFT_ARROW:LEFT_ARROW), 3, 0); + break; + case VK_F1: + if ( dwControlKeyState == 0 ) + { + if (pParams->bVT100Mode) + NetWriteString2(pParams->Socket, (char *)VT100_PF1_KEY, strlen(VT100_PF1_KEY), 0); + else + NetWriteString2(pParams->Socket, (char *)PF1_KEY, strlen(PF1_KEY), 0); + } + else if ( dwControlKeyState == SHIFT_PRESSED ) + NetWriteString2(pParams->Socket, (char *)SHIFT_PF1_KEY, strlen(SHIFT_PF1_KEY), 0); + else if ( dwControlKeyState == LEFT_CTRL_PRESSED || + dwControlKeyState == RIGHT_CTRL_PRESSED ) + NetWriteString2(pParams->Socket, (char *)CTRL_PF1_KEY, strlen(CTRL_PF1_KEY), 0); + else if ( dwControlKeyState == LEFT_ALT_PRESSED || + dwControlKeyState == RIGHT_ALT_PRESSED ) + NetWriteString2(pParams->Socket, (char *)ALT_PF1_KEY, strlen(ALT_PF1_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) ) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF1_KEY, strlen(SHIFT_ALT_CTRL_PF1_KEY), 0); + else if((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF1_KEY, strlen(ALT_CTRL_PF1_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) )) + NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_PF1_KEY, strlen(SHIFT_ALT_PF1_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)SHIFT_CTRL_PF1_KEY, strlen(SHIFT_CTRL_PF1_KEY), 0); + break; + case VK_F2: + if ( dwControlKeyState == 0 ) + { + if (pParams->bVT100Mode) + NetWriteString2(pParams->Socket, (char *)VT100_PF2_KEY, strlen(VT100_PF2_KEY), 0); + else + NetWriteString2(pParams->Socket, (char *)PF2_KEY, strlen(PF2_KEY), 0); + } + else if ( dwControlKeyState == SHIFT_PRESSED ) + NetWriteString2(pParams->Socket, (char *)SHIFT_PF2_KEY, strlen(SHIFT_PF2_KEY), 0); + else if ( dwControlKeyState == LEFT_CTRL_PRESSED || + dwControlKeyState == RIGHT_CTRL_PRESSED ) + NetWriteString2(pParams->Socket, (char *)CTRL_PF2_KEY, strlen(CTRL_PF2_KEY), 0); + else if ( dwControlKeyState == LEFT_ALT_PRESSED || + dwControlKeyState == RIGHT_ALT_PRESSED ) + NetWriteString2(pParams->Socket, (char *)ALT_PF2_KEY, strlen(ALT_PF2_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) ) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF2_KEY, strlen(SHIFT_ALT_CTRL_PF2_KEY), 0); + else if((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF2_KEY, strlen(ALT_CTRL_PF2_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) )) + NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_PF2_KEY, strlen(SHIFT_ALT_PF2_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)SHIFT_CTRL_PF2_KEY, strlen(SHIFT_CTRL_PF2_KEY), 0); + break; + case VK_F3: + if ( dwControlKeyState == 0 ) + { + if (pParams->bVT100Mode) + NetWriteString2(pParams->Socket, (char *)VT100_PF3_KEY, strlen(VT100_PF3_KEY), 0); + else + NetWriteString2(pParams->Socket, (char *)PF3_KEY, strlen(PF3_KEY), 0); + } + else if ( dwControlKeyState == SHIFT_PRESSED ) + NetWriteString2(pParams->Socket, (char *)SHIFT_PF3_KEY, strlen(SHIFT_PF3_KEY), 0); + else if ( dwControlKeyState == LEFT_CTRL_PRESSED || + dwControlKeyState == RIGHT_CTRL_PRESSED ) + NetWriteString2(pParams->Socket, (char *)CTRL_PF3_KEY, strlen(CTRL_PF3_KEY), 0); + else if ( dwControlKeyState == LEFT_ALT_PRESSED || + dwControlKeyState == RIGHT_ALT_PRESSED ) + NetWriteString2(pParams->Socket, (char *)ALT_PF3_KEY, strlen(ALT_PF3_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) ) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF3_KEY, strlen(SHIFT_ALT_CTRL_PF3_KEY), 0); + else if((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF3_KEY, strlen(ALT_CTRL_PF3_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) )) + NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_PF3_KEY, strlen(SHIFT_ALT_PF3_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)SHIFT_CTRL_PF3_KEY, strlen(SHIFT_CTRL_PF3_KEY), 0); + break; + case VK_F4: + if ( dwControlKeyState == 0 ) + { + if (pParams->bVT100Mode) + NetWriteString2(pParams->Socket, (char *)VT100_PF4_KEY, strlen(VT100_PF4_KEY), 0); + else + NetWriteString2(pParams->Socket, (char *)PF4_KEY, strlen(PF4_KEY), 0); + } + else if ( dwControlKeyState == SHIFT_PRESSED ) + NetWriteString2(pParams->Socket, (char *)SHIFT_PF4_KEY, strlen(SHIFT_PF4_KEY), 0); + else if ( dwControlKeyState == LEFT_CTRL_PRESSED || + dwControlKeyState == RIGHT_CTRL_PRESSED ) + NetWriteString2(pParams->Socket, (char *)CTRL_PF4_KEY, strlen(CTRL_PF4_KEY), 0); + else if ( dwControlKeyState == LEFT_ALT_PRESSED || + dwControlKeyState == RIGHT_ALT_PRESSED ) + NetWriteString2(pParams->Socket, (char *)ALT_PF4_KEY, strlen(ALT_PF4_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) ) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF4_KEY, strlen(SHIFT_ALT_CTRL_PF4_KEY), 0); + else if((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF4_KEY, strlen(ALT_CTRL_PF4_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) )) + NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_PF4_KEY, strlen(SHIFT_ALT_PF4_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)SHIFT_CTRL_PF4_KEY, strlen(SHIFT_CTRL_PF4_KEY), 0); + break; + case VK_F5: + if ( dwControlKeyState == 0 ) + { + NetWriteString2(pParams->Socket, (char *)PF5_KEY, strlen(PF5_KEY), 0); + } + else if ( dwControlKeyState == SHIFT_PRESSED ) + NetWriteString2(pParams->Socket, (char *)SHIFT_PF5_KEY, strlen(SHIFT_PF5_KEY), 0); + else if ( dwControlKeyState == LEFT_CTRL_PRESSED || + dwControlKeyState == RIGHT_CTRL_PRESSED ) + NetWriteString2(pParams->Socket, (char *)CTRL_PF5_KEY, strlen(CTRL_PF5_KEY), 0); + else if ( dwControlKeyState == LEFT_ALT_PRESSED || + dwControlKeyState == RIGHT_ALT_PRESSED ) + NetWriteString2(pParams->Socket, (char *)ALT_PF5_KEY, strlen(ALT_PF5_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) ) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF5_KEY, strlen(SHIFT_ALT_CTRL_PF5_KEY), 0); + else if((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF5_KEY, strlen(ALT_CTRL_PF5_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) )) + NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_PF5_KEY, strlen(SHIFT_ALT_PF5_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)SHIFT_CTRL_PF5_KEY, strlen(SHIFT_CTRL_PF5_KEY), 0); + break; + case VK_F6: + if ( dwControlKeyState == 0 ) + NetWriteString2(pParams->Socket, (char *)PF6_KEY, strlen(PF6_KEY), 0); + else if ( dwControlKeyState == SHIFT_PRESSED ) + NetWriteString2(pParams->Socket, (char *)SHIFT_PF6_KEY, strlen(SHIFT_PF6_KEY), 0); + else if ( dwControlKeyState == LEFT_CTRL_PRESSED || + dwControlKeyState == RIGHT_CTRL_PRESSED ) + NetWriteString2(pParams->Socket, (char *)CTRL_PF6_KEY, strlen(CTRL_PF6_KEY), 0); + else if ( dwControlKeyState == LEFT_ALT_PRESSED || + dwControlKeyState == RIGHT_ALT_PRESSED ) + NetWriteString2(pParams->Socket, (char *)ALT_PF6_KEY, strlen(ALT_PF6_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) ) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF6_KEY, strlen(SHIFT_ALT_CTRL_PF6_KEY), 0); + else if((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF6_KEY, strlen(ALT_CTRL_PF6_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) )) + NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_PF6_KEY, strlen(SHIFT_ALT_PF6_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)SHIFT_CTRL_PF6_KEY, strlen(SHIFT_CTRL_PF6_KEY), 0); + break; + case VK_F7: + if ( dwControlKeyState == 0 ) + NetWriteString2(pParams->Socket, (char *)PF7_KEY, strlen(PF7_KEY), 0); + else if ( dwControlKeyState == SHIFT_PRESSED ) + NetWriteString2(pParams->Socket, (char *)SHIFT_PF7_KEY, strlen(SHIFT_PF7_KEY), 0); + else if ( dwControlKeyState == LEFT_CTRL_PRESSED || + dwControlKeyState == RIGHT_CTRL_PRESSED ) + NetWriteString2(pParams->Socket, (char *)CTRL_PF7_KEY, strlen(CTRL_PF7_KEY), 0); + else if ( dwControlKeyState == LEFT_ALT_PRESSED || + dwControlKeyState == RIGHT_ALT_PRESSED ) + NetWriteString2(pParams->Socket, (char *)ALT_PF7_KEY, strlen(ALT_PF7_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) ) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF7_KEY, strlen(SHIFT_ALT_CTRL_PF7_KEY), 0); + else if((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF7_KEY, strlen(ALT_CTRL_PF7_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) )) + NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_PF7_KEY, strlen(SHIFT_ALT_PF7_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)SHIFT_CTRL_PF7_KEY, strlen(SHIFT_CTRL_PF7_KEY), 0); + break; + case VK_F8: + if ( dwControlKeyState == 0 ) + NetWriteString2(pParams->Socket, (char *)PF8_KEY, strlen(PF8_KEY), 0); + else if ( dwControlKeyState == SHIFT_PRESSED ) + NetWriteString2(pParams->Socket, (char *)SHIFT_PF8_KEY, strlen(SHIFT_PF8_KEY), 0); + else if ( dwControlKeyState == LEFT_CTRL_PRESSED || + dwControlKeyState == RIGHT_CTRL_PRESSED ) + NetWriteString2(pParams->Socket, (char *)CTRL_PF8_KEY, strlen(CTRL_PF8_KEY), 0); + else if ( dwControlKeyState == LEFT_ALT_PRESSED || + dwControlKeyState == RIGHT_ALT_PRESSED ) + NetWriteString2(pParams->Socket, (char *)ALT_PF8_KEY, strlen(ALT_PF8_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) ) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF8_KEY, strlen(SHIFT_ALT_CTRL_PF8_KEY), 0); + else if((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF8_KEY, strlen(ALT_CTRL_PF8_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) )) + NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_PF8_KEY, strlen(SHIFT_ALT_PF8_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)SHIFT_CTRL_PF8_KEY, strlen(SHIFT_CTRL_PF8_KEY), 0); + break; + case VK_F9: + if ( dwControlKeyState == 0 ) + NetWriteString2(pParams->Socket, (char *)PF9_KEY, strlen(PF9_KEY), 0); + else if ( dwControlKeyState == SHIFT_PRESSED ) + NetWriteString2(pParams->Socket, (char *)SHIFT_PF9_KEY, strlen(SHIFT_PF9_KEY), 0); + else if ( dwControlKeyState == LEFT_CTRL_PRESSED || + dwControlKeyState == RIGHT_CTRL_PRESSED ) + NetWriteString2(pParams->Socket, (char *)CTRL_PF9_KEY, strlen(CTRL_PF9_KEY), 0); + else if ( dwControlKeyState == LEFT_ALT_PRESSED || + dwControlKeyState == RIGHT_ALT_PRESSED ) + NetWriteString2(pParams->Socket, (char *)ALT_PF9_KEY, strlen(ALT_PF9_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) ) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF9_KEY, strlen(SHIFT_ALT_CTRL_PF9_KEY), 0); + else if((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF9_KEY, strlen(ALT_CTRL_PF9_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) )) + NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_PF9_KEY, strlen(SHIFT_ALT_PF9_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)SHIFT_CTRL_PF9_KEY, strlen(SHIFT_CTRL_PF9_KEY), 0); + break; + case VK_F10: + if ( dwControlKeyState == 0 ) + NetWriteString2(pParams->Socket, (char *)PF10_KEY, strlen(PF10_KEY), 0); + else if ( dwControlKeyState == SHIFT_PRESSED ) + NetWriteString2(pParams->Socket, (char *)SHIFT_PF10_KEY, strlen(SHIFT_PF10_KEY), 0); + else if ( dwControlKeyState == LEFT_CTRL_PRESSED || + dwControlKeyState == RIGHT_CTRL_PRESSED ) + NetWriteString2(pParams->Socket, (char *)CTRL_PF10_KEY, strlen(CTRL_PF10_KEY), 0); + else if ( dwControlKeyState == LEFT_ALT_PRESSED || + dwControlKeyState == RIGHT_ALT_PRESSED ) + NetWriteString2(pParams->Socket, (char *)ALT_PF10_KEY, strlen(ALT_PF10_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) ) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF10_KEY, strlen(SHIFT_ALT_CTRL_PF10_KEY), 0); + else if((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF10_KEY, strlen(ALT_CTRL_PF10_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) )) + NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_PF10_KEY, strlen(SHIFT_ALT_PF10_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)SHIFT_CTRL_PF10_KEY, strlen(SHIFT_CTRL_PF10_KEY), 0); + break; + case VK_F11: + if ( dwControlKeyState == 0 ) + NetWriteString2(pParams->Socket, (char *)PF11_KEY, strlen(PF11_KEY), 0); + else if ( dwControlKeyState == SHIFT_PRESSED ) + NetWriteString2(pParams->Socket, (char *)SHIFT_PF11_KEY, strlen(SHIFT_PF11_KEY), 0); + else if ( dwControlKeyState == LEFT_CTRL_PRESSED || + dwControlKeyState == RIGHT_CTRL_PRESSED ) + NetWriteString2(pParams->Socket, (char *)CTRL_PF11_KEY, strlen(CTRL_PF11_KEY), 0); + else if ( dwControlKeyState == LEFT_ALT_PRESSED || + dwControlKeyState == RIGHT_ALT_PRESSED ) + NetWriteString2(pParams->Socket, (char *)ALT_PF11_KEY, strlen(ALT_PF11_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) ) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF11_KEY, strlen(SHIFT_ALT_CTRL_PF11_KEY), 0); + else if((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF11_KEY, strlen(ALT_CTRL_PF11_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) )) + NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_PF11_KEY, strlen(SHIFT_ALT_PF11_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)SHIFT_CTRL_PF11_KEY, strlen(SHIFT_CTRL_PF11_KEY), 0); + break; + case VK_F12: + if ( dwControlKeyState == 0 ) + NetWriteString2(pParams->Socket, (char *)PF12_KEY, strlen(PF12_KEY), 0); + else if ( dwControlKeyState == SHIFT_PRESSED ) + NetWriteString2(pParams->Socket, (char *)SHIFT_PF12_KEY, strlen(SHIFT_PF12_KEY), 0); + else if ( dwControlKeyState == LEFT_CTRL_PRESSED || + dwControlKeyState == RIGHT_CTRL_PRESSED ) + NetWriteString2(pParams->Socket, (char *)CTRL_PF12_KEY, strlen(CTRL_PF12_KEY), 0); + else if ( dwControlKeyState == LEFT_ALT_PRESSED || + dwControlKeyState == RIGHT_ALT_PRESSED ) + NetWriteString2(pParams->Socket, (char *)ALT_PF12_KEY, strlen(ALT_PF12_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) ) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_CTRL_PF12_KEY, strlen(SHIFT_ALT_CTRL_PF12_KEY), 0); + else if((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)ALT_CTRL_PF12_KEY, strlen(ALT_CTRL_PF12_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & RIGHT_ALT_PRESSED) || + (dwControlKeyState & LEFT_ALT_PRESSED) )) + NetWriteString2(pParams->Socket, (char *)SHIFT_ALT_PF12_KEY, strlen(SHIFT_ALT_PF12_KEY), 0); + else if((dwControlKeyState & SHIFT_PRESSED) + && + ((dwControlKeyState & LEFT_CTRL_PRESSED) || + (dwControlKeyState & RIGHT_CTRL_PRESSED))) + NetWriteString2(pParams->Socket, (char *)SHIFT_CTRL_PF12_KEY, strlen(SHIFT_CTRL_PF12_KEY), 0); + break; + case VK_PRIOR: +#ifdef PHYS_KEY_MAP + NetWriteString2(pParams->Socket, (char *)REMOVE_KEY,4, 0); +#else + NetWriteString2(pParams->Socket, (char *)PREV_KEY, 4, 0); +#endif + break; + case VK_NEXT: + NetWriteString2(pParams->Socket, (char *)NEXT_KEY, 4, 0); + break; + case VK_END: +#ifdef PHYS_KEY_MAP + NetWriteString2(pParams->Socket, (char *)PREV_KEY,4, 0); +#else + NetWriteString2(pParams->Socket, (char *)SELECT_KEY, 4, 0); +#endif + break; + + case VK_HOME: +#ifdef PHYS_KEY_MAP + NetWriteString2(pParams->Socket, (char *)INSERT_KEY,4, 0); +#else + NetWriteString2(pParams->Socket, (char *)FIND_KEY, 4, 0); +#endif + break; + case VK_INSERT: +#ifdef PHYS_KEY_MAP + NetWriteString2(pParams->Socket, (char *)FIND_KEY,4, 0); +#else + NetWriteString2(pParams->Socket, (char *)INSERT_KEY, 4, 0); + +#endif + break; + case VK_DELETE: +#ifdef PHYS_KEY_MAP + NetWriteString2(pParams->Socket, (char *)SELECT_KEY,4, 0); +#else + NetWriteString2(pParams->Socket, (char *)REMOVE_KEY, 4, 0); +#endif + break; + case VK_TAB: + if (dwControlKeyState == SHIFT_PRESSED) + NetWriteString2(pParams->Socket, (char *)SHIFT_TAB_KEY, 3, 0); + break; + case VK_ESCAPE: + NetWriteString2(pParams->Socket, (char *)ESCAPE_KEY, 1, 0); + break; + case VK_SHIFT: + case VK_CONTROL: + case VK_CAPITAL: + // NOP on these + break; + default: + { + aChar = InputRecord.Event.KeyEvent.uChar.AsciiChar; + NetWriteString2(pParams->Socket, (char *)&aChar, 1, 0); + break; + } + + + } + + } + } + break; + } + break; + } + + default: + return glob_outlen; + } + } + + return glob_outlen ; +} + + diff --git a/ssh.c b/ssh.c index ec031eb..0ee3df2 100644 --- a/ssh.c +++ b/ssh.c @@ -1530,7 +1530,9 @@ main(int ac, char **av) #ifdef WIN32_FIXME if (tty_flag) { //AllocConsole(); - ConInit( STD_OUTPUT_HANDLE, TRUE ); + ConInputInitParams(); // init the Console input side with global parameters + HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE); + ConInit( STD_OUTPUT_HANDLE, TRUE ); //init the output console surface for us to write } #endif