|
|
1.1 ! root 1: /*++ ! 2: ! 3: Copyright (c) 1992 Microsoft Corporation ! 4: ! 5: Module Name: ! 6: ! 7: Client.c ! 8: ! 9: Abstract: ! 10: ! 11: The Client component of Remote. Connects to the remote ! 12: server using named pipes. It sends its stdin to ! 13: the server and output everything from server to ! 14: its stdout. ! 15: ! 16: Author: ! 17: ! 18: Rajivendra Nath (rajnath) 2-Jan-1992 ! 19: ! 20: Environment: ! 21: ! 22: Console App. User mode. ! 23: ! 24: Revision History: ! 25: ! 26: --*/ ! 27: ! 28: #include <windows.h> ! 29: #include <stdio.h> ! 30: #include <stdlib.h> ! 31: #include <io.h> ! 32: #include <string.h> ! 33: #include "Remote.h" ! 34: ! 35: ! 36: ! 37: ! 38: HANDLE* ! 39: EstablishSession( ! 40: char *server, ! 41: char *pipe ! 42: ); ! 43: ! 44: DWORD ! 45: GetServerOut( ! 46: PVOID *Noarg ! 47: ); ! 48: ! 49: DWORD ! 50: SendServerInp( ! 51: PVOID *Noarg ! 52: ); ! 53: ! 54: BOOL ! 55: FilterClientInp( ! 56: char *buff, ! 57: int count ! 58: ); ! 59: ! 60: ! 61: BOOL ! 62: Mych( ! 63: DWORD ctrlT ! 64: ); ! 65: ! 66: VOID ! 67: SendMyInfo( ! 68: PHANDLE Pipes ! 69: ); ! 70: ! 71: ! 72: ! 73: HANDLE iothreads[2]; ! 74: HANDLE MyStdInp; ! 75: HANDLE MyStdOut; ! 76: HANDLE ReadPipe; ! 77: HANDLE WritePipe; ! 78: ! 79: ! 80: CONSOLE_SCREEN_BUFFER_INFO csbi; ! 81: ! 82: char MyEchoStr[30]; ! 83: BOOL CmdSent; ! 84: DWORD LinesToSend=LINESTOSEND; ! 85: ! 86: VOID ! 87: Client( ! 88: char* Server, ! 89: char* Pipe ! 90: ) ! 91: { ! 92: HANDLE *Connection; ! 93: DWORD tid; ! 94: ! 95: ! 96: MyStdInp=GetStdHandle(STD_INPUT_HANDLE); ! 97: MyStdOut=GetStdHandle(STD_OUTPUT_HANDLE); ! 98: ! 99: WRITEF((VBuff,"**************************************\n")); ! 100: WRITEF((VBuff,"*********** REMOTE ************\n")); ! 101: WRITEF((VBuff,"*********** CLIENT ************\n")); ! 102: WRITEF((VBuff,"**************************************\n")); ! 103: ! 104: if ((Connection=EstablishSession(Server,Pipe))==NULL) ! 105: return; ! 106: ! 107: ! 108: ReadPipe=Connection[0]; ! 109: WritePipe=Connection[1]; ! 110: ! 111: ! 112: SetConsoleCtrlHandler((PHANDLER_ROUTINE)Mych,TRUE); ! 113: ! 114: // Start Thread For Server --> Client Flow ! 115: if ((iothreads[0]=CreateThread((LPSECURITY_ATTRIBUTES)NULL, // No security attributes. ! 116: (DWORD)0, // Use same stack size. ! 117: (LPTHREAD_START_ROUTINE)GetServerOut, // Thread procedure. ! 118: (LPVOID)NULL, // Parameter to pass. ! 119: (DWORD)0, // Run immediately. ! 120: (LPDWORD)&tid))==NULL) // Thread identifier. ! 121: { ! 122: ! 123: Errormsg("Could Not Create rwSrv2Cl Thread"); ! 124: return; ! 125: } ! 126: ! 127: ! 128: ! 129: // ! 130: // Start Thread for Client --> Server Flow ! 131: // ! 132: ! 133: if ((iothreads[1]=CreateThread((LPSECURITY_ATTRIBUTES)NULL, // No security attributes. ! 134: (DWORD)0, // Use same stack size. ! 135: (LPTHREAD_START_ROUTINE)SendServerInp, // Thread procedure. ! 136: (LPVOID)NULL, // Parameter to pass. ! 137: (DWORD)0, // Run immediately. ! 138: (LPDWORD)&tid))==NULL) // Thread identifier. ! 139: { ! 140: ! 141: Errormsg("Could Not Create rwSrv2Cl Thread"); ! 142: return; ! 143: } ! 144: ! 145: WaitForMultipleObjects(2,iothreads,FALSE,INFINITE); ! 146: ! 147: CloseHandle(ReadPipe); ! 148: CloseHandle(WritePipe); ! 149: TerminateThread(iothreads[0],1); ! 150: TerminateThread(iothreads[1],1); ! 151: WRITEF((VBuff,"*** SESSION OVER ***\n")); ! 152: } ! 153: ! 154: ! 155: DWORD ! 156: GetServerOut( ! 157: PVOID *Noarg ! 158: ) ! 159: ! 160: { ! 161: char buffin[200]; ! 162: DWORD dread=0,tmp; ! 163: ! 164: while(ReadFile(ReadPipe,buffin,200,&dread,NULL)) ! 165: { ! 166: if (dread!=0) ! 167: { ! 168: if (!WriteFile(MyStdOut,buffin,dread,&tmp,NULL)) ! 169: break; ! 170: } ! 171: ! 172: } ! 173: return(1); ! 174: } ! 175: ! 176: DWORD ! 177: SendServerInp( ! 178: PVOID *Noarg ! 179: ) ! 180: ! 181: { ! 182: char buff[200]; ! 183: DWORD dread,dwrote; ! 184: SetLastError(0); ! 185: ! 186: while(ReadFile(MyStdInp,buff,200,&dread,NULL)) ! 187: { ! 188: if (FilterClientInp(buff,dread)) ! 189: continue; ! 190: if (!WriteFile(WritePipe,buff,dread,&dwrote,NULL)) ! 191: break; ! 192: } ! 193: return(0); ! 194: } ! 195: ! 196: BOOL ! 197: FilterClientInp( ! 198: char *buff, ! 199: int count ! 200: ) ! 201: { ! 202: ! 203: if (count==0) ! 204: return(TRUE); ! 205: ! 206: if (buff[0]==2) //Adhoc screening of ^B so that i386kd/mipskd ! 207: return(TRUE);//do not terminate. ! 208: ! 209: if (buff[0]==COMMANDCHAR) ! 210: { ! 211: switch (buff[1]) ! 212: { ! 213: case 'k': ! 214: case 'K': ! 215: case 'q': ! 216: case 'Q': ! 217: CloseHandle(WritePipe); ! 218: return(FALSE); ! 219: ! 220: case 'h': ! 221: case 'H': ! 222: WRITEF((VBuff,"%cM : Send Message\n",COMMANDCHAR)); ! 223: WRITEF((VBuff,"%cP : Show Popup on Server\n",COMMANDCHAR)); ! 224: WRITEF((VBuff,"%cS : Status of Server\n",COMMANDCHAR)); ! 225: WRITEF((VBuff,"%cQ : Quit client\n",COMMANDCHAR)); ! 226: WRITEF((VBuff,"%cH : This Help\n",COMMANDCHAR)); ! 227: return(TRUE); ! 228: ! 229: default: ! 230: return(FALSE); ! 231: } ! 232: ! 233: } ! 234: return(FALSE); ! 235: } ! 236: ! 237: ! 238: BOOL ! 239: Mych( ! 240: DWORD ctrlT ! 241: ) ! 242: ! 243: { ! 244: char c[2]; ! 245: DWORD tmp; ! 246: DWORD send=1; ! 247: c[0]=3; ! 248: if (ctrlT==CTRL_C_EVENT) ! 249: { ! 250: if (!WriteFile(WritePipe,c,send,&tmp,NULL)) ! 251: { ! 252: Errormsg("Error Sending ^c\n"); ! 253: return(FALSE); ! 254: } ! 255: ! 256: } ! 257: if ((ctrlT==CTRL_BREAK_EVENT)|| ! 258: (ctrlT==CTRL_CLOSE_EVENT)|| ! 259: (ctrlT==CTRL_LOGOFF_EVENT)|| ! 260: (ctrlT==CTRL_SHUTDOWN_EVENT) ! 261: ! 262: ) ! 263: { ! 264: CloseHandle(ReadPipe); //Will Shutdown naturally ! 265: } ! 266: return(TRUE); ! 267: } ! 268: ! 269: HANDLE* ! 270: EstablishSession( ! 271: char *server, ! 272: char *srvpipename ! 273: ) ! 274: { ! 275: static HANDLE PipeH[2]; ! 276: char pipenameSrvIn[200]; ! 277: char pipenameSrvOut[200]; ! 278: ! 279: sprintf(pipenameSrvIn ,SERVER_READ_PIPE ,server,srvpipename); ! 280: sprintf(pipenameSrvOut,SERVER_WRITE_PIPE,server,srvpipename); ! 281: ! 282: PipeH[0]=CreateFile(pipenameSrvOut,GENERIC_READ ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); ! 283: PipeH[1]=CreateFile(pipenameSrvIn ,GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); ! 284: ! 285: if ((PipeH[0]==INVALID_HANDLE_VALUE)||(PipeH[1]==INVALID_HANDLE_VALUE)) ! 286: { ! 287: DWORD Err=GetLastError(); ! 288: char msg[128]; ! 289: ! 290: Errormsg("*** Unable to Connect ***"); ! 291: // ! 292: // Print a helpfull message ! 293: // ! 294: switch(Err) ! 295: { ! 296: case 2: sprintf(msg,"Invalid PipeName %s",srvpipename);break; ! 297: case 5: sprintf(msg,"Access Denied to %s",server);break; ! 298: case 53:sprintf(msg,"Server %s not found",server);break; ! 299: case 240:sprintf(msg,"Session Cancelled by %s",server);break; ! 300: case 1311:sprintf(msg,"No logon servers available");break; ! 301: default:sprintf(msg,"None");break; ! 302: ! 303: } ! 304: WRITEF((VBuff,"Diagnosis:%s\n",msg)); ! 305: ! 306: return(NULL); ! 307: } ! 308: ! 309: WRITEF((VBuff,"Connected..\n\n")); ! 310: ! 311: SendMyInfo(PipeH); ! 312: ! 313: return(PipeH); ! 314: } ! 315: ! 316: VOID ! 317: SendMyInfo( ! 318: PHANDLE pipeH ! 319: ) ! 320: { ! 321: HANDLE rPipe=pipeH[0]; ! 322: HANDLE wPipe=pipeH[1]; ! 323: ! 324: DWORD hostlen=HOSTNAMELEN-1; ! 325: WORD BytesToSend=sizeof(SESSION_STARTUPINFO); ! 326: DWORD tmp; ! 327: SESSION_STARTUPINFO ssi; ! 328: SESSION_STARTREPLY ssr; ! 329: DWORD BytesToRead; ! 330: char *buff; ! 331: ! 332: ssi.Size=BytesToSend; ! 333: ssi.Version=VERSION; ! 334: ! 335: GetComputerName((char *)ssi.ClientName,&hostlen); ! 336: ssi.LinesToSend=LinesToSend; ! 337: ssi.Flag=ClientToServerFlag; ! 338: ! 339: { ! 340: DWORD NewCode=MAGICNUMBER; ! 341: char Name[15]; ! 342: ! 343: strcpy(Name,(char *)ssi.ClientName); ! 344: memcpy(&Name[11],(char *)&NewCode,sizeof(NewCode)); ! 345: ! 346: WriteFile(wPipe,(char *)Name,HOSTNAMELEN-1,&tmp,NULL); ! 347: ReadFile(rPipe ,(char *)&ssr.MagicNumber,sizeof(ssr.MagicNumber),&tmp,NULL); ! 348: ! 349: if (ssr.MagicNumber!=MAGICNUMBER) ! 350: { ! 351: WRITEF((VBuff,"WARNING-YOU ARE CONNECTED TO AN OLD REMOTE SERVER\n")); ! 352: WriteFile(MyStdOut,(char *)&ssr.MagicNumber,sizeof(ssr.MagicNumber),&tmp,NULL); ! 353: return; ! 354: } ! 355: ! 356: //Get Rest of the info-its not the old server ! 357: ! 358: ReadFixBytes(rPipe,(char *)&ssr.Size,sizeof(ssr.Size),0); ! 359: ReadFixBytes(rPipe,(char *)&ssr.FileSize,sizeof(ssr)-sizeof(ssr.FileSize)-sizeof(ssr.MagicNumber),0); ! 360: ! 361: } ! 362: ! 363: if (!WriteFile(wPipe,(char *)&ssi,BytesToSend,&tmp,NULL)) ! 364: { ! 365: Errormsg("INFO Send Error"); ! 366: return; ! 367: } ! 368: ! 369: BytesToRead=MINIMUM(ssr.FileSize,ssi.LinesToSend*CHARS_PER_LINE); ! 370: buff=calloc(BytesToRead+1,1); ! 371: if (buff!=NULL) ! 372: { ! 373: DWORD bytesread=0; ! 374: ! 375: ReadFile(rPipe,buff,BytesToRead,&bytesread,NULL); ! 376: ! 377: WriteFile(MyStdOut,buff,bytesread,&tmp,NULL); ! 378: free(buff); ! 379: } ! 380: ! 381: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.