예제 #1
0
        void InternalThreadAgentEnd()
        {
            Int64 W32Res;

            if (Process2ProcessComm.InvokeRunConsoleRedir(Filename, Args, out W32Res, out runningdata) == false)
            {
                TellMGMTSessionTerminated();
                MainSTDIORedir.RemoveSession(SessionID);
                return;
            }

            do
            {
                Push_Stdio_StdOut r = runningdata.p2pGetResultStacked.GetResultStacked <Push_Stdio_StdOut>();
                if (r == null)
                {
                    if (runningdata.proc.HasExited == true)
                    {
                        TellMGMTSessionTerminated();
                        MainSTDIORedir.RemoveSession(SessionID);
                        break;
                    }
                }
                else
                {
                    net.ResponsePushData1(r, "stdio", 0, "stdio-" + SessionID);
                }
            } while (true);

            runningdata.p2pGetResultStacked.ClosePipe();
            runningdata.p2pSetTODOStacked.ClosePipe();
        }
예제 #2
0
        void TellMGMTSessionTerminated()
        {
            Push_Stdio_StdOut std = new Push_Stdio_StdOut();

            std.SessionID = SessionID;
            std.State     = PushStdoutState.End;
            net.ResponsePushData1(std, "stdio", 0, "stdio-" + SessionID);
            Thread.Sleep(1000);
        }
예제 #3
0
        bool BufferChanged(Push_Stdio_StdOut b)
        {
            if (b.CursorX != lastbuffer.CursorX)
            {
                return(true);
            }
            if (b.CursorY != lastbuffer.CursorY)
            {
                return(true);
            }
            if (b.SessionID != lastbuffer.SessionID)
            {
                return(true);
            }
            if (b.WindowsX != lastbuffer.WindowsX)
            {
                return(true);
            }
            if (b.WindowsY != lastbuffer.WindowsY)
            {
                return(true);
            }
            if (lastbuffer.Data == null && b.Data == null)
            {
                return(false);  //all match
            }
            if (lastbuffer.Data == null)
            {
                return(true);
            }
            if (b.Data == null)
            {
                return(true);
            }

            if (lastbuffer.Data.Length != b.Data.Length)
            {
                return(true);
            }
            for (int i = 0; i < lastbuffer.Data.Length; i++)
            {
                if (lastbuffer.Data[i].b[0] != b.Data[i].b[0] ||
                    lastbuffer.Data[i].b[1] != b.Data[i].b[1] ||
                    lastbuffer.Data[i].b[2] != b.Data[i].b[2] ||
                    lastbuffer.Data[i].b[3] != b.Data[i].b[3])
                {
                    return(true);
                }
            }

            return(false);  //all match
        }
예제 #4
0
파일: StdIO.cs 프로젝트: VulpesSARL/Fox-SDC
        public RESTStatus PopSTDIOData(SQLLib sql, NetString StdIOSession, NetworkConnectionInfo ni, string MachineID)
        {
            if (ni.HasAcl(ACLFlags.ChangeServerSettings) == false)
            {
                ni.Error   = "Access denied";
                ni.ErrorID = ErrorFlags.AccessDenied;
                return(RESTStatus.Denied);
            }

            if (StdIOSession == null)
            {
                ni.Error   = "Missing Session Data";
                ni.ErrorID = ErrorFlags.InvalidData;
                return(RESTStatus.Fail);
            }

            if (string.IsNullOrWhiteSpace(StdIOSession.Data) == true)
            {
                ni.Error   = "Missing Session Data";
                ni.ErrorID = ErrorFlags.InvalidData;
                return(RESTStatus.Fail);
            }

            string           sess = "stdio-" + StdIOSession.Data;
            PushDataResponse resp = PushServiceHelper.PopResponse(MachineID, 0, sess, true);

            if (resp == null)
            {
                res           = new Push_Stdio_StdOut();
                res.SessionID = StdIOSession.Data;
                res.State     = PushStdoutState.Timeout;
                return(RESTStatus.NoContent);
            }

            try
            {
                res = JsonConvert.DeserializeObject <Push_Stdio_StdOut>(resp.Data.ToString());
            }
            catch
            {
                res           = new Push_Stdio_StdOut();
                res.SessionID = StdIOSession.Data;
                res.State     = PushStdoutState.InternalError;
                return(RESTStatus.NoContent);
            }

            return(RESTStatus.Success);
        }
