Annotation of mstools/samples/sdktools/remote/client.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.