|
|
1.1 ! root 1: /*++ ! 2: ! 3: Copyright (c) 1992 Microsoft Corporation ! 4: ! 5: Module Name: ! 6: ! 7: Server.c ! 8: ! 9: Abstract: ! 10: ! 11: The server component of Remote. It spawns a child process ! 12: and redirects the stdin/stdout/stderr of child to itself. ! 13: Waits for connections from clients - passing the ! 14: output of child process to client and the input from clients ! 15: to child process. ! 16: ! 17: Author: ! 18: ! 19: Rajivendra Nath (rajnath) 2-Jan-1992 ! 20: ! 21: Environment: ! 22: ! 23: Console App. User mode. ! 24: ! 25: Revision History: ! 26: ! 27: --*/ ! 28: ! 29: #include <windows.h> ! 30: #include <stdio.h> ! 31: #include <stdlib.h> ! 32: #include <io.h> ! 33: #include <string.h> ! 34: #include "Remote.h" ! 35: ! 36: #define MAX_SESSION 10 ! 37: ! 38: #define COMMANDFORMAT "%c%-15s [%-15s %d:%d]\n%c" ! 39: #define LOCALNAME "Local" ! 40: #define LOCALCLIENT(x) (strcmp((char *)(x->Name),LOCALNAME)==0) ! 41: #define RemoteInfo(prt,flg) {if (!(flg&&0x80000000)) prt;} ! 42: ! 43: #define CMDSTRING(OutBuff,InpBuff,Client,sTime) \ ! 44: { \ ! 45: /* int xxlen; */ \ ! 46: sprintf \ ! 47: ( \ ! 48: &OutBuff[0],COMMANDFORMAT,\ ! 49: BEGINMARK,InpBuff, \ ! 50: Client->Name,sTime.wHour, \ ! 51: sTime.wMinute,ENDMARK \ ! 52: ); \ ! 53: } \ ! 54: ! 55: #define BUFFSIZE 256 ! 56: ! 57: SESSION_TYPE ClientList[MAX_SESSION]; ! 58: ! 59: HANDLE ChildStdInp; //Server Writes to it ! 60: HANDLE ChildStdOut; //Server Reads from it ! 61: HANDLE ChildStdErr; //Server Reads from it ! 62: ! 63: HANDLE SaveFile; //File containing all that was ! 64: //output by child process. ! 65: //Each connection opens a handle to this file ! 66: //and is sent through PipeWriteH. ! 67: ! 68: char SaveFileName[64]; //Name of above file - all new sessions need ! 69: HANDLE ChldProc; //Handle to the Child Process ! 70: HANDLE ListenThreadH; //Handle to the thread listening for connections ! 71: //from Remote Clients. ! 72: ! 73: HANDLE ! 74: ForkChildProcess( // Creates a new process ! 75: char *cmd, // Redirects its stdin,stdout ! 76: PHANDLE in, // and stderr - returns the ! 77: PHANDLE out, // corresponding pipe ends. Using currently ! 78: PHANDLE err ! 79: ); ! 80: ! 81: HANDLE ! 82: OldForkChildProcess( //Same as above except different ! 83: char *cmd, //method for redirection. Not Used. ! 84: PHANDLE in, ! 85: PHANDLE out, ! 86: PHANDLE err ! 87: ); ! 88: ! 89: DWORD ! 90: ListenForSession( //THREAD:Listens for new connections and ! 91: char* pipe //spawns of new seesions - Updates the ! 92: ); //Status in Client DataStructure. Seperate Thread. ! 93: ! 94: DWORD ! 95: NewSession( //Manages the session with a client. ! 96: SESSION_TYPE* Client ! 97: ); ! 98: ! 99: DWORD //2 THREAD:Each reads either ! 100: GetChldOutput( //StdOut or StdErr of child and ! 101: HANDLE rhandle //writes to SaveFile. Seperate Thread. ! 102: ); ! 103: ! 104: DWORD ! 105: TransferFileToClient( //X THREADS:Reads the save ! 106: SESSION_TYPE* Client //file and sendsoutput to a client. Seperate Thread ! 107: ); ! 108: ! 109: ! 110: DWORD ! 111: GetClientInput( //Times X THREADS:Gets input from Child pipe ! 112: SESSION_TYPE* Client //and sends to childs StdIn. Seperate Thread. ! 113: ); ! 114: ! 115: ! 116: BOOL ! 117: FilterCommand( //Filters input from client ! 118: SESSION_TYPE *cl, //for commands intended for REMOTE ! 119: char *buff, ! 120: int dread ! 121: ); ! 122: ! 123: DWORD // Manages the IO with user ! 124: LocalSession( // For the remote server. Seperate Thread. ! 125: PVOID noarg ! 126: ); ! 127: ! 128: DWORD // Manages the IO with Remote Client. ! 129: RemoteSession( ! 130: SESSION_TYPE* Client ! 131: ); ! 132: ! 133: BOOL // Ctrl-C handler ! 134: SrvCtrlHand( ! 135: DWORD event ! 136: ); ! 137: ! 138: VOID // @s command to remote ! 139: SendStatus( ! 140: HANDLE hClientPipe ! 141: ); ! 142: ! 143: DWORD // @p command to remote ! 144: ShowPopup( ! 145: char *mssg ! 146: ); ! 147: ! 148: VOID // Removes the command begin and end markers ! 149: RemoveInpMark( // from the save file. ! 150: char* Buff, ! 151: DWORD Size ! 152: ); ! 153: ! 154: VOID // Cleans up the session ! 155: CloseClient( // once it ends. ! 156: SESSION_TYPE *Client ! 157: ); ! 158: // Initialises the Client datastructs ! 159: VOID ! 160: InitClientList( ! 161: ); ! 162: ! 163: ! 164: /*************************************************************/ ! 165: /* The main entry point for the Server End of Remote */ ! 166: /*************************************************************/ ! 167: VOID ! 168: Server( ! 169: char* ChildCmd, ! 170: char* PipeName ! 171: ) ! 172: { ! 173: DWORD ThreadID ; ! 174: HANDLE WaitH[3]; ! 175: DWORD WaitObj; ! 176: char tmpdir[32]; ! 177: ! 178: WRITEF((VBuff,"**************************************\n")); ! 179: WRITEF((VBuff,"*********** REMOTE ************\n")); ! 180: WRITEF((VBuff,"*********** SERVER ************\n")); ! 181: WRITEF((VBuff,"**************************************\n")); ! 182: WRITEF((VBuff,"To Connect: Remote /C %s %s\n\n",HostName,PipeName)); ! 183: ! 184: InitClientList(); ! 185: ! 186: // ! 187: //Start the command as a child process ! 188: // ! 189: ! 190: ChldProc=ForkChildProcess(ChildCmd,&ChildStdInp,&ChildStdOut,&ChildStdErr); ! 191: ! 192: // ! 193: //Create a tempfile for storing Child process output. ! 194: // ! 195: { ! 196: DWORD size=sizeof(tmpdir); ! 197: if ( ! 198: (GetEnvironmentVariable("TMP" ,tmpdir,size)==0)&& ! 199: (GetEnvironmentVariable("TEMP",tmpdir,size)==0) ! 200: ) ! 201: { ! 202: sprintf(tmpdir,"%s","."); ! 203: } ! 204: if (!GetTempFileName(tmpdir,"REMOTE",0,SaveFileName)) ! 205: GetTempFileName(".","REMOTE",0,SaveFileName); ! 206: } ! 207: ! 208: ! 209: if ((SaveFile=CreateFile ! 210: ( ! 211: (LPCTSTR)SaveFileName, /* address of name of the file */ ! 212: GENERIC_READ|GENERIC_WRITE, /* access (read/write) mode */ ! 213: FILE_SHARE_READ|FILE_SHARE_WRITE,/* share mode */ ! 214: (LPSECURITY_ATTRIBUTES)NULL, /* security descriptor */ ! 215: CREATE_ALWAYS, /* how to create */ ! 216: FILE_ATTRIBUTE_NORMAL, /* File Attribute */ ! 217: (HANDLE)NULL) ! 218: )==NULL) ! 219: { ! 220: TerminateProcess(ChldProc,0); ! 221: ErrorExit("Could not Create Output File"); ! 222: } ! 223: ! 224: ! 225: // ! 226: //Start 2 threads to save the output from stdout and stderr of cmd to savefile. ! 227: // ! 228: ! 229: if ((WaitH[0]=CreateThread ! 230: ( ! 231: (LPSECURITY_ATTRIBUTES)NULL, // No security attributes. ! 232: (DWORD)0, // Use same stack size. ! 233: (LPTHREAD_START_ROUTINE)GetChldOutput, // Thread procedure. ! 234: (LPVOID)ChildStdErr, // Parameter to pass. ! 235: (DWORD)0, // Run immediately. ! 236: (LPDWORD)&ThreadID) ! 237: )==NULL) ! 238: { ! 239: ! 240: TerminateProcess(ChldProc,0); ! 241: ErrorExit("Failed to Create GetGhldOutput#1 Thread"); ! 242: } ! 243: ! 244: ! 245: if ((WaitH[1]=CreateThread ! 246: ( ! 247: (LPSECURITY_ATTRIBUTES)NULL, // No security attributes. ! 248: (DWORD)0, // Use same stack size. ! 249: (LPTHREAD_START_ROUTINE)GetChldOutput, // Thread procedure. ! 250: (LPVOID)ChildStdOut, // Parameter to pass. ! 251: (DWORD)0, // Run immediately. ! 252: (LPDWORD)&ThreadID) ! 253: )==NULL) ! 254: { ! 255: ! 256: TerminateProcess(ChldProc,0); ! 257: ErrorExit("Failed to Create GetGhldOutput#2 Thread"); ! 258: } ! 259: ! 260: ! 261: // ! 262: //Start Thread to listen for new Connections ! 263: // ! 264: ! 265: if ((ListenThreadH=CreateThread ! 266: ( ! 267: (LPSECURITY_ATTRIBUTES)NULL, // No security attributes. ! 268: (DWORD)0, // Use same stack size. ! 269: (LPTHREAD_START_ROUTINE)ListenForSession, // Thread procedure. ! 270: (LPVOID)PipeName, // Parameter to pass. ! 271: (DWORD)0, // Run immediately. ! 272: (LPDWORD)&ThreadID) ! 273: )==NULL) ! 274: { ! 275: ! 276: TerminateProcess(ChldProc,0); ! 277: ErrorExit("Failed To Create ListenForSession Thread"); ! 278: ! 279: } ! 280: ! 281: // ! 282: //Start Local Thread ! 283: // ! 284: ! 285: if ((ClientList[0].hThread=CreateThread ! 286: ( ! 287: (LPSECURITY_ATTRIBUTES)NULL, // No security attributes. ! 288: (DWORD)0, // Use same stack size. ! 289: (LPTHREAD_START_ROUTINE)LocalSession, // Thread procedure. ! 290: (LPVOID)NULL, // Parameter to pass. ! 291: (DWORD)0, // Run immediately. ! 292: (LPDWORD)&ThreadID) ! 293: )==NULL) ! 294: { ! 295: ! 296: TerminateProcess(ChldProc,0); ! 297: ErrorExit("Failed To Create ListenForSession Thread"); ! 298: ! 299: } ! 300: ! 301: SetConsoleCtrlHandler((PHANDLER_ROUTINE)SrvCtrlHand,TRUE); ! 302: ! 303: WaitH[2]=ChldProc; ! 304: ! 305: // ! 306: // Wait until the child process terminates ! 307: // or local IO thread terminates ! 308: // or IO with child process ends ! 309: // ! 310: ! 311: WaitObj=WaitForMultipleObjects(3,WaitH,FALSE,INFINITE); ! 312: ! 313: switch (WaitObj-WAIT_OBJECT_0) ! 314: { ! 315: case 0: // Error Writing to savefile ! 316: case 1: ! 317: TerminateProcess(ChldProc,0); ! 318: break; ! 319: case 2: // Child Proc Terminated ! 320: break; ! 321: ! 322: default: // Out of Some Resource ! 323: printf("Out of Resource Error %d..Terminating\n",GetLastError()); ! 324: break; ! 325: ! 326: } ! 327: ! 328: TerminateThread(ListenThreadH,0); ! 329: ! 330: CloseHandle(ChildStdInp); ! 331: CloseHandle(ChildStdOut); ! 332: CloseHandle(ChildStdErr); ! 333: ! 334: WRITEF((VBuff,"\nRemote:Parent exiting. Child(%s) dead..\n",ChildCmd)); ! 335: ! 336: CloseHandle(SaveFile); ! 337: ! 338: { ! 339: int i; ! 340: for (i=0;i<MAX_SESSION;i++) ! 341: CloseClient(&ClientList[i]); ! 342: } ! 343: ! 344: if (!DeleteFile(SaveFileName)) ! 345: WRITEF((VBuff,"Temp File %s not deleted..\n",SaveFileName)); ! 346: ! 347: return; ! 348: } ! 349: /*************************************************************/ ! 350: /* Creates the child process and redirects its std.IO handles*/ ! 351: /*************************************************************/ ! 352: HANDLE ! 353: ForkChildProcess( // Creates a new process ! 354: char *cmd, // Redirects its stdin,stdout ! 355: PHANDLE inH, // and stderr - returns the ! 356: PHANDLE outH, // corresponding pipe ends. ! 357: PHANDLE errH ! 358: ) ! 359: { ! 360: SECURITY_ATTRIBUTES lsa; ! 361: STARTUPINFO si; ! 362: PROCESS_INFORMATION pi; ! 363: ! 364: HANDLE ChildIn; ! 365: HANDLE ChildOut; ! 366: HANDLE ChildErr; ! 367: ! 368: lsa.nLength=sizeof(SECURITY_ATTRIBUTES); ! 369: lsa.lpSecurityDescriptor=NULL; ! 370: lsa.bInheritHandle=TRUE; ! 371: ! 372: // ! 373: //Create Parent_Write to ChildStdIn Pipe ! 374: // ! 375: ! 376: if (!CreatePipe(&ChildIn,inH,&lsa,0)) ! 377: ErrorExit("Could Not Create Parent-->Child Pipe"); ! 378: ! 379: // ! 380: //Create ChildStdOut to Parent_Read pipe ! 381: // ! 382: ! 383: if (!CreatePipe(outH,&ChildOut,&lsa,0)) ! 384: ErrorExit("Could Not Create Child-->Parent Pipe"); ! 385: ! 386: // ! 387: //Create ChildStdOut to Parent_Read pipe ! 388: // ! 389: ! 390: if (!CreatePipe(errH,&ChildErr,&lsa,0)) ! 391: ErrorExit("Could Not Create Child-->Parent Pipe"); ! 392: ! 393: // ! 394: // Lets Redirect Console StdHandles - easy enough ! 395: // ! 396: ! 397: ! 398: si.cb=sizeof(STARTUPINFO); ! 399: si.lpReserved=NULL; ! 400: si.lpTitle=NULL; ! 401: si.lpDesktop=NULL; ! 402: si.dwX=si.dwY=si.dwYSize=si.dwXSize=0; ! 403: si.dwFlags=STARTF_USESTDHANDLES; ! 404: si.hStdInput =ChildIn; ! 405: si.hStdOutput=ChildOut; ! 406: si.hStdError =ChildErr; ! 407: si.wShowWindow=SW_SHOW; ! 408: si.lpReserved2=NULL; ! 409: si.cbReserved2=0; ! 410: ! 411: // ! 412: //Create Child Process ! 413: // ! 414: ! 415: if (!CreateProcess ! 416: ( ! 417: NULL, ! 418: cmd, ! 419: NULL, ! 420: NULL, ! 421: TRUE, ! 422: NORMAL_PRIORITY_CLASS, ! 423: NULL, ! 424: NULL, ! 425: &si, ! 426: &pi) ! 427: ) ! 428: { ! 429: if (GetLastError()==2) ! 430: WRITEF((VBuff,"Executable %s not found\n",cmd)); ! 431: ErrorExit("Could Not Create Child Process"); ! 432: } ! 433: ! 434: // ! 435: //Close unneccesary Handles and Restore the crt handles ! 436: // ! 437: ! 438: CloseHandle(ChildIn); ! 439: CloseHandle(ChildOut); ! 440: CloseHandle(ChildErr); ! 441: ! 442: return(pi.hProcess); ! 443: } ! 444: /*************************************************************/ ! 445: /* Same as above but uses different method of IO redir. */ ! 446: /* Not used now */ ! 447: /*************************************************************/ ! 448: HANDLE ! 449: OldForkChildProcess( ! 450: char *cmd, ! 451: PHANDLE inH, ! 452: PHANDLE outH, ! 453: PHANDLE errH ! 454: ) ! 455: { ! 456: SECURITY_ATTRIBUTES lsa; ! 457: STARTUPINFO si; ! 458: PROCESS_INFORMATION pi; ! 459: ! 460: HANDLE OldStdIn =GetStdHandle(STD_INPUT_HANDLE); ! 461: HANDLE OldStdOut=GetStdHandle(STD_OUTPUT_HANDLE); ! 462: HANDLE OldStdErr=GetStdHandle(STD_ERROR_HANDLE); ! 463: ! 464: HANDLE ChildStdIn; ! 465: HANDLE ChildStdOut; ! 466: HANDLE ChildStdErr; ! 467: ! 468: lsa.nLength=sizeof(SECURITY_ATTRIBUTES); ! 469: lsa.lpSecurityDescriptor=NULL; ! 470: lsa.bInheritHandle=TRUE; ! 471: ! 472: //Create Parent_Write to ChildStdIn Pipe ! 473: if (!CreatePipe(&ChildStdIn,inH,&lsa,0)) ! 474: ErrorExit("Could Not Create Parent-->Child Pipe"); ! 475: ! 476: //Create ChildStdOut to Parent_Read pipe ! 477: if (!CreatePipe(outH,&ChildStdOut,&lsa,0)) ! 478: ErrorExit("Could Not Create Child-->Parent Pipe"); ! 479: ! 480: //Create ChildStdOut to Parent_Read pipe ! 481: if (!CreatePipe(errH,&ChildStdErr,&lsa,0)) ! 482: ErrorExit("Could Not Create Child-->Parent Pipe"); ! 483: ! 484: //Make ChildStdIn and Out as standard handles and get it inherited by child ! 485: if (!SetStdHandle(STD_INPUT_HANDLE,ChildStdIn)) ! 486: ErrorExit("Could not change StdIn"); ! 487: ! 488: if (!SetStdHandle(STD_OUTPUT_HANDLE,ChildStdOut)) ! 489: ErrorExit("Could Not change StdOut"); ! 490: ! 491: if (!SetStdHandle(STD_ERROR_HANDLE,ChildStdErr)) ! 492: ErrorExit("Could Not change StdErr"); ! 493: ! 494: si.cb=sizeof(STARTUPINFO); ! 495: si.lpReserved=NULL; ! 496: si.lpTitle=NULL; ! 497: si.lpDesktop=NULL; ! 498: si.dwX=si.dwY=si.dwYSize=si.dwXSize=si.dwFlags=0L; ! 499: si.wShowWindow=SW_SHOW; ! 500: si.lpReserved2=NULL; ! 501: si.cbReserved2=0; ! 502: ! 503: //Create Child Process ! 504: if (!CreateProcess ! 505: ( ! 506: NULL, ! 507: cmd, ! 508: NULL, ! 509: NULL, ! 510: TRUE, ! 511: NORMAL_PRIORITY_CLASS, ! 512: NULL, ! 513: NULL, ! 514: &si, ! 515: &pi) ! 516: ) ! 517: { ! 518: ErrorExit("Could Not Create Child Process"); ! 519: } ! 520: ! 521: //reset StdIn StdOut ! 522: if (!SetStdHandle(STD_INPUT_HANDLE,OldStdIn)) ! 523: { ! 524: TerminateProcess(pi.hProcess,1); ! 525: ErrorExit("Could not RESET StdIn"); ! 526: } ! 527: ! 528: if (!SetStdHandle(STD_OUTPUT_HANDLE,OldStdOut)) ! 529: { ! 530: TerminateProcess(pi.hProcess,1); ! 531: ErrorExit("Could not RESET StdIn"); ! 532: } ! 533: ! 534: if (!SetStdHandle(STD_ERROR_HANDLE,OldStdErr)) ! 535: { ! 536: TerminateProcess(pi.hProcess,1); ! 537: ErrorExit("Could not RESET StdIn"); ! 538: } ! 539: ! 540: //Close unneccesary Handles ! 541: CloseHandle(ChildStdIn); ! 542: CloseHandle(ChildStdOut); ! 543: CloseHandle(ChildStdErr); ! 544: ! 545: return(pi.hProcess); ! 546: } ! 547: /*************************************************************/ ! 548: /* Listens for sessions from Clients and creates a new thread*/ ! 549: /* for each client */ ! 550: /*************************************************************/ ! 551: ! 552: DWORD ! 553: ListenForSession( ! 554: char* pipename ! 555: ) ! 556: { ! 557: int i; ! 558: DWORD ThreadID; ! 559: HANDLE PipeH[2]; ! 560: SECURITY_DESCRIPTOR SecurityDescriptor; ! 561: HANDLE TokenHandle; ! 562: TOKEN_DEFAULT_DACL DefaultDacl; ! 563: SECURITY_ATTRIBUTES lsa; ! 564: ! 565: char fullnameIn[BUFFSIZE]; ! 566: char fullnameOut[BUFFSIZE]; ! 567: ! 568: sprintf(fullnameIn,SERVER_READ_PIPE ,".",pipename); ! 569: sprintf(fullnameOut,SERVER_WRITE_PIPE,".",pipename); ! 570: ! 571: // ! 572: // Initialize the security descriptor that we're going to ! 573: // use. ! 574: // ! 575: ! 576: InitializeSecurityDescriptor ! 577: ( ! 578: &SecurityDescriptor, ! 579: SECURITY_DESCRIPTOR_REVISION ! 580: ); ! 581: ! 582: (VOID) SetSecurityDescriptorDacl ! 583: ( ! 584: &SecurityDescriptor, ! 585: TRUE, ! 586: NULL, ! 587: FALSE ! 588: ); ! 589: ! 590: DefaultDacl.DefaultDacl = NULL; ! 591: ! 592: if (OpenProcessToken ! 593: ( ! 594: GetCurrentProcess(), ! 595: TOKEN_ADJUST_DEFAULT, ! 596: &TokenHandle ! 597: )) ! 598: { ! 599: ! 600: // ! 601: // Remove the default DACL on the token ! 602: // ! 603: ! 604: SetTokenInformation ! 605: ( ! 606: TokenHandle, ! 607: TokenDefaultDacl, ! 608: &DefaultDacl, ! 609: sizeof( TOKEN_DEFAULT_DACL ) ! 610: ); ! 611: ! 612: } ! 613: ! 614: lsa.nLength=sizeof(SECURITY_ATTRIBUTES); ! 615: lsa.lpSecurityDescriptor=&SecurityDescriptor; ! 616: lsa.bInheritHandle=TRUE; ! 617: ! 618: while(TRUE) ! 619: { ! 620: // ! 621: // Create New pipe instances for each connection ! 622: // ! 623: ! 624: PipeH[0]=CreateNamedPipe ! 625: ( ! 626: fullnameIn , ! 627: PIPE_ACCESS_INBOUND , ! 628: PIPE_TYPE_BYTE, ! 629: PIPE_UNLIMITED_INSTANCES, ! 630: 0,0,0,&lsa ! 631: ); ! 632: ! 633: PipeH[1]=CreateNamedPipe ! 634: ( ! 635: fullnameOut, ! 636: PIPE_ACCESS_OUTBOUND, ! 637: PIPE_TYPE_BYTE, ! 638: PIPE_UNLIMITED_INSTANCES, ! 639: 0,0,0,&lsa ! 640: ); ! 641: ! 642: if (!ConnectNamedPipe(PipeH[0],NULL)) ! 643: { ! 644: if (GetLastError()!=ERROR_PIPE_CONNECTED) ! 645: { ! 646: CloseHandle(PipeH[0]); ! 647: CloseHandle(PipeH[1]); ! 648: continue; ! 649: } ! 650: ! 651: } ! 652: ! 653: if (!ConnectNamedPipe(PipeH[1],NULL)) ! 654: { ! 655: if (GetLastError()!=ERROR_PIPE_CONNECTED) ! 656: { ! 657: CloseHandle(PipeH[0]); ! 658: CloseHandle(PipeH[1]); ! 659: continue; ! 660: } ! 661: } ! 662: ! 663: // ! 664: //Look For a Free Slot & if not- then terminate connection ! 665: // ! 666: ! 667: for (i=1;i<MAX_SESSION;i++) ! 668: { ! 669: // ! 670: // Locate a Free Client block ! 671: // ! 672: if (!ClientList[i].Active) ! 673: break; ! 674: } ! 675: ! 676: if (i<MAX_SESSION) ! 677: { ! 678: // ! 679: // Initialize the Client ! 680: // ! 681: ClientList[i].PipeReadH=PipeH[0]; ! 682: ClientList[i].PipeWriteH=PipeH[1]; ! 683: ClientList[i].Active=TRUE; ! 684: ClientList[i].SendOutput=TRUE; ! 685: ClientList[i].CommandRcvd=FALSE; ! 686: ! 687: } ! 688: else ! 689: { ! 690: WRITEF((VBuff,"Remote:Closing New Session - No more slots\n")); ! 691: CloseHandle(PipeH[0]); ! 692: CloseHandle(PipeH[1]); ! 693: continue; ! 694: } ! 695: ! 696: // ! 697: //start new thread for this connection ! 698: // ! 699: ! 700: if((ClientList[i].hThread=CreateThread ! 701: ( ! 702: (LPSECURITY_ATTRIBUTES)NULL, // No security attributes. ! 703: (DWORD)0, // Use same stack size. ! 704: (LPTHREAD_START_ROUTINE)RemoteSession, // Thread procedure. ! 705: (LPVOID)&ClientList[i], // Parameter to pass. ! 706: (DWORD)0, // Run immediately. ! 707: (LPDWORD)&ThreadID) ! 708: )==NULL) ! 709: { ! 710: CloseClient(&ClientList[i]); ! 711: continue; ! 712: } ! 713: } ! 714: return(0); ! 715: } ! 716: /*************************************************************/ ! 717: /* Manages the Session with a Client - Creates a thread for */ ! 718: /* Inputs from the client and a thread for sending outputs to*/ ! 719: /* the client. Could have just as easily done with 1 thread */ ! 720: /* using Asyn IO. */ ! 721: /*************************************************************/ ! 722: DWORD ! 723: RemoteSession( ! 724: SESSION_TYPE *MyClient ! 725: ) ! 726: { ! 727: DWORD ReadCnt; ! 728: SESSION_STARTUPINFO ssi; ! 729: char *headerbuff; ! 730: char msg[BUFFSIZE]; ! 731: DWORD tmp; ! 732: SESSION_STARTREPLY ssr; ! 733: SYSTEMTIME st; ! 734: ! 735: GetLocalTime(&st); ! 736: memset((char *)&ssi,0,sizeof(ssi)); ! 737: ! 738: // ! 739: // Open a new handle to the save file ... ! 740: // contains the saved output from the child process ! 741: // and the commands already given to it. ! 742: // ! 743: ! 744: if ((MyClient->rSaveFile=CreateFile ! 745: ( ! 746: SaveFileName, ! 747: GENERIC_READ|GENERIC_WRITE, ! 748: FILE_SHARE_READ|FILE_SHARE_WRITE, ! 749: NULL,OPEN_EXISTING, ! 750: FILE_ATTRIBUTE_NORMAL,NULL) ! 751: )==NULL) ! 752: ! 753: { ! 754: CloseClient(MyClient); ! 755: return(1); ! 756: } ! 757: ! 758: // ! 759: // Exchange Remote Information with Client. ! 760: // ! 761: ! 762: { ! 763: ! 764: DWORD reply=0; ! 765: ! 766: ReadFixBytes(MyClient->PipeReadH,(char *)MyClient->Name,HOSTNAMELEN-1,0); ! 767: ! 768: // ! 769: //Last four Bytes contains a code ! 770: // ! 771: ! 772: memcpy((char *)&reply,(char *)&(MyClient->Name[11]),4); ! 773: ! 774: if (reply!=MAGICNUMBER) ! 775: { ! 776: // ! 777: // Unknown client ! 778: // ! 779: CloseClient(MyClient); ! 780: return(1); ! 781: } ! 782: ! 783: ssr.MagicNumber=MAGICNUMBER; ! 784: ssr.Size=sizeof(ssr); ! 785: ssr.FileSize=GetFileSize( MyClient->rSaveFile, &tmp ); ! 786: ! 787: WriteFile(MyClient->PipeWriteH,(char *)&ssr,sizeof(ssr),&tmp,NULL); ! 788: } ! 789: ! 790: if (ReadFixBytes(MyClient->PipeReadH,(char *)&(ssi.Size),sizeof(ssi.Size),0)!=0) ! 791: { ! 792: CloseClient(MyClient); ! 793: return(1); ! 794: } ! 795: ! 796: if (ssi.Size>1024) //Sanity Check ! 797: { ! 798: sprintf(msg,"%s","Server:Unknown Header..Terminating session\n"); ! 799: WriteFile(MyClient->PipeWriteH,msg,strlen(msg),&tmp,NULL); ! 800: CloseClient(MyClient); ! 801: return(1); ! 802: } ! 803: ! 804: if ((headerbuff=(char *)calloc(ssi.Size,1))==NULL) ! 805: { ! 806: sprintf(msg,"%s","Server:Not Enough Memory..Terminating session\n"); ! 807: WriteFile(MyClient->PipeWriteH,msg,strlen(msg),&tmp,NULL); ! 808: CloseClient(MyClient); ! 809: return(1); ! 810: } ! 811: ! 812: ReadCnt=ssi.Size-sizeof(ssi.Size); ! 813: if (ReadFixBytes(MyClient->PipeReadH,(char *)headerbuff,ReadCnt,0)!=0) ! 814: { ! 815: CloseClient(MyClient); ! 816: return(1); ! 817: } ! 818: ! 819: memcpy((char *)&ssi+sizeof(ssi.Size),headerbuff,sizeof(ssi)-sizeof(ssi.Size)); ! 820: free(headerbuff); ! 821: ! 822: /* Version */ ! 823: if (ssi.Version!=VERSION) ! 824: { ! 825: sprintf(msg,"Remote Warning:Server Version=%d Client Version=%d\n",VERSION,ssi.Version); ! 826: WriteFile(MyClient->PipeWriteH,msg,strlen(msg),&tmp,NULL); ! 827: ! 828: } ! 829: ! 830: /* Name */ ! 831: { ! 832: memcpy(MyClient->Name,ssi.ClientName,15); ! 833: MyClient->Name[14]=0; ! 834: ! 835: } ! 836: ! 837: /* Lines */ ! 838: if (ssi.LinesToSend!=-1) ! 839: { ! 840: long PosFromEnd=ssi.LinesToSend*CHARS_PER_LINE; ! 841: DWORD BytesToSend=MINIMUM((DWORD)PosFromEnd,ssr.FileSize); ! 842: DWORD BytesRead; ! 843: char *buff=(char *)calloc(BytesToSend+1,1); ! 844: ! 845: if (ssr.FileSize > (DWORD)PosFromEnd) ! 846: { ! 847: SetFilePointer( ! 848: MyClient->rSaveFile, ! 849: -PosFromEnd, ! 850: (PLONG)NULL, ! 851: FILE_END ! 852: ); ! 853: } ! 854: ! 855: if (buff!=NULL) ! 856: { ! 857: if (!ReadFile(MyClient->rSaveFile,buff,BytesToSend,&BytesRead,NULL)) ! 858: { ! 859: CloseClient(MyClient); ! 860: return(1); ! 861: } ! 862: ! 863: // ! 864: // Don't want the markers to be part of the output display ! 865: // at the client end. ! 866: // ! 867: RemoveInpMark(buff,BytesRead); ! 868: if (!WriteFile(MyClient->PipeWriteH,buff,BytesRead,&tmp,NULL)) ! 869: { ! 870: CloseClient(MyClient); ! 871: return(1); ! 872: } ! 873: } ! 874: free(buff); ! 875: ! 876: } ! 877: ! 878: RemoteInfo(printf("\n**Remote:Connected To %s [%02d:%02d]\n",MyClient->Name,st.wHour,st.wMinute),ssi.Flag); ! 879: ! 880: // ! 881: // Start off the new session. ! 882: // ! 883: NewSession(MyClient); ! 884: ! 885: RemoteInfo(printf("\n**Remote:Disconnected From %s [%02d:%02d]\n",MyClient->Name,st.wHour,st.wMinute),ssi.Flag); ! 886: CloseClient(MyClient); ! 887: return(0); ! 888: } ! 889: /*************************************************************/ ! 890: DWORD ! 891: NewSession( ! 892: SESSION_TYPE* MyClient ! 893: ) ! 894: { ! 895: DWORD ThreadId; ! 896: HANDLE rwThread[3]; ! 897: ! 898: MyClient->MoreData=CreateEvent ! 899: ( ! 900: (LPSECURITY_ATTRIBUTES) NULL,/* address of security attributes */ ! 901: FALSE, /* flag for manual-reset event */ ! 902: TRUE, /* flag for initial state */ ! 903: NULL /* address of event-object name */ ! 904: ); ! 905: ! 906: if ((rwThread[0]=CreateThread ! 907: ( ! 908: (LPSECURITY_ATTRIBUTES)NULL, // No security attributes. ! 909: (DWORD)0, // Use same stack size. ! 910: (LPTHREAD_START_ROUTINE)GetClientInput, // Thread procedure. ! 911: (LPVOID)MyClient, // Parameter to pass. ! 912: (DWORD)0, // Run immediately. ! 913: (LPDWORD)&ThreadId) ! 914: )==NULL) ! 915: { ! 916: return(GetLastError()); ! 917: } ! 918: ! 919: ! 920: if ((rwThread[1]=CreateThread ! 921: ( ! 922: (LPSECURITY_ATTRIBUTES)NULL, // No security attributes. ! 923: (DWORD)0, // Use same stack size. ! 924: (LPTHREAD_START_ROUTINE)TransferFileToClient, // Thread procedure. ! 925: (LPVOID)MyClient, // Parameter to pass. ! 926: (DWORD)0, // Run immediately. ! 927: (LPDWORD)&ThreadId) ! 928: )==NULL) ! 929: { ! 930: CloseHandle(rwThread[0]); ! 931: return(GetLastError()); ! 932: } ! 933: ! 934: rwThread[2]=ChldProc; ! 935: ! 936: // ! 937: // Wait for either the Input or Output thread ! 938: // to terminate and then close the session. ! 939: // ! 940: ! 941: WaitForMultipleObjects(3, rwThread,FALSE, INFINITE); ! 942: ! 943: TerminateThread(rwThread[0],1); ! 944: TerminateThread(rwThread[1],1); ! 945: ! 946: CloseHandle(rwThread[0]); ! 947: CloseHandle(rwThread[0]); ! 948: ! 949: return(0); ! 950: } ! 951: ! 952: /*************************************************************/ ! 953: /* Saves the output from the child process into the savefile */ ! 954: /* All the remote client thread and local client thread */ ! 955: /* open a seperate handle to this and output its content */ ! 956: /* sequentially. */ ! 957: /*************************************************************/ ! 958: DWORD ! 959: GetChldOutput( ! 960: HANDLE readH ! 961: ) ! 962: { ! 963: char buff[BUFFSIZE]; ! 964: DWORD dread; ! 965: DWORD tmp; ! 966: ! 967: ! 968: while(ReadFile(readH,buff,BUFFSIZE-1,&dread,NULL)) ! 969: { ! 970: buff[dread]='\0'; ! 971: ! 972: if (!WriteFile(SaveFile,buff,dread,&tmp,NULL)) ! 973: { ! 974: return(1); ! 975: } ! 976: ! 977: // ! 978: // Signal Reader Thread that more data is available ! 979: // ! 980: { ! 981: int i; ! 982: for (i=0;i<MAX_SESSION;i++) ! 983: { ! 984: if (ClientList[i].Active) ! 985: { ! 986: SetEvent(ClientList[i].MoreData); ! 987: } ! 988: } ! 989: } ! 990: } ! 991: return(1); ! 992: } ! 993: /*************************************************************/ ! 994: /* A thread for each client connection and one for local IO */ ! 995: /* Reads the contents of Save file and sends it to client for*/ ! 996: /* display. */ ! 997: /*************************************************************/ ! 998: DWORD ! 999: TransferFileToClient( ! 1000: SESSION_TYPE *MyClient ! 1001: ) ! 1002: { ! 1003: ! 1004: char buffin[BUFFSIZE],buffout[BUFFSIZE],cmdbuff[BUFFSIZE]; ! 1005: DWORD tmp; ! 1006: DWORD dread=0,dwrite=0; ! 1007: BOOL incmd=FALSE; ! 1008: DWORD cmdP=0; ! 1009: DWORD i; ! 1010: char MyEchoStr[30]; ! 1011: ! 1012: sprintf(MyEchoStr,"[%-15s",MyClient->Name); ! 1013: ! 1014: while(ReadFile(MyClient->rSaveFile,buffin,BUFFSIZE-1,&dread,NULL)) ! 1015: { ! 1016: if (dread==0) ! 1017: { ! 1018: // ! 1019: // Event is set by GetChldOutput() func. to signal ! 1020: // More data is available in save file. ! 1021: // ! 1022: WaitForSingleObject(MyClient->MoreData,INFINITE); ! 1023: continue; ! 1024: } ! 1025: dwrite=0; ! 1026: ! 1027: // ! 1028: // This is all to insure that the commands entered ! 1029: // by clients are not echoed back to them. ! 1030: // A Beginmark and an Endmark is placed around commands ! 1031: // sent to the child process from some client. ! 1032: // ! 1033: ! 1034: for(i=0;i<dread;i++) ! 1035: { ! 1036: if (incmd) ! 1037: { ! 1038: if ((buffin[i]==ENDMARK)||(cmdP==BUFFSIZE-1)) ! 1039: { ! 1040: incmd=FALSE; ! 1041: cmdbuff[cmdP]=0; ! 1042: if ((strstr(cmdbuff,MyEchoStr)==NULL)|| ! 1043: (!MyClient->CommandRcvd)) ! 1044: { ! 1045: if (!WriteFile( ! 1046: MyClient->PipeWriteH, ! 1047: cmdbuff,cmdP,&tmp,NULL)) ! 1048: { ! 1049: return(1); ! 1050: } ! 1051: } ! 1052: cmdP=0; ! 1053: } ! 1054: else ! 1055: { ! 1056: cmdbuff[cmdP++]=buffin[i]; ! 1057: } ! 1058: } ! 1059: else ! 1060: { ! 1061: ! 1062: if (buffin[i]==BEGINMARK) ! 1063: { ! 1064: if (dwrite!=0) ! 1065: { ! 1066: if (!WriteFile( ! 1067: MyClient->PipeWriteH, ! 1068: buffout,dwrite,&tmp,NULL)) ! 1069: { ! 1070: return(1); ! 1071: } ! 1072: dwrite=0; ! 1073: } ! 1074: incmd=TRUE; ! 1075: continue; ! 1076: } ! 1077: else ! 1078: { ! 1079: buffout[dwrite++]=buffin[i]; ! 1080: } ! 1081: } ! 1082: } ! 1083: ! 1084: if (dwrite!=0) ! 1085: { ! 1086: if (!WriteFile( ! 1087: MyClient->PipeWriteH, ! 1088: buffout,dwrite,&tmp,NULL)) ! 1089: { ! 1090: return(0); ! 1091: } ! 1092: } ! 1093: } ! 1094: return(1); ! 1095: } ! 1096: ! 1097: /*************************************************************/ ! 1098: /* Commands from the clients are sent to the child process */ ! 1099: /* and also saved in the SaveFile with Begin and End markers */ ! 1100: /* around them to seperate them from the output from child */ ! 1101: /* process. */ ! 1102: /*************************************************************/ ! 1103: DWORD ! 1104: GetClientInput( ! 1105: SESSION_TYPE *MyClient ! 1106: ) ! 1107: { ! 1108: char buff[BUFFSIZE]; ! 1109: DWORD tmp,dread; ! 1110: ! 1111: while(ReadFile(MyClient->PipeReadH,buff,BUFFSIZE,&dread,NULL)) ! 1112: { ! 1113: buff[dread]=0; ! 1114: MyClient->CommandRcvd=TRUE; ! 1115: ! 1116: if (FilterCommand(MyClient,buff,dread)) ! 1117: continue; ! 1118: ! 1119: ! 1120: if (!WriteFile(ChildStdInp,buff,dread,&tmp,NULL)) ! 1121: { ! 1122: ExitThread(0); ! 1123: } ! 1124: } ! 1125: return(1); ! 1126: } ! 1127: ! 1128: /*************************************************************/ ! 1129: /* If a client command is intended for the Remote server - */ ! 1130: /* those beginning with COMMANDCHAR (are not intended */ ! 1131: /* for the child process) - they are executed here */ ! 1132: /* and the output sent to the client. */ ! 1133: /*************************************************************/ ! 1134: BOOL ! 1135: FilterCommand( ! 1136: SESSION_TYPE *cl, ! 1137: char *buff, ! 1138: int dread ! 1139: ) ! 1140: { ! 1141: SYSTEMTIME st; ! 1142: char inp_buff[4096]; ! 1143: char tmpchar; ! 1144: char ch[3]; ! 1145: DWORD tmp; ! 1146: int len; ! 1147: DWORD ThreadID; //Useless ! 1148: ! 1149: if (dread==0) ! 1150: return(FALSE); ! 1151: ! 1152: buff[dread]=0; ! 1153: ! 1154: GetLocalTime(&st); ! 1155: ! 1156: ! 1157: if (buff[0]==COMMANDCHAR) ! 1158: { ! 1159: switch(buff[1]) ! 1160: { ! 1161: case 'o': ! 1162: case 'O': ! 1163: cl->SendOutput=!cl->SendOutput; ! 1164: break; ! 1165: ! 1166: case 'k': ! 1167: case 'K': ! 1168: TerminateProcess(ChldProc,1); ! 1169: break; ! 1170: ! 1171: case 's': ! 1172: case 'S': ! 1173: SendStatus(cl->PipeWriteH); ! 1174: break; ! 1175: ! 1176: case 'p': ! 1177: case 'P': ! 1178: { ! 1179: char *mssg=(char *)calloc(4096,1); //Free it in called Proc ! 1180: char *ack="Remote:Popup Shown..\n"; ! 1181: ! 1182: if (mssg==NULL) ! 1183: break; ! 1184: ! 1185: sprintf(mssg,"From %s [%d:%d]\n\n%s\n",cl->Name,st.wHour,st.wMinute,&buff[2]); ! 1186: CreateThread( ! 1187: (LPSECURITY_ATTRIBUTES)NULL, // No security attributes. ! 1188: (DWORD)0, // Use same stack size. ! 1189: (LPTHREAD_START_ROUTINE)ShowPopup, // Thread procedure. ! 1190: (LPVOID)mssg, // Parameter to pass. ! 1191: (DWORD)0, // Run immediately. ! 1192: (LPDWORD)&ThreadID ! 1193: ); ! 1194: WriteFile(cl->PipeWriteH,ack,strlen(ack),&tmp,NULL); ! 1195: break; ! 1196: } ! 1197: ! 1198: case 'm': ! 1199: case 'M': ! 1200: buff[dread-2]=0; ! 1201: CMDSTRING(inp_buff,buff,cl,st); ! 1202: len=strlen(inp_buff); ! 1203: WriteFile(SaveFile,inp_buff,len,&tmp,NULL); ! 1204: break; ! 1205: ! 1206: case '@': ! 1207: buff[dread-2]=0; ! 1208: CMDSTRING(inp_buff,&buff[1],cl,st); ! 1209: len=strlen(inp_buff); ! 1210: WriteFile(SaveFile,inp_buff,len,&tmp,NULL); ! 1211: // ! 1212: // Remove the first @ sign ! 1213: // ! 1214: MoveMemory(buff,&buff[1],dread-1); ! 1215: buff[dread-1]=' '; ! 1216: return(FALSE); //Send it it to the chile process ! 1217: break; ! 1218: ! 1219: ! 1220: default : ! 1221: sprintf(inp_buff,"%s","** Unknown Command **\n"); ! 1222: WriteFile(cl->PipeWriteH,inp_buff,strlen(inp_buff),&tmp,NULL); ! 1223: ! 1224: case 'h': ! 1225: case 'H': ! 1226: sprintf(inp_buff,"%cM: To Send Message\n",COMMANDCHAR); ! 1227: WriteFile(cl->PipeWriteH,inp_buff,strlen(inp_buff),&tmp,NULL); ! 1228: sprintf(inp_buff,"%cP: To Generate popup\n",COMMANDCHAR); ! 1229: WriteFile(cl->PipeWriteH,inp_buff,strlen(inp_buff),&tmp,NULL); ! 1230: sprintf(inp_buff,"%cK: To kill the server\n",COMMANDCHAR); ! 1231: WriteFile(cl->PipeWriteH,inp_buff,strlen(inp_buff),&tmp,NULL); ! 1232: sprintf(inp_buff,"%cH: This Help\n",COMMANDCHAR); ! 1233: WriteFile(cl->PipeWriteH,inp_buff,strlen(inp_buff),&tmp,NULL); ! 1234: break; ! 1235: } ! 1236: return(TRUE); ! 1237: } ! 1238: ! 1239: ! 1240: if ((buff[0]<26)) ! 1241: { ! 1242: BOOL ret=FALSE; ! 1243: ! 1244: sprintf(ch,"^%c",buff[0]+64); ! 1245: CMDSTRING(inp_buff,ch,cl,st); ! 1246: len=strlen(inp_buff); ! 1247: ! 1248: if (buff[0]==CTRLC) ! 1249: { ! 1250: cl->CommandRcvd=FALSE; ! 1251: GenerateConsoleCtrlEvent(CTRL_C_EVENT,0); ! 1252: ret=TRUE; //Already sent to child ! 1253: } ! 1254: ! 1255: WriteFile(SaveFile,inp_buff,len,&tmp,NULL); ! 1256: return(ret); //FALSE:send it to child StdIn ! 1257: } ! 1258: ! 1259: tmpchar=buff[dread-2]; //must be 13;but just incase ! 1260: buff[dread-2]=0; ! 1261: CMDSTRING(inp_buff,buff,cl,st); ! 1262: buff[dread-2]=tmpchar; ! 1263: len=strlen(inp_buff); ! 1264: WriteFile(SaveFile,inp_buff,len,&tmp,NULL); ! 1265: return(FALSE); ! 1266: } ! 1267: /*************************************************************/ ! 1268: VOID ! 1269: SendStatus( ! 1270: HANDLE hClientPipe ! 1271: ) ! 1272: { ! 1273: char buff[1024]; ! 1274: int i; ! 1275: DWORD tmp; ! 1276: char *env=(char *)GetEnvironmentStrings(); ! 1277: DWORD ver=GetVersion(); ! 1278: ! 1279: sprintf(buff,"Command = %s\n",ChildCmd); ! 1280: WriteFile(hClientPipe,buff,strlen(buff),&tmp,NULL); ! 1281: ! 1282: sprintf(buff,"Server = %s PIPE=%s\n",HostName,PipeName); ! 1283: WriteFile(hClientPipe,buff,strlen(buff),&tmp,NULL); ! 1284: ! 1285: sprintf(buff,"Build = %d \n",((WORD *)&ver)[1]); ! 1286: WriteFile(hClientPipe,buff,strlen(buff),&tmp,NULL); ! 1287: ! 1288: for (i=1;i<MAX_SESSION;i++) ! 1289: { ! 1290: if (ClientList[i].Active) ! 1291: { ! 1292: sprintf(buff,"ACTIVE SESSION=%s\n",ClientList[i].Name); ! 1293: WriteFile(hClientPipe,buff,strlen(buff),&tmp,NULL); ! 1294: } ! 1295: } ! 1296: ! 1297: sprintf(buff,"====================\n",Server,PipeName); ! 1298: WriteFile(hClientPipe,buff,strlen(buff),&tmp,NULL); ! 1299: ! 1300: sprintf(buff,"ENVIRONMENT VARIABLES\n",Server,PipeName); ! 1301: WriteFile(hClientPipe,buff,strlen(buff),&tmp,NULL); ! 1302: ! 1303: sprintf(buff,"====================\n",Server,PipeName); ! 1304: WriteFile(hClientPipe,buff,strlen(buff),&tmp,NULL); ! 1305: ! 1306: ! 1307: try ! 1308: { ! 1309: while (*env!=0) ! 1310: { ! 1311: sprintf(buff,"%s\n",env); ! 1312: WriteFile(hClientPipe,buff,strlen(buff),&tmp,NULL); ! 1313: ! 1314: while(*(env++)!=0); ! 1315: } ! 1316: } ! 1317: except(EXCEPTION_EXECUTE_HANDLER) ! 1318: { ! 1319: sprintf(buff,"Exception Generated Getting Environment Block\n",env); ! 1320: WriteFile(hClientPipe,buff,strlen(buff),&tmp,NULL); ! 1321: ! 1322: } ! 1323: ! 1324: sprintf(buff,"====================\n",Server,PipeName); ! 1325: WriteFile(hClientPipe,buff,strlen(buff),&tmp,NULL); ! 1326: return; ! 1327: } ! 1328: /*************************************************************/ ! 1329: DWORD ! 1330: ShowPopup( ! 1331: char *mssg ! 1332: ) ! 1333: { ! 1334: MessageBox(GetActiveWindow(),mssg,"***REMOTE***",MB_OK|MB_SETFOREGROUND); ! 1335: free(mssg); ! 1336: return(0); ! 1337: ! 1338: } ! 1339: /*************************************************************/ ! 1340: BOOL SrvCtrlHand( ! 1341: DWORD event ! 1342: ) ! 1343: { ! 1344: if (event==CTRL_BREAK_EVENT) ! 1345: { ! 1346: TerminateProcess(ChldProc,1); ! 1347: } ! 1348: return(TRUE); ! 1349: } ! 1350: /*************************************************************/ ! 1351: ! 1352: DWORD LocalSession(PVOID noarg) ! 1353: { ! 1354: //Local is ClientList[0] ! 1355: char *name=(char *)ClientList[0].Name; ! 1356: ! 1357: strcpy(name,LOCALNAME); ! 1358: if ((ClientList[0].rSaveFile=CreateFile(SaveFileName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL))==NULL) ! 1359: { ! 1360: WRITEF((VBuff,"Remote:Cannot open ReadHandle to Savefile:%d\n",GetLastError())); ! 1361: ClientList[0].Active=FALSE; ! 1362: return(1); ! 1363: ! 1364: } ! 1365: ! 1366: ClientList[0].PipeReadH=GetStdHandle(STD_INPUT_HANDLE); ! 1367: ClientList[0].PipeWriteH=GetStdHandle(STD_OUTPUT_HANDLE); ! 1368: ClientList[0].SendOutput=TRUE; ! 1369: ClientList[0].Active=TRUE; ! 1370: NewSession(&ClientList[0]); ! 1371: CloseClient(&ClientList[0]); ! 1372: return(0); ! 1373: } ! 1374: ! 1375: VOID ! 1376: CloseClient( ! 1377: SESSION_TYPE *Client ! 1378: ) ! 1379: { ! 1380: ZeroMemory(Client->Name,HOSTNAMELEN); ! 1381: ! 1382: if (Client->PipeReadH!=INVALID_HANDLE_VALUE) ! 1383: { ! 1384: CloseHandle(Client->PipeReadH); ! 1385: Client->PipeReadH=INVALID_HANDLE_VALUE; ! 1386: } ! 1387: ! 1388: if (Client->PipeWriteH!=INVALID_HANDLE_VALUE) ! 1389: { ! 1390: CloseHandle(Client->PipeWriteH); ! 1391: Client->PipeWriteH=INVALID_HANDLE_VALUE; ! 1392: } ! 1393: ! 1394: if (Client->rSaveFile!=INVALID_HANDLE_VALUE) ! 1395: { ! 1396: CloseHandle(Client->rSaveFile); ! 1397: Client->rSaveFile=INVALID_HANDLE_VALUE; ! 1398: } ! 1399: if (Client->MoreData!=NULL) ! 1400: { ! 1401: CloseHandle(Client->MoreData); ! 1402: Client->MoreData=NULL; ! 1403: } ! 1404: ! 1405: Client->Active=FALSE; //Keep it last else synch problem. ! 1406: return; ! 1407: } ! 1408: ! 1409: VOID ! 1410: InitClientList( ! 1411: ) ! 1412: { ! 1413: int i; ! 1414: for (i=0;i<MAX_SESSION;i++) ! 1415: { ! 1416: ZeroMemory(ClientList[i].Name,HOSTNAMELEN); ! 1417: ClientList[i].PipeReadH=INVALID_HANDLE_VALUE; ! 1418: ClientList[i].PipeWriteH=INVALID_HANDLE_VALUE; ! 1419: ClientList[i].rSaveFile=INVALID_HANDLE_VALUE; ! 1420: ClientList[i].MoreData=NULL; ! 1421: ClientList[i].Active=FALSE; ! 1422: ClientList[i].CommandRcvd=FALSE; ! 1423: ClientList[i].SendOutput=FALSE; ! 1424: ClientList[i].hThread=NULL; ! 1425: } ! 1426: return; ! 1427: } ! 1428: ! 1429: ! 1430: ! 1431: VOID ! 1432: RemoveInpMark( ! 1433: char* Buff, ! 1434: DWORD Size ! 1435: ) ! 1436: ! 1437: { ! 1438: DWORD i; ! 1439: for (i=0;i<Size;i++) ! 1440: { ! 1441: switch (Buff[i]) ! 1442: { ! 1443: case BEGINMARK: ! 1444: Buff[i]=' '; ! 1445: break; ! 1446: ! 1447: case ENDMARK: ! 1448: if (i<2) ! 1449: { ! 1450: Buff[i]= ' '; ! 1451: } ! 1452: else ! 1453: { ! 1454: Buff[i] =Buff[i-1]; ! 1455: Buff[i-1]=Buff[i-2]; ! 1456: Buff[i-2]=' '; ! 1457: } ! 1458: break; ! 1459: ! 1460: default: ! 1461: break; ! 1462: } ! 1463: } ! 1464: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.