예제 #5
0
        static void RecvDataThread()
        {
            Network n = net.CloneElement();

            do
            {
                Push_Stdio_StdOut o = n.PushPopStdIO(MachineID, StdIOSession);
                if (o == null)
                {
                    Debug.WriteLine("Push_Stdio_StdOut==null");
                    Thread.Sleep(500);
                    continue;
                }
                switch (o.State)
                {
                case PushStdoutState.Timeout:
                    Debug.WriteLine("Push_Stdio_StdOut.State==Timeout");
                    break;

                case PushStdoutState.InternalError:
                    Debug.WriteLine("Push_Stdio_StdOut.State==InternalError");
                    Thread.Sleep(500);
                    break;

                case PushStdoutState.End:
                    Debug.WriteLine("Push_Stdio_StdOut.State==End");
                    ConsoleColor c = Console.ForegroundColor;
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    Console.WriteLine("Remote process terminated.");
                    Thread.Sleep(500);
                    Console.ForegroundColor = c;
                    End = true;
                    return;

                case PushStdoutState.OK:
                    ProcessConsoleData(o);
                    break;
                }
            } while (End == false);
        }
예제 #6
0
        public void RunConsoleEnd()
        {
            Console.Clear();
            Console.WriteLine("Fox SDC Redirector on " + Environment.MachineName);

            try
            {
                consoleproc = new Process();
                consoleproc.StartInfo.Arguments       = Args;
                consoleproc.StartInfo.FileName        = Filename;
                consoleproc.StartInfo.UseShellExecute = false;
                consoleproc.Start();
                consolestdin  = ConsoleUtilities.GetStdHandle((int)ConsoleUtilities.StdHandle.STD_INPUT_HANDLE);
                consolestdout = ConsoleUtilities.GetStdHandle((int)ConsoleUtilities.StdHandle.STD_OUTPUT_HANDLE);
                TScreen       = new Thread(new ThreadStart(PullScreen));
                ConsoleT      = new Thread(new ThreadStart(InternalThreadConsoleEnd));
                TScreen.Start();
                ConsoleT.Start();
                consoleproc.WaitForExit();
            }
            catch (Exception ee)
            {
                Debug.WriteLine(ee.ToString());
                Push_Stdio_StdOut std = new Push_Stdio_StdOut();
                std.SessionID = SessionID;
                std.State     = PushStdoutState.End;
                try
                {
                    consoleendSetResultStacked.SetResultStacked(std);
                }
                catch (Exception eee)
                {
                    Debug.WriteLine(eee.ToString());
                }
            }
        }
예제 #7
0
        void PullScreen()
        {
            try
            {
                do
                {
                    ConsoleUtilities.CONSOLE_SCREEN_BUFFER_INFO bufferinfo;
                    if (ConsoleUtilities.GetConsoleScreenBufferInfo(consolestdout, out bufferinfo) == false)
                    {
                        Debug.WriteLine("GetConsoleScreenBufferInfo() failed");
                        Thread.Sleep(1000);
                        continue;
                    }

                    Push_Stdio_StdOut std = new Push_Stdio_StdOut();
                    std.WindowsY = (bufferinfo.srWindow.Bottom - bufferinfo.srWindow.Top) + 1;
                    std.WindowsX = (bufferinfo.srWindow.Right - bufferinfo.srWindow.Left) + 1;

                    ConsoleUtilities.SMALL_RECT r   = bufferinfo.srWindow;
                    ConsoleUtilities.COORD      csz = new ConsoleUtilities.COORD();
                    csz.X = (short)std.WindowsX;
                    csz.Y = (short)std.WindowsY;
                    ConsoleUtilities.COORD ccoord = new ConsoleUtilities.COORD();
                    ccoord.X = 0; ccoord.Y = 0;

                    ConsoleUtilities.CHAR_INFO2[] info = new ConsoleUtilities.CHAR_INFO2[csz.X * csz.Y];
                    if (ConsoleUtilities.ReadConsoleOutput(consolestdout, info, csz, ccoord, ref r) == false)
                    {
                        Debug.WriteLine("ReadConsoleOutput() failed");
                        Thread.Sleep(1000);
                        continue;
                    }

                    std.CursorX   = bufferinfo.dwCursorPosition.X - bufferinfo.srWindow.Left;
                    std.CursorY   = bufferinfo.dwCursorPosition.Y - bufferinfo.srWindow.Top;
                    std.SessionID = SessionID;
                    std.State     = PushStdoutState.OK;
                    std.Data      = info;

                    if (BufferChanged(std) == true)
                    {
                        consoleendSetResultStacked.SetResultStacked(std);
                        lastbuffer = std;
                        Thread.Sleep(10); //a trick to "skip" some pages, due some intense scrolling
                    }
                    else
                    {
                        Thread.Sleep(100); //polling principle :-(
                    }
                } while (consoleproc.HasExited == false);
            }
            catch (Exception ee)
            {
                Debug.WriteLine(ee.ToString());
            }
            try
            {
                Push_Stdio_StdOut std = new Push_Stdio_StdOut();
                std.State = PushStdoutState.End;
                consoleendSetResultStacked.SetResultStacked(std);
            }
            catch
            {
            }
        }
