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(); }
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); }
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 }
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); }
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); }
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()); } } }
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 { } }
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; }