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