// TODO: If this is not used remove this // internal override event EventHandler<RemoteDataEventArgs> DataReceived; /// <summary> /// This processes the object received from transport which are /// targeted for session. /// </summary> /// <param name="arg"> /// argument contains the data object /// </param> private void ProcessSessionMessages(RemoteDataEventArgs arg) { if (arg == null || arg.ReceivedData == null) { throw PSTraceSource.NewArgumentNullException(nameof(arg)); } RemoteDataObject <PSObject> rcvdData = arg.ReceivedData; RemotingTargetInterface targetInterface = rcvdData.TargetInterface; Dbg.Assert(targetInterface == RemotingTargetInterface.Session, "targetInterface must be Session"); RemotingDataType dataType = rcvdData.DataType; switch (dataType) { case RemotingDataType.CloseSession: PSRemotingDataStructureException reasonOfClose = new PSRemotingDataStructureException(RemotingErrorIdStrings.ServerRequestedToCloseSession); RemoteSessionStateMachineEventArgs closeSessionArg = new RemoteSessionStateMachineEventArgs(RemoteSessionEvent.Close, reasonOfClose); _stateMachine.RaiseEvent(closeSessionArg); break; case RemotingDataType.SessionCapability: RemoteSessionCapability capability = null; try { capability = RemotingDecoder.GetSessionCapability(rcvdData.Data); } catch (PSRemotingDataStructureException dse) { // this will happen if expected properties are not // received for session capability throw new PSRemotingDataStructureException(RemotingErrorIdStrings.ClientNotFoundCapabilityProperties, dse.Message, PSVersionInfo.GitCommitId, RemotingConstants.ProtocolVersion); } RemoteSessionStateMachineEventArgs capabilityArg = new RemoteSessionStateMachineEventArgs(RemoteSessionEvent.NegotiationReceived); capabilityArg.RemoteSessionCapability = capability; _stateMachine.RaiseEvent(capabilityArg); RemoteSessionNegotiationEventArgs negotiationArg = new RemoteSessionNegotiationEventArgs(capability); NegotiationReceived.SafeInvoke(this, negotiationArg); break; case RemotingDataType.EncryptedSessionKey: { string encryptedSessionKey = RemotingDecoder.GetEncryptedSessionKey(rcvdData.Data); EncryptedSessionKeyReceived.SafeInvoke(this, new RemoteDataEventArgs <string>(encryptedSessionKey)); } break; case RemotingDataType.PublicKeyRequest: { PublicKeyRequestReceived.SafeInvoke(this, new RemoteDataEventArgs <string>(string.Empty)); } break; default: { throw new PSRemotingDataStructureException(RemotingErrorIdStrings.ReceivedUnsupportedAction, dataType); } } }
/// <summary> /// This method is used by the input queue dispatching mechanism. /// It examines the data and takes appropriate actions. /// </summary> /// <param name="dataArg"> /// The received client data. /// </param> /// /// <exception cref="ArgumentNullException"> /// If the parameter is null. /// </exception> internal override void RaiseDataReceivedEvent(RemoteDataEventArgs dataArg) { if (dataArg == null) { throw PSTraceSource.NewArgumentNullException("dataArg"); } RemoteDataObject <PSObject> rcvdData = dataArg.ReceivedData; RemotingTargetInterface targetInterface = rcvdData.TargetInterface; RemotingDataType dataType = rcvdData.DataType; Dbg.Assert(targetInterface == RemotingTargetInterface.Session, "targetInterface must be Session"); switch (dataType) { case RemotingDataType.CreateRunspacePool: { // At this point, the negotiation is complete, so // need to import the clients public key CreateRunspacePoolReceived.SafeInvoke(this, dataArg); } break; case RemotingDataType.CloseSession: PSRemotingDataStructureException reasonOfClose = new PSRemotingDataStructureException(RemotingErrorIdStrings.ClientRequestedToCloseSession); RemoteSessionStateMachineEventArgs closeSessionArg = new RemoteSessionStateMachineEventArgs(RemoteSessionEvent.Close, reasonOfClose); _stateMachine.RaiseEvent(closeSessionArg); break; case RemotingDataType.SessionCapability: RemoteSessionCapability capability = null; try { capability = RemotingDecoder.GetSessionCapability(rcvdData.Data); } catch (PSRemotingDataStructureException dse) { // this will happen if expected properties are not // received for session capability throw new PSRemotingDataStructureException(RemotingErrorIdStrings.ServerNotFoundCapabilityProperties, dse.Message, PSVersionInfo.BuildVersion, RemotingConstants.ProtocolVersion); } RemoteSessionStateMachineEventArgs capabilityArg = new RemoteSessionStateMachineEventArgs(RemoteSessionEvent.NegotiationReceived); capabilityArg.RemoteSessionCapability = capability; _stateMachine.RaiseEvent(capabilityArg); if (NegotiationReceived != null) { RemoteSessionNegotiationEventArgs negotiationArg = new RemoteSessionNegotiationEventArgs(capability); negotiationArg.RemoteData = rcvdData; NegotiationReceived.SafeInvoke(this, negotiationArg); } break; case RemotingDataType.PublicKey: { string remotePublicKey = RemotingDecoder.GetPublicKey(rcvdData.Data); PublicKeyReceived.SafeInvoke(this, new RemoteDataEventArgs <string>(remotePublicKey)); } break; default: throw new PSRemotingDataStructureException(RemotingErrorIdStrings.ReceivedUnsupportedAction, dataType); } }
internal void ProcessReceivedData(RemoteDataObject <PSObject> receivedData) { using (ClientRunspacePoolDataStructureHandler.tracer.TraceMethod()) { if (receivedData.RunspacePoolId != this.clientRunspacePoolId) { throw new PSRemotingDataStructureException(PSRemotingErrorId.RunspaceIdsDoNotMatch, new object[2] { (object)receivedData.RunspacePoolId, (object)this.clientRunspacePoolId }); } switch (receivedData.DataType) { case RemotingDataType.RunspacePoolOperationResponse: this.SetMaxMinRunspacesResponseRecieved((object)this, new RemoteDataEventArgs <PSObject>((object)receivedData.Data)); break; case RemotingDataType.RunspacePoolStateInfo: RunspacePoolStateInfo runspacePoolStateInfo = RemotingDecoder.GetRunspacePoolStateInfo(receivedData.Data); this.StateInfoReceived((object)this, new RemoteDataEventArgs <RunspacePoolStateInfo>((object)runspacePoolStateInfo)); this.NotifyAssociatedPowerShells(runspacePoolStateInfo); break; case RemotingDataType.PSEventArgs: this.PSEventArgsReceived((object)this, new RemoteDataEventArgs <PSEventArgs>((object)RemotingDecoder.GetPSEventArgs(receivedData.Data))); break; case RemotingDataType.ApplicationPrivateData: this.ApplicationPrivateDataReceived((object)this, new RemoteDataEventArgs <PSPrimitiveDictionary>((object)RemotingDecoder.GetApplicationPrivateData(receivedData.Data))); break; case RemotingDataType.RemoteHostCallUsingRunspaceHost: this.RemoteHostCallReceived((object)this, new RemoteDataEventArgs <RemoteHostCall>((object)RemoteHostCall.Decode(receivedData.Data))); break; } } }
internal static CommandParameter FromPSObjectForRemoting( PSObject parameterAsPSObject) { return(parameterAsPSObject != null ? new CommandParameter(RemotingDecoder.GetPropertyValue <string>(parameterAsPSObject, "N"), RemotingDecoder.GetPropertyValue <object>(parameterAsPSObject, "V")) : throw CommandParameter._trace.NewArgumentNullException(nameof(parameterAsPSObject))); }
internal override void RaiseDataReceivedEvent(RemoteDataEventArgs dataArg) { using (ServerRemoteSessionDSHandlerlImpl._trace.TraceMethod()) { RemoteDataObject <PSObject> remoteDataObject = dataArg != null ? dataArg.ReceivedData : throw ServerRemoteSessionDSHandlerlImpl._trace.NewArgumentNullException(nameof(dataArg)); int targetInterface = (int)remoteDataObject.TargetInterface; RemotingDataType dataType = remoteDataObject.DataType; switch (dataType) { case RemotingDataType.SessionCapability: RemoteSessionCapability sessionCapability; try { sessionCapability = RemotingDecoder.GetSessionCapability((object)remoteDataObject.Data); } catch (PSRemotingDataStructureException ex) { throw new PSRemotingDataStructureException(PSRemotingErrorId.ServerNotFoundCapabilityProperties, new object[3] { (object)ex.Message, (object)PSVersionInfo.BuildVersion, (object)RemotingConstants.ProtocolVersion }); } this._stateMachine.RaiseEvent(new RemoteSessionStateMachineEventArgs(RemoteSessionEvent.NegotiationReceived) { RemoteSessionCapability = sessionCapability }); if (this.NegotiationReceived == null) { break; } this.NegotiationReceived((object)this, new RemoteSessionNegotiationEventArgs(sessionCapability) { RemoteData = remoteDataObject }); break; case RemotingDataType.CloseSession: this._stateMachine.RaiseEvent(new RemoteSessionStateMachineEventArgs(RemoteSessionEvent.Close, (Exception) new PSRemotingDataStructureException(PSRemotingErrorId.ClientRequestedToCloseSession, new object[0]))); break; case RemotingDataType.CreateRunspacePool: if (this.CreateRunspacePoolReceived == null) { break; } this.CreateRunspacePoolReceived((object)this, dataArg); break; case RemotingDataType.PublicKey: this.PublicKeyReceived((object)this, new RemoteDataEventArgs <string>((object)RemotingDecoder.GetPublicKey(remoteDataObject.Data))); break; default: throw new PSRemotingDataStructureException(PSRemotingErrorId.ReceivedUnsupportedAction, new object[1] { (object)dataType }); } } }
private void HandleCreateRunspacePool(object sender, RemoteDataEventArgs createRunspaceEventArg) { if (createRunspaceEventArg == null) { throw PSTraceSource.NewArgumentNullException("createRunspaceEventArg"); } RemoteDataObject <PSObject> receivedData = createRunspaceEventArg.ReceivedData; if (this._context != null) { if (this._context.ClientCapability == null) { this._senderInfo.ClientTimeZone = this._context.ServerCapability.TimeZone; } else { this._senderInfo.ClientTimeZone = this._context.ClientCapability.TimeZone; } } this._senderInfo.ApplicationArguments = RemotingDecoder.GetApplicationArguments(receivedData.Data); ConfigurationDataFromXML configData = PSSessionConfiguration.LoadEndPointConfiguration(this._configProviderId, this._initParameters); configData.InitializationScriptForOutOfProcessRunspace = this._initScriptForOutOfProcRS; this.maxRecvdObjectSize = configData.MaxReceivedObjectSizeMB; this.maxRecvdDataSizeCommand = configData.MaxReceivedCommandSizeMB; DISCPowerShellConfiguration configuration = null; if (string.IsNullOrEmpty(configData.ConfigFilePath)) { this._sessionConfigProvider = configData.CreateEndPointConfigurationInstance(); } else { configuration = new DISCPowerShellConfiguration(configData.ConfigFilePath); this._sessionConfigProvider = configuration; } PSPrimitiveDictionary applicationPrivateData = this._sessionConfigProvider.GetApplicationPrivateData(this._senderInfo); InitialSessionState initialSessionState = null; if (configData.SessionConfigurationData != null) { try { initialSessionState = this._sessionConfigProvider.GetInitialSessionState(configData.SessionConfigurationData, this._senderInfo, this._configProviderId); } catch (NotImplementedException) { initialSessionState = this._sessionConfigProvider.GetInitialSessionState(this._senderInfo); } } else { initialSessionState = this._sessionConfigProvider.GetInitialSessionState(this._senderInfo); } if (initialSessionState == null) { throw PSTraceSource.NewInvalidOperationException("RemotingErrorIdStrings", "InitialSessionStateNull", new object[] { this._configProviderId }); } initialSessionState.ThrowOnRunspaceOpenError = true; initialSessionState.Variables.Add(new SessionStateVariableEntry("PSSenderInfo", this._senderInfo, PSRemotingErrorInvariants.FormatResourceString(RemotingErrorIdStrings.PSSenderInfoDescription, new object[0]), ScopedItemOptions.ReadOnly)); if ((this._senderInfo.ApplicationArguments != null) && this._senderInfo.ApplicationArguments.ContainsKey("PSversionTable")) { PSPrimitiveDictionary dictionary2 = PSObject.Base(this._senderInfo.ApplicationArguments["PSversionTable"]) as PSPrimitiveDictionary; if ((dictionary2 != null) && dictionary2.ContainsKey("WSManStackVersion")) { Version version = PSObject.Base(dictionary2["WSManStackVersion"]) as Version; if ((version != null) && (version.Major < 3)) { initialSessionState.Commands.Add(new SessionStateFunctionEntry("TabExpansion", "\r\n param($line, $lastWord)\r\n & {\r\n function Write-Members ($sep='.')\r\n {\r\n Invoke-Expression ('$_val=' + $_expression)\r\n\r\n $_method = [Management.Automation.PSMemberTypes] `\r\n 'Method,CodeMethod,ScriptMethod,ParameterizedProperty'\r\n if ($sep -eq '.')\r\n {\r\n $params = @{view = 'extended','adapted','base'}\r\n }\r\n else\r\n {\r\n $params = @{static=$true}\r\n }\r\n \r\n foreach ($_m in ,$_val | Get-Member @params $_pat |\r\n Sort-Object membertype,name)\r\n {\r\n if ($_m.MemberType -band $_method)\r\n {\r\n # Return a method...\r\n $_base + $_expression + $sep + $_m.name + '('\r\n }\r\n else {\r\n # Return a property...\r\n $_base + $_expression + $sep + $_m.name\r\n }\r\n }\r\n }\r\n\r\n # If a command name contains any of these chars, it needs to be quoted\r\n $_charsRequiringQuotes = ('`&@''#{}()$,;|<> ' + \"`t\").ToCharArray()\r\n\r\n # If a variable name contains any of these characters it needs to be in braces\r\n $_varsRequiringQuotes = ('-`&@''#{}()$,;|<> .\\/' + \"`t\").ToCharArray()\r\n\r\n switch -regex ($lastWord)\r\n {\r\n # Handle property and method expansion rooted at variables...\r\n # e.g. $a.b.<tab>\r\n '(^.*)(\\$(\\w|:|\\.)+)\\.([*\\w]*)$' {\r\n $_base = $matches[1]\r\n $_expression = $matches[2]\r\n $_pat = $matches[4] + '*'\r\n Write-Members\r\n break;\r\n }\r\n\r\n # Handle simple property and method expansion on static members...\r\n # e.g. [datetime]::n<tab>\r\n '(^.*)(\\[(\\w|\\.|\\+)+\\])(\\:\\:|\\.){0,1}([*\\w]*)$' {\r\n $_base = $matches[1]\r\n $_expression = $matches[2]\r\n $_pat = $matches[5] + '*'\r\n Write-Members $(if (! $matches[4]) {'::'} else {$matches[4]})\r\n break;\r\n }\r\n\r\n # Handle complex property and method expansion on static members\r\n # where there are intermediate properties...\r\n # e.g. [datetime]::now.d<tab>\r\n '(^.*)(\\[(\\w|\\.|\\+)+\\](\\:\\:|\\.)(\\w+\\.)+)([*\\w]*)$' {\r\n $_base = $matches[1] # everything before the expression\r\n $_expression = $matches[2].TrimEnd('.') # expression less trailing '.'\r\n $_pat = $matches[6] + '*' # the member to look for...\r\n Write-Members\r\n break;\r\n }\r\n\r\n # Handle variable name expansion...\r\n '(^.*\\$)([*\\w:]+)$' {\r\n $_prefix = $matches[1]\r\n $_varName = $matches[2]\r\n $_colonPos = $_varname.IndexOf(':')\r\n if ($_colonPos -eq -1)\r\n {\r\n $_varName = 'variable:' + $_varName\r\n $_provider = ''\r\n }\r\n else\r\n {\r\n $_provider = $_varname.Substring(0, $_colonPos+1)\r\n }\r\n\r\n foreach ($_v in Get-ChildItem ($_varName + '*') | sort Name)\r\n { \r\n $_nameFound = $_v.name\r\n $(if ($_nameFound.IndexOfAny($_varsRequiringQuotes) -eq -1) {'{0}{1}{2}'}\r\n else {'{0}{{{1}{2}}}'}) -f $_prefix, $_provider, $_nameFound\r\n }\r\n break;\r\n }\r\n\r\n # Do completion on parameters...\r\n '^-([*\\w0-9]*)' {\r\n $_pat = $matches[1] + '*'\r\n\r\n # extract the command name from the string\r\n # first split the string into statements and pipeline elements\r\n # This doesn't handle strings however.\r\n $_command = [regex]::Split($line, '[|;=]')[-1]\r\n\r\n # Extract the trailing unclosed block e.g. ls | foreach { cp\r\n if ($_command -match '\\{([^\\{\\}]*)$')\r\n {\r\n $_command = $matches[1]\r\n }\r\n\r\n # Extract the longest unclosed parenthetical expression...\r\n if ($_command -match '\\(([^()]*)$')\r\n {\r\n $_command = $matches[1]\r\n }\r\n\r\n # take the first space separated token of the remaining string\r\n # as the command to look up. Trim any leading or trailing spaces\r\n # so you don't get leading empty elements.\r\n $_command = $_command.TrimEnd('-')\r\n $_command,$_arguments = $_command.Trim().Split()\r\n\r\n # now get the info object for it, -ArgumentList will force aliases to be resolved\r\n # it also retrieves dynamic parameters\r\n try\r\n {\r\n $_command = @(Get-Command -type 'Alias,Cmdlet,Function,Filter,ExternalScript' `\r\n -Name $_command -ArgumentList $_arguments)[0]\r\n }\r\n catch\r\n {\r\n # see if the command is an alias. If so, resolve it to the real command\r\n if(Test-Path alias:\\$_command)\r\n {\r\n $_command = @(Get-Command -Type Alias $_command)[0].Definition\r\n }\r\n\r\n # If we were unsuccessful retrieving the command, try again without the parameters\r\n $_command = @(Get-Command -type 'Cmdlet,Function,Filter,ExternalScript' `\r\n -Name $_command)[0]\r\n }\r\n\r\n # remove errors generated by the command not being found, and break\r\n if(-not $_command) { $error.RemoveAt(0); break; }\r\n\r\n # expand the parameter sets and emit the matching elements\r\n # need to use psbase.Keys in case 'keys' is one of the parameters\r\n # to the cmdlet\r\n foreach ($_n in $_command.Parameters.psbase.Keys)\r\n {\r\n if ($_n -like $_pat) { '-' + $_n }\r\n }\r\n break;\r\n }\r\n\r\n # Tab complete against history either #<pattern> or #<id>\r\n '^#(\\w*)' {\r\n $_pattern = $matches[1]\r\n if ($_pattern -match '^[0-9]+$')\r\n {\r\n Get-History -ea SilentlyContinue -Id $_pattern | Foreach { $_.CommandLine } \r\n }\r\n else\r\n {\r\n $_pattern = '*' + $_pattern + '*'\r\n Get-History -Count 32767 | Sort-Object -Descending Id| Foreach { $_.CommandLine } | where { $_ -like $_pattern }\r\n }\r\n break;\r\n }\r\n\r\n # try to find a matching command...\r\n default {\r\n # parse the script...\r\n $_tokens = [System.Management.Automation.PSParser]::Tokenize($line,\r\n [ref] $null)\r\n\r\n if ($_tokens)\r\n {\r\n $_lastToken = $_tokens[$_tokens.count - 1]\r\n if ($_lastToken.Type -eq 'Command')\r\n {\r\n $_cmd = $_lastToken.Content\r\n\r\n # don't look for paths...\r\n if ($_cmd.IndexOfAny('/\\:') -eq -1)\r\n {\r\n # handle parsing errors - the last token string should be the last\r\n # string in the line...\r\n if ($lastword.Length -ge $_cmd.Length -and \r\n $lastword.substring($lastword.length-$_cmd.length) -eq $_cmd)\r\n {\r\n $_pat = $_cmd + '*'\r\n $_base = $lastword.substring(0, $lastword.length-$_cmd.length)\r\n\r\n # get files in current directory first, then look for commands...\r\n $( try {Resolve-Path -ea SilentlyContinue -Relative $_pat } catch {} ;\r\n try { $ExecutionContext.InvokeCommand.GetCommandName($_pat, $true, $false) |\r\n Sort-Object -Unique } catch {} ) |\r\n # If the command contains non-word characters (space, ) ] ; ) etc.)\r\n # then it needs to be quoted and prefixed with &\r\n ForEach-Object {\r\n if ($_.IndexOfAny($_charsRequiringQuotes) -eq -1) { $_ }\r\n elseif ($_.IndexOf('''') -ge 0) {'& ''{0}''' -f $_.Replace('''','''''') }\r\n else { '& ''{0}''' -f $_ }} |\r\n ForEach-Object {'{0}{1}' -f $_base,$_ }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n ")); } } } if (!string.IsNullOrEmpty(configData.EndPointConfigurationTypeName)) { this.maxRecvdObjectSize = this._sessionConfigProvider.GetMaximumReceivedObjectSize(this._senderInfo); this.maxRecvdDataSizeCommand = this._sessionConfigProvider.GetMaximumReceivedDataSizePerCommand(this._senderInfo); } this._sessionDSHandler.TransportManager.ReceivedDataCollection.MaximumReceivedObjectSize = this.maxRecvdObjectSize; Guid runspacePoolId = receivedData.RunspacePoolId; int minRunspaces = RemotingDecoder.GetMinRunspaces(receivedData.Data); int maxRunspaces = RemotingDecoder.GetMaxRunspaces(receivedData.Data); PSThreadOptions threadOptions = RemotingDecoder.GetThreadOptions(receivedData.Data); ApartmentState apartmentState = RemotingDecoder.GetApartmentState(receivedData.Data); HostInfo hostInfo = RemotingDecoder.GetHostInfo(receivedData.Data); if (this._runspacePoolDriver != null) { throw new PSRemotingDataStructureException(RemotingErrorIdStrings.RunspaceAlreadyExists, new object[] { this._runspacePoolDriver.InstanceId }); } bool isAdministrator = this._senderInfo.UserInfo.IsInRole(WindowsBuiltInRole.Administrator); ServerRunspacePoolDriver driver = new ServerRunspacePoolDriver(runspacePoolId, minRunspaces, maxRunspaces, threadOptions, apartmentState, hostInfo, initialSessionState, applicationPrivateData, configData, this.SessionDataStructureHandler.TransportManager, isAdministrator, this._context.ServerCapability, (configuration == null) ? null : configuration.ConfigHash); Interlocked.Exchange <ServerRunspacePoolDriver>(ref this._runspacePoolDriver, driver); this._runspacePoolDriver.Closed = (EventHandler <EventArgs>)Delegate.Combine(this._runspacePoolDriver.Closed, new EventHandler <EventArgs>(this.HandleResourceClosing)); this._runspacePoolDriver.Start(); }
internal void ExecuteConnect(byte[] connectData, out byte[] connectResponseData) { RemoteSessionCapability sessionCapability; connectResponseData = null; Fragmentor fragmentor = new Fragmentor(0x7fffffff, null); Fragmentor defragmentor = fragmentor; int length = connectData.Length; if (length < 0x15) { throw new PSRemotingDataStructureException(RemotingErrorIdStrings.ServerConnectFailedOnInputValidation); } FragmentedRemoteObject.GetFragmentId(connectData, 0); bool isStartFragment = FragmentedRemoteObject.GetIsStartFragment(connectData, 0); bool isEndFragment = FragmentedRemoteObject.GetIsEndFragment(connectData, 0); int blobLength = FragmentedRemoteObject.GetBlobLength(connectData, 0); if (blobLength > (length - 0x15)) { throw new PSRemotingDataStructureException(RemotingErrorIdStrings.ServerConnectFailedOnInputValidation); } if (!isStartFragment || !isEndFragment) { throw new PSRemotingDataStructureException(RemotingErrorIdStrings.ServerConnectFailedOnInputValidation); } RemoteSessionState state = this.SessionDataStructureHandler.StateMachine.State; if ((state != RemoteSessionState.Established) && (state != RemoteSessionState.EstablishedAndKeyExchanged)) { throw new PSRemotingDataStructureException(RemotingErrorIdStrings.ServerConnectFailedOnServerStateValidation); } MemoryStream serializedDataStream = new MemoryStream(); serializedDataStream.Write(connectData, 0x15, blobLength); serializedDataStream.Seek(0L, SeekOrigin.Begin); RemoteDataObject <PSObject> obj2 = RemoteDataObject <PSObject> .CreateFrom(serializedDataStream, defragmentor); if (obj2 == null) { throw new PSRemotingDataStructureException(RemotingErrorIdStrings.ServerConnectFailedOnInputValidation); } if ((obj2.Destination != (RemotingDestination.InvalidDestination | RemotingDestination.Server)) || (obj2.DataType != RemotingDataType.SessionCapability)) { throw new PSRemotingDataStructureException(RemotingErrorIdStrings.ServerConnectFailedOnInputValidation); } int num3 = (length - 0x15) - blobLength; if (num3 < 0x15) { throw new PSRemotingDataStructureException(RemotingErrorIdStrings.ServerConnectFailedOnInputValidation); } byte[] destinationArray = new byte[num3]; Array.Copy(connectData, 0x15 + blobLength, destinationArray, 0, num3); FragmentedRemoteObject.GetFragmentId(destinationArray, 0); isStartFragment = FragmentedRemoteObject.GetIsStartFragment(destinationArray, 0); isEndFragment = FragmentedRemoteObject.GetIsEndFragment(destinationArray, 0); blobLength = FragmentedRemoteObject.GetBlobLength(destinationArray, 0); if (blobLength != (num3 - 0x15)) { throw new PSRemotingDataStructureException(RemotingErrorIdStrings.ServerConnectFailedOnInputValidation); } if (!isStartFragment || !isEndFragment) { throw new PSRemotingDataStructureException(RemotingErrorIdStrings.ServerConnectFailedOnInputValidation); } serializedDataStream = new MemoryStream(); serializedDataStream.Write(destinationArray, 0x15, blobLength); serializedDataStream.Seek(0L, SeekOrigin.Begin); RemoteDataObject <PSObject> obj3 = RemoteDataObject <PSObject> .CreateFrom(serializedDataStream, defragmentor); if (obj3 == null) { throw new PSRemotingDataStructureException(RemotingErrorIdStrings.ServerConnectFailedOnServerStateValidation); } if ((obj3.Destination != (RemotingDestination.InvalidDestination | RemotingDestination.Server)) || (obj3.DataType != RemotingDataType.ConnectRunspacePool)) { throw new PSRemotingDataStructureException(RemotingErrorIdStrings.ServerConnectFailedOnInputValidation); } try { sessionCapability = RemotingDecoder.GetSessionCapability(obj2.Data); } catch (PSRemotingDataStructureException) { throw new PSRemotingDataStructureException(RemotingErrorIdStrings.ServerConnectFailedOnInputValidation); } try { this.RunServerNegotiationAlgorithm(sessionCapability, true); } catch (PSRemotingDataStructureException exception) { throw exception; } int minRunspaces = -1; int maxRunspaces = -1; bool flag3 = false; if ((obj3.Data.Properties["MinRunspaces"] != null) && (obj3.Data.Properties["MinRunspaces"] != null)) { try { minRunspaces = RemotingDecoder.GetMinRunspaces(obj3.Data); maxRunspaces = RemotingDecoder.GetMaxRunspaces(obj3.Data); flag3 = true; } catch (PSRemotingDataStructureException) { throw new PSRemotingDataStructureException(RemotingErrorIdStrings.ServerConnectFailedOnInputValidation); } } if (flag3 && (((minRunspaces == -1) || (maxRunspaces == -1)) || (minRunspaces > maxRunspaces))) { throw new PSRemotingDataStructureException(RemotingErrorIdStrings.ServerConnectFailedOnInputValidation); } if (this._runspacePoolDriver == null) { throw new PSRemotingDataStructureException(RemotingErrorIdStrings.ServerConnectFailedOnServerStateValidation); } if (obj3.RunspacePoolId != this._runspacePoolDriver.InstanceId) { throw new PSRemotingDataStructureException(RemotingErrorIdStrings.ServerConnectFailedOnInputValidation); } if ((flag3 && (this._runspacePoolDriver.RunspacePool.GetMaxRunspaces() != maxRunspaces)) && (this._runspacePoolDriver.RunspacePool.GetMinRunspaces() != minRunspaces)) { throw new PSRemotingDataStructureException(RemotingErrorIdStrings.ServerConnectFailedOnMismatchedRunspacePoolProperties); } RemoteDataObject obj4 = RemotingEncoder.GenerateServerSessionCapability(this._context.ServerCapability, this._runspacePoolDriver.InstanceId); RemoteDataObject obj5 = RemotingEncoder.GenerateRunspacePoolInitData(this._runspacePoolDriver.InstanceId, this._runspacePoolDriver.RunspacePool.GetMaxRunspaces(), this._runspacePoolDriver.RunspacePool.GetMinRunspaces()); SerializedDataStream streamToWriteTo = new SerializedDataStream(0x1000); streamToWriteTo.Enter(); obj4.Serialize(streamToWriteTo, fragmentor); streamToWriteTo.Exit(); streamToWriteTo.Enter(); obj5.Serialize(streamToWriteTo, fragmentor); streamToWriteTo.Exit(); byte[] buffer2 = streamToWriteTo.Read(); streamToWriteTo.Dispose(); connectResponseData = buffer2; ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object s) { RemoteSessionStateMachineEventArgs fsmEventArg = new RemoteSessionStateMachineEventArgs(RemoteSessionEvent.ConnectSession); this._sessionDSHandler.StateMachine.RaiseEvent(fsmEventArg); })); this._runspacePoolDriver.DataStructureHandler.ProcessConnect(); }