1 //------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation.  All rights reserved.
3 //------------------------------------------------------------
4 
5 namespace System.ServiceModel.Administration
6 {
7     using System;
8     using System.Collections.Generic;
9     using System.Diagnostics;
10     using System.Globalization;
11     using System.Reflection;
12     using System.Runtime;
13     using System.ServiceModel;
14     using System.ServiceModel.Diagnostics;
15     using System.ServiceModel.Activation;
16     using System.Security;
17     using System.Security.Permissions;
18 
19     class AppDomainInstanceProvider : ProviderBase, IWmiProvider
20     {
IWmiProvider.EnumInstances(IWmiInstances instances)21         void IWmiProvider.EnumInstances(IWmiInstances instances)
22         {
23             Fx.Assert(null != instances, "");
24             IWmiInstance instance = instances.NewInstance(null);
25             FillAppDomainInfo(instance);
26             instances.AddInstance(instance);
27         }
28 
IWmiProvider.GetInstance(IWmiInstance instance)29         bool IWmiProvider.GetInstance(IWmiInstance instance)
30         {
31             Fx.Assert(null != instance, "");
32             bool bFound = false;
33             if ((int)instance.GetProperty(AdministrationStrings.ProcessId) == AppDomainInfo.Current.ProcessId
34                 && String.Equals((string)instance.GetProperty(AdministrationStrings.Name), AppDomainInfo.Current.Name, StringComparison.Ordinal))
35             {
36                 FillAppDomainInfo(instance);
37                 bFound = true;
38             }
39 
40             return bFound;
41         }
42 
GetReference()43         internal static string GetReference()
44         {
45             return String.Format(CultureInfo.InvariantCulture, AdministrationStrings.AppDomainInfo +
46                                     "." +
47                                     AdministrationStrings.AppDomainId +
48                                     "={0}," +
49                                     AdministrationStrings.Name +
50                                     "='{1}'," +
51                                     AdministrationStrings.ProcessId +
52                                     "={2}",
53                                AppDomainInfo.Current.Id,
54                                AppDomainInfo.Current.Name,
55                                AppDomainInfo.Current.ProcessId);
56         }
57 
FillAppDomainInfo(IWmiInstance instance)58         internal static void FillAppDomainInfo(IWmiInstance instance)
59         {
60             Fx.Assert(null != instance, "");
61             AppDomainInfo domainInfo = AppDomainInfo.Current;
62             instance.SetProperty(AdministrationStrings.Name, domainInfo.Name);
63             instance.SetProperty(AdministrationStrings.AppDomainId, domainInfo.Id);
64             instance.SetProperty(AdministrationStrings.PerformanceCounters, PerformanceCounters.Scope.ToString());
65             instance.SetProperty(AdministrationStrings.IsDefault, domainInfo.IsDefaultAppDomain);
66             instance.SetProperty(AdministrationStrings.ProcessId, domainInfo.ProcessId);
67             instance.SetProperty(AdministrationStrings.TraceLevel, DiagnosticUtility.Level.ToString());
68             instance.SetProperty(AdministrationStrings.LogMalformedMessages, MessageLogger.LogMalformedMessages);
69             instance.SetProperty(AdministrationStrings.LogMessagesAtServiceLevel, MessageLogger.LogMessagesAtServiceLevel);
70             instance.SetProperty(AdministrationStrings.LogMessagesAtTransportLevel, MessageLogger.LogMessagesAtTransportLevel);
71             instance.SetProperty(AdministrationStrings.ServiceConfigPath, AspNetEnvironment.Current.ConfigurationPath);
72             FillListenersInfo(instance);
73         }
74 
CreateListenersInfo(TraceSource traceSource, IWmiInstance instance)75         static IWmiInstance[] CreateListenersInfo(TraceSource traceSource, IWmiInstance instance)
76         {
77             Fx.Assert(null != traceSource, "");
78             Fx.Assert(null != instance, "");
79 
80             IWmiInstance[] traceListeners = new IWmiInstance[traceSource.Listeners.Count];
81 
82             for (int i = 0; i < traceSource.Listeners.Count; i++)
83             {
84                 TraceListener traceListener = traceSource.Listeners[i];
85                 IWmiInstance traceListenerWmiInstance = instance.NewInstance(AdministrationStrings.TraceListener);
86                 traceListenerWmiInstance.SetProperty(AdministrationStrings.Name, traceListener.Name);
87                 List<IWmiInstance> traceListenerArguments = new List<IWmiInstance>(1);
88 
89                 Type type = traceListener.GetType();
90                 string initializeData = (string)type.InvokeMember(AdministrationStrings.InitializeData, BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance, null, traceListener, null, CultureInfo.InvariantCulture);
91                 string[] supportedAttributes = (string[])type.InvokeMember(AdministrationStrings.GetSupportedAttributes, BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, traceListener, null, CultureInfo.InvariantCulture);
92 
93                 IWmiInstance argumentWmiInstance = instance.NewInstance(AdministrationStrings.TraceListenerArgument);
94                 argumentWmiInstance.SetProperty(AdministrationStrings.Name, AdministrationStrings.InitializeData);
95                 argumentWmiInstance.SetProperty(AdministrationStrings.Value, initializeData);
96                 traceListenerArguments.Add(argumentWmiInstance);
97 
98                 if (null != supportedAttributes)
99                 {
100                     foreach (string attribute in supportedAttributes)
101                     {
102                         argumentWmiInstance = instance.NewInstance(AdministrationStrings.TraceListenerArgument);
103                         argumentWmiInstance.SetProperty(AdministrationStrings.Name, attribute);
104                         argumentWmiInstance.SetProperty(AdministrationStrings.Value, traceListener.Attributes[attribute]);
105                         traceListenerArguments.Add(argumentWmiInstance);
106                     }
107                 }
108                 traceListenerWmiInstance.SetProperty(AdministrationStrings.TraceListenerArguments, traceListenerArguments.ToArray());
109                 traceListeners[i] = traceListenerWmiInstance;
110             }
111 
112             return traceListeners;
113         }
114 
FillListenersInfo(IWmiInstance instance)115         static void FillListenersInfo(IWmiInstance instance)
116         {
117             Fx.Assert(null != instance, "");
118             TraceSource traceSource = DiagnosticUtility.DiagnosticTrace == null ? null : DiagnosticUtility.DiagnosticTrace.TraceSource;
119             if (null != traceSource)
120             {
121                 instance.SetProperty(AdministrationStrings.ServiceModelTraceListeners, CreateListenersInfo(traceSource, instance));
122             }
123             traceSource = MessageLogger.MessageTraceSource;
124             if (null != traceSource)
125             {
126                 instance.SetProperty(AdministrationStrings.MessageLoggingTraceListeners, CreateListenersInfo(traceSource, instance));
127             }
128         }
129 
130         [Fx.Tag.SecurityNote(Critical = "Critical because we are setting DiagnosticUtility.Level.",
131             Safe = "Demands UnmanagedCode permission to set the Trace level")]
132         [SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]
133         [SecuritySafeCritical]
IWmiProvider.PutInstance(IWmiInstance instance)134         bool IWmiProvider.PutInstance(IWmiInstance instance)
135         {
136             Fx.Assert(null != instance, "");
137             bool bFound = false;
138             if ((int)instance.GetProperty(AdministrationStrings.ProcessId) == AppDomainInfo.Current.ProcessId
139                 && String.Equals((string)instance.GetProperty(AdministrationStrings.Name), AppDomainInfo.Current.Name, StringComparison.Ordinal))
140             {
141                 try
142                 {
143                     SourceLevels newLevel = (SourceLevels)Enum.Parse(typeof(SourceLevels), (string)instance.GetProperty(AdministrationStrings.TraceLevel));
144                     if (DiagnosticUtility.Level != newLevel)
145                     {
146                         if (DiagnosticUtility.ShouldTraceVerbose)
147                         {
148                             TraceUtility.TraceEvent(TraceEventType.Verbose, TraceCode.WmiPut, SR.GetString(SR.TraceCodeWmiPut),
149                                 new WmiPutTraceRecord("DiagnosticTrace.Level",
150                                 DiagnosticUtility.Level,
151                                 newLevel), instance, null);
152                         }
153                         DiagnosticUtility.Level = newLevel;
154                     }
155 
156                     bool logMalformedMessages = (bool)instance.GetProperty(AdministrationStrings.LogMalformedMessages);
157                     if (MessageLogger.LogMalformedMessages != logMalformedMessages)
158                     {
159                         if (DiagnosticUtility.ShouldTraceVerbose)
160                         {
161                             TraceUtility.TraceEvent(TraceEventType.Verbose, TraceCode.WmiPut, SR.GetString(SR.TraceCodeWmiPut),
162                                 new WmiPutTraceRecord("MessageLogger.LogMalformedMessages",
163                                 MessageLogger.LogMalformedMessages,
164                                 logMalformedMessages), instance, null);
165                         }
166                         MessageLogger.LogMalformedMessages = logMalformedMessages;
167                     }
168 
169                     bool logMessagesAtServiceLevel = (bool)instance.GetProperty(AdministrationStrings.LogMessagesAtServiceLevel);
170                     if (MessageLogger.LogMessagesAtServiceLevel != logMessagesAtServiceLevel)
171                     {
172                         if (DiagnosticUtility.ShouldTraceVerbose)
173                         {
174                             TraceUtility.TraceEvent(TraceEventType.Verbose, TraceCode.WmiPut, SR.GetString(SR.TraceCodeWmiPut),
175                                 new WmiPutTraceRecord("MessageLogger.LogMessagesAtServiceLevel",
176                                 MessageLogger.LogMessagesAtServiceLevel,
177                                 logMessagesAtServiceLevel), instance, null);
178                         }
179                         MessageLogger.LogMessagesAtServiceLevel = logMessagesAtServiceLevel;
180                     }
181 
182                     bool logMessagesAtTransportLevel = (bool)instance.GetProperty(AdministrationStrings.LogMessagesAtTransportLevel);
183                     if (MessageLogger.LogMessagesAtTransportLevel != logMessagesAtTransportLevel)
184                     {
185                         if (DiagnosticUtility.ShouldTraceVerbose)
186                         {
187                             TraceUtility.TraceEvent(TraceEventType.Verbose, TraceCode.WmiPut, SR.GetString(SR.TraceCodeWmiPut),
188                                 new WmiPutTraceRecord("MessageLogger.LogMessagesAtTransportLevel",
189                                 MessageLogger.LogMessagesAtTransportLevel,
190                                 logMessagesAtTransportLevel), instance, null);
191                         }
192                         MessageLogger.LogMessagesAtTransportLevel = logMessagesAtTransportLevel;
193                     }
194                 }
195                 catch (ArgumentException)
196                 {
197                     throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new WbemInvalidParameterException());
198                 }
199                 bFound = true;
200             }
201 
202             return bFound;
203         }
204     }
205 }
206