Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / infocard / Service / managed / Microsoft / InfoCards / InfoCardService.cs / 1 / InfoCardService.cs
//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- // // Presharp uses the c# pragma mechanism to supress its warnings. // These are not recognised by the base compiler so we need to explictly // disable the following warnings. See http://winweb/cse/Tools/PREsharp/userguide/default.asp // for details. // #pragma warning disable 1634, 1691 // unknown message, unknown pragma namespace Microsoft.InfoCards { using System; using System.Text; using System.IO; using System.Collections; using System.ComponentModel; using System.Diagnostics; using System.Runtime.InteropServices; using System.Security.AccessControl; using System.Security.Principal; using System.ServiceProcess; using System.Threading; using System.Reflection; using Microsoft.InfoCards.Diagnostics; using System.Net; using System.Net.Security; using IDT = Microsoft.InfoCards.Diagnostics.InfoCardTrace; // // Summary: // This is the class that receives service control manager messages and acts accordingly, such as // starting or stopping the service. // internal class InfoCardService : ServiceBase { public const int WindowsVistaMajorVersion = 6; public const string FullServiceName = "idsvc"; // // Declare service stopping delegate. // static public event EventHandler Stopping; // // An instance of a delegate passed out to native code. It's // held here so that the garbage collector doesn't get rid of it // while native code is still using it. // RpcCallbacks m_rpcCallbacks; static public LifeTimeMonitor LifeTimeMonitor = null; public InfoCardService() { // // Set privileges on our exe // // For downlevel: This is being called by managed code so that it can be overridden // by the service update // // For XP Tablet PC, we need debug privileges in order to locate the instance of tcserver // that is associated with our desktop. // // For LH+ the code to strip privileges exists in S.SM.Install.dll. // So we'd also need to change registry setting with update. // bool isTabletPC = (0 != NativeMethods.GetSystemMetrics( NativeMethods.SM_TABLETPC )); bool isDownlevel = (Environment.OSVersion.Version.Major < WindowsVistaMajorVersion); bool isXPTabletPC = isTabletPC && isDownlevel; if( 0 != NativeMcppMethods.AdjustPrivilegesWrapper( isXPTabletPC ) ) { // // Not an expected condition, should crash the service. // Crash( new Win32Exception() ); } try { NativeMcppMethods.AdjustServiceProcessSecurity(); } catch( Win32Exception e ) { Crash( e ); } ServiceName = InfoCardService.FullServiceName; CanStop = true; CanShutdown = true; CanPauseAndContinue = false; CanHandleSessionChangeEvent = true; CanHandlePowerEvent = false; AutoLog = true; m_rpcCallbacks.uiAgentRequestAuthorize = new RpcAuthorizeCallback( UIAgentRequest.Authorize ); m_rpcCallbacks.uiAgentRequestBindToService = new RpcUIAgentBindToServiceCallback( UIAgentRequest.BindToService ); m_rpcCallbacks.clientRequestAuthorize = new RpcAuthorizeCallback( ClientRequest.Authorize ); m_rpcCallbacks.clientRequestBindToService = new RpcClientBindToServiceCallback( ClientUIRequest.BindToService ); m_rpcCallbacks.requestFactoryProcessNewRequest = new RpcProcessNewRequestCallback( RequestFactory.ProcessNewRequest ); m_rpcCallbacks.allocMem = new RpcAllocMemCallback( Marshal.AllocHGlobal ); m_rpcCallbacks.freeMem = new RpcFreeMemCallback( Marshal.FreeHGlobal ); m_rpcCallbacks.rundownClientContext = new RpcRundownClientContextHandle( ClientUIRequest.RemoveAndDisposeContextMapping ); // // Create the service lifetime monitor. // InfoCardService.LifeTimeMonitor = new LifeTimeMonitor(); // // The .NET validator does NO CRL check by default. Also it does not check for peer trust. // This will get invoked for all https interactions from managed code. // To remove the inconsistency between this and the CardSpace validator, implement the callback in the .NET validator. // The callback we implement will check for CRL offline and/or peer trust. // ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback( InfoCardX509Validator.ValidateChainOrPeerCallback ); } protected override void Dispose( bool disposing ) { base.Dispose( disposing ); } // // Summary: // Starts the service. // // Remarks: // Starts the native RPC layer and passes out the static delegates that that layer needs to call // back in to managed code when an RPC request is received. // protected override void OnStart( string[] args ) { base.OnStart( args ); AppDomain dom = AppDomain.CurrentDomain; dom.SetPrincipalPolicy( PrincipalPolicy.WindowsPrincipal ); using( HGlobalSafeHandle callbacks = HGlobalSafeHandle.Construct( Marshal.SizeOf( m_rpcCallbacks ) ) ) { Marshal.StructureToPtr( m_rpcCallbacks, callbacks.DangerousGetHandle(), false ); uint status = NativeMcppMethods.InfoCardStartRpcServerWrapper( InfoCardUIAgent.UiAgentFullPath, callbacks.DangerousGetHandle() ); if( 0 != status ) { throw IDT.ThrowHelperError( new Win32Exception( (int)status ) ); } } } // // Summary: // Called when the SCM wants the service stop. When called the native RPC layer is stopped. protected override void OnStop() { try { InfoCardUIAgent.DoShutdown(); NativeMcppMethods.InfoCardStopRpcServerWrapper(); // // Raise service stopping event. // OnStopping(); } #pragma warning suppress 56500 // do not catch all exceptions. catch( Exception e ) { IDT.TraceAndLogException( e ); // // We need to catch the exception becuase we are shutting down // if it throws, it will leave the SCM in and invalid state. // } finally { base.OnStop( ); } } // // Summary: // Raises service stopping event to registered handlers. // protected virtual void OnStopping() { if( null != Stopping ) { Stopping( this, new EventArgs() ); } } // // Summary: // Called whenever something changes about the TS Sessions on the machine. // protected override void OnSessionChange( SessionChangeDescription changeDescription ) { // // If this is a SessionLogOff then we want to make sure that we shut down any UIAgents in that session. // This prevents any following users from logging in and seeing the ui from the previous user of that // session. // if( System.ServiceProcess.SessionChangeReason.SessionLogoff == changeDescription.Reason ) { InfoCardUIAgent.OnLogout( (uint)changeDescription.SessionId ); } } // // Summary: // Called when an unrecoverable error has occurred. // static public void Crash() { InfoCardService.Crash( null ); } // // Summary: // Called when an unrecoverable error has occurred. // Log that something awful happened, and failfast the process. // // Parameters: // e - The exception that is at the root of the unrecoverable error. This is logged to the // debug output stream. // static public void Crash( Exception e ) { #if DEBUG Debugger.Log( 0, "", SR.GetString( SR.ServiceEncounteredFatalError ) ); string failFastMessage; if ( null != e ) { Debugger.Log( 0, "", e.ToString() ); IDT.TraceDebug( "Fatal exception - terminating service {0} ({1})\n{2}", e.Message, e.Source, e.StackTrace ); failFastMessage = e.Message; } else { failFastMessage = SR.GetString( SR.ServiceCrashedWithoutException ); } if( Debugger.IsAttached ) { Debugger.Launch(); Debugger.Break(); } Microsoft.InfoCards.Diagnostics.InfoCardTrace.FailFast( failFastMessage ); Environment.Exit( 1 ); #else IDT.FailFast( e.Message ); #endif } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- IsolatedStorage.cs
- XmlSchemaFacet.cs
- SvcMapFileSerializer.cs
- DBDataPermissionAttribute.cs
- EventSetter.cs
- MessageEnumerator.cs
- StylusTouchDevice.cs
- DataGridViewRowStateChangedEventArgs.cs
- XslTransform.cs
- FixedHighlight.cs
- CaseExpr.cs
- NullableFloatMinMaxAggregationOperator.cs
- Message.cs
- HandlerFactoryCache.cs
- PrintDialog.cs
- bidPrivateBase.cs
- SqlHelper.cs
- ControlsConfig.cs
- ConstrainedGroup.cs
- PieceNameHelper.cs
- CompiledQueryCacheEntry.cs
- ArcSegment.cs
- GeometryConverter.cs
- InvalidateEvent.cs
- ParagraphVisual.cs
- EditCommandColumn.cs
- JsonDataContract.cs
- SerializationException.cs
- CustomTypeDescriptor.cs
- DataList.cs
- TypeDelegator.cs
- PropertyChangingEventArgs.cs
- PieceNameHelper.cs
- _RequestCacheProtocol.cs
- DataStreamFromComStream.cs
- FontSource.cs
- WindowsIdentity.cs
- SchemaCompiler.cs
- EndpointNameMessageFilter.cs
- MenuItemBinding.cs
- SystemParameters.cs
- ColorConvertedBitmapExtension.cs
- XmlObjectSerializer.cs
- Matrix3D.cs
- DetailsViewModeEventArgs.cs
- ByteRangeDownloader.cs
- oledbmetadatacolumnnames.cs
- MessageLogTraceRecord.cs
- PerfCounterSection.cs
- Types.cs
- LineProperties.cs
- DockPattern.cs
- MultitargetingHelpers.cs
- Stylus.cs
- BlurBitmapEffect.cs
- WindowsSidIdentity.cs
- HandlerFactoryWrapper.cs
- ImageKeyConverter.cs
- PackageStore.cs
- AlignmentYValidation.cs
- MessagePropertyVariants.cs
- DesignerResources.cs
- ProfileSection.cs
- TailCallAnalyzer.cs
- MasterPageBuildProvider.cs
- ZoomPercentageConverter.cs
- PasswordTextNavigator.cs
- AuthenticateEventArgs.cs
- ScriptHandlerFactory.cs
- DispatchOperationRuntime.cs
- UpdatePanelTriggerCollection.cs
- WebRequest.cs
- NestedContainer.cs
- BitHelper.cs
- DataSourceGeneratorException.cs
- LinqDataSourceUpdateEventArgs.cs
- ScrollProperties.cs
- MenuItem.cs
- FormatException.cs
- GenericPrincipal.cs
- ToolStripContentPanelRenderEventArgs.cs
- XmlSchemaAnnotated.cs
- ShaperBuffers.cs
- PanelDesigner.cs
- StrongNameIdentityPermission.cs
- FillRuleValidation.cs
- StringStorage.cs
- GlobalizationAssembly.cs
- UrlAuthorizationModule.cs
- StrongName.cs
- JoinQueryOperator.cs
- SecureEnvironment.cs
- ExtenderProvidedPropertyAttribute.cs
- SystemUdpStatistics.cs
- ClientBuildManagerCallback.cs
- HtmlTableCell.cs
- WebPartAddingEventArgs.cs
- SafeCryptoHandles.cs
- XamlInt32CollectionSerializer.cs
- MenuCommandsChangedEventArgs.cs