meshcentral
Version:
Web based remote computer management server
1 lines • 4.52 kB
JavaScript
var PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE=131094,EXTENDED_STARTUPINFO_PRESENT=524288,HEAP_ZERO_MEMORY=8,duplex=require("stream").Duplex;function vt(){this._ObjectID="win-virtual-terminal",Object.defineProperty(this,"supported",{value:function(){var e=require("_GenericMarshal").CreateNativeProxy("kernel32.dll");try{e.CreateMethod("CreatePseudoConsole")}catch(e){return!1}return!0}()}),this.Create=function(e,r,t){if(!this.supported)throw"This build of Windows does not have support for PseudoConsoles";r=r||80,t=t||25;var o=require("_GenericMarshal"),i=o.CreateNativeProxy("kernel32.dll"),s=(i.CreateMethod("CancelIoEx"),i.CreateMethod("CreatePipe"),i.CreateMethod("CreateProcessW"),i.CreateMethod("CreatePseudoConsole"),i.CreateMethod("CloseHandle"),i.CreateMethod("ClosePseudoConsole"),i.CreateMethod("GetProcessHeap"),i.CreateMethod("HeapAlloc"),i.CreateMethod("InitializeProcThreadAttributeList"),i.CreateMethod("ResizePseudoConsole"),i.CreateMethod("UpdateProcThreadAttribute"),i.CreateMethod("WriteFile"),i.CreateMethod("ReadFile"),i.CreateMethod("TerminateProcess"),{_h:o.CreatePointer(),_consoleInput:o.CreatePointer(),_consoleOutput:o.CreatePointer(),_input:o.CreatePointer(),_output:o.CreatePointer(),k32:i}),n=o.CreateVariable(8),a=o.CreateVariable(4==o.PointerSize?16:24);if(0==i.CreatePipe(s._consoleInput,s._input,0,0).Val&&console.log("PIPE/FAIL"),0==i.CreatePipe(s._output,s._consoleOutput,0,0).Val&&console.log("PIPE/FAIL"),0!=i.CreatePseudoConsole(t<<16|r,s._consoleInput.Deref(),s._consoleOutput.Deref(),0,s._h).Val)throw"Error calling CreatePseudoConsole()";i.InitializeProcThreadAttributeList(0,1,0,n);t=o.CreateVariable(n.toBuffer().readUInt32LE()),r=o.CreateVariable(8==o.PointerSize?112:72);if((r.toBuffer().writeUInt32LE(8==o.PointerSize?112:72,0),t.pointerBuffer().copy(r.Deref(8==o.PointerSize?104:68,o.PointerSize).toBuffer()),0!=i.InitializeProcThreadAttributeList(t,1,0,n).Val)&&(0!=i.UpdateProcThreadAttribute(t,0,PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE,s._h.Deref(),o.PointerSize,0,0).Val&&0!=i.CreateProcessW(0,o.CreateVariable(e,{wide:!0}),0,0,1,EXTENDED_STARTUPINFO_PRESENT,0,0,r,a).Val))return s._startupinfoex=r,s._process=a.Deref(0),s._pid=a.Deref(4==o.PointerSize?8:16,4).toBuffer().readUInt32LE(),((n=new duplex({write:function(e,r){var t=require("_GenericMarshal").CreateVariable(4);return this.terminal.k32.WriteFile(this.terminal._input.Deref(),require("_GenericMarshal").CreateVariable(e),e.length,t,0),r(),!0},final:function(e){this.terminal._process&&(this.terminal._process=null,i.ClosePseudoConsole(this._obj._h.Deref())),e()}}))._obj=s)._waiter=require("DescriptorEvents").addDescriptor(a.Deref(0)),s._waiter.ds=n,(s._waiter._obj=s)._waiter.on("signaled",function(){i.CancelIoEx(this._obj._output.Deref(),0),this.ds.push(null),this._obj._process&&(this._obj._process=null,i.ClosePseudoConsole(this._obj._h.Deref())),i.CloseHandle(this._obj._input.Deref()),i.CloseHandle(this._obj._output.Deref()),i.CloseHandle(this._obj._consoleInput.Deref()),i.CloseHandle(this._obj._consoleOutput.Deref())}),n.resizeTerminal=function(e,r){if(console.setDestination(console.Destinations.LOGFILE),console.log("resizeTerminal("+e+", "+r+")"),0!=(r=i.ResizePseudoConsole(this._obj._h.Deref(),r<<16|e).Val))throw console.log("HResult="+r),"Resize returned HRESULT: "+r;console.log("SUCCESS")},n.terminal=s,n._rpbuf=o.CreateVariable(4096),n._rpbufRead=o.CreateVariable(4),n.__read=function(){this._rp=this.terminal.k32.ReadFile.async(this.terminal._output.Deref(),this._rpbuf,this._rpbuf._size,this._rpbufRead,0),this._rp.then(function(){var e=this.parent._rpbufRead.toBuffer().readUInt32LE();e<=0||(this.parent.push(this.parent._rpbuf.toBuffer().slice(0,e)),this.parent.__read())}),this._rp.parent=this},n.__read(),n;throw"Internal Error"},this.PowerShellCapable=function(){return"x64"==require("os").arch()?require("fs").existsSync(process.env.windir+"\\SysWow64\\WindowsPowerShell\\v1.0\\powershell.exe"):require("fs").existsSync(process.env.windir+"\\System32\\WindowsPowerShell\\v1.0\\powershell.exe")},this.Start=function(e,r){return this.Create(process.env.windir+"\\System32\\cmd.exe",e,r)},this.StartPowerShell=function(e,r){return"x64"!=require("os").arch()||require("fs").existsSync(process.env.windir+"\\System32\\WindowsPowerShell\\v1.0\\powershell.exe")?this.Create(process.env.windir+"\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",e,r):this.Create(process.env.windir+"\\SysWow64\\WindowsPowerShell\\v1.0\\powershell.exe",e,r)}}"win32"==process.platform&&(module.exports=new vt)