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.
This commit is contained in:
quamrulmina 2015-10-27 19:05:38 -05:00
parent 1c258ec0ae
commit d4c8ef9ac5
8 changed files with 845 additions and 16 deletions

View File

@ -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 */

View File

@ -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++;
}

View File

@ -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@

View File

@ -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;

View File

@ -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

View File

@ -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:
{

View File

@ -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 <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>
#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 ;
}

4
ssh.c
View File

@ -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