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
- RtfNavigator.cs
- BitmapMetadataEnumerator.cs
- EventSinkActivity.cs
- EmissiveMaterial.cs
- CngAlgorithm.cs
- ApplicationCommands.cs
- Socket.cs
- OptimizedTemplateContent.cs
- NamedPipeAppDomainProtocolHandler.cs
- MobileSysDescriptionAttribute.cs
- BitmapVisualManager.cs
- UnsafeNativeMethods.cs
- TextFragmentEngine.cs
- ExpandableObjectConverter.cs
- AttributeUsageAttribute.cs
- WebPartUtil.cs
- TypeLibConverter.cs
- ProxyWebPart.cs
- KeyboardInputProviderAcquireFocusEventArgs.cs
- VisualState.cs
- DefaultBinder.cs
- SqlDataSourceQuery.cs
- SqlClientWrapperSmiStream.cs
- ButtonBase.cs
- SafeTimerHandle.cs
- CustomTrackingQuery.cs
- SessionViewState.cs
- OptimalBreakSession.cs
- SqlCacheDependencySection.cs
- ConnectionPoint.cs
- TraceUtility.cs
- RewritingPass.cs
- FlowDocumentFormatter.cs
- FixedSOMPage.cs
- HighlightComponent.cs
- XamlReaderHelper.cs
- ListItemParagraph.cs
- GacUtil.cs
- ModuleConfigurationInfo.cs
- UndoManager.cs
- SQLInt32.cs
- ReaderOutput.cs
- SelectionPattern.cs
- FieldNameLookup.cs
- Condition.cs
- CheckoutException.cs
- StrokeCollectionConverter.cs
- InstanceData.cs
- HighlightOverlayGlyph.cs
- sqlstateclientmanager.cs
- PointCollectionConverter.cs
- LexicalChunk.cs
- ConnectionsZone.cs
- documentation.cs
- TextFormatterHost.cs
- SettingsProperty.cs
- InProcStateClientManager.cs
- GridEntryCollection.cs
- _ContextAwareResult.cs
- WebPartEventArgs.cs
- IUnknownConstantAttribute.cs
- HMACRIPEMD160.cs
- SmtpDigestAuthenticationModule.cs
- xdrvalidator.cs
- PowerModeChangedEventArgs.cs
- TaskFormBase.cs
- SmtpCommands.cs
- FilterElement.cs
- BuildProvidersCompiler.cs
- EventRecord.cs
- ElementNotEnabledException.cs
- ConnectionManagementSection.cs
- SimpleFileLog.cs
- ClientRuntimeConfig.cs
- RequestCacheManager.cs
- Nodes.cs
- PropertyIdentifier.cs
- Ref.cs
- FixedPageProcessor.cs
- SizeLimitedCache.cs
- SearchForVirtualItemEventArgs.cs
- ApplicationServiceHelper.cs
- ProviderCommandInfoUtils.cs
- TextFormatter.cs
- DbDeleteCommandTree.cs
- ProviderConnectionPointCollection.cs
- DNS.cs
- FileEnumerator.cs
- EntityContainer.cs
- NativeMethods.cs
- Walker.cs
- ModuleBuilder.cs
- HttpProfileBase.cs
- DetailsViewCommandEventArgs.cs
- ThreadStateException.cs
- ApplicationInfo.cs
- EncryptedType.cs
- TdsParser.cs
- DateTimeValueSerializer.cs
- DBParameter.cs