예제 #8
0
        private static void ProcessConsoleData(Push_Stdio_StdOut std)
        {
            if (std.WindowsX != LastBuffer.WindowsX || std.WindowsY != LastBuffer.WindowsY)
            {
                ConsoleUtilities.CONSOLE_SCREEN_BUFFER_INFO_EX ex = new ConsoleUtilities.CONSOLE_SCREEN_BUFFER_INFO_EX();
                ex.cbSize = 96;
                res       = ConsoleUtilities.GetConsoleScreenBufferInfoEx(StdOutHandle, ref ex);
                ex.dwMaximumWindowSize.X = ex.dwSize.X = (short)std.WindowsX;
                ex.dwMaximumWindowSize.Y = ex.dwSize.Y = (short)std.WindowsY;
                ex.srWindow.Top          = ex.srWindow.Left = 0;
                ex.srWindow.Right        = (short)std.WindowsX;
                ex.srWindow.Bottom       = (short)std.WindowsY;
                res = ConsoleUtilities.SetConsoleScreenBufferInfoEx(StdOutHandle, ref ex);
            }

            if (std.CursorX != LastBuffer.CursorX || std.CursorY != LastBuffer.CursorY)
            {
                ConsoleUtilities.COORD c = new ConsoleUtilities.COORD();
                c.X = (short)std.CursorX;
                c.Y = (short)std.CursorY;
                res = ConsoleUtilities.SetConsoleCursorPosition(StdOutHandle, c);
            }

            if (std.Data == null)
            {
                std.Data = new ConsoleUtilities.CHAR_INFO2[1];
            }
            if (LastBuffer.Data == null)
            {
                LastBuffer.Data = new ConsoleUtilities.CHAR_INFO2[1];
            }

            bool DataModified = false;

            if (std.Data.Length != LastBuffer.Data.Length)
            {
                DataModified = true;
            }
            if (DataModified == false)
            {
                for (int i = 0; i < std.Data.Length; i++)
                {
                    if (LastBuffer.Data[i].b[0] != std.Data[i].b[0] ||
                        LastBuffer.Data[i].b[1] != std.Data[i].b[1] ||
                        LastBuffer.Data[i].b[2] != std.Data[i].b[2] ||
                        LastBuffer.Data[i].b[3] != std.Data[i].b[3])
                    {
                        DataModified = true;
                        break;
                    }
                }
            }

            if (DataModified == true)
            {
                ConsoleUtilities.COORD c = new ConsoleUtilities.COORD();
                c.X = (short)std.WindowsX;
                c.Y = (short)std.WindowsY;
                ConsoleUtilities.COORD p = new ConsoleUtilities.COORD();
                p.X = p.Y = 0;
                ConsoleUtilities.SMALL_RECT r = new ConsoleUtilities.SMALL_RECT();
                r.Left   = r.Top = 0;
                r.Right  = (short)std.WindowsX;
                r.Bottom = (short)std.WindowsY;
                res      = ConsoleUtilities.WriteConsoleOutput(StdOutHandle, std.Data, c, p, ref r);
            }

            LastBuffer = std;
        }