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
- BamlBinaryWriter.cs
- AttributeTable.cs
- CacheEntry.cs
- BCryptHashAlgorithm.cs
- TextRangeProviderWrapper.cs
- HttpHeaderCollection.cs
- BitmapEffectDrawingContent.cs
- X509Certificate2Collection.cs
- PathBox.cs
- DataMember.cs
- SystemDropShadowChrome.cs
- returneventsaver.cs
- BamlReader.cs
- DrawingContextWalker.cs
- EntityDescriptor.cs
- WebPartConnectionsCancelVerb.cs
- DbExpressionBuilder.cs
- Accessors.cs
- SourceElementsCollection.cs
- SystemWebExtensionsSectionGroup.cs
- DocumentEventArgs.cs
- ToolboxItem.cs
- GacUtil.cs
- FileVersionInfo.cs
- LinearKeyFrames.cs
- PublisherMembershipCondition.cs
- MemoryFailPoint.cs
- ArcSegment.cs
- LocalizableResourceBuilder.cs
- XmlTextWriter.cs
- handlecollector.cs
- SymmetricKeyWrap.cs
- FullTextState.cs
- XmlSchemaComplexContentExtension.cs
- DescriptionAttribute.cs
- WinInetCache.cs
- DesignOnlyAttribute.cs
- BitmapCacheBrush.cs
- PageCatalogPart.cs
- TemplateControlBuildProvider.cs
- RowSpanVector.cs
- PrimarySelectionGlyph.cs
- ConstraintConverter.cs
- OleServicesContext.cs
- MaskDescriptor.cs
- PassportPrincipal.cs
- LocationUpdates.cs
- ProfileManager.cs
- WrappedOptions.cs
- MemoryMappedViewStream.cs
- SQLInt16Storage.cs
- DbConnectionInternal.cs
- ValidatingPropertiesEventArgs.cs
- CodeEventReferenceExpression.cs
- RuntimeEnvironment.cs
- PropertyItem.cs
- DataRecordInternal.cs
- TextElementCollectionHelper.cs
- OleDbRowUpdatedEvent.cs
- InstanceDescriptor.cs
- SmtpReplyReader.cs
- CancellationTokenSource.cs
- Walker.cs
- MarkupExtensionParser.cs
- followingsibling.cs
- StringFunctions.cs
- KnownTypesProvider.cs
- CallId.cs
- GuidConverter.cs
- AspProxy.cs
- DataGridRow.cs
- PathParser.cs
- WebContext.cs
- Sorting.cs
- ImageMapEventArgs.cs
- TypefaceMap.cs
- OleCmdHelper.cs
- RegexGroupCollection.cs
- TimelineCollection.cs
- HttpRequest.cs
- ReflectionTypeLoadException.cs
- SessionEndedEventArgs.cs
- ScriptResourceHandler.cs
- EntityDataSourceStatementEditor.cs
- CompositeScriptReference.cs
- SocketElement.cs
- ConsoleKeyInfo.cs
- ListViewItemSelectionChangedEvent.cs
- SerializationInfoEnumerator.cs
- PageHandlerFactory.cs
- BaseCollection.cs
- TypeConverter.cs
- WebExceptionStatus.cs
- SqlBulkCopy.cs
- SamlConstants.cs
- LocalBuilder.cs
- SelectedDatesCollection.cs
- Rotation3DKeyFrameCollection.cs
- FilteredXmlReader.cs
- UseAttributeSetsAction.cs