private void SendData(byte[] data, DataPriorityType priorityType) { BaseClientTransportManager.tracer.WriteLine("Command sending data of size : {0}", new object[] { data.Length }); byte[] buffer = data; bool flag = true; if (commandSendRedirect != null) { object[] objArray3 = new object[2]; objArray3[1] = buffer; object[] args = objArray3; flag = (bool)commandSendRedirect.DynamicInvoke(args); buffer = (byte[])args[0]; } if (flag) { using (WSManNativeApi.WSManData data2 = new WSManNativeApi.WSManData(buffer)) { PSEtwLog.LogAnalyticInformational(PSEventId.WSManSendShellInputEx, PSOpcode.Send, PSTask.None, PSKeyword.Transport | PSKeyword.UseAlwaysAnalytic, new object[] { base.RunspacePoolInstanceId.ToString(), this.powershellInstanceId.ToString(), data2.BufferLength.ToString(CultureInfo.InvariantCulture) }); lock (base.syncObject) { if (base.isClosed) { BaseClientTransportManager.tracer.WriteLine("Client Session TM: Transport manager is closed. So returning", new object[0]); } else { this.sendToRemoteCompleted = new WSManNativeApi.WSManShellAsync(new IntPtr(this.cmdContextId), cmdSendCallback); WSManNativeApi.WSManSendShellInputEx(this.wsManShellOperationHandle, this.wsManCmdOperationHandle, 0, (priorityType == DataPriorityType.Default) ? "stdin" : "pr", data2, (IntPtr)this.sendToRemoteCompleted, ref this.wsManSendOperationHandle); } } } } }
internal override void Dispose(bool isDisposing) { BaseClientTransportManager.tracer.WriteLine("Disposing session with session context: {0} Operation Context: {1}", (object)this.sessionContextID, (object)this.wsManShellOperationHandle); this.CloseSessionAndClearResources(); if (isDisposing && this.openContent != null) { this.openContent.Dispose(); this.openContent = (WSManNativeApi.WSManData)null; } base.Dispose(isDisposing); }
internal void SetWSManSessionOption(WSManNativeApi.WSManSessionOption option, string stringData) { using (WSManNativeApi.WSManData wsManData = new WSManNativeApi.WSManData(stringData)) { int errorCode = WSManNativeApi.WSManSetSessionOption(this.wsManSessionHandle, option, (IntPtr)wsManData); if (errorCode != 0) { throw new PSInvalidOperationException(WSManNativeApi.WSManGetErrorMessage(WSManClientSessionTransportManager.wsManApiStaticData.WSManAPIHandle, errorCode)); } } }
internal static void WSManSendShellInputEx( IntPtr shellOperationHandle, IntPtr commandOperationHandle, int flags, [MarshalAs(UnmanagedType.LPWStr)] string streamId, WSManNativeApi.WSManData streamData, IntPtr asyncCallback, ref IntPtr sendOperationHandle) { WSManNativeApi.WSManSendShellInputExInternal(shellOperationHandle, commandOperationHandle, flags, streamId, (IntPtr)streamData, false, asyncCallback, ref sendOperationHandle); }
internal static void WSManCreateShellEx( IntPtr wsManSessionHandle, int flags, string resourceUri, WSManNativeApi.WSManShellStartupInfo startupInfo, WSManNativeApi.WSManOptionSet optionSet, WSManNativeApi.WSManData openContent, IntPtr asyncCallback, ref IntPtr shellOperationHandle) { WSManNativeApi.WSManCreateShellExInternal(wsManSessionHandle, flags, resourceUri, (IntPtr)startupInfo, (IntPtr)optionSet, (IntPtr)openContent, asyncCallback, ref shellOperationHandle); }
private void SendData(byte[] data, DataPriorityType priorityType) { BaseClientTransportManager.tracer.WriteLine("Session sending data of size : {0}", (object)data.Length); byte[] data1 = data; bool flag = true; if ((object)WSManClientSessionTransportManager.sessionSendRedirect != null) { object[] objArray = new object[2] { null, (object)data1 }; flag = (bool)WSManClientSessionTransportManager.sessionSendRedirect.DynamicInvoke(objArray); data1 = (byte[])objArray[0]; } if (!flag) { return; } using (WSManNativeApi.WSManData streamData = new WSManNativeApi.WSManData(data1)) { BaseTransportManager.ETWTracer.AnalyticChannel.WriteInformation(PSEventId.WSManSendShellInputEx, PSOpcode.Send, PSTask.None, (object)this.RunspacePoolInstanceId, (object)Guid.Empty, (object)streamData.BufferLength.ToString((IFormatProvider)CultureInfo.InvariantCulture)); lock (this.syncObject) { if (this.isClosed) { BaseClientTransportManager.tracer.WriteLine("Client Session TM: Transport manager is closed. So returning", new object[0]); } else { this.sendToRemoteCompleted = new WSManNativeApi.WSManShellAsync(new IntPtr(this.sessionContextID), WSManClientSessionTransportManager.sessionSendCallback); WSManNativeApi.WSManSendShellInputEx(this.wsManShellOperationHandle, IntPtr.Zero, 0, priorityType == DataPriorityType.Default ? "stdin" : "pr", streamData, (IntPtr)this.sendToRemoteCompleted, ref this.wsManSendOperationHandle); } } } }
private void SendData(byte[] data, DataPriorityType priorityType) { BaseClientTransportManager.tracer.WriteLine("Command sending data of size : {0}", new object[] { data.Length }); byte[] buffer = data; bool flag = true; if (commandSendRedirect != null) { object[] objArray3 = new object[2]; objArray3[1] = buffer; object[] args = objArray3; flag = (bool) commandSendRedirect.DynamicInvoke(args); buffer = (byte[]) args[0]; } if (flag) { using (WSManNativeApi.WSManData data2 = new WSManNativeApi.WSManData(buffer)) { PSEtwLog.LogAnalyticInformational(PSEventId.WSManSendShellInputEx, PSOpcode.Send, PSTask.None, PSKeyword.Transport | PSKeyword.UseAlwaysAnalytic, new object[] { base.RunspacePoolInstanceId.ToString(), this.powershellInstanceId.ToString(), data2.BufferLength.ToString(CultureInfo.InvariantCulture) }); lock (base.syncObject) { if (base.isClosed) { BaseClientTransportManager.tracer.WriteLine("Client Session TM: Transport manager is closed. So returning", new object[0]); } else { this.sendToRemoteCompleted = new WSManNativeApi.WSManShellAsync(new IntPtr(this.cmdContextId), cmdSendCallback); WSManNativeApi.WSManSendShellInputEx(this.wsManShellOperationHandle, this.wsManCmdOperationHandle, 0, (priorityType == DataPriorityType.Default) ? "stdin" : "pr", data2, (IntPtr) this.sendToRemoteCompleted, ref this.wsManSendOperationHandle); } } } } }
internal override void ConnectAsync() { List <WSManNativeApi.WSManOption> wsManOptionList = new List <WSManNativeApi.WSManOption>((IEnumerable <WSManNativeApi.WSManOption>)WSManClientSessionTransportManager.wsManApiStaticData.CommonOptionSet); if ((object)WSManClientSessionTransportManager.protocolVersionRedirect != null) { string str = (string)WSManClientSessionTransportManager.protocolVersionRedirect.DynamicInvoke(); wsManOptionList.Clear(); wsManOptionList.Add(new WSManNativeApi.WSManOption() { name = "protocolversion", value = str, mustComply = true }); } WSManNativeApi.WSManShellStartupInfo startupInfo = new WSManNativeApi.WSManShellStartupInfo(WSManClientSessionTransportManager.wsManApiStaticData.InputStreamSet, WSManClientSessionTransportManager.wsManApiStaticData.OutputStreamSet, 0L > this.idleTimeout || this.idleTimeout >= (long)uint.MaxValue ? uint.MaxValue : (uint)this.idleTimeout); if (this.openContent == null) { byte[] inArray = this.dataToBeSent.ReadOrRegisterCallback((PrioritySendDataCollection.OnDataAvailableCallback)null, out DataPriorityType _); bool flag = true; if ((object)WSManClientSessionTransportManager.sessionSendRedirect != null) { object[] objArray = new object[2] { null, (object)inArray }; flag = (bool)WSManClientSessionTransportManager.sessionSendRedirect.DynamicInvoke(objArray); inArray = (byte[])objArray[0]; } if (!flag) { return; } if (inArray != null) { this.openContent = new WSManNativeApi.WSManData(string.Format((IFormatProvider)CultureInfo.InvariantCulture, "<{0} xmlns=\"{1}\">{2}</{0}>", (object)"creationXml", (object)"http://schemas.microsoft.com/powershell", (object)Convert.ToBase64String(inArray, Base64FormattingOptions.None))); } } this.sessionContextID = WSManClientSessionTransportManager.GetNextSessionTMHandleId(); WSManClientSessionTransportManager.AddSessionTransportManager(this.sessionContextID, this); BaseTransportManager.ETWTracer.AnalyticChannel.WriteInformation(PSEventId.WSManCreateShell, PSOpcode.Connect, PSTask.CreateRunspace, (object)this.RunspacePoolInstanceId); this.createSessionCompleted = new WSManNativeApi.WSManShellAsync(new IntPtr(this.sessionContextID), WSManClientSessionTransportManager.sessionCreateCallback); this.createSessionCompletedGCHandle = GCHandle.Alloc((object)this.createSessionCompleted); try { lock (this.syncObject) { if (this.isClosed) { return; } if (this.noMachineProfile) { wsManOptionList.Add(new WSManNativeApi.WSManOption() { name = "WINRS_NOPROFILE", mustComply = true, value = "1" }); } using (WSManNativeApi.WSManOptionSet optionSet = new WSManNativeApi.WSManOptionSet(wsManOptionList.ToArray())) WSManNativeApi.WSManCreateShellEx(this.wsManSessionHandle, this.noCompression ? 1 : 0, this.resourceUri, startupInfo, optionSet, this.openContent, (IntPtr)this.createSessionCompleted, ref this.wsManShellOperationHandle); } if (!(this.wsManShellOperationHandle == IntPtr.Zero)) { return; } this.RaiseErrorHandler(WSManTransportManagerUtils.ConstructTransportErrorEventArgs(WSManClientSessionTransportManager.wsManApiStaticData.WSManAPIHandle, IntPtr.Zero, new WSManNativeApi.WSManError(), TransportMethodEnum.CreateShellEx, PSRemotingErrorId.ConnectExFailed)); } finally { startupInfo.Dispose(); } }
internal override void Dispose(bool isDisposing) { BaseClientTransportManager.tracer.WriteLine("Disposing session with session context: {0} Operation Context: {1}", new object[] { this.sessionContextID, this.wsManShellOperationHandle }); this.CloseSessionAndClearResources(); if (isDisposing && (this.openContent != null)) { this.openContent.Dispose(); this.openContent = null; } base.Dispose(isDisposing); }
internal override void CreateAsync() { List<WSManNativeApi.WSManOption> list = new List<WSManNativeApi.WSManOption>(wsManApiStaticData.CommonOptionSet); if (protocolVersionRedirect != null) { string str = (string) protocolVersionRedirect.DynamicInvoke(new object[0]); list.Clear(); WSManNativeApi.WSManOption item = new WSManNativeApi.WSManOption { name = "protocolversion", value = str, mustComply = true }; list.Add(item); } int serverIdleTimeOut = (this._connectionInfo.IdleTimeout > 0) ? ((int) this._connectionInfo.IdleTimeout) : int.MaxValue; WSManNativeApi.WSManShellStartupInfo startupInfo = new WSManNativeApi.WSManShellStartupInfo(wsManApiStaticData.InputStreamSet, wsManApiStaticData.OutputStreamSet, serverIdleTimeOut, this.sessionName); if (this.openContent == null) { DataPriorityType type; byte[] inArray = base.dataToBeSent.ReadOrRegisterCallback(null, out type); bool flag = true; if (sessionSendRedirect != null) { object[] objArray2 = new object[2]; objArray2[1] = inArray; object[] objArray = objArray2; flag = (bool) sessionSendRedirect.DynamicInvoke(objArray); inArray = (byte[]) objArray[0]; } if (!flag) { return; } if (inArray != null) { string data = string.Format(CultureInfo.InvariantCulture, "<{0} xmlns=\"{1}\">{2}</{0}>", new object[] { "creationXml", "http://schemas.microsoft.com/powershell", Convert.ToBase64String(inArray, Base64FormattingOptions.None) }); this.openContent = new WSManNativeApi.WSManData(data); } } this.sessionContextID = GetNextSessionTMHandleId(); AddSessionTransportManager(this.sessionContextID, this); PSEtwLog.LogAnalyticInformational(PSEventId.WSManCreateShell, PSOpcode.Connect, PSTask.CreateRunspace, PSKeyword.Transport | PSKeyword.UseAlwaysAnalytic, new object[] { base.RunspacePoolInstanceId.ToString() }); this.createSessionCallback = new WSManNativeApi.WSManShellAsync(new IntPtr(this.sessionContextID), sessionCreateCallback); this.createSessionCallbackGCHandle = GCHandle.Alloc(this.createSessionCallback); try { lock (base.syncObject) { if (base.isClosed) { return; } this.startMode = WSManTransportManagerUtils.tmStartModes.Create; if (this.noMachineProfile) { WSManNativeApi.WSManOption option2 = new WSManNativeApi.WSManOption { name = "WINRS_NOPROFILE", mustComply = true, value = "1" }; list.Add(option2); } int flags = this.noCompression ? 1 : 0; flags |= (this._connectionInfo.OutputBufferingMode == OutputBufferingMode.Block) ? 8 : 0; flags |= (this._connectionInfo.OutputBufferingMode == OutputBufferingMode.Drop) ? 4 : 0; using (WSManNativeApi.WSManOptionSet set = new WSManNativeApi.WSManOptionSet(list.ToArray())) { WSManNativeApi.WSManCreateShellEx(this.wsManSessionHandle, flags, this._connectionInfo.ShellUri, base.RunspacePoolInstanceId.ToString().ToUpper(CultureInfo.InvariantCulture), startupInfo, set, this.openContent, (IntPtr) this.createSessionCallback, ref this.wsManShellOperationHandle); } } if (this.wsManShellOperationHandle == IntPtr.Zero) { TransportErrorOccuredEventArgs eventArgs = WSManTransportManagerUtils.ConstructTransportErrorEventArgs(wsManApiStaticData.WSManAPIHandle, this, new WSManNativeApi.WSManError(), TransportMethodEnum.CreateShellEx, RemotingErrorIdStrings.ConnectExFailed, new object[] { this.ConnectionInfo.ComputerName }); this.ProcessWSManTransportError(eventArgs); } } finally { startupInfo.Dispose(); } }
internal override void ConnectAsync() { base.ReceivedDataCollection.PrepareForStreamConnect(); if (this.openContent == null) { DataPriorityType type; byte[] inArray = base.dataToBeSent.ReadOrRegisterCallback(null, out type); if (inArray != null) { string data = string.Format(CultureInfo.InvariantCulture, "<{0} xmlns=\"{1}\">{2}</{0}>", new object[] { "connectXml", "http://schemas.microsoft.com/powershell", Convert.ToBase64String(inArray, Base64FormattingOptions.None) }); this.openContent = new WSManNativeApi.WSManData(data); } if (base.dataToBeSent.ReadOrRegisterCallback(null, out type) != null) { return; } } this.sessionContextID = GetNextSessionTMHandleId(); AddSessionTransportManager(this.sessionContextID, this); this.supportsDisconnect = true; this.connectSessionCallback = new WSManNativeApi.WSManShellAsync(new IntPtr(this.sessionContextID), sessionConnectCallback); lock (base.syncObject) { if (base.isClosed) { return; } this.startMode = WSManTransportManagerUtils.tmStartModes.Connect; int flags = 0; flags |= (this._connectionInfo.OutputBufferingMode == OutputBufferingMode.Block) ? 8 : 0; flags |= (this._connectionInfo.OutputBufferingMode == OutputBufferingMode.Drop) ? 4 : 0; WSManNativeApi.WSManConnectShellEx(this.wsManSessionHandle, flags, this._connectionInfo.ShellUri, base.RunspacePoolInstanceId.ToString().ToUpper(CultureInfo.InvariantCulture), IntPtr.Zero, (IntPtr) this.openContent, (IntPtr) this.connectSessionCallback, ref this.wsManShellOperationHandle); } if (this.wsManShellOperationHandle == IntPtr.Zero) { TransportErrorOccuredEventArgs eventArgs = WSManTransportManagerUtils.ConstructTransportErrorEventArgs(wsManApiStaticData.WSManAPIHandle, this, new WSManNativeApi.WSManError(), TransportMethodEnum.ConnectShellEx, RemotingErrorIdStrings.ConnectExFailed, new object[] { this.ConnectionInfo.ComputerName }); this.ProcessWSManTransportError(eventArgs); } }
internal void SetWSManSessionOption(WSManNativeApi.WSManSessionOption option, string stringData) { using (WSManNativeApi.WSManData data = new WSManNativeApi.WSManData(stringData)) { int errorCode = WSManNativeApi.WSManSetSessionOption(this.wsManSessionHandle, option, (IntPtr) data); if (errorCode != 0) { PSInvalidOperationException exception = new PSInvalidOperationException(WSManNativeApi.WSManGetErrorMessage(wsManApiStaticData.WSManAPIHandle, errorCode)); throw exception; } } }