private object SetupServiceConfig(InstanceContext instanceContext, Message message) { object obj2 = new CServiceConfig(); IServiceThreadPoolConfig config = (IServiceThreadPoolConfig)obj2; switch (this.info.ThreadingModel) { case ThreadingModel.MTA: config.SelectThreadPool(System.ServiceModel.ComIntegration.ThreadPoolOption.MTA); break; case ThreadingModel.STA: config.SelectThreadPool(System.ServiceModel.ComIntegration.ThreadPoolOption.STA); break; default: throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.UnexpectedThreadingModel()); } config.SetBindingInfo(System.ServiceModel.ComIntegration.BindingOption.BindingToPoolThread); if (this.info.HasUdts()) { IServiceSxsConfig config2 = obj2 as IServiceSxsConfig; if (config2 == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.QFENotPresent()); } lock (manifestLock) { string directory = string.Empty; try { directory = Path.GetTempPath(); } catch (Exception exception) { if (Fx.IsFatal(exception)) { throw; } throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.CannotAccessDirectory(directory)); } string path = directory + this.info.AppID.ToString() + @"\"; if (!Directory.Exists(path)) { try { Directory.CreateDirectory(path); } catch (Exception exception2) { if (Fx.IsFatal(exception2)) { throw; } throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.CannotAccessDirectory(path)); } Guid[] assemblies = this.info.Assemblies; ComIntegrationManifestGenerator.GenerateManifestCollectionFile(assemblies, path + manifestFileName + ".manifest", manifestFileName); foreach (Guid guid in assemblies) { System.Type[] types = this.info.GetTypes(guid); if (types.Length > 0) { string assemblyName = guid.ToString(); ComIntegrationManifestGenerator.GenerateWin32ManifestFile(types, path + assemblyName + ".manifest", assemblyName); } } } config2.SxsConfig(CSC_SxsConfig.CSC_NewSxs); config2.SxsName(manifestFileName + ".manifest"); config2.SxsDirectory(path); } } if (this.info.PartitionId != DefaultPartitionId) { IServicePartitionConfig config3 = (IServicePartitionConfig)obj2; config3.PartitionConfig(System.ServiceModel.ComIntegration.PartitionOption.New); config3.PartitionID(this.info.PartitionId); } IServiceTransactionConfig config4 = (IServiceTransactionConfig)obj2; config4.ConfigureTransaction(TransactionConfig.NoTransaction); if ((this.info.TransactionOption == TransactionOption.Required) || (this.info.TransactionOption == TransactionOption.Supported)) { Transaction messageTransaction = null; messageTransaction = MessageUtil.GetMessageTransaction(message); if (messageTransaction != null) { System.ServiceModel.ComIntegration.TransactionProxy item = new System.ServiceModel.ComIntegration.TransactionProxy(this.info.AppID, this.info.Clsid); item.SetTransaction(messageTransaction); instanceContext.Extensions.Add(item); IServiceSysTxnConfig config5 = (IServiceSysTxnConfig)config4; IntPtr pITxByot = TransactionProxyBuilder.CreateTransactionProxyTearOff(item); config5.ConfigureBYOTSysTxn(pITxByot); Marshal.Release(pITxByot); } } return(obj2); }
public object BeforeInvoke( InstanceContext instanceContext, IClientChannel channel, Message message) { ComPlusServerSecurity serverSecurity = null; WindowsImpersonationContext impersonateContext = null; bool errorTraced = false; WindowsIdentity identity = null; Uri from = null; object instance = null; int instanceID = 0; string action = null; TransactionProxy proxy = null; Transaction tx = null; Guid incomingTransactionID = Guid.Empty; // The outer try block is to comply with FXCOP's WrapVulnerableFinallyClausesInOuterTry rule. try { try { identity = MessageUtil.GetMessageIdentity(message); if (message.Headers.From != null) { from = message.Headers.From.Uri; } instance = instanceContext.GetServiceInstance(message); instanceID = instance.GetHashCode(); action = message.Headers.Action; ComPlusMethodCallTrace.Trace(TraceEventType.Verbose, TraceCode.ComIntegrationInvokingMethod, SR.TraceCodeComIntegrationInvokingMethod, this.info, from, action, identity.Name, iid, instanceID, false); // Security // if (this.info.CheckRoles) { if (!this.comAuth.IsAuthorizedForOperation(identity)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.CallAccessDenied()); } } if (this.info.HostingMode != HostingMode.WebHostOutOfProcess) { // NOTE: This has the side effect of setting up // the COM server security thing, so be sure // to clear it with Dispose() eventually. // serverSecurity = new ComPlusServerSecurity(identity, this.info.CheckRoles); } // Transactions // proxy = instanceContext.Extensions.Find <TransactionProxy>(); if (proxy != null) { // This makes the Tx header Understood. tx = MessageUtil.GetMessageTransaction(message); if (tx != null) { incomingTransactionID = tx.TransactionInformation.DistributedIdentifier; } try { if (tx != null) { proxy.SetTransaction(tx); } else { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.TransactionMismatch()); } ComPlusMethodCallTrace.Trace(TraceEventType.Verbose, TraceCode.ComIntegrationInvokingMethodNewTransaction, SR.TraceCodeComIntegrationInvokingMethodNewTransaction, this.info, from, action, identity.Name, iid, instanceID, incomingTransactionID); } catch (FaultException e) { Transaction txProxy = proxy.CurrentTransaction; Guid currentTransactionID = Guid.Empty; if (txProxy != null) { currentTransactionID = txProxy.TransactionInformation.DistributedIdentifier; } string identityName = String.Empty; if (null != identity) { identityName = identity.Name; } DiagnosticUtility.EventLog.LogEvent(TraceEventType.Error, (ushort)System.Runtime.Diagnostics.EventLogCategory.ComPlus, (uint)System.Runtime.Diagnostics.EventLogEventId.ComPlusInvokingMethodFailedMismatchedTransactions, incomingTransactionID.ToString("B").ToUpperInvariant(), currentTransactionID.ToString("B").ToUpperInvariant(), from.ToString(), this.info.AppID.ToString("B").ToUpperInvariant(), this.info.Clsid.ToString("B").ToUpperInvariant(), iid.ToString(), action, instanceID.ToString(CultureInfo.InvariantCulture), System.Threading.Thread.CurrentThread.ManagedThreadId.ToString(CultureInfo.InvariantCulture), SafeNativeMethods.GetCurrentThreadId().ToString(CultureInfo.InvariantCulture), identityName, e.ToString()); errorTraced = true; throw; } } else { ComPlusMethodCallTrace.Trace(TraceEventType.Verbose, TraceCode.ComIntegrationInvokingMethodContextTransaction, SR.TraceCodeComIntegrationInvokingMethodContextTransaction, this.info, from, action, identity.Name, iid, instanceID, true); } // Impersonation // if (this.info.HostingMode == HostingMode.WebHostOutOfProcess) { impersonateContext = identity.Impersonate(); } CorrelationState correlationState; correlationState = new CorrelationState(impersonateContext, serverSecurity, from, action, identity.Name, instanceID); impersonateContext = null; serverSecurity = null; return(correlationState); } finally { if (impersonateContext != null) { impersonateContext.Undo(); } if (serverSecurity != null) { ((IDisposable)serverSecurity).Dispose(); } } } catch (Exception e) { if (errorTraced == false) { if (DiagnosticUtility.ShouldTraceError) { DiagnosticUtility.EventLog.LogEvent(TraceEventType.Error, (ushort)System.Runtime.Diagnostics.EventLogCategory.ComPlus, (uint)System.Runtime.Diagnostics.EventLogEventId.ComPlusInvokingMethodFailed, from == null ? string.Empty : from.ToString(), this.info.AppID.ToString("B").ToUpperInvariant(), this.info.Clsid.ToString("B").ToUpperInvariant(), iid.ToString("B").ToUpperInvariant(), action, instanceID.ToString(CultureInfo.InvariantCulture), System.Threading.Thread.CurrentThread.ManagedThreadId.ToString(CultureInfo.InvariantCulture), SafeNativeMethods.GetCurrentThreadId().ToString(CultureInfo.InvariantCulture), identity.Name, e.ToString()); } } throw; } }
public object GetInstance(InstanceContext instanceContext, Message message) { object result = null; Guid incomingTransactionID = Guid.Empty; if (ContextUtil.IsInTransaction) { incomingTransactionID = ContextUtil.TransactionId; } ComPlusInstanceCreationTrace.Trace(TraceEventType.Verbose, TraceCode.ComIntegrationInstanceCreationRequest, SR.TraceCodeComIntegrationInstanceCreationRequest, this.info, message, incomingTransactionID); WindowsIdentity callerIdentity = null; callerIdentity = MessageUtil.GetMessageIdentity(message); WindowsImpersonationContext impersonateContext = null; try { try { if (this.info.HostingMode == HostingMode.WebHostOutOfProcess) { if (SecurityUtils.IsAtleastImpersonationToken(new SafeCloseHandle(callerIdentity.Token, false))) { impersonateContext = callerIdentity.Impersonate(); } else { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new COMException(SR.GetString(SR.BadImpersonationLevelForOutOfProcWas), HR.ERROR_BAD_IMPERSONATION_LEVEL)); } } CLSCTX clsctx = CLSCTX.SERVER; if (PlatformSupportsBitness && (this.info.HostingMode == HostingMode.WebHostOutOfProcess)) { if (this.info.Bitness == Bitness.Bitness32) { clsctx |= CLSCTX.ACTIVATE_32_BIT_SERVER; } else { clsctx |= CLSCTX.ACTIVATE_64_BIT_SERVER; } } result = SafeNativeMethods.CoCreateInstance( info.Clsid, null, clsctx, IID_IUnknown); } finally { if (impersonateContext != null) { impersonateContext.Undo(); } } } catch (Exception e) { if (Fx.IsFatal(e)) { throw; } Uri from = null; if (message.Headers.From != null) { from = message.Headers.From.Uri; } DiagnosticUtility.EventLog.LogEvent(TraceEventType.Error, (ushort)System.Runtime.Diagnostics.EventLogCategory.ComPlus, (uint)System.Runtime.Diagnostics.EventLogEventId.ComPlusInstanceCreationError, from == null ? string.Empty : from.ToString(), this.info.AppID.ToString(), this.info.Clsid.ToString(), incomingTransactionID.ToString(), callerIdentity.Name, e.ToString()); throw TraceUtility.ThrowHelperError(e, message); } TransactionProxy proxy = instanceContext.Extensions.Find <TransactionProxy>(); if (proxy != null) { proxy.InstanceID = result.GetHashCode(); } ComPlusInstanceCreationTrace.Trace(TraceEventType.Verbose, TraceCode.ComIntegrationInstanceCreationSuccess, SR.TraceCodeComIntegrationInstanceCreationSuccess, this.info, message, result.GetHashCode(), incomingTransactionID); return(result); }
public object GetInstance(InstanceContext instanceContext, Message message) { object obj2 = null; Guid empty = Guid.Empty; if (ContextUtil.IsInTransaction) { empty = ContextUtil.TransactionId; } ComPlusInstanceCreationTrace.Trace(TraceEventType.Verbose, 0x50012, "TraceCodeComIntegrationInstanceCreationRequest", this.info, message, empty); WindowsIdentity messageIdentity = null; messageIdentity = MessageUtil.GetMessageIdentity(message); WindowsImpersonationContext context = null; try { try { if (this.info.HostingMode == HostingMode.WebHostOutOfProcess) { if (!System.ServiceModel.ComIntegration.SecurityUtils.IsAtleastImpersonationToken(new SafeCloseHandle(messageIdentity.Token, false))) { throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new COMException(System.ServiceModel.SR.GetString("BadImpersonationLevelForOutOfProcWas"), HR.ERROR_BAD_IMPERSONATION_LEVEL)); } context = messageIdentity.Impersonate(); } CLSCTX sERVER = CLSCTX.SERVER; if (PlatformSupportsBitness && (this.info.HostingMode == HostingMode.WebHostOutOfProcess)) { if (this.info.Bitness == Bitness.Bitness32) { sERVER |= CLSCTX.ACTIVATE_32_BIT_SERVER; } else { sERVER |= CLSCTX.ACTIVATE_64_BIT_SERVER; } } obj2 = System.ServiceModel.ComIntegration.SafeNativeMethods.CoCreateInstance(this.info.Clsid, null, sERVER, IID_IUnknown); } finally { if (context != null) { context.Undo(); } } } catch (Exception exception) { if (Fx.IsFatal(exception)) { throw; } Uri uri = null; if (message.Headers.From != null) { uri = message.Headers.From.Uri; } System.ServiceModel.DiagnosticUtility.EventLog.LogEvent(TraceEventType.Error, EventLogCategory.ComPlus, (EventLogEventId)(-1073610726), new string[] { (uri == null) ? string.Empty : uri.ToString(), this.info.AppID.ToString(), this.info.Clsid.ToString(), empty.ToString(), messageIdentity.Name, exception.ToString() }); throw TraceUtility.ThrowHelperError(exception, message); } System.ServiceModel.ComIntegration.TransactionProxy proxy = instanceContext.Extensions.Find <System.ServiceModel.ComIntegration.TransactionProxy>(); if (proxy != null) { proxy.InstanceID = obj2.GetHashCode(); } ComPlusInstanceCreationTrace.Trace(TraceEventType.Verbose, 0x50013, "TraceCodeComIntegrationInstanceCreationSuccess", this.info, message, obj2.GetHashCode(), empty); return(obj2); }