|
|
1.1 ! root 1: /*++ ! 2: ! 3: Copyright (c) 1993 Microsoft Corporation ! 4: ! 5: Module Name: ! 6: ! 7: Remote.c ! 8: ! 9: Abstract: ! 10: ! 11: This module contains the main() entry point for Remote. ! 12: Calls the Server or the Client depending on the first parameter. ! 13: ! 14: ! 15: Author: ! 16: ! 17: Rajivendra Nath (rajnath) 2-Jan-1993 ! 18: ! 19: Environment: ! 20: ! 21: Console App. User mode. ! 22: ! 23: Revision History: ! 24: ! 25: --*/ ! 26: ! 27: ! 28: #include <windows.h> ! 29: #include <stdio.h> ! 30: #include <stdlib.h> ! 31: #include "Remote.h" ! 32: ! 33: char HostName[HOSTNAMELEN]; ! 34: char* ChildCmd; ! 35: char* PipeName; ! 36: char* ServerName; ! 37: HANDLE MyOutHandle; ! 38: ! 39: BOOL IsAdvertise=TRUE; ! 40: DWORD ClientToServerFlag; ! 41: ! 42: char* ColorList[]={"black" ,"blue" ,"green" ,"cyan" ,"red" ,"purple" ,"yellow" ,"white", ! 43: "lblack","lblue","lgreen","lcyan","lred","lpurple","lyellow","lwhite"}; ! 44: ! 45: WORD ! 46: GetColorNum( ! 47: char* color ! 48: ); ! 49: ! 50: VOID ! 51: SetColor( ! 52: WORD attr ! 53: ); ! 54: ! 55: BOOL ! 56: GetNextConnectInfo( ! 57: char** SrvName, ! 58: char** PipeName ! 59: ); ! 60: ! 61: ! 62: ! 63: CONSOLE_SCREEN_BUFFER_INFO csbiOriginal; ! 64: ! 65: main( ! 66: int argc, ! 67: char** argv ! 68: ) ! 69: { ! 70: WORD RunType; // Server or Client end of Remote ! 71: DWORD len=HOSTNAMELEN-1; ! 72: int i; ! 73: ! 74: char sTitle[100]; // New Title ! 75: char orgTitle[100]; // Old Title ! 76: BOOL bSetAttrib=FALSE; // Change Console Attributes ! 77: BOOL bPromptForArgs=FALSE; // Is /P option ! 78: WORD wAttrib; // Console Attributes ! 79: ! 80: GetComputerName((LPTSTR)HostName,&len); ! 81: ! 82: MyOutHandle=GetStdHandle(STD_OUTPUT_HANDLE); ! 83: ! 84: GetConsoleScreenBufferInfo(MyOutHandle,&csbiOriginal); ! 85: ! 86: ! 87: ! 88: ! 89: ! 90: // ! 91: // Parameter Processing ! 92: // ! 93: // For Server: ! 94: // Remote /S <Executable> <PipeName> [Optional Params] ! 95: // ! 96: // For Client: ! 97: // Remote /C <Server Name> <PipeName> [Optional Params] ! 98: // or ! 99: // Remote /P ! 100: // This will loop continously prompting for different ! 101: // Servers and Pipename ! 102: ! 103: ! 104: if ((argc<2)||((argv[1][0]!='/')&&(argv[1][0]!='-'))) ! 105: { ! 106: ! 107: DisplayServerHlp(); ! 108: DisplayClientHlp(); ! 109: return(1); ! 110: } ! 111: ! 112: switch(argv[1][1]) ! 113: { ! 114: ! 115: case 'c': ! 116: case 'C': ! 117: ! 118: // ! 119: // Is Client End of Remote ! 120: // ! 121: ! 122: if ((argc<4)||((argv[1][0]!='/')&&(argv[1][0]!='-'))) ! 123: { ! 124: ! 125: DisplayServerHlp(); ! 126: DisplayClientHlp(); ! 127: return(1); ! 128: } ! 129: ! 130: ServerName=argv[2]; ! 131: PipeName=argv[3]; ! 132: ! 133: RunType=REMOTE_CLIENT; ! 134: break; ! 135: ! 136: ! 137: case 'p': ! 138: case 'P': ! 139: ! 140: // ! 141: // Is Client End of Remote ! 142: // ! 143: ! 144: bPromptForArgs=TRUE; ! 145: RunType=REMOTE_CLIENT; ! 146: break; ! 147: ! 148: ! 149: case 's': ! 150: case 'S': ! 151: // ! 152: // Is Server End of Remote ! 153: // ! 154: if ((argc<4)||((argv[1][0]!='/')&&(argv[1][0]!='-'))) ! 155: { ! 156: ! 157: DisplayServerHlp(); ! 158: DisplayClientHlp(); ! 159: return(1); ! 160: } ! 161: ! 162: ChildCmd=argv[2]; ! 163: PipeName=argv[3]; ! 164: ! 165: RunType=REMOTE_SERVER; ! 166: break; ! 167: ! 168: ! 169: default: ! 170: DisplayServerHlp(); ! 171: DisplayClientHlp(); ! 172: return(1); ! 173: } ! 174: ! 175: // ! 176: // Save Existing Values ! 177: // ! 178: ! 179: // ! 180: //Colors /f <ForeGround> /b <BackGround> ! 181: // ! 182: ! 183: wAttrib=csbiOriginal.wAttributes; ! 184: ! 185: // ! 186: //Title /T Title ! 187: // ! 188: ! 189: GetConsoleTitle(orgTitle,sizeof(orgTitle)); ! 190: ! 191: if (RunType==REMOTE_SERVER) ! 192: { ! 193: // ! 194: // Base Name of Executable ! 195: // For setting the title ! 196: // ! 197: ! 198: char *tcmd=ChildCmd; ! 199: ! 200: while ((*tcmd!=' ') &&(*tcmd!=0)) tcmd++; ! 201: while ((tcmd!=ChildCmd)&&(*tcmd!='\\'))tcmd--; ! 202: ! 203: sprintf(sTitle,"%8.8s [Remote /C %s %s]",tcmd,HostName,PipeName); ! 204: } ! 205: ! 206: // ! 207: //Process Common (Optional) Parameters ! 208: // ! 209: ! 210: for (i=4;i<argc;i++) ! 211: { ! 212: ! 213: if ((argv[i][0]!='/')&&(argv[i][0]!='-')) ! 214: { ! 215: WRITEF((VBuff,"Invalid parameter %s:Ignoring\n",argv[i])); ! 216: continue; ! 217: } ! 218: ! 219: switch(argv[i][1]) ! 220: { ! 221: case 'l': // Only Valid for client End ! 222: case 'L': // Max Number of Lines to recieve from Server ! 223: i++; ! 224: if (i>=argc) ! 225: { ! 226: WRITEF((VBuff,"Incomplete Param %s..Ignoring\n",argv[i-1])); ! 227: break; ! 228: } ! 229: LinesToSend=(DWORD)atoi(argv[i])+1; ! 230: break; ! 231: ! 232: case 't': // Title to be set instead of the default ! 233: case 'T': ! 234: i++; ! 235: if (i>=argc) ! 236: { ! 237: WRITEF((VBuff,"Incomplete Param %s..Ignoring\n",argv[i-1])); ! 238: break; ! 239: } ! 240: sprintf(sTitle,"%s",argv[i]); ! 241: break; ! 242: ! 243: case 'b': // Background color ! 244: case 'B': ! 245: i++; ! 246: if (i>=argc) ! 247: { ! 248: WRITEF((VBuff,"Incomplete Param %s..Ignoring\n",argv[i-1])); ! 249: break; ! 250: } ! 251: { ! 252: WORD col=GetColorNum(argv[i]); ! 253: if (col!=0xffff) ! 254: { ! 255: bSetAttrib=TRUE; ! 256: wAttrib=col<<4|(wAttrib&0x000f); ! 257: } ! 258: break; ! 259: } ! 260: ! 261: case 'f': // Foreground color ! 262: case 'F': ! 263: i++; ! 264: if (i>=argc) ! 265: { ! 266: WRITEF((VBuff,"Incomplete Param %s..Ignoring\n",argv[i-1])); ! 267: break; ! 268: } ! 269: { ! 270: WORD col=GetColorNum(argv[i]); ! 271: if (col!=0xffff) ! 272: { ! 273: bSetAttrib=TRUE; ! 274: wAttrib=col|(wAttrib&0x00f0); ! 275: } ! 276: break; ! 277: } ! 278: ! 279: case 'q': ! 280: case 'Q': ! 281: IsAdvertise=FALSE; ! 282: ClientToServerFlag|=0x80000000; ! 283: break; ! 284: ! 285: default: ! 286: WRITEF((VBuff,"Unknown Parameter=%s %s\n",argv[i-1],argv[i])); ! 287: break; ! 288: ! 289: } ! 290: ! 291: } ! 292: ! 293: // ! 294: //Now Set various Parameters ! 295: // ! 296: ! 297: // ! 298: //Colors ! 299: // ! 300: ! 301: SetColor(wAttrib); ! 302: ! 303: if (RunType==REMOTE_CLIENT) ! 304: { ! 305: BOOL done=FALSE; ! 306: ! 307: // ! 308: // Set Client end defaults and start client ! 309: // ! 310: ! 311: ! 312: ! 313: while(!done) ! 314: { ! 315: if (!bPromptForArgs || ! 316: GetNextConnectInfo(&ServerName,&PipeName) ! 317: ) ! 318: { ! 319: sprintf(sTitle,"Remote /C %s %s",ServerName,PipeName); ! 320: SetConsoleTitle(sTitle); ! 321: ! 322: // ! 323: // Start Client (Client.C) ! 324: // ! 325: Client(ServerName,PipeName); ! 326: } ! 327: done=!bPromptForArgs; ! 328: } ! 329: } ! 330: ! 331: if (RunType==REMOTE_SERVER) ! 332: { ! 333: SetConsoleTitle(sTitle); ! 334: ! 335: // ! 336: // Start Server (Server.C) ! 337: // ! 338: Server(ChildCmd,PipeName); ! 339: } ! 340: ! 341: // ! 342: //Reset Colors ! 343: // ! 344: SetColor(csbiOriginal.wAttributes); ! 345: SetConsoleTitle(orgTitle); ! 346: ! 347: ExitProcess(0); ! 348: } ! 349: /*************************************************************/ ! 350: VOID ! 351: ErrorExit( ! 352: char* str ! 353: ) ! 354: { ! 355: WRITEF((VBuff,"Error-%d:%s\n",GetLastError(),str)); ! 356: ExitProcess(1); ! 357: } ! 358: /*************************************************************/ ! 359: DWORD ! 360: ReadFixBytes( ! 361: HANDLE hRead, ! 362: char* Buffer, ! 363: DWORD ToRead, ! 364: DWORD TimeOut //ignore for timebeing ! 365: ) ! 366: { ! 367: DWORD xyzBytesRead=0; ! 368: DWORD xyzBytesToRead=ToRead; ! 369: char* xyzbuff=Buffer; ! 370: ! 371: while(xyzBytesToRead!=0) ! 372: { ! 373: if (!ReadFile(hRead,xyzbuff,xyzBytesToRead,&xyzBytesRead,NULL)) ! 374: { ! 375: return(xyzBytesToRead); ! 376: } ! 377: ! 378: xyzBytesToRead-=xyzBytesRead; ! 379: xyzbuff+=xyzBytesRead; ! 380: } ! 381: return(0); ! 382: ! 383: } ! 384: /*************************************************************/ ! 385: VOID ! 386: DisplayClientHlp() ! 387: { ! 388: WRITEF((VBuff,"\n To Start the CLIENT end of REMOTE\n")); ! 389: WRITEF((VBuff," ---------------------------------\n")); ! 390: WRITEF((VBuff," Syntax : REMOTE /C <ServerName> <Unique Id> [Param]\n")); ! 391: WRITEF((VBuff," Example: REMOTE /C rajnathX86 imbroglio\n")); ! 392: WRITEF((VBuff," This would connect to a server session on \n")); ! 393: WRITEF((VBuff," rajnathX86 with id \"imbroglio\" if there was a\n")); ! 394: WRITEF((VBuff," REMOTE /S <\"Cmd\"> imbroglio\n")); ! 395: WRITEF((VBuff," started on the machine rajnathX86.\n\n")); ! 396: WRITEF((VBuff," To Exit: %cQ (Leaves the Remote Server Running)\n",COMMANDCHAR)); ! 397: WRITEF((VBuff," [Param]: /L <# of Lines to Get>\n")); ! 398: WRITEF((VBuff," [Param]: /F <Foreground color eg blue, lred..>\n")); ! 399: WRITEF((VBuff," [Param]: /B <Background color eg cyan, lwhite..>\n")); ! 400: WRITEF((VBuff,"\n")); ! 401: } ! 402: /*************************************************************/ ! 403: ! 404: VOID ! 405: DisplayServerHlp() ! 406: { ! 407: WRITEF((VBuff,"\n To Start the SERVER end of REMOTE\n")); ! 408: WRITEF((VBuff," ---------------------------------\n")); ! 409: WRITEF((VBuff," Syntax : REMOTE /S <\"Cmd\"> <Unique Id> [Param]\n")); ! 410: WRITEF((VBuff," Example: REMOTE /S \"i386kd -v\" imbroglio\n")); ! 411: WRITEF((VBuff," To interact with this \"Cmd\" \n")); ! 412: WRITEF((VBuff," from some other machine\n")); ! 413: WRITEF((VBuff," - start the client end by:\n")); ! 414: WRITEF((VBuff," REMOTE /C %s imbroglio\n\n",HostName)); ! 415: WRITEF((VBuff," To Exit: %cK \n",COMMANDCHAR)); ! 416: WRITEF((VBuff," [Param]: /F <Foreground color eg yellow, black..>\n")); ! 417: WRITEF((VBuff," [Param]: /B <Background color eg lblue, white..>\n")); ! 418: WRITEF((VBuff,"\n")); ! 419: ! 420: } ! 421: ! 422: WORD ! 423: GetColorNum( ! 424: char *color ! 425: ) ! 426: { ! 427: int i; ! 428: ! 429: strlwr(color); ! 430: for (i=0;i<16;i++) ! 431: { ! 432: if (strcmp(ColorList[i],color)==0) ! 433: { ! 434: return(i); ! 435: } ! 436: } ! 437: return ((WORD)atoi(color)); ! 438: } ! 439: ! 440: VOID ! 441: SetColor( ! 442: WORD attr ! 443: ) ! 444: { ! 445: COORD origin={0,0}; ! 446: DWORD dwrite; ! 447: FillConsoleOutputAttribute ! 448: ( ! 449: MyOutHandle,attr,csbiOriginal.dwSize. ! 450: X*csbiOriginal.dwSize.Y,origin,&dwrite ! 451: ); ! 452: SetConsoleTextAttribute(MyOutHandle,attr); ! 453: } ! 454: ! 455: BOOL ! 456: GetNextConnectInfo( ! 457: char** SrvName, ! 458: char** PipeName ! 459: ) ! 460: { ! 461: static char szServerName[32]; ! 462: static char szPipeName[32]; ! 463: ! 464: try ! 465: { ! 466: ZeroMemory(szServerName,32); ! 467: ZeroMemory(szPipeName,32); ! 468: SetConsoleTitle("Remote - Prompting for next Connection"); ! 469: WRITEF((VBuff,"Debugger machine (server): ")); ! 470: fflush(stdout); ! 471: ! 472: if (((*SrvName=gets(szServerName))==NULL)|| ! 473: (strlen(szServerName)==0)) ! 474: { ! 475: return(FALSE); ! 476: } ! 477: ! 478: if (szServerName[0] == COMMANDCHAR && ! 479: (szServerName[1] == 'q' || szServerName[1] == 'Q') ! 480: ) ! 481: { ! 482: return(FALSE); ! 483: } ! 484: ! 485: WRITEF((VBuff,"Debuggee machine : ")); ! 486: fflush(stdout); ! 487: ! 488: if ((*PipeName=gets(szPipeName))==NULL) ! 489: { ! 490: return(FALSE); ! 491: } ! 492: if (szPipeName[0] == COMMANDCHAR && ! 493: (szPipeName[1] == 'q' || szPipeName[1] == 'Q') ! 494: ) ! 495: { ! 496: return(FALSE); ! 497: } ! 498: WRITEF((VBuff,"\n\n")); ! 499: } ! 500: ! 501: except(EXCEPTION_EXECUTE_HANDLER) ! 502: { ! 503: return(FALSE); // Ignore exceptions ! 504: } ! 505: return(TRUE); ! 506: } ! 507: ! 508: ! 509: /*************************************************************/ ! 510: VOID ! 511: Errormsg( ! 512: char* str ! 513: ) ! 514: { ! 515: WRITEF((VBuff,"Error (%d) - %s\n",GetLastError(),str)); ! 516: } ! 517: ! 518: /*************************************************************/
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.