예제 #1
1
		private static void EnsureClassExists(SchemaNaming.InstallLogWrapper context, string classPath, SchemaNaming.ClassMaker classMakerFunction)
		{
			try
			{
				context.LogMessage(string.Concat(RC.GetString("CLASS_ENSURE"), " ", classPath));
				ManagementClass managementClass = new ManagementClass(classPath);
				managementClass.Get();
			}
			catch (ManagementException managementException1)
			{
				ManagementException managementException = managementException1;
				if (managementException.ErrorCode != ManagementStatus.NotFound)
				{
					throw managementException;
				}
				else
				{
					context.LogMessage(string.Concat(RC.GetString("CLASS_ENSURECREATE"), " ", classPath));
					ManagementClass managementClass1 = classMakerFunction();
					managementClass1.Put();
				}
			}
		}
예제 #2
0
        public override void Install(IDictionary savedState)
        {
            FileIOPermission fileIOPermission = new FileIOPermission(FileIOPermissionAccess.Read, base.Context.Parameters["assemblypath"]);

            fileIOPermission.Demand();
            base.Install(savedState);
            base.Context.LogMessage(RC.GetString("WMISCHEMA_INSTALLATIONSTART"));
            string       item         = base.Context.Parameters["assemblypath"];
            Assembly     assembly     = Assembly.LoadFrom(item);
            SchemaNaming schemaNaming = SchemaNaming.GetSchemaNaming(assembly);

            schemaNaming.DecoupledProviderInstanceName = AssemblyNameUtility.UniqueToAssemblyFullVersion(assembly);
            if (schemaNaming != null)
            {
                if (!schemaNaming.IsAssemblyRegistered() || base.Context.Parameters.ContainsKey("force") || base.Context.Parameters.ContainsKey("f"))
                {
                    base.Context.LogMessage(string.Concat(RC.GetString("REGESTRING_ASSEMBLY"), " ", schemaNaming.DecoupledProviderInstanceName));
                    schemaNaming.RegisterNonAssemblySpecificSchema(base.Context);
                    schemaNaming.RegisterAssemblySpecificSchema();
                }
                this.mof = schemaNaming.Mof;
                base.Context.LogMessage(RC.GetString("WMISCHEMA_INSTALLATIONEND"));
                return;
            }
            else
            {
                return;
            }
        }
        /// <summary>
        ///    <para>Installs the assembly.</para>
        /// </summary>
        /// <param name='savedState'>The state of the assembly.</param>
        public override void Install(IDictionary savedState)
        {
            base.Install(savedState);
            // TODO: Localize
            Context.LogMessage(RC.GetString("WMISCHEMA_INSTALLATIONSTART"));

            string   assemblyPath = Context.Parameters["assemblypath"];
            Assembly assembly     = Assembly.LoadFrom(assemblyPath);

            SchemaNaming naming = SchemaNaming.GetSchemaNaming(assembly);

            // See if this assembly provides instrumentation
            if (null == naming)
            {
                return;
            }

            //
            // [RAID: 123895]
            // If the force parameter is present, we update registration information independent if it already
            // exists.
            //
            if ((naming.IsAssemblyRegistered() == false) || (Context.Parameters.ContainsKey("force")) || (Context.Parameters.ContainsKey("f")))
            {
                Context.LogMessage(RC.GetString("REGESTRING_ASSEMBLY") + " " + naming.DecoupledProviderInstanceName);

                naming.RegisterNonAssemblySpecificSchema(Context);
                naming.RegisterAssemblySpecificSchema();
            }
            mof = naming.Mof;

            Context.LogMessage(RC.GetString("WMISCHEMA_INSTALLATIONEND"));
        }
예제 #4
0
        /// <summary>
        ///     <para>Determines if the instrumentation schema of the specified assembly has already been correctly registered with WMI.</para>
        /// </summary>
        /// <param name="assemblyToRegister"><para>The assembly containing instrumentation instance or event types.</para></param>
        /// <returns>
        ///     <para>true if the instrumentation schema in the specified assembly is registered with WMI; otherwise, false.</para>
        /// </returns>
        public static bool IsAssemblyRegistered(Assembly assemblyToRegister)
        {
            // Check for valid argument
            if (null == assemblyToRegister)
            {
                throw new ArgumentNullException("assemblyToRegister");
            }

            // See if we have already loaded this assembly in the current app domain
            lock (instrumentedAssemblies)
            {
                if (instrumentedAssemblies.ContainsKey(assemblyToRegister))
                {
                    return(true);
                }
            }

            // See if the assembly is registered with WMI.  This will not force the
            // assembly to be registered, and will not load the dynamically generated
            // code if it is registered.
            SchemaNaming naming = SchemaNaming.GetSchemaNaming(assemblyToRegister);

            if (naming == null)
            {
                return(false);
            }

            return(naming.IsAssemblyRegistered());
        }
예제 #5
0
        private static void Initialize(Assembly assembly)
        {
            lock (instrumentedAssemblies)
            {
                if (instrumentedAssemblies.ContainsKey(assembly))
                {
                    return;
                }

                SchemaNaming naming = SchemaNaming.GetSchemaNaming(assembly);
                if (naming == null)
                {
                    return;
                }

                if (false == naming.IsAssemblyRegistered())
                {
                    // If we are not an administrator, don't try to JIT install the schema
                    if (!WMICapabilities.IsUserAdmin())
                    {
                        throw new Exception(RC.GetString("ASSEMBLY_NOT_REGISTERED"));
                    }

                    naming.RegisterNonAssemblySpecificSchema(null);
                    naming.RegisterAssemblySpecificSchema();
                }

                InstrumentedAssembly instrumentedAssembly = new InstrumentedAssembly(assembly, naming);
                instrumentedAssemblies.Add(assembly, instrumentedAssembly);
            }
        }
예제 #6
0
        public static bool IsAssemblyRegistered(Assembly assemblyToRegister)
        {
            bool flag;

            if (null != assemblyToRegister)
            {
                lock (Instrumentation.instrumentedAssemblies)
                {
                    if (!Instrumentation.instrumentedAssemblies.ContainsKey(assemblyToRegister))
                    {
                        goto Label0;
                    }
                    else
                    {
                        flag = true;
                    }
                }
                return(flag);
            }
            else
            {
                throw new ArgumentNullException("assemblyToRegister");
            }
Label0:
            SchemaNaming schemaNaming = SchemaNaming.GetSchemaNaming(assemblyToRegister);

            if (schemaNaming != null)
            {
                return(schemaNaming.IsAssemblyRegistered());
            }
            else
            {
                return(false);
            }
        }
예제 #7
0
 private static void Initialize(Assembly assembly)
 {
     lock (Instrumentation.instrumentedAssemblies)
     {
         if (!Instrumentation.instrumentedAssemblies.ContainsKey(assembly))
         {
             SchemaNaming schemaNaming = SchemaNaming.GetSchemaNaming(assembly);
             if (schemaNaming != null)
             {
                 if (!schemaNaming.IsAssemblyRegistered())
                 {
                     if (WMICapabilities.IsUserAdmin())
                     {
                         schemaNaming.DecoupledProviderInstanceName = AssemblyNameUtility.UniqueToAssemblyFullVersion(assembly);
                         schemaNaming.RegisterNonAssemblySpecificSchema(null);
                         schemaNaming.RegisterAssemblySpecificSchema();
                     }
                     else
                     {
                         throw new Exception(RC.GetString("ASSEMBLY_NOT_REGISTERED"));
                     }
                 }
                 InstrumentedAssembly instrumentedAssembly = new InstrumentedAssembly(assembly, schemaNaming);
                 Instrumentation.instrumentedAssemblies.Add(assembly, instrumentedAssembly);
             }
         }
     }
 }
        /// <summary>
        /// Install the assembly
        /// </summary>
        /// <param name="savedState"></param>
        public override void Install(IDictionary savedState)
        {
            base.Install(savedState);
            // TODO: Localize
            Context.LogMessage("Installing WMI Schema: Started");

            string   assemblyPath = Context.Parameters["assemblypath"];
            Assembly assembly     = Assembly.LoadFrom(assemblyPath);

            SchemaNaming naming = SchemaNaming.GetSchemaNaming(assembly);

            // See if this assembly provides instrumentation
            if (null == naming)
            {
                return;
            }

            if (naming.IsAssemblyRegistered() == false)
            {
                Context.LogMessage("Registering assembly: " + naming.DecoupledProviderInstanceName);

                naming.RegisterNonAssemblySpecificSchema(Context);
                naming.RegisterAssemblySpecificSchema();
            }
            mof = naming.GenerateMof();

            Context.LogMessage("Installing WMI Schema: Finished");
        }
예제 #9
0
            public TypeInfo(EventSource source, SchemaNaming naming, Type converterType)
            {
                this.converterType = converterType;
                this.source        = source;
                object target = Activator.CreateInstance(converterType);

                this.convertFunctionNoBatch = (ConvertToWMI)Delegate.CreateDelegate(typeof(ConvertToWMI), target, "ToWMI");
                this.SetBatchSize(this.batchSize);
            }
예제 #10
0
        public InstrumentedAssembly(Assembly assembly, SchemaNaming naming)
        {
            this.mapTypeToTypeInfo = new Hashtable();
            SecurityHelper.UnmanagedCode.Demand();
            this.naming = naming;
            Assembly precompiledAssembly = naming.PrecompiledAssembly;

            if (null == precompiledAssembly)
            {
                CSharpCodeProvider cSharpCodeProvider = new CSharpCodeProvider();
                CompilerParameters compilerParameter  = new CompilerParameters();
                compilerParameter.GenerateInMemory = true;
                compilerParameter.ReferencedAssemblies.Add(assembly.Location);
                compilerParameter.ReferencedAssemblies.Add(typeof(BaseEvent).Assembly.Location);
                compilerParameter.ReferencedAssemblies.Add(typeof(Component).Assembly.Location);
                Type[] types = assembly.GetTypes();
                for (int i = 0; i < (int)types.Length; i++)
                {
                    Type type = types[i];
                    if (this.IsInstrumentedType(type))
                    {
                        this.FindReferences(type, compilerParameter);
                    }
                }
                string[] code = new string[1];
                code[0] = naming.Code;
                CompilerResults compilerResult = cSharpCodeProvider.CompileAssemblyFromSource(compilerParameter, code);
                foreach (CompilerError error in compilerResult.Errors)
                {
                    Console.WriteLine(error.ToString());
                }
                if (!compilerResult.Errors.HasErrors)
                {
                    precompiledAssembly = compilerResult.CompiledAssembly;
                }
                else
                {
                    throw new Exception(RC.GetString("FAILED_TO_BUILD_GENERATED_ASSEMBLY"));
                }
            }
            Type type1 = precompiledAssembly.GetType("WMINET_Converter");

            this.mapTypeToConverter = (Hashtable)type1.GetField("mapTypeToConverter").GetValue(null);
            if (MTAHelper.IsNoContextMTA())
            {
                this.InitEventSource(this);
                return;
            }
            else
            {
                ThreadDispatch threadDispatch = new ThreadDispatch(new ThreadDispatch.ThreadWorkerMethodWithParam(this.InitEventSource));
                threadDispatch.Parameter = this;
                threadDispatch.Start();
                return;
            }
        }
예제 #11
0
		public InstrumentedAssembly(Assembly assembly, SchemaNaming naming)
		{
			this.mapTypeToTypeInfo = new Hashtable();
			SecurityHelper.UnmanagedCode.Demand();
			this.naming = naming;
			Assembly precompiledAssembly = naming.PrecompiledAssembly;
			if (null == precompiledAssembly)
			{
				CSharpCodeProvider cSharpCodeProvider = new CSharpCodeProvider();
				CompilerParameters compilerParameter = new CompilerParameters();
				compilerParameter.GenerateInMemory = true;
				compilerParameter.ReferencedAssemblies.Add(assembly.Location);
				compilerParameter.ReferencedAssemblies.Add(typeof(BaseEvent).Assembly.Location);
				compilerParameter.ReferencedAssemblies.Add(typeof(Component).Assembly.Location);
				Type[] types = assembly.GetTypes();
				for (int i = 0; i < (int)types.Length; i++)
				{
					Type type = types[i];
					if (this.IsInstrumentedType(type))
					{
						this.FindReferences(type, compilerParameter);
					}
				}
				string[] code = new string[1];
				code[0] = naming.Code;
				CompilerResults compilerResult = cSharpCodeProvider.CompileAssemblyFromSource(compilerParameter, code);
				foreach (CompilerError error in compilerResult.Errors)
				{
					Console.WriteLine(error.ToString());
				}
				if (!compilerResult.Errors.HasErrors)
				{
					precompiledAssembly = compilerResult.CompiledAssembly;
				}
				else
				{
					throw new Exception(RC.GetString("FAILED_TO_BUILD_GENERATED_ASSEMBLY"));
				}
			}
			Type type1 = precompiledAssembly.GetType("WMINET_Converter");
			this.mapTypeToConverter = (Hashtable)type1.GetField("mapTypeToConverter").GetValue(null);
			if (MTAHelper.IsNoContextMTA())
			{
				this.InitEventSource(this);
				return;
			}
			else
			{
				ThreadDispatch threadDispatch = new ThreadDispatch(new ThreadDispatch.ThreadWorkerMethodWithParam(this.InitEventSource));
				threadDispatch.Parameter = this;
				threadDispatch.Start();
				return;
			}
		}
예제 #12
0
        public InstrumentedAssembly(Assembly assembly, SchemaNaming naming)
        {
            SecurityHelper.UnmanagedCode.Demand();             // Bug#112640 - Close off any potential use from anything but fully trusted code
            this.naming = naming;

            Assembly compiledAssembly = naming.PrecompiledAssembly;

            if (null == compiledAssembly)
            {
                CSharpCodeProvider provider   = new CSharpCodeProvider();
                ICodeCompiler      compiler   = provider.CreateCompiler();
                CompilerParameters parameters = new CompilerParameters();
                parameters.GenerateInMemory = true;
                parameters.ReferencedAssemblies.Add(assembly.Location);
                parameters.ReferencedAssemblies.Add(typeof(BaseEvent).Assembly.Location);
                parameters.ReferencedAssemblies.Add(typeof(System.ComponentModel.Component).Assembly.Location);

                // Must reference any base types in 'assembly'
                // TODO: Make this more restrictive.  Only look at instrumented types.
                foreach (Type type in assembly.GetTypes())
                {
                    FindReferences(type, parameters);
                }

                CompilerResults results = compiler.CompileAssemblyFromSource(parameters, naming.Code);
                foreach (CompilerError err in results.Errors)
                {
                    Console.WriteLine(err.ToString());
                }
                compiledAssembly = results.CompiledAssembly;
            }
            Type dynType = compiledAssembly.GetType("WMINET_Converter");

            mapTypeToConverter = (Hashtable)dynType.GetField("mapTypeToConverter").GetValue(null);

            // TODO: Is STA/MTA all we have to worry about?
            if (!MTAHelper.IsNoContextMTA())             // Bug#110141 - Checking for MTA is not enough.  We need to make sure we are not in a COM+ Context
            {
                ThreadDispatch disp = new ThreadDispatch(new ThreadDispatch.ThreadWorkerMethodWithParam(InitEventSource));
                disp.Parameter = this;
                disp.Start( );

                // We are on an STA thread.  Create the event source on an MTA
//				Thread thread = new Thread(new ThreadStart(InitEventSource));
//                thread.ApartmentState = ApartmentState.MTA;
//				thread.Start();
//				thread.Join();
            }
            else
            {
                InitEventSource(this);
            }
        }
예제 #13
0
            public TypeInfo(EventSource source, SchemaNaming naming, Type converterType)
            {
                this.converterType = converterType;
                this.source        = source;

                Object converter = Activator.CreateInstance(converterType);

                convertFunctionNoBatch = (ConvertToWMI)Delegate.CreateDelegate(typeof(ConvertToWMI), converter, "ToWMI");

                // NOTE: wbemObjects[0] will get initialized in SetBatchSize if batchSize == 1

                SetBatchSize(batchSize);
            }
예제 #14
0
            public TypeInfo(EventSource source, SchemaNaming naming, Type t)
            {
                this.toWMI = (ConvertFuncToWMI)InstrumentedAssembly.mapTypeToToWMIFunc[t];
                this.toNET = (ConvertFuncToNET)InstrumentedAssembly.mapTypeToToNETFunc[t];
                this.t     = t;
                isSTA      = Thread.CurrentThread.ApartmentState == ApartmentState.STA;
                ManagementClass eventClass = new ManagementClass(naming.NamespaceName + ":" + ManagedNameAttribute.GetMemberName(t));
                PropertyInfo    prop       = typeof(ManagementBaseObject).GetProperty("WmiObject", BindingFlags.Instance | BindingFlags.NonPublic);

                ManagementObject evt = eventClass.CreateInstance();

                obj         = (IWbemClassObject_DoNotMarshal)prop.GetValue(evt, null);
                this.source = source;


                SetBatchSize(batchSize);

                IWbemClassObject_DoNotMarshal obj2;

                obj.Clone_(out obj2);
                xoa1[0] = (IWbemObjectAccess)obj2;
                oa1test = new ClassObjectArray(xoa1);

                writeDWORD1 = new WriteDWORD(xoa1[0].WriteDWORD_);
                writeQWORD1 = new WriteQWORD(xoa1[0].WriteQWORD_);

#if xxx
                string             code       = CodeSpit.Spit(t, xoa1[0]);
                CSharpCodeProvider provider   = new CSharpCodeProvider();
                ICodeCompiler      compiler   = provider.CreateCompiler();
                CompilerParameters parameters = new CompilerParameters();
                parameters.GenerateInMemory = true;

                parameters.ReferencedAssemblies.Add(t.Assembly.Location);
                parameters.ReferencedAssemblies.Add(typeof(WriteDWORD).Assembly.Location);
                parameters.ReferencedAssemblies.Add(typeof(Event).Assembly.Location);
                CompilerResults results = compiler.CompileAssemblyFromSource(parameters, code);
                foreach (CompilerError err in results.Errors)
                {
                    Console.WriteLine(err.ToString());
                }
                Type dynType = results.CompiledAssembly.GetType("Hack");

                MethodInfo doit = dynType.GetMethod("Func");

                managedToIWbem = (ManagedToIWbem)Delegate.CreateDelegate(typeof(ManagedToIWbem), doit);
#endif
            }
예제 #15
0
        public InstrumentedAssembly(Assembly assembly, SchemaNaming naming)
        {
            SecurityHelper.UnmanagedCode.Demand();
            this.naming = naming;
            Assembly precompiledAssembly = naming.PrecompiledAssembly;

            if (null == precompiledAssembly)
            {
                CSharpCodeProvider provider   = new CSharpCodeProvider();
                CompilerParameters parameters = new CompilerParameters {
                    GenerateInMemory = true
                };
                parameters.ReferencedAssemblies.Add(assembly.Location);
                parameters.ReferencedAssemblies.Add(typeof(BaseEvent).Assembly.Location);
                parameters.ReferencedAssemblies.Add(typeof(Component).Assembly.Location);
                foreach (Type type in assembly.GetTypes())
                {
                    if (this.IsInstrumentedType(type))
                    {
                        this.FindReferences(type, parameters);
                    }
                }
                CompilerResults results = provider.CompileAssemblyFromSource(parameters, new string[] { naming.Code });
                foreach (CompilerError error in results.Errors)
                {
                    Console.WriteLine(error.ToString());
                }
                if (results.Errors.HasErrors)
                {
                    throw new Exception(RC.GetString("FAILED_TO_BUILD_GENERATED_ASSEMBLY"));
                }
                precompiledAssembly = results.CompiledAssembly;
            }
            Type type2 = precompiledAssembly.GetType("WMINET_Converter");

            this.mapTypeToConverter = (Hashtable)type2.GetField("mapTypeToConverter").GetValue(null);
            if (!MTAHelper.IsNoContextMTA())
            {
                new ThreadDispatch(new ThreadDispatch.ThreadWorkerMethodWithParam(this.InitEventSource))
                {
                    Parameter = this
                }.Start();
            }
            else
            {
                this.InitEventSource(this);
            }
        }
예제 #16
0
        private static void InitializeInstance(Object o)
        {
            Type            type      = o.GetType();
            string          className = ManagedNameAttribute.GetClassName(type);
            SchemaNaming    naming    = InstrumentedAttribute.GetSchemaNaming(type.Assembly);
            ManagementClass theClass  = new ManagementClass(naming.NamespaceName + ":" + className);

            foreach (FieldInfo field in type.GetFields())
            {
                Object val = theClass.Properties[ManagedNameAttribute.GetFieldName(field)].Value;
                if (null != val)
                {
                    field.SetValue(o, val);
                }
            }
        }
예제 #17
0
        public static Hashtable mapTypeToToNETFunc = new Hashtable(); //TODO LOCK THIS

        public InstrumentedAssembly(Assembly assembly, SchemaNaming naming)
        {
            this.naming = naming;

            CSharpCodeProvider provider   = new CSharpCodeProvider();
            ICodeCompiler      compiler   = provider.CreateCompiler();
            CompilerParameters parameters = new CompilerParameters();

            parameters.GenerateInMemory = true;
            parameters.ReferencedAssemblies.Add(assembly.Location);
            parameters.ReferencedAssemblies.Add(typeof(BaseEvent).Assembly.Location);
            parameters.ReferencedAssemblies.Add(typeof(System.ComponentModel.Component).Assembly.Location);
            CompilerResults results = compiler.CompileAssemblyFromSource(parameters, naming.Code);

            foreach (CompilerError err in results.Errors)
            {
                Console.WriteLine(err.ToString());
            }
            Type dynType = results.CompiledAssembly.GetType("WMINET_Converter");

            Type[]       types  = (Type[])dynType.GetField("netTypes").GetValue(null);
            MethodInfo[] toWMIs = (MethodInfo[])dynType.GetField("toWMIMethods").GetValue(null);
            MethodInfo[] toNETs = (MethodInfo[])dynType.GetField("toNETMethods").GetValue(null);
            Object       theOne = dynType.GetField("theOne").GetValue(null);

            for (int i = 0; i < types.Length; i++)
            {
                ConvertFuncToWMI toWMI = (ConvertFuncToWMI)Delegate.CreateDelegate(typeof(ConvertFuncToWMI), theOne, toWMIs[i].Name);
                ConvertFuncToNET toNET = (ConvertFuncToNET)Delegate.CreateDelegate(typeof(ConvertFuncToNET), theOne, toNETs[i].Name);
                mapTypeToToWMIFunc.Add(types[i], toWMI);
                mapTypeToToNETFunc.Add(types[i], toNET);
            }

            // TODO: Is STA/MTA all we have to worry about?
            if (Thread.CurrentThread.ApartmentState == ApartmentState.STA)
            {
                // We are on an STA thread.  Create the event source on an MTA
                Thread thread = new Thread(new ThreadStart(InitEventSource));
                thread.ApartmentState = ApartmentState.MTA;
                thread.Start();
                thread.Join();
            }
            else
            {
                InitEventSource();
            }
        }
 public InstrumentedAssembly(Assembly assembly, SchemaNaming naming)
 {
     SecurityHelper.UnmanagedCode.Demand();
     this.naming = naming;
     Assembly precompiledAssembly = naming.PrecompiledAssembly;
     if (null == precompiledAssembly)
     {
         CSharpCodeProvider provider = new CSharpCodeProvider();
         CompilerParameters parameters = new CompilerParameters {
             GenerateInMemory = true
         };
         parameters.ReferencedAssemblies.Add(assembly.Location);
         parameters.ReferencedAssemblies.Add(typeof(BaseEvent).Assembly.Location);
         parameters.ReferencedAssemblies.Add(typeof(Component).Assembly.Location);
         foreach (Type type in assembly.GetTypes())
         {
             if (this.IsInstrumentedType(type))
             {
                 this.FindReferences(type, parameters);
             }
         }
         CompilerResults results = provider.CompileAssemblyFromSource(parameters, new string[] { naming.Code });
         foreach (CompilerError error in results.Errors)
         {
             Console.WriteLine(error.ToString());
         }
         if (results.Errors.HasErrors)
         {
             throw new Exception(RC.GetString("FAILED_TO_BUILD_GENERATED_ASSEMBLY"));
         }
         precompiledAssembly = results.CompiledAssembly;
     }
     Type type2 = precompiledAssembly.GetType("WMINET_Converter");
     this.mapTypeToConverter = (Hashtable) type2.GetField("mapTypeToConverter").GetValue(null);
     if (!MTAHelper.IsNoContextMTA())
     {
         new ThreadDispatch(new ThreadDispatch.ThreadWorkerMethodWithParam(this.InitEventSource)) { Parameter = this }.Start();
     }
     else
     {
         this.InitEventSource(this);
     }
 }
예제 #19
0
        public override void Install(IDictionary savedState)
        {
            // Demand IO permission required for LoadFrom FXCop 191096
            FileIOPermission ioPermission = new FileIOPermission(FileIOPermissionAccess.Read, (string)Context.Parameters["assemblypath"]);

            ioPermission.Demand();

            base.Install(savedState);
            //
            Context.LogMessage(RC.GetString("WMISCHEMA_INSTALLATIONSTART"));

            string   assemblyPath = Context.Parameters["assemblypath"];
            Assembly assembly     = Assembly.LoadFrom(assemblyPath);

            SchemaNaming naming = SchemaNaming.GetSchemaNaming(assembly);

            //
            // We always use the full version number for Whidbey.
            //
            naming.DecoupledProviderInstanceName = AssemblyNameUtility.UniqueToAssemblyFullVersion(assembly);
            // See if this assembly provides instrumentation
            if (null == naming)
            {
                return;
            }

            //
            // [RAID: 123895]
            // If the force parameter is present, we update registration information independent if it already
            // exists.
            //
            if ((naming.IsAssemblyRegistered() == false) || (Context.Parameters.ContainsKey("force")) || (Context.Parameters.ContainsKey("f")))
            {
                Context.LogMessage(RC.GetString("REGESTRING_ASSEMBLY") + " " + naming.DecoupledProviderInstanceName);

                naming.RegisterNonAssemblySpecificSchema(Context);
                naming.RegisterAssemblySpecificSchema();
            }
            mof = naming.Mof;

            Context.LogMessage(RC.GetString("WMISCHEMA_INSTALLATIONEND"));
        }
예제 #20
0
        public static bool IsAssemblyRegistered(Assembly assemblyToRegister)
        {
            if (null == assemblyToRegister)
            {
                throw new ArgumentNullException("assemblyToRegister");
            }
            lock (instrumentedAssemblies)
            {
                if (instrumentedAssemblies.ContainsKey(assemblyToRegister))
                {
                    return(true);
                }
            }
            SchemaNaming schemaNaming = SchemaNaming.GetSchemaNaming(assemblyToRegister);

            if (schemaNaming == null)
            {
                return(false);
            }
            return(schemaNaming.IsAssemblyRegistered());
        }
예제 #21
0
        private static void Initialize(Assembly assembly)
        {
            if (instrumentedAssemblies.ContainsKey(assembly))
            {
                return;
            }

            SchemaNaming naming = SchemaNaming.GetSchemaNaming(assembly);

            if (naming == null)
            {
                return;
            }

            if (false == naming.IsAssemblyRegistered())
            {
                throw new Exception("This assembly has not been registered with WMI");
            }

            InstrumentedAssembly instrumentedAssembly = new InstrumentedAssembly(assembly, naming);

            instrumentedAssemblies.Add(assembly, instrumentedAssembly);
        }
예제 #22
0
        private static void Initialize(Assembly assembly)
        {
            lock (instrumentedAssemblies)
            {
                if (instrumentedAssemblies.ContainsKey(assembly))
                {
                    return;
                }

                SchemaNaming naming = SchemaNaming.GetSchemaNaming(assembly);
                if (naming == null)
                {
                    return;
                }

                if (false == naming.IsAssemblyRegistered())
                {
                    // If we are not an administrator, don't try to JIT install the schema
                    if (!WMICapabilities.IsUserAdmin())
                    {
                        throw new Exception(RC.GetString("ASSEMBLY_NOT_REGISTERED"));
                    }

                    //
                    // We always use the full version number for Whidbey.
                    //
                    naming.DecoupledProviderInstanceName = AssemblyNameUtility.UniqueToAssemblyFullVersion(assembly);

                    naming.RegisterNonAssemblySpecificSchema(null);
                    naming.RegisterAssemblySpecificSchema();
                }

                InstrumentedAssembly instrumentedAssembly = new InstrumentedAssembly(assembly, naming);
                instrumentedAssemblies.Add(assembly, instrumentedAssembly);
            }
        }
예제 #23
0
            public TypeInfo(EventSource source, SchemaNaming naming, Type converterType)
            {
                this.converterType = converterType;
                this.source = source;

                Object converter = Activator.CreateInstance(converterType);
                convertFunctionNoBatch = (ConvertToWMI)Delegate.CreateDelegate(typeof(ConvertToWMI), converter, "ToWMI");

                // NOTE: wbemObjects[0] will get initialized in SetBatchSize if batchSize == 1

                SetBatchSize(batchSize);
            }
예제 #24
0
		private static void EnsureNamespace(SchemaNaming.InstallLogWrapper context, string namespaceName)
		{
			context.LogMessage(string.Concat(RC.GetString("NAMESPACE_ENSURE"), " ", namespaceName));
			string str = null;
			char[] chrArray = new char[1];
			chrArray[0] = '\\';
			string[] strArrays = namespaceName.Split(chrArray);
			for (int i = 0; i < (int)strArrays.Length; i++)
			{
				string str1 = strArrays[i];
				if (str != null)
				{
					SchemaNaming.EnsureNamespace(str, str1);
					str = string.Concat(str, "\\", str1);
				}
				else
				{
					str = str1;
				}
			}
		}
예제 #25
0
			public TypeInfo(EventSource source, SchemaNaming naming, Type converterType)
			{
				this.batchSize = 64;
				this.batchEvents = true;
				this.converterType = converterType;
				this.source = source;
				object obj = Activator.CreateInstance(converterType);
				this.convertFunctionNoBatch = (ConvertToWMI)Delegate.CreateDelegate(typeof(ConvertToWMI), obj, "ToWMI");
				this.SetBatchSize(this.batchSize);
			}
예제 #26
0
        public SchemaMapping(Type type, SchemaNaming naming, Hashtable mapTypeToConverterClassName)
        {
            codeClassName = (string)mapTypeToConverterClassName[type];
            classType     = type;

            bool hasGenericEmbeddedObject = false;

            string baseClassName = ManagedNameAttribute.GetBaseClassName(type);

            className           = ManagedNameAttribute.GetMemberName(type);
            instrumentationType = InstrumentationClassAttribute.GetAttribute(type).InstrumentationType;

            classPath = naming.NamespaceName + ":" + className;

            if (null == baseClassName)
            {
                newClass = new ManagementClass(naming.NamespaceName, "", null);
                newClass.SystemProperties ["__CLASS"].Value = className;
            }
            else
            {
                ManagementClass baseClass = new ManagementClass(naming.NamespaceName + ":" + baseClassName);
                if (instrumentationType == InstrumentationType.Instance)
                {
                    bool baseAbstract = false;
                    try
                    {
                        QualifierData o = baseClass.Qualifiers["abstract"];
                        if (o.Value is bool)
                        {
                            baseAbstract = (bool)o.Value;
                        }
                    }
                    catch (ManagementException e)
                    {
                        if (e.ErrorCode != ManagementStatus.NotFound)
                        {
                            throw;
                        }
                    }
                    if (!baseAbstract)
                    {
                        throw new Exception(RC.GetString("CLASSINST_EXCEPT"));
                    }
                }

                newClass = baseClass.Derive(className);
            }


            // Create the converter class
            CodeWriter codeClass = code.AddChild("public class " + codeClassName + " : IWmiConverter");

            // Create code block for one line Members
            CodeWriter codeOneLineMembers = codeClass.AddChild(new CodeWriter());

            codeOneLineMembers.Line("static ManagementClass managementClass = new ManagementClass(@\"" + classPath + "\");");
            codeOneLineMembers.Line("static IntPtr classWbemObjectIP;");
            codeOneLineMembers.Line("static Guid iidIWbemObjectAccess = new Guid(\"49353C9A-516B-11D1-AEA6-00C04FB68820\");");
            codeOneLineMembers.Line("internal ManagementObject instance = managementClass.CreateInstance();");
            codeOneLineMembers.Line("object reflectionInfoTempObj = null ; ");
            codeOneLineMembers.Line("FieldInfo reflectionIWbemClassObjectField = null ; ");
            codeOneLineMembers.Line("IntPtr emptyWbemObject = IntPtr.Zero ; ");

            //
            // Reuters VSQFE#: 750	[marioh] see comments above
            // Used as a temporary pointer to the newly created instance that we create to avoid re-using the same
            // object causing unbound memory usage in IWbemClassObject implementation.
            codeOneLineMembers.Line("IntPtr theClone = IntPtr.Zero;");
            codeOneLineMembers.Line("public static ManagementObject emptyInstance = managementClass.CreateInstance();");

            // TODO: Make these non-public
            codeOneLineMembers.Line("public IntPtr instWbemObjectAccessIP;");

            // Create static constructor to initialize handles
            CodeWriter codeCCTOR = codeClass.AddChild("static " + codeClassName + "()");

            codeCCTOR.Line("classWbemObjectIP = (IntPtr)managementClass;");
            codeCCTOR.Line("IntPtr wbemObjectAccessIP;");
            codeCCTOR.Line("Marshal.QueryInterface(classWbemObjectIP, ref iidIWbemObjectAccess, out wbemObjectAccessIP);");
            codeCCTOR.Line("int cimType;");

            // Create constructor
            CodeWriter codeCTOR = codeClass.AddChild("public " + codeClassName + "()");

            codeCTOR.Line("IntPtr wbemObjectIP = (IntPtr)instance;");
            codeCTOR.Line("Marshal.QueryInterface(wbemObjectIP, ref iidIWbemObjectAccess, out instWbemObjectAccessIP);");

            //
            // Reuters VSQFE#: 750	[marioh]
            // In the CCTOR we set things up only once:
            //  1. We get the IWbemClassObjectFreeThreaded object '_wbemObject' from the ManagementObject instance
            //  2. We then get the actual IntPtr to the underlying WMI object
            //  3. Finally, the simple cast to IntPtr from the ManagementObject instance
            // These fields will be used later during the ToWMI call.
            codeCTOR.Line("FieldInfo tempField = instance.GetType().GetField ( \"_wbemObject\", BindingFlags.Instance | BindingFlags.NonPublic );");
            codeCTOR.Line("if ( tempField == null )");
            codeCTOR.Line("{");
            codeCTOR.Line("   tempField = instance.GetType().GetField ( \"wbemObject\", BindingFlags.Instance | BindingFlags.NonPublic ) ;");
            codeCTOR.Line("}");

            codeCTOR.Line("reflectionInfoTempObj = tempField.GetValue (instance) ;");
            codeCTOR.Line("reflectionIWbemClassObjectField = reflectionInfoTempObj.GetType().GetField (\"pWbemClassObject\", BindingFlags.Instance | BindingFlags.NonPublic );");
            codeCTOR.Line("emptyWbemObject = (IntPtr) emptyInstance;");

            // Create destructor that will be called at process cleanup
            CodeWriter codeDTOR = codeClass.AddChild("~" + codeClassName + "()");

            codeDTOR.AddChild("if(instWbemObjectAccessIP != IntPtr.Zero)").Line("Marshal.Release(instWbemObjectAccessIP);");

            // Create method to convert from managed code to WMI
            CodeWriter codeToWMI = codeClass.AddChild("public void ToWMI(object obj)");

            //
            // Reuters VSQFE#: 750	[marioh] see comments above
            // Ensure the release of the WbemObjectAccess interface pointer.
            codeToWMI.Line("if(instWbemObjectAccessIP != IntPtr.Zero)");
            codeToWMI.Line("{");
            codeToWMI.Line("    Marshal.Release(instWbemObjectAccessIP);");
            codeToWMI.Line("    instWbemObjectAccessIP = IntPtr.Zero;");
            codeToWMI.Line("}");

            codeToWMI.Line("if(theClone != IntPtr.Zero)");
            codeToWMI.Line("{");
            codeToWMI.Line("    Marshal.Release(theClone);");
            codeToWMI.Line("    theClone = IntPtr.Zero;");
            codeToWMI.Line("}");

            codeToWMI.Line("IWOA.Clone_f(12, emptyWbemObject, out theClone) ;");
            codeToWMI.Line("Marshal.QueryInterface(theClone, ref iidIWbemObjectAccess, out instWbemObjectAccessIP) ;");
            codeToWMI.Line("reflectionIWbemClassObjectField.SetValue ( reflectionInfoTempObj, theClone ) ;");

            codeToWMI.Line(String.Format("{0} instNET = ({0})obj;", type.FullName.Replace('+', '.')));             // bug#92918 - watch for nested classes

            // Explicit cast to IntPtr
            CodeWriter codeIntPtrCast = codeClass.AddChild("public static explicit operator IntPtr(" + codeClassName + " obj)");

            codeIntPtrCast.Line("return obj.instWbemObjectAccessIP;");

            // Add GetInstance
            codeOneLineMembers.Line("public ManagementObject GetInstance() {return instance;}");

            PropertyDataCollection props = newClass.Properties;

            // type specific info
            switch (instrumentationType)
            {
            case InstrumentationType.Event:
                break;

            case InstrumentationType.Instance:
                props.Add("ProcessId", CimType.String, false);
                props.Add("InstanceId", CimType.String, false);
                props["ProcessId"].Qualifiers.Add("key", true);
                props["InstanceId"].Qualifiers.Add("key", true);
                newClass.Qualifiers.Add("dynamic", true, false, false, false, true);
                newClass.Qualifiers.Add("provider", naming.DecoupledProviderInstanceName, false, false, false, true);
                break;

            case InstrumentationType.Abstract:
                newClass.Qualifiers.Add("abstract", true, false, false, false, true);
                break;

            default:
                break;
            }

            int  propCount    = 0;
            bool needsNullObj = false;

            foreach (MemberInfo field in type.GetMembers())
            {
                if (!(field is FieldInfo || field is PropertyInfo))
                {
                    continue;
                }

                if (field.GetCustomAttributes(typeof(IgnoreMemberAttribute), false).Length > 0)
                {
                    continue;
                }

                if (field is FieldInfo)
                {
                    FieldInfo fi = field as FieldInfo;

                    // We ignore statics
                    if (fi.IsStatic)
                    {
                        ThrowUnsupportedMember(field);
                    }
                }
                else if (field is PropertyInfo)
                {
                    PropertyInfo pi = field as PropertyInfo;
                    // We must have a 'get' property accessor
                    if (!pi.CanRead)
                    {
                        ThrowUnsupportedMember(field);
                    }

                    // We ignore static properties
                    MethodInfo mi = pi.GetGetMethod();
                    if (null == mi || mi.IsStatic)
                    {
                        ThrowUnsupportedMember(field);
                    }

                    // We don't support parameters on properties
                    if (mi.GetParameters().Length > 0)
                    {
                        ThrowUnsupportedMember(field);
                    }
                }

                String propName = ManagedNameAttribute.GetMemberName(field);


#if SUPPORTS_ALTERNATE_WMI_PROPERTY_TYPE
                Type t2 = ManagedTypeAttribute.GetManagedType(field);
#else
                Type t2;
                if (field is FieldInfo)
                {
                    t2 = (field as FieldInfo).FieldType;
                }
                else
                {
                    t2 = (field as PropertyInfo).PropertyType;
                }
#endif
                bool isArray = false;
                if (t2.IsArray)
                {
                    // We only support one dimensional arrays in this version
                    if (t2.GetArrayRank() != 1)
                    {
                        ThrowUnsupportedMember(field);
                    }

                    isArray = true;
                    t2      = t2.GetElementType();
                }

                string embeddedTypeName      = null;
                string embeddedConverterName = null;
                if (mapTypeToConverterClassName.Contains(t2))
                {
                    embeddedConverterName = (string)mapTypeToConverterClassName[t2];
                    embeddedTypeName      = ManagedNameAttribute.GetMemberName(t2);
                }

                bool isGenericEmbeddedObject = false;
                if (t2 == typeof(object))
                {
                    isGenericEmbeddedObject = true;
                    if (hasGenericEmbeddedObject == false)
                    {
                        hasGenericEmbeddedObject = true;
                        // Add map
                        codeOneLineMembers.Line("static Hashtable mapTypeToConverter = new Hashtable();");
                        foreach (DictionaryEntry entry in mapTypeToConverterClassName)
                        {
                            codeCCTOR.Line(String.Format("mapTypeToConverter[typeof({0})] = typeof({1});", ((Type)entry.Key).FullName.Replace('+', '.'), (string)entry.Value)); // bug#92918 - watch for nested classes
                        }
                    }
                }

                string propFieldName   = "prop_" + (propCount);
                string handleFieldName = "handle_" + (propCount++);

                // Add handle for field, which is static accross all instances
                codeOneLineMembers.Line("static int " + handleFieldName + ";");
                codeCCTOR.Line(String.Format("IWOA.GetPropertyHandle_f27(27, wbemObjectAccessIP, \"{0}\", out cimType, out {1});", propName, handleFieldName));

                // Add PropertyData for field, which is specific to each instance
                codeOneLineMembers.Line("PropertyData " + propFieldName + ";");
                codeCTOR.Line(String.Format("{0} = instance.Properties[\"{1}\"];", propFieldName, propName));

                if (isGenericEmbeddedObject)
                {
                    CodeWriter codeNotNull = codeToWMI.AddChild(String.Format("if(instNET.{0} != null)", field.Name));
                    CodeWriter codeElse    = codeToWMI.AddChild("else");
                    codeElse.Line(String.Format("{0}.Value = null;", propFieldName));
                    if (isArray)
                    {
                        codeNotNull.Line(String.Format("int len = instNET.{0}.Length;", field.Name));
                        codeNotNull.Line("ManagementObject[] embeddedObjects = new ManagementObject[len];");
                        codeNotNull.Line("IWmiConverter[] embeddedConverters = new IWmiConverter[len];");

                        CodeWriter codeForLoop = codeNotNull.AddChild("for(int i=0;i<len;i++)");

                        CodeWriter codeFoundType = codeForLoop.AddChild(String.Format("if((instNET.{0}[i] != null) && mapTypeToConverter.Contains(instNET.{0}[i].GetType()))", field.Name));
                        codeFoundType.Line(String.Format("Type type = (Type)mapTypeToConverter[instNET.{0}[i].GetType()];", field.Name));
                        codeFoundType.Line("embeddedConverters[i] = (IWmiConverter)Activator.CreateInstance(type);");
                        codeFoundType.Line(String.Format("embeddedConverters[i].ToWMI(instNET.{0}[i]);", field.Name));
                        codeFoundType.Line("embeddedObjects[i] = embeddedConverters[i].GetInstance();");

                        codeForLoop.AddChild("else").Line(String.Format("embeddedObjects[i] = SafeAssign.GetManagementObject(instNET.{0}[i]);", field.Name));

                        codeNotNull.Line(String.Format("{0}.Value = embeddedObjects;", propFieldName));
                    }
                    else
                    {
                        CodeWriter codeFoundType = codeNotNull.AddChild(String.Format("if(mapTypeToConverter.Contains(instNET.{0}.GetType()))", field.Name));
                        codeFoundType.Line(String.Format("Type type = (Type)mapTypeToConverter[instNET.{0}.GetType()];", field.Name));
                        codeFoundType.Line("IWmiConverter converter = (IWmiConverter)Activator.CreateInstance(type);");
                        codeFoundType.Line(String.Format("converter.ToWMI(instNET.{0});", field.Name));
                        codeFoundType.Line(String.Format("{0}.Value = converter.GetInstance();", propFieldName));

                        codeNotNull.AddChild("else").Line(String.Format("{0}.Value = SafeAssign.GetInstance(instNET.{1});", propFieldName, field.Name));
                    }
                }
                else if (embeddedTypeName != null)
                {
                    // If this is an embedded struct, it cannot be null
                    CodeWriter codeNotNull;
                    if (t2.IsValueType)
                    {
                        codeNotNull = codeToWMI;
                    }
                    else
                    {
                        codeNotNull = codeToWMI.AddChild(String.Format("if(instNET.{0} != null)", field.Name));
                        CodeWriter codeElse = codeToWMI.AddChild("else");
                        codeElse.Line(String.Format("{0}.Value = null;", propFieldName));
                    }

                    if (isArray)
                    {
                        codeNotNull.Line(String.Format("int len = instNET.{0}.Length;", field.Name));
                        codeNotNull.Line("ManagementObject[] embeddedObjects = new ManagementObject[len];");
                        codeNotNull.Line(String.Format("{0}[] embeddedConverters = new {0}[len];", embeddedConverterName));

                        CodeWriter codeForLoop = codeNotNull.AddChild("for(int i=0;i<len;i++)");
                        codeForLoop.Line(String.Format("embeddedConverters[i] = new {0}();", embeddedConverterName));

                        // If this is a struct array, the elements are never null
                        if (t2.IsValueType)
                        {
                            codeForLoop.Line(String.Format("embeddedConverters[i].ToWMI(instNET.{0}[i]);", field.Name));
                        }
                        else
                        {
                            CodeWriter codeArrayElementNotNull = codeForLoop.AddChild(String.Format("if(instNET.{0}[i] != null)", field.Name));
                            codeArrayElementNotNull.Line(String.Format("embeddedConverters[i].ToWMI(instNET.{0}[i]);", field.Name));
                        }
                        codeForLoop.Line("embeddedObjects[i] = embeddedConverters[i].instance;");

                        codeNotNull.Line(String.Format("{0}.Value = embeddedObjects;", propFieldName));
                    }
                    else
                    {
                        // We cannot create an instance of 'embeddedConverterName' because it may be the
                        // same type as we are defining (in other words, a cyclic loop, such as class XXX
                        // having an instance of an XXX as a member).  To prevent an infinite loop of constructing
                        // converter classes, we create a 'lazy' variable that is initialized to NULL, and the first
                        // time it is used, we set it to a 'new embeddedConverterName'.
                        codeOneLineMembers.Line(String.Format("{0} lazy_embeddedConverter_{1} = null;", embeddedConverterName, propFieldName));
                        CodeWriter codeConverterProp = codeClass.AddChild(String.Format("{0} embeddedConverter_{1}", embeddedConverterName, propFieldName));
                        CodeWriter codeGet           = codeConverterProp.AddChild("get");
                        CodeWriter codeIf            = codeGet.AddChild(String.Format("if(null == lazy_embeddedConverter_{0})", propFieldName));
                        codeIf.Line(String.Format("lazy_embeddedConverter_{0} = new {1}();", propFieldName, embeddedConverterName));
                        codeGet.Line(String.Format("return lazy_embeddedConverter_{0};", propFieldName));

                        codeNotNull.Line(String.Format("embeddedConverter_{0}.ToWMI(instNET.{1});", propFieldName, field.Name));
                        codeNotNull.Line(String.Format("{0}.Value = embeddedConverter_{0}.instance;", propFieldName));
                    }
                }
                else if (!isArray)
                {
                    if (t2 == typeof(Byte) || t2 == typeof(SByte))
                    {
                        codeToWMI.Line(String.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 1, ref instNET.{1});", handleFieldName, field.Name));
                    }
                    else if (t2 == typeof(Int16) || t2 == typeof(UInt16) || t2 == typeof(Char))
                    {
                        codeToWMI.Line(String.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 2, ref instNET.{1});", handleFieldName, field.Name));
                    }
                    else if (t2 == typeof(UInt32) || t2 == typeof(Int32) || t2 == typeof(Single))
                    {
                        codeToWMI.Line(String.Format("IWOA.WriteDWORD_f31(31, instWbemObjectAccessIP, {0}, instNET.{1});", handleFieldName, field.Name));
                    }
                    else if (t2 == typeof(UInt64) || t2 == typeof(Int64) || t2 == typeof(Double))
                    {
                        codeToWMI.Line(String.Format("IWOA.WriteQWORD_f33(33, instWbemObjectAccessIP, {0}, instNET.{1});", handleFieldName, field.Name));
                    }
                    else if (t2 == typeof(Boolean))
                    {
                        // TODO: Fix this to use IWOA
//                        codeToWMI.Line(String.Format("{0}.Value = instNET.{1};", propFieldName, field.Name));
                        codeToWMI.Line(String.Format("if(instNET.{0})", field.Name));
                        codeToWMI.Line(String.Format("    IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 2, ref SafeAssign.boolTrue);", handleFieldName));
                        codeToWMI.Line("else");
                        codeToWMI.Line(String.Format("    IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 2, ref SafeAssign.boolFalse);", handleFieldName));
                    }
                    else if (t2 == typeof(String))
                    {
                        CodeWriter codeQuickString = codeToWMI.AddChild(String.Format("if(null != instNET.{0})", field.Name));
                        codeQuickString.Line(String.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, (instNET.{1}.Length+1)*2, instNET.{1});", handleFieldName, field.Name));
                        //                        codeToWMI.AddChild("else").Line(String.Format("{0}.Value = instNET.{1};", propFieldName, field.Name));
                        codeToWMI.AddChild("else").Line(String.Format("IWOA.Put_f5(5, instWbemObjectAccessIP, \"{0}\", 0, ref nullObj, 8);", propName));
                        if (needsNullObj == false)
                        {
                            needsNullObj = true;

                            // Bug#111623 - This line used to say 'nullObj = null;'  When nullObj was passed
                            // to IWOA.Put, this did NOT set the value of a string variable to NULL.  The correct
                            // thing to do was to pass a reference to DBNull.Value to IWOA.Put instead.
                            codeOneLineMembers.Line("object nullObj = DBNull.Value;");
                        }
                    }
                    else if (t2 == typeof(DateTime) || t2 == typeof(TimeSpan))
                    {
                        codeToWMI.Line(String.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 52, SafeAssign.WMITimeToString(instNET.{1}));", handleFieldName, field.Name));
                        //                        codeToWMI.Line(String.Format("{0}.Value = SafeAssign.DateTimeToString(instNET.{1});", propFieldName, field.Name));
                    }
                    else
                    {
                        codeToWMI.Line(String.Format("{0}.Value = instNET.{1};", propFieldName, field.Name));
                    }
                }
                else
                {
                    // We have an array type
                    if (t2 == typeof(DateTime) || t2 == typeof(TimeSpan))
                    {
                        codeToWMI.AddChild(String.Format("if(null == instNET.{0})", field.Name)).Line(String.Format("{0}.Value = null;", propFieldName));
                        codeToWMI.AddChild("else").Line(String.Format("{0}.Value = SafeAssign.WMITimeArrayToStringArray(instNET.{1});", propFieldName, field.Name));
                    }
                    else
                    {
                        // This handles arrays of all primative types
                        codeToWMI.Line(String.Format("{0}.Value = instNET.{1};", propFieldName, field.Name));
                    }
                }


                CimType cimtype = CimType.String;

                if (field.DeclaringType != type)
                {
                    continue;
                }


#if REQUIRES_EXPLICIT_DECLARATION_OF_INHERITED_PROPERTIES
                if (InheritedPropertyAttribute.GetAttribute(field) != null)
                {
                    continue;
                }
#else
                // See if this field already exists on the WMI class
                // In other words, is it inherited from a base class
                // TODO: Make this more efficient
                //  - If we have a null base class name, all property names
                //    should be new
                //  - We could get all base class property names into a
                //    hashtable, and look them up from there
                bool propertyExists = true;
                try
                {
                    PropertyData prop = newClass.Properties[propName];
                    // HACK for bug#96863 - The above line used to throw a
                    // not found exception.  This was changed with a recent
                    // checkin.  If this functionality is not reverted, the
                    // following statement should force the necessary 'not
                    // found' exception that we are looking for.
                    CimType cimType = prop.Type;

                    // Make sure that if the property exists, it is inherited
                    // If it is local, they probably named two properties with
                    // the same name
                    if (prop.IsLocal)
                    {
                        throw new ArgumentException(String.Format(RC.GetString("MEMBERCONFLILCT_EXCEPT"), field.Name), field.Name);
                    }
                }
                catch (ManagementException e)
                {
                    if (e.ErrorCode != ManagementStatus.NotFound)
                    {
                        throw;
                    }
                    else
                    {
                        propertyExists = false;
                    }
                }
                if (propertyExists)
                {
                    continue;
                }
#endif


                if (embeddedTypeName != null)
                {
                    cimtype = CimType.Object;
                }
                else if (isGenericEmbeddedObject)
                {
                    cimtype = CimType.Object;
                }
                else if (t2 == typeof(ManagementObject))
                {
                    cimtype = CimType.Object;
                }
                else if (t2 == typeof(SByte))
                {
                    cimtype = CimType.SInt8;
                }
                else if (t2 == typeof(Byte))
                {
                    cimtype = CimType.UInt8;
                }
                else if (t2 == typeof(Int16))
                {
                    cimtype = CimType.SInt16;
                }
                else if (t2 == typeof(UInt16))
                {
                    cimtype = CimType.UInt16;
                }
                else if (t2 == typeof(Int32))
                {
                    cimtype = CimType.SInt32;
                }
                else if (t2 == typeof(UInt32))
                {
                    cimtype = CimType.UInt32;
                }
                else if (t2 == typeof(Int64))
                {
                    cimtype = CimType.SInt64;
                }
                else if (t2 == typeof(UInt64))
                {
                    cimtype = CimType.UInt64;
                }
                else if (t2 == typeof(Single))
                {
                    cimtype = CimType.Real32;
                }
                else if (t2 == typeof(Double))
                {
                    cimtype = CimType.Real64;
                }
                else if (t2 == typeof(Boolean))
                {
                    cimtype = CimType.Boolean;
                }
                else if (t2 == typeof(String))
                {
                    cimtype = CimType.String;
                }
                else if (t2 == typeof(Char))
                {
                    cimtype = CimType.Char16;
                }
                else if (t2 == typeof(DateTime))
                {
                    cimtype = CimType.DateTime;
                }
                else if (t2 == typeof(TimeSpan))
                {
                    cimtype = CimType.DateTime;
                }
                else
                {
                    ThrowUnsupportedMember(field);
                }
// HACK: The following line cause a strange System.InvalidProgramException when run through InstallUtil
//				throw new Exception("Unsupported type for event member - " + t2.Name);


//              TODO: if(t2 == typeof(Decimal))

#if SUPPORTS_WMI_DEFAULT_VAULES
                Object defaultValue = ManagedDefaultValueAttribute.GetManagedDefaultValue(field);

                // TODO: Is it safe to make this one line?
                if (null == defaultValue)
                {
                    props.Add(propName, cimtype, false);
                }
                else
                {
                    props.Add(propName, defaultValue, cimtype);
                }
#else
                try
                {
                    props.Add(propName, cimtype, isArray);
                }
                catch (ManagementException e)
                {
                    ThrowUnsupportedMember(field, e);
                }
#endif

                // Must at 'interval' SubType on TimeSpans
                if (t2 == typeof(TimeSpan))
                {
                    PropertyData prop = props[propName];
                    prop.Qualifiers.Add("SubType", "interval", false, true, true, true);
                }

                if (embeddedTypeName != null)
                {
                    PropertyData prop = props[propName];
                    prop.Qualifiers["CIMTYPE"].Value = "object:" + embeddedTypeName;
                }
            }
            codeCCTOR.Line("Marshal.Release(wbemObjectAccessIP);");
//            codeToWMI.Line("Console.WriteLine(instance.GetText(TextFormat.Mof));");
        }
예제 #27
0
       public InstrumentedAssembly(Assembly assembly, SchemaNaming naming)
        {
            SecurityHelper.UnmanagedCode.Demand(); // Bug#112640 - Close off any potential use from anything but fully trusted code
            this.naming = naming;

            Assembly compiledAssembly = naming.PrecompiledAssembly;
            if(null == compiledAssembly)
            {
                CSharpCodeProvider provider = new CSharpCodeProvider();
//              ICodeCompiler compiler = provider.CreateCompiler();
                CompilerParameters parameters = new CompilerParameters();
                parameters.GenerateInMemory = true;
                parameters.ReferencedAssemblies.Add(assembly.Location);
                parameters.ReferencedAssemblies.Add(typeof(BaseEvent).Assembly.Location);
                parameters.ReferencedAssemblies.Add(typeof(System.ComponentModel.Component).Assembly.Location);

                // Must reference any base types in 'assembly'
                // 
                foreach(Type type in assembly.GetTypes())
                {
                    // Only interested in instrumented types (VSQFE#2469)
                    if (IsInstrumentedType(type))    
                        FindReferences(type, parameters);
                }

                CompilerResults results = provider.CompileAssemblyFromSource(parameters, naming.Code);
                foreach(CompilerError err in results.Errors)
                {
                    Console.WriteLine(err.ToString());
                }
                if (results.Errors.HasErrors)
                {
                    // we failed to compile the generated code - the compile error shows up on console but we need to throw
                    throw new Exception(RC.GetString("FAILED_TO_BUILD_GENERATED_ASSEMBLY"));
                }
                compiledAssembly = results.CompiledAssembly;
            }

            Type dynType = compiledAssembly.GetType("WMINET_Converter");
            mapTypeToConverter = (Hashtable)dynType.GetField("mapTypeToConverter").GetValue(null);

            // 
            if(!MTAHelper.IsNoContextMTA())  // Bug#110141 - Checking for MTA is not enough.  We need to make sure we are not in a COM+ Context
            {
                ThreadDispatch disp = new ThreadDispatch ( new ThreadDispatch.ThreadWorkerMethodWithParam ( InitEventSource ) ) ;
                disp.Parameter = this ;
                disp.Start ( ) ;
			
		 // We are on an STA thread.  Create the event source on an MTA
//                          Thread thread = new Thread(new ThreadStart(InitEventSource));
//                          thread.ApartmentState = ApartmentState.MTA;
//                          thread.Start();
//                          thread.Join();			
             }
                 else
             {
               InitEventSource( this ) ;
              }

        }
예제 #28
0
        public SchemaMapping(Type type, SchemaNaming naming)
        {
            classType = type;

            string baseClassName = ManagedNameAttribute.GetBaseClassName(type);

            className           = ManagedNameAttribute.GetMemberName(type);
            instrumentationType = InstrumentationClassAttribute.GetAttribute(type).InstrumentationType;

            classPath = naming.NamespaceName + ":" + className;

            if (null == baseClassName)
            {
                newClass = new ManagementClass(naming.NamespaceName, "", null);
                newClass.SystemProperties ["__CLASS"].Value = className;
            }
            else
            {
                ManagementClass baseClass = new ManagementClass(naming.NamespaceName + ":" + baseClassName);
                newClass = baseClass.Derive(className);
            }

            PropertyDataCollection props = newClass.Properties;

            // type specific info
            switch (instrumentationType)
            {
            case InstrumentationType.Event:
                break;

            case InstrumentationType.Instance:
                props.Add("ProcessId", CimType.String, false);
                props.Add("InstanceId", CimType.String, false);
                props["ProcessId"].Qualifiers.Add("key", true);
                props["InstanceId"].Qualifiers.Add("key", true);
                newClass.Qualifiers.Add("dynamic", true, false, false, false, true);
                newClass.Qualifiers.Add("provider", naming.DecoupledProviderInstanceName, false, false, false, true);
                break;

            case InstrumentationType.Abstract:
                newClass.Qualifiers.Add("abstract", true, false, false, false, true);
                break;

            default:
                break;
            }

            foreach (MemberInfo field in type.GetFields())
            {
                if (!(field is FieldInfo || field is PropertyInfo))
                {
                    continue;
                }

                if (field.DeclaringType != type)
                {
                    continue;
                }

                if (field.GetCustomAttributes(typeof(IgnoreMemberAttribute), false).Length > 0)
                {
                    continue;
                }

                String propName = ManagedNameAttribute.GetMemberName(field);


#if REQUIRES_EXPLICIT_DECLARATION_OF_INHERITED_PROPERTIES
                if (InheritedPropertyAttribute.GetAttribute(field) != null)
                {
                    continue;
                }
#else
                // See if this field already exists on the WMI class
                // In other words, is it inherited from a base class
                // TODO: Make this more efficient
                //  - If we have a null base class name, all property names
                //    should be new
                //  - We could get all base class property names into a
                //    hashtable, and look them up from there
                bool propertyExists = true;
                try
                {
                    PropertyData prop = newClass.Properties[propName];
                }
                catch (ManagementException e)
                {
                    if (e.ErrorCode != ManagementStatus.NotFound)
                    {
                        throw e;
                    }
                    else
                    {
                        propertyExists = false;
                    }
                }
                if (propertyExists)
                {
                    continue;
                }
#endif

#if SUPPORTS_ALTERNATE_WMI_PROPERTY_TYPE
                Type t2 = ManagedTypeAttribute.GetManagedType(field);
#else
                Type t2;
                if (field is FieldInfo)
                {
                    t2 = (field as FieldInfo).FieldType;
                }
                else
                {
                    t2 = (field as PropertyInfo).PropertyType;
                }
#endif

                CimType cimtype = CimType.String;

                if (t2 == typeof(SByte))
                {
                    cimtype = CimType.SInt8;
                }
                else if (t2 == typeof(Byte))
                {
                    cimtype = CimType.UInt8;
                }
                else if (t2 == typeof(Int16))
                {
                    cimtype = CimType.SInt16;
                }
                else if (t2 == typeof(UInt16))
                {
                    cimtype = CimType.UInt16;
                }
                else if (t2 == typeof(Int32))
                {
                    cimtype = CimType.SInt32;
                }
                else if (t2 == typeof(UInt32))
                {
                    cimtype = CimType.UInt32;
                }
                else if (t2 == typeof(Int64))
                {
                    cimtype = CimType.SInt64;
                }
                else if (t2 == typeof(UInt64))
                {
                    cimtype = CimType.UInt64;
                }
                else if (t2 == typeof(Single))
                {
                    cimtype = CimType.Real32;
                }
                else if (t2 == typeof(Double))
                {
                    cimtype = CimType.Real64;
                }
                else if (t2 == typeof(Boolean))
                {
                    cimtype = CimType.Boolean;
                }
                else if (t2 == typeof(String))
                {
                    cimtype = CimType.String;
                }
                else if (t2 == typeof(Char))
                {
                    cimtype = CimType.Char16;
                }
                else if (t2 == typeof(DateTime))
                {
                    cimtype = CimType.DateTime;
                }
                else if (t2 == typeof(TimeSpan))
                {
                    cimtype = CimType.DateTime;
                }
                else
                {
                    throw new Exception(String.Format("Unsupported type for event member - {0}", t2.Name));
                }
// HACK: The following line cause a strange System.InvalidProgramException when run through InstallUtil
//				throw new Exception("Unsupported type for event member - " + t2.Name);


//              TODO: if(t2 == typeof(Decimal))

#if SUPPORTS_WMI_DEFAULT_VAULES
                Object defaultValue = ManagedDefaultValueAttribute.GetManagedDefaultValue(field);

                // TODO: Is it safe to make this one line?
                if (null == defaultValue)
                {
                    props.Add(propName, cimtype, false);
                }
                else
                {
                    props.Add(propName, defaultValue, cimtype);
                }
#else
                props.Add(propName, cimtype, false);
#endif

                // Must at 'interval' SubType on TimeSpans
                if (t2 == typeof(TimeSpan))
                {
                    PropertyData prop = props[propName];
                    prop.Qualifiers.Add("SubType", "interval", false, true, true, true);
                }
            }
        }
        public SchemaMapping(Type type, SchemaNaming naming, Hashtable mapTypeToConverterClassName)
        {
            this.codeClassName = (string)mapTypeToConverterClassName[type];
            this.classType     = type;
            bool   flag          = false;
            string baseClassName = ManagedNameAttribute.GetBaseClassName(type);

            this.className           = ManagedNameAttribute.GetMemberName(type);
            this.instrumentationType = InstrumentationClassAttribute.GetAttribute(type).InstrumentationType;
            this.classPath           = naming.NamespaceName + ":" + this.className;
            if (baseClassName == null)
            {
                this.newClass = new ManagementClass(naming.NamespaceName, "", null);
                this.newClass.SystemProperties["__CLASS"].Value = this.className;
            }
            else
            {
                ManagementClass class2 = new ManagementClass(naming.NamespaceName + ":" + baseClassName);
                if (this.instrumentationType == System.Management.Instrumentation.InstrumentationType.Instance)
                {
                    bool flag2 = false;
                    try
                    {
                        QualifierData data = class2.Qualifiers["abstract"];
                        if (data.Value is bool)
                        {
                            flag2 = (bool)data.Value;
                        }
                    }
                    catch (ManagementException exception)
                    {
                        if (exception.ErrorCode != ManagementStatus.NotFound)
                        {
                            throw;
                        }
                    }
                    if (!flag2)
                    {
                        throw new Exception(RC.GetString("CLASSINST_EXCEPT"));
                    }
                }
                this.newClass = class2.Derive(this.className);
            }
            CodeWriter writer  = this.code.AddChild("public class " + this.codeClassName + " : IWmiConverter");
            CodeWriter writer2 = writer.AddChild(new CodeWriter());

            writer2.Line("static ManagementClass managementClass = new ManagementClass(@\"" + this.classPath + "\");");
            writer2.Line("static IntPtr classWbemObjectIP;");
            writer2.Line("static Guid iidIWbemObjectAccess = new Guid(\"49353C9A-516B-11D1-AEA6-00C04FB68820\");");
            writer2.Line("internal ManagementObject instance = managementClass.CreateInstance();");
            writer2.Line("object reflectionInfoTempObj = null ; ");
            writer2.Line("FieldInfo reflectionIWbemClassObjectField = null ; ");
            writer2.Line("IntPtr emptyWbemObject = IntPtr.Zero ; ");
            writer2.Line("IntPtr originalObject = IntPtr.Zero ; ");
            writer2.Line("bool toWmiCalled = false ; ");
            writer2.Line("IntPtr theClone = IntPtr.Zero;");
            writer2.Line("public static ManagementObject emptyInstance = managementClass.CreateInstance();");
            writer2.Line("public IntPtr instWbemObjectAccessIP;");
            CodeWriter writer3 = writer.AddChild("static " + this.codeClassName + "()");

            writer3.Line("classWbemObjectIP = (IntPtr)managementClass;");
            writer3.Line("IntPtr wbemObjectAccessIP;");
            writer3.Line("Marshal.QueryInterface(classWbemObjectIP, ref iidIWbemObjectAccess, out wbemObjectAccessIP);");
            writer3.Line("int cimType;");
            CodeWriter writer4 = writer.AddChild("public " + this.codeClassName + "()");

            writer4.Line("IntPtr wbemObjectIP = (IntPtr)instance;");
            writer4.Line("originalObject = (IntPtr)instance;");
            writer4.Line("Marshal.QueryInterface(wbemObjectIP, ref iidIWbemObjectAccess, out instWbemObjectAccessIP);");
            writer4.Line("FieldInfo tempField = instance.GetType().GetField ( \"_wbemObject\", BindingFlags.Instance | BindingFlags.NonPublic );");
            writer4.Line("if ( tempField == null )");
            writer4.Line("{");
            writer4.Line("   tempField = instance.GetType().GetField ( \"wbemObject\", BindingFlags.Instance | BindingFlags.NonPublic ) ;");
            writer4.Line("}");
            writer4.Line("reflectionInfoTempObj = tempField.GetValue (instance) ;");
            writer4.Line("reflectionIWbemClassObjectField = reflectionInfoTempObj.GetType().GetField (\"pWbemClassObject\", BindingFlags.Instance | BindingFlags.NonPublic );");
            writer4.Line("emptyWbemObject = (IntPtr) emptyInstance;");
            CodeWriter writer5 = writer.AddChild("~" + this.codeClassName + "()");

            writer5.AddChild("if(instWbemObjectAccessIP != IntPtr.Zero)").Line("Marshal.Release(instWbemObjectAccessIP);");
            writer5.Line("if ( toWmiCalled == true )");
            writer5.Line("{");
            writer5.Line("\tMarshal.Release (originalObject);");
            writer5.Line("}");
            CodeWriter writer6 = writer.AddChild("public void ToWMI(object obj)");

            writer6.Line("toWmiCalled = true ;");
            writer6.Line("if(instWbemObjectAccessIP != IntPtr.Zero)");
            writer6.Line("{");
            writer6.Line("    Marshal.Release(instWbemObjectAccessIP);");
            writer6.Line("    instWbemObjectAccessIP = IntPtr.Zero;");
            writer6.Line("}");
            writer6.Line("if(theClone != IntPtr.Zero)");
            writer6.Line("{");
            writer6.Line("    Marshal.Release(theClone);");
            writer6.Line("    theClone = IntPtr.Zero;");
            writer6.Line("}");
            writer6.Line("IWOA.Clone_f(12, emptyWbemObject, out theClone) ;");
            writer6.Line("Marshal.QueryInterface(theClone, ref iidIWbemObjectAccess, out instWbemObjectAccessIP) ;");
            writer6.Line("reflectionIWbemClassObjectField.SetValue ( reflectionInfoTempObj, theClone ) ;");
            writer6.Line(string.Format("{0} instNET = ({0})obj;", type.FullName.Replace('+', '.')));
            writer.AddChild("public static explicit operator IntPtr(" + this.codeClassName + " obj)").Line("return obj.instWbemObjectAccessIP;");
            writer2.Line("public ManagementObject GetInstance() {return instance;}");
            PropertyDataCollection properties = this.newClass.Properties;

            switch (this.instrumentationType)
            {
            case System.Management.Instrumentation.InstrumentationType.Instance:
                properties.Add("ProcessId", CimType.String, false);
                properties.Add("InstanceId", CimType.String, false);
                properties["ProcessId"].Qualifiers.Add("key", true);
                properties["InstanceId"].Qualifiers.Add("key", true);
                this.newClass.Qualifiers.Add("dynamic", true, false, false, false, true);
                this.newClass.Qualifiers.Add("provider", naming.DecoupledProviderInstanceName, false, false, false, true);
                break;

            case System.Management.Instrumentation.InstrumentationType.Abstract:
                this.newClass.Qualifiers.Add("abstract", true, false, false, false, true);
                break;
            }
            int  num   = 0;
            bool flag3 = false;

            foreach (MemberInfo info in type.GetMembers())
            {
                if (((info is FieldInfo) || (info is PropertyInfo)) && (info.GetCustomAttributes(typeof(IgnoreMemberAttribute), false).Length <= 0))
                {
                    Type fieldType;
                    if (info is FieldInfo)
                    {
                        FieldInfo info2 = info as FieldInfo;
                        if (info2.IsStatic)
                        {
                            ThrowUnsupportedMember(info);
                        }
                    }
                    else if (info is PropertyInfo)
                    {
                        PropertyInfo info3 = info as PropertyInfo;
                        if (!info3.CanRead)
                        {
                            ThrowUnsupportedMember(info);
                        }
                        MethodInfo getMethod = info3.GetGetMethod();
                        if ((null == getMethod) || getMethod.IsStatic)
                        {
                            ThrowUnsupportedMember(info);
                        }
                        if (getMethod.GetParameters().Length > 0)
                        {
                            ThrowUnsupportedMember(info);
                        }
                    }
                    string memberName = ManagedNameAttribute.GetMemberName(info);
                    if (info is FieldInfo)
                    {
                        fieldType = (info as FieldInfo).FieldType;
                    }
                    else
                    {
                        fieldType = (info as PropertyInfo).PropertyType;
                    }
                    bool isArray = false;
                    if (fieldType.IsArray)
                    {
                        if (fieldType.GetArrayRank() != 1)
                        {
                            ThrowUnsupportedMember(info);
                        }
                        isArray   = true;
                        fieldType = fieldType.GetElementType();
                    }
                    string str3 = null;
                    string str4 = null;
                    if (mapTypeToConverterClassName.Contains(fieldType))
                    {
                        str4 = (string)mapTypeToConverterClassName[fieldType];
                        str3 = ManagedNameAttribute.GetMemberName(fieldType);
                    }
                    bool flag5 = false;
                    if (fieldType == typeof(object))
                    {
                        flag5 = true;
                        if (!flag)
                        {
                            flag = true;
                            writer2.Line("static Hashtable mapTypeToConverter = new Hashtable();");
                            foreach (DictionaryEntry entry in mapTypeToConverterClassName)
                            {
                                string introduced55 = ((Type)entry.Key).FullName.Replace('+', '.');
                                writer3.Line(string.Format("mapTypeToConverter[typeof({0})] = typeof({1});", introduced55, (string)entry.Value));
                            }
                        }
                    }
                    string str5 = "prop_" + num;
                    string str6 = "handle_" + num++;
                    writer2.Line("static int " + str6 + ";");
                    writer3.Line(string.Format("IWOA.GetPropertyHandle_f27(27, wbemObjectAccessIP, \"{0}\", out cimType, out {1});", memberName, str6));
                    writer2.Line("PropertyData " + str5 + ";");
                    writer4.Line(string.Format("{0} = instance.Properties[\"{1}\"];", str5, memberName));
                    if (flag5)
                    {
                        CodeWriter writer8 = writer6.AddChild(string.Format("if(instNET.{0} != null)", info.Name));
                        writer6.AddChild("else").Line(string.Format("{0}.Value = null;", str5));
                        if (isArray)
                        {
                            writer8.Line(string.Format("int len = instNET.{0}.Length;", info.Name));
                            writer8.Line("ManagementObject[] embeddedObjects = new ManagementObject[len];");
                            writer8.Line("IWmiConverter[] embeddedConverters = new IWmiConverter[len];");
                            CodeWriter writer10 = writer8.AddChild("for(int i=0;i<len;i++)");
                            CodeWriter writer11 = writer10.AddChild(string.Format("if((instNET.{0}[i] != null) && mapTypeToConverter.Contains(instNET.{0}[i].GetType()))", info.Name));
                            writer11.Line(string.Format("Type type = (Type)mapTypeToConverter[instNET.{0}[i].GetType()];", info.Name));
                            writer11.Line("embeddedConverters[i] = (IWmiConverter)Activator.CreateInstance(type);");
                            writer11.Line(string.Format("embeddedConverters[i].ToWMI(instNET.{0}[i]);", info.Name));
                            writer11.Line("embeddedObjects[i] = embeddedConverters[i].GetInstance();");
                            writer10.AddChild("else").Line(string.Format("embeddedObjects[i] = SafeAssign.GetManagementObject(instNET.{0}[i]);", info.Name));
                            writer8.Line(string.Format("{0}.Value = embeddedObjects;", str5));
                        }
                        else
                        {
                            CodeWriter writer12 = writer8.AddChild(string.Format("if(mapTypeToConverter.Contains(instNET.{0}.GetType()))", info.Name));
                            writer12.Line(string.Format("Type type = (Type)mapTypeToConverter[instNET.{0}.GetType()];", info.Name));
                            writer12.Line("IWmiConverter converter = (IWmiConverter)Activator.CreateInstance(type);");
                            writer12.Line(string.Format("converter.ToWMI(instNET.{0});", info.Name));
                            writer12.Line(string.Format("{0}.Value = converter.GetInstance();", str5));
                            writer8.AddChild("else").Line(string.Format("{0}.Value = SafeAssign.GetInstance(instNET.{1});", str5, info.Name));
                        }
                    }
                    else if (str3 != null)
                    {
                        CodeWriter writer13;
                        if (fieldType.IsValueType)
                        {
                            writer13 = writer6;
                        }
                        else
                        {
                            writer13 = writer6.AddChild(string.Format("if(instNET.{0} != null)", info.Name));
                            writer6.AddChild("else").Line(string.Format("{0}.Value = null;", str5));
                        }
                        if (isArray)
                        {
                            writer13.Line(string.Format("int len = instNET.{0}.Length;", info.Name));
                            writer13.Line("ManagementObject[] embeddedObjects = new ManagementObject[len];");
                            writer13.Line(string.Format("{0}[] embeddedConverters = new {0}[len];", str4));
                            CodeWriter writer15 = writer13.AddChild("for(int i=0;i<len;i++)");
                            writer15.Line(string.Format("embeddedConverters[i] = new {0}();", str4));
                            if (fieldType.IsValueType)
                            {
                                writer15.Line(string.Format("embeddedConverters[i].ToWMI(instNET.{0}[i]);", info.Name));
                            }
                            else
                            {
                                writer15.AddChild(string.Format("if(instNET.{0}[i] != null)", info.Name)).Line(string.Format("embeddedConverters[i].ToWMI(instNET.{0}[i]);", info.Name));
                            }
                            writer15.Line("embeddedObjects[i] = embeddedConverters[i].instance;");
                            writer13.Line(string.Format("{0}.Value = embeddedObjects;", str5));
                        }
                        else
                        {
                            writer2.Line(string.Format("{0} lazy_embeddedConverter_{1} = null;", str4, str5));
                            CodeWriter writer18 = writer.AddChild(string.Format("{0} embeddedConverter_{1}", str4, str5)).AddChild("get");
                            writer18.AddChild(string.Format("if(null == lazy_embeddedConverter_{0})", str5)).Line(string.Format("lazy_embeddedConverter_{0} = new {1}();", str5, str4));
                            writer18.Line(string.Format("return lazy_embeddedConverter_{0};", str5));
                            writer13.Line(string.Format("embeddedConverter_{0}.ToWMI(instNET.{1});", str5, info.Name));
                            writer13.Line(string.Format("{0}.Value = embeddedConverter_{0}.instance;", str5));
                        }
                    }
                    else if (!isArray)
                    {
                        if ((fieldType == typeof(byte)) || (fieldType == typeof(sbyte)))
                        {
                            writer6.Line(string.Format("{0} instNET_{1} = instNET.{1} ;", fieldType, info.Name));
                            writer6.Line(string.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 1, ref instNET_{1});", str6, info.Name));
                        }
                        else if (((fieldType == typeof(short)) || (fieldType == typeof(ushort))) || (fieldType == typeof(char)))
                        {
                            writer6.Line(string.Format("{0} instNET_{1} = instNET.{1} ;", fieldType, info.Name));
                            writer6.Line(string.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 2, ref instNET_{1});", str6, info.Name));
                        }
                        else if (((fieldType == typeof(uint)) || (fieldType == typeof(int))) || (fieldType == typeof(float)))
                        {
                            writer6.Line(string.Format("IWOA.WriteDWORD_f31(31, instWbemObjectAccessIP, {0}, instNET.{1});", str6, info.Name));
                        }
                        else if (((fieldType == typeof(ulong)) || (fieldType == typeof(long))) || (fieldType == typeof(double)))
                        {
                            writer6.Line(string.Format("IWOA.WriteQWORD_f33(33, instWbemObjectAccessIP, {0}, instNET.{1});", str6, info.Name));
                        }
                        else if (fieldType == typeof(bool))
                        {
                            writer6.Line(string.Format("if(instNET.{0})", info.Name));
                            writer6.Line(string.Format("    IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 2, ref SafeAssign.boolTrue);", str6));
                            writer6.Line("else");
                            writer6.Line(string.Format("    IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 2, ref SafeAssign.boolFalse);", str6));
                        }
                        else if (fieldType == typeof(string))
                        {
                            writer6.AddChild(string.Format("if(null != instNET.{0})", info.Name)).Line(string.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, (instNET.{1}.Length+1)*2, instNET.{1});", str6, info.Name));
                            writer6.AddChild("else").Line(string.Format("IWOA.Put_f5(5, instWbemObjectAccessIP, \"{0}\", 0, ref nullObj, 8);", memberName));
                            if (!flag3)
                            {
                                flag3 = true;
                                writer2.Line("object nullObj = DBNull.Value;");
                            }
                        }
                        else if ((fieldType == typeof(DateTime)) || (fieldType == typeof(TimeSpan)))
                        {
                            writer6.Line(string.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 52, SafeAssign.WMITimeToString(instNET.{1}));", str6, info.Name));
                        }
                        else
                        {
                            writer6.Line(string.Format("{0}.Value = instNET.{1};", str5, info.Name));
                        }
                    }
                    else if ((fieldType == typeof(DateTime)) || (fieldType == typeof(TimeSpan)))
                    {
                        writer6.AddChild(string.Format("if(null == instNET.{0})", info.Name)).Line(string.Format("{0}.Value = null;", str5));
                        writer6.AddChild("else").Line(string.Format("{0}.Value = SafeAssign.WMITimeArrayToStringArray(instNET.{1});", str5, info.Name));
                    }
                    else
                    {
                        writer6.Line(string.Format("{0}.Value = instNET.{1};", str5, info.Name));
                    }
                    CimType propertyType = CimType.String;
                    if (info.DeclaringType == type)
                    {
                        bool flag6 = true;
                        try
                        {
                            PropertyData data2 = this.newClass.Properties[memberName];
                            CimType      type1 = data2.Type;
                            if (data2.IsLocal)
                            {
                                throw new ArgumentException(string.Format(RC.GetString("MEMBERCONFLILCT_EXCEPT"), info.Name), info.Name);
                            }
                        }
                        catch (ManagementException exception2)
                        {
                            if (exception2.ErrorCode != ManagementStatus.NotFound)
                            {
                                throw;
                            }
                            flag6 = false;
                        }
                        if (!flag6)
                        {
                            if (str3 != null)
                            {
                                propertyType = CimType.Object;
                            }
                            else if (flag5)
                            {
                                propertyType = CimType.Object;
                            }
                            else if (fieldType == typeof(ManagementObject))
                            {
                                propertyType = CimType.Object;
                            }
                            else if (fieldType == typeof(sbyte))
                            {
                                propertyType = CimType.SInt8;
                            }
                            else if (fieldType == typeof(byte))
                            {
                                propertyType = CimType.UInt8;
                            }
                            else if (fieldType == typeof(short))
                            {
                                propertyType = CimType.SInt16;
                            }
                            else if (fieldType == typeof(ushort))
                            {
                                propertyType = CimType.UInt16;
                            }
                            else if (fieldType == typeof(int))
                            {
                                propertyType = CimType.SInt32;
                            }
                            else if (fieldType == typeof(uint))
                            {
                                propertyType = CimType.UInt32;
                            }
                            else if (fieldType == typeof(long))
                            {
                                propertyType = CimType.SInt64;
                            }
                            else if (fieldType == typeof(ulong))
                            {
                                propertyType = CimType.UInt64;
                            }
                            else if (fieldType == typeof(float))
                            {
                                propertyType = CimType.Real32;
                            }
                            else if (fieldType == typeof(double))
                            {
                                propertyType = CimType.Real64;
                            }
                            else if (fieldType == typeof(bool))
                            {
                                propertyType = CimType.Boolean;
                            }
                            else if (fieldType == typeof(string))
                            {
                                propertyType = CimType.String;
                            }
                            else if (fieldType == typeof(char))
                            {
                                propertyType = CimType.Char16;
                            }
                            else if (fieldType == typeof(DateTime))
                            {
                                propertyType = CimType.DateTime;
                            }
                            else if (fieldType == typeof(TimeSpan))
                            {
                                propertyType = CimType.DateTime;
                            }
                            else
                            {
                                ThrowUnsupportedMember(info);
                            }
                            try
                            {
                                properties.Add(memberName, propertyType, isArray);
                            }
                            catch (ManagementException exception3)
                            {
                                ThrowUnsupportedMember(info, exception3);
                            }
                            if (fieldType == typeof(TimeSpan))
                            {
                                PropertyData data3 = properties[memberName];
                                data3.Qualifiers.Add("SubType", "interval", false, true, true, true);
                            }
                            if (str3 != null)
                            {
                                PropertyData data4 = properties[memberName];
                                data4.Qualifiers["CIMTYPE"].Value = "object:" + str3;
                            }
                        }
                    }
                }
            }
            writer3.Line("Marshal.Release(wbemObjectAccessIP);");
        }
예제 #30
0
        public InstrumentedAssembly(Assembly assembly, SchemaNaming naming)
        {
            SecurityHelper.UnmanagedCode.Demand(); // Bug#112640 - Close off any potential use from anything but fully trusted code
            this.naming = naming;

            Assembly compiledAssembly = naming.PrecompiledAssembly;

            if (null == compiledAssembly)
            {
                CSharpCodeProvider provider = new CSharpCodeProvider();
//              ICodeCompiler compiler = provider.CreateCompiler();
                CompilerParameters parameters = new CompilerParameters();
                parameters.GenerateInMemory = true;
                parameters.ReferencedAssemblies.Add(assembly.Location);
                parameters.ReferencedAssemblies.Add(typeof(BaseEvent).Assembly.Location);
                parameters.ReferencedAssemblies.Add(typeof(System.ComponentModel.Component).Assembly.Location);

                // Must reference any base types in 'assembly'
                //
                foreach (Type type in assembly.GetTypes())
                {
                    // Only interested in instrumented types (VSQFE#2469)
                    if (IsInstrumentedType(type))
                    {
                        FindReferences(type, parameters);
                    }
                }

                CompilerResults results = provider.CompileAssemblyFromSource(parameters, naming.Code);
                foreach (CompilerError err in results.Errors)
                {
                    Console.WriteLine(err.ToString());
                }
                if (results.Errors.HasErrors)
                {
                    // we failed to compile the generated code - the compile error shows up on console but we need to throw
                    throw new Exception(RC.GetString("FAILED_TO_BUILD_GENERATED_ASSEMBLY"));
                }
                compiledAssembly = results.CompiledAssembly;
            }

            Type dynType = compiledAssembly.GetType("WMINET_Converter");

            mapTypeToConverter = (Hashtable)dynType.GetField("mapTypeToConverter").GetValue(null);

            //
            if (!MTAHelper.IsNoContextMTA())  // Bug#110141 - Checking for MTA is not enough.  We need to make sure we are not in a COM+ Context
            {
                ThreadDispatch disp = new ThreadDispatch(new ThreadDispatch.ThreadWorkerMethodWithParam(InitEventSource));
                disp.Parameter = this;
                disp.Start( );

                // We are on an STA thread.  Create the event source on an MTA
//                          Thread thread = new Thread(new ThreadStart(InitEventSource));
//                          thread.ApartmentState = ApartmentState.MTA;
//                          thread.Start();
//                          thread.Join();
            }
            else
            {
                InitEventSource(this);
            }
        }
예제 #31
0
		public SchemaMapping(Type type, SchemaNaming naming, Hashtable mapTypeToConverterClassName)
		{
			codeClassName = (string)mapTypeToConverterClassName[type];
			classType = type;

			bool hasGenericEmbeddedObject = false;

			string baseClassName = ManagedNameAttribute.GetBaseClassName(type);
			className = ManagedNameAttribute.GetMemberName(type);
			instrumentationType = InstrumentationClassAttribute.GetAttribute(type).InstrumentationType;

			classPath = naming.NamespaceName + ":" + className;

			if(null == baseClassName)
			{
				newClass = new ManagementClass(naming.NamespaceName, "", null);
				newClass.SystemProperties ["__CLASS"].Value = className;
			}
			else
			{
				ManagementClass baseClass = new ManagementClass(naming.NamespaceName + ":" + baseClassName);
				if(instrumentationType == InstrumentationType.Instance)
				{
					bool baseAbstract = false;
					try
					{
						QualifierData o = baseClass.Qualifiers["abstract"];
						if(o.Value is bool)
							baseAbstract = (bool)o.Value;
					}
					catch(ManagementException e)
					{
						if(e.ErrorCode != ManagementStatus.NotFound)
							throw;
					}
					if(!baseAbstract)
						throw new Exception(RC.GetString("CLASSINST_EXCEPT"));

				}

				newClass = baseClass.Derive(className);
			}


			// Create the converter class
			CodeWriter codeClass = code.AddChild("public class "+codeClassName+" : IWmiConverter");

			// Create code block for one line Members
			CodeWriter codeOneLineMembers = codeClass.AddChild(new CodeWriter());
			codeOneLineMembers.Line("static ManagementClass managementClass = new ManagementClass(@\"" + classPath + "\");");
			codeOneLineMembers.Line("static IntPtr classWbemObjectIP;");
			codeOneLineMembers.Line("static Guid iidIWbemObjectAccess = new Guid(\"49353C9A-516B-11D1-AEA6-00C04FB68820\");");
			codeOneLineMembers.Line("internal ManagementObject instance = managementClass.CreateInstance();");
			codeOneLineMembers.Line("object reflectionInfoTempObj = null ; ");
			codeOneLineMembers.Line("FieldInfo reflectionIWbemClassObjectField = null ; ");
			codeOneLineMembers.Line("IntPtr emptyWbemObject = IntPtr.Zero ; ");
			codeOneLineMembers.Line("IntPtr originalObject = IntPtr.Zero ; ");
			codeOneLineMembers.Line("bool toWmiCalled = false ; ");
			
			//
			// Reuters VSQFE#: 750	[marioh] see comments above
			// Used as a temporary pointer to the newly created instance that we create to avoid re-using the same
			// object causing unbound memory usage in IWbemClassObject implementation.
			codeOneLineMembers.Line("IntPtr theClone = IntPtr.Zero;");
			codeOneLineMembers.Line("public static ManagementObject emptyInstance = managementClass.CreateInstance();");

			// 
			codeOneLineMembers.Line("public IntPtr instWbemObjectAccessIP;");

			// Create static constructor to initialize handles
			CodeWriter codeCCTOR = codeClass.AddChild("static "+codeClassName+"()");
			codeCCTOR.Line("classWbemObjectIP = (IntPtr)managementClass;");
			codeCCTOR.Line("IntPtr wbemObjectAccessIP;");
			codeCCTOR.Line("Marshal.QueryInterface(classWbemObjectIP, ref iidIWbemObjectAccess, out wbemObjectAccessIP);");
			codeCCTOR.Line("int cimType;");
            
			// Create constructor
			CodeWriter codeCTOR = codeClass.AddChild("public "+codeClassName+"()");
			codeCTOR.Line("IntPtr wbemObjectIP = (IntPtr)instance;");
       	       codeCTOR.Line("originalObject = (IntPtr)instance;");
			codeCTOR.Line("Marshal.QueryInterface(wbemObjectIP, ref iidIWbemObjectAccess, out instWbemObjectAccessIP);");

			//
			// Reuters VSQFE#: 750	[marioh] 
			// In the CCTOR we set things up only once:
			//  1. We get the IWbemClassObjectFreeThreaded object '_wbemObject' from the ManagementObject instance
			//  2. We then get the actual IntPtr to the underlying WMI object
			//  3. Finally, the simple cast to IntPtr from the ManagementObject instance
			// These fields will be used later during the ToWMI call.
			codeCTOR.Line ("FieldInfo tempField = instance.GetType().GetField ( \"_wbemObject\", BindingFlags.Instance | BindingFlags.NonPublic );" );
			codeCTOR.Line("if ( tempField == null )");
			codeCTOR.Line("{");
			codeCTOR.Line("   tempField = instance.GetType().GetField ( \"wbemObject\", BindingFlags.Instance | BindingFlags.NonPublic ) ;");
			codeCTOR.Line("}");

			codeCTOR.Line ("reflectionInfoTempObj = tempField.GetValue (instance) ;");
			codeCTOR.Line("reflectionIWbemClassObjectField = reflectionInfoTempObj.GetType().GetField (\"pWbemClassObject\", BindingFlags.Instance | BindingFlags.NonPublic );");
			codeCTOR.Line("emptyWbemObject = (IntPtr) emptyInstance;");

			// Create destructor that will be called at process cleanup
			CodeWriter codeDTOR = codeClass.AddChild("~"+codeClassName+"()");
			codeDTOR.AddChild("if(instWbemObjectAccessIP != IntPtr.Zero)").Line("Marshal.Release(instWbemObjectAccessIP);");
			// [marioh] Make sure we release the initial instance so that we dont leak
			codeDTOR.Line("if ( toWmiCalled == true )");
			codeDTOR.Line("{");
			codeDTOR.Line("	Marshal.Release (originalObject);");
			codeDTOR.Line("}");
			

			// Create method to convert from managed code to WMI
			CodeWriter codeToWMI = codeClass.AddChild("public void ToWMI(object obj)");

			//
			// Reuters VSQFE#: 750	[marioh] see comments above
			// Ensure the release of the WbemObjectAccess interface pointer.
			codeToWMI.Line( "toWmiCalled = true ;" ) ;
			codeToWMI.Line( "if(instWbemObjectAccessIP != IntPtr.Zero)" ) ;
			codeToWMI.Line( "{" ) ;
			codeToWMI.Line("    Marshal.Release(instWbemObjectAccessIP);" ) ;
			codeToWMI.Line("    instWbemObjectAccessIP = IntPtr.Zero;" ) ;
			codeToWMI.Line( "}" ) ;

			codeToWMI.Line( "if(theClone != IntPtr.Zero)" ) ;
			codeToWMI.Line( "{" ) ;
			codeToWMI.Line("    Marshal.Release(theClone);" ) ;
			codeToWMI.Line("    theClone = IntPtr.Zero;" ) ;
			codeToWMI.Line( "}" ) ;

			codeToWMI.Line( "IWOA.Clone_f(12, emptyWbemObject, out theClone) ;" ) ;
			codeToWMI.Line( "Marshal.QueryInterface(theClone, ref iidIWbemObjectAccess, out instWbemObjectAccessIP) ;" ) ;
			codeToWMI.Line( "reflectionIWbemClassObjectField.SetValue ( reflectionInfoTempObj, theClone ) ;" ) ;

			codeToWMI.Line(String.Format("{0} instNET = ({0})obj;", type.FullName.Replace('+', '.'))); // bug#92918 - watch for nested classes

			// Explicit cast to IntPtr
			CodeWriter codeIntPtrCast = codeClass.AddChild("public static explicit operator IntPtr("+codeClassName+" obj)");
			codeIntPtrCast.Line("return obj.instWbemObjectAccessIP;");

			// Add GetInstance
			codeOneLineMembers.Line("public ManagementObject GetInstance() {return instance;}");

			PropertyDataCollection props = newClass.Properties;

			// type specific info
			switch(instrumentationType)
			{
				case InstrumentationType.Event:
					break;
				case InstrumentationType.Instance:
					props.Add("ProcessId", CimType.String, false);
					props.Add("InstanceId", CimType.String, false);
					props["ProcessId"].Qualifiers.Add("key", true);
					props["InstanceId"].Qualifiers.Add("key", true);
					newClass.Qualifiers.Add("dynamic", true, false, false, false, true);
					newClass.Qualifiers.Add("provider", naming.DecoupledProviderInstanceName, false, false, false, true);
					break;
				case InstrumentationType.Abstract:
					newClass.Qualifiers.Add("abstract", true, false, false, false, true);
					break;
				default:
					break;
			}
			
			int propCount = 0;
			bool needsNullObj = false;
			foreach(MemberInfo field in type.GetMembers())
			{
				if(!(field is FieldInfo || field is PropertyInfo))
					continue;

				if(field.GetCustomAttributes(typeof(IgnoreMemberAttribute), false).Length > 0)
					continue;

				if(field is FieldInfo)
				{
					FieldInfo fi = field as FieldInfo;

					// We ignore statics
					if(fi.IsStatic)
						ThrowUnsupportedMember(field);
				}
				else if (field is PropertyInfo)
				{
					PropertyInfo pi = field as PropertyInfo;
					// We must have a 'get' property accessor
					if(!pi.CanRead)
						ThrowUnsupportedMember(field);

					// We ignore static properties
					MethodInfo mi = pi.GetGetMethod();
					if(null == mi || mi.IsStatic)
						ThrowUnsupportedMember(field);

					// We don't support parameters on properties
					if(mi.GetParameters().Length > 0)
						ThrowUnsupportedMember(field);
				}
                
				String propName = ManagedNameAttribute.GetMemberName(field);


#if SUPPORTS_ALTERNATE_WMI_PROPERTY_TYPE
                Type t2 = ManagedTypeAttribute.GetManagedType(field);
#else
				Type t2;
				if(field is FieldInfo)
					t2 = (field as FieldInfo).FieldType;
				else
					t2 = (field as PropertyInfo).PropertyType;
#endif
				bool isArray = false;
				if(t2.IsArray)
				{
					// We only support one dimensional arrays in this version
					if(t2.GetArrayRank() != 1)
						ThrowUnsupportedMember(field);

					isArray = true;
					t2 = t2.GetElementType();
				}

				string embeddedTypeName = null;
				string embeddedConverterName = null;
				if(mapTypeToConverterClassName.Contains(t2))
				{
					embeddedConverterName = (string)mapTypeToConverterClassName[t2];
					embeddedTypeName = ManagedNameAttribute.GetMemberName(t2);
				}

				bool isGenericEmbeddedObject = false;
				if(t2 == typeof(object))
				{
					isGenericEmbeddedObject = true;
					if(hasGenericEmbeddedObject == false)
					{
						hasGenericEmbeddedObject = true;
						// Add map
						codeOneLineMembers.Line("static Hashtable mapTypeToConverter = new Hashtable();");
						foreach(DictionaryEntry entry in mapTypeToConverterClassName)
						{
							codeCCTOR.Line(String.Format("mapTypeToConverter[typeof({0})] = typeof({1});", ((Type)entry.Key).FullName.Replace('+', '.'), (string)entry.Value)); // bug#92918 - watch for nested classes
						}
					}

				}

				string propFieldName = "prop_" + (propCount);
				string handleFieldName = "handle_" + (propCount++);

				// Add handle for field, which is static accross all instances
				codeOneLineMembers.Line("static int " + handleFieldName + ";");
				codeCCTOR.Line(String.Format("IWOA.GetPropertyHandle_f27(27, wbemObjectAccessIP, \"{0}\", out cimType, out {1});", propName, handleFieldName));

				// Add PropertyData for field, which is specific to each instance
				codeOneLineMembers.Line("PropertyData " + propFieldName + ";");
				codeCTOR.Line(String.Format("{0} = instance.Properties[\"{1}\"];", propFieldName, propName));
				
				if(isGenericEmbeddedObject)
				{
					CodeWriter codeNotNull = codeToWMI.AddChild(String.Format("if(instNET.{0} != null)", field.Name));
					CodeWriter codeElse = codeToWMI.AddChild("else");
					codeElse.Line(String.Format("{0}.Value = null;", propFieldName));
					if(isArray)
					{
						codeNotNull.Line(String.Format("int len = instNET.{0}.Length;", field.Name));
						codeNotNull.Line("ManagementObject[] embeddedObjects = new ManagementObject[len];");
						codeNotNull.Line("IWmiConverter[] embeddedConverters = new IWmiConverter[len];");

						CodeWriter codeForLoop = codeNotNull.AddChild("for(int i=0;i<len;i++)");

						CodeWriter codeFoundType = codeForLoop.AddChild(String.Format("if((instNET.{0}[i] != null) && mapTypeToConverter.Contains(instNET.{0}[i].GetType()))", field.Name));
						codeFoundType.Line(String.Format("Type type = (Type)mapTypeToConverter[instNET.{0}[i].GetType()];", field.Name));
						codeFoundType.Line("embeddedConverters[i] = (IWmiConverter)Activator.CreateInstance(type);");
						codeFoundType.Line(String.Format("embeddedConverters[i].ToWMI(instNET.{0}[i]);", field.Name));
						codeFoundType.Line("embeddedObjects[i] = embeddedConverters[i].GetInstance();");

						codeForLoop.AddChild("else").Line(String.Format("embeddedObjects[i] = SafeAssign.GetManagementObject(instNET.{0}[i]);", field.Name));

						codeNotNull.Line(String.Format("{0}.Value = embeddedObjects;", propFieldName));
					}
					else
					{
						CodeWriter codeFoundType = codeNotNull.AddChild(String.Format("if(mapTypeToConverter.Contains(instNET.{0}.GetType()))", field.Name));
						codeFoundType.Line(String.Format("Type type = (Type)mapTypeToConverter[instNET.{0}.GetType()];", field.Name));
						codeFoundType.Line("IWmiConverter converter = (IWmiConverter)Activator.CreateInstance(type);");
						codeFoundType.Line(String.Format("converter.ToWMI(instNET.{0});", field.Name));
						codeFoundType.Line(String.Format("{0}.Value = converter.GetInstance();", propFieldName));

						codeNotNull.AddChild("else").Line(String.Format("{0}.Value = SafeAssign.GetInstance(instNET.{1});", propFieldName, field.Name));
					}
				}
				else if(embeddedTypeName != null)
				{
					// If this is an embedded struct, it cannot be null
					CodeWriter codeNotNull;
					if(t2.IsValueType)
						codeNotNull = codeToWMI;
					else
					{
						codeNotNull = codeToWMI.AddChild(String.Format("if(instNET.{0} != null)", field.Name));
						CodeWriter codeElse = codeToWMI.AddChild("else");
						codeElse.Line(String.Format("{0}.Value = null;", propFieldName));
					}

					if(isArray)
					{
						codeNotNull.Line(String.Format("int len = instNET.{0}.Length;", field.Name));
						codeNotNull.Line("ManagementObject[] embeddedObjects = new ManagementObject[len];");
						codeNotNull.Line(String.Format("{0}[] embeddedConverters = new {0}[len];", embeddedConverterName));

						CodeWriter codeForLoop = codeNotNull.AddChild("for(int i=0;i<len;i++)");
						codeForLoop.Line(String.Format("embeddedConverters[i] = new {0}();", embeddedConverterName));

						// If this is a struct array, the elements are never null
						if(t2.IsValueType)
						{
							codeForLoop.Line(String.Format("embeddedConverters[i].ToWMI(instNET.{0}[i]);", field.Name));
						}
						else
						{
							CodeWriter codeArrayElementNotNull = codeForLoop.AddChild(String.Format("if(instNET.{0}[i] != null)", field.Name));
							codeArrayElementNotNull.Line(String.Format("embeddedConverters[i].ToWMI(instNET.{0}[i]);", field.Name));
						}
						codeForLoop.Line("embeddedObjects[i] = embeddedConverters[i].instance;");

						codeNotNull.Line(String.Format("{0}.Value = embeddedObjects;", propFieldName));
					}
					else
					{

						// We cannot create an instance of 'embeddedConverterName' because it may be the
						// same type as we are defining (in other words, a cyclic loop, such as class XXX
						// having an instance of an XXX as a member).  To prevent an infinite loop of constructing
						// converter classes, we create a 'lazy' variable that is initialized to NULL, and the first
						// time it is used, we set it to a 'new embeddedConverterName'.
						codeOneLineMembers.Line(String.Format("{0} lazy_embeddedConverter_{1} = null;", embeddedConverterName, propFieldName));
						CodeWriter codeConverterProp = codeClass.AddChild(String.Format("{0} embeddedConverter_{1}", embeddedConverterName, propFieldName));
						CodeWriter codeGet = codeConverterProp.AddChild("get");
						CodeWriter codeIf = codeGet.AddChild(String.Format("if(null == lazy_embeddedConverter_{0})", propFieldName));
						codeIf.Line(String.Format("lazy_embeddedConverter_{0} = new {1}();", propFieldName, embeddedConverterName));
						codeGet.Line(String.Format("return lazy_embeddedConverter_{0};", propFieldName));

						codeNotNull.Line(String.Format("embeddedConverter_{0}.ToWMI(instNET.{1});", propFieldName, field.Name));
						codeNotNull.Line(String.Format("{0}.Value = embeddedConverter_{0}.instance;", propFieldName));
					}

				}
				else if(!isArray)
				{
					if(t2 == typeof(Byte) || t2 == typeof(SByte))
					{
						//
						// [PS#128409, marioh] CS0206 Compile error occured when instrumentated types contains public properties of type SByte, Int16, and UInt16	
						// Properties can not be passed as ref and therefore we store the property value in a tmp local variable before calling WritePropertyValue.
						// 
						codeToWMI.Line(String.Format("{0} instNET_{1} = instNET.{1} ;", t2, field.Name));
						codeToWMI.Line(String.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 1, ref instNET_{1});", handleFieldName, field.Name));
					}
					else if(t2 == typeof(Int16) || t2 == typeof(UInt16) || t2 == typeof(Char))
					{
						//
						// [PS#128409, marioh] CS0206 Compile error occured when instrumentated types contains public properties of type SByte, Int16, and UInt16	
						// Properties can not be passed as ref and therefore we store the property value in a tmp local variable before calling WritePropertyValue.
						// 
						codeToWMI.Line(String.Format("{0} instNET_{1} = instNET.{1} ;", t2, field.Name));	
						codeToWMI.Line(String.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 2, ref instNET_{1});", handleFieldName, field.Name));
					}
					else if(t2 == typeof(UInt32) || t2 == typeof(Int32) || t2 == typeof(Single))
						codeToWMI.Line(String.Format("IWOA.WriteDWORD_f31(31, instWbemObjectAccessIP, {0}, instNET.{1});", handleFieldName, field.Name));
					else if(t2 == typeof(UInt64) || t2 == typeof(Int64) || t2 == typeof(Double))
						codeToWMI.Line(String.Format("IWOA.WriteQWORD_f33(33, instWbemObjectAccessIP, {0}, instNET.{1});", handleFieldName, field.Name));
					else if(t2 == typeof(Boolean))
					{
						// 

						codeToWMI.Line(String.Format("if(instNET.{0})", field.Name));
						codeToWMI.Line(String.Format("    IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 2, ref SafeAssign.boolTrue);", handleFieldName));
						codeToWMI.Line("else");
						codeToWMI.Line(String.Format("    IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 2, ref SafeAssign.boolFalse);", handleFieldName));
					}
					else if(t2 == typeof(String))
					{
						CodeWriter codeQuickString = codeToWMI.AddChild(String.Format("if(null != instNET.{0})", field.Name));
						codeQuickString.Line(String.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, (instNET.{1}.Length+1)*2, instNET.{1});", handleFieldName, field.Name));
						//                        codeToWMI.AddChild("else").Line(String.Format("{0}.Value = instNET.{1};", propFieldName, field.Name));
						codeToWMI.AddChild("else").Line(String.Format("IWOA.Put_f5(5, instWbemObjectAccessIP, \"{0}\", 0, ref nullObj, 8);", propName));
						if(needsNullObj == false)
						{
							needsNullObj = true;

							// Bug#111623 - This line used to say 'nullObj = null;'  When nullObj was passed
							// to IWOA.Put, this did NOT set the value of a string variable to NULL.  The correct
							// thing to do was to pass a reference to DBNull.Value to IWOA.Put instead.
							codeOneLineMembers.Line("object nullObj = DBNull.Value;");
						}
					}
					else if(t2 == typeof(DateTime) || t2 == typeof(TimeSpan))
					{
						codeToWMI.Line(String.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 52, SafeAssign.WMITimeToString(instNET.{1}));", handleFieldName, field.Name));
						//                        codeToWMI.Line(String.Format("{0}.Value = SafeAssign.DateTimeToString(instNET.{1});", propFieldName, field.Name));
					}
					else
						codeToWMI.Line(String.Format("{0}.Value = instNET.{1};", propFieldName, field.Name));
				}
				else
				{
					// We have an array type
					if(t2 == typeof(DateTime) || t2 == typeof(TimeSpan))
					{
						codeToWMI.AddChild(String.Format("if(null == instNET.{0})", field.Name)).Line(String.Format("{0}.Value = null;", propFieldName));
						codeToWMI.AddChild("else").Line(String.Format("{0}.Value = SafeAssign.WMITimeArrayToStringArray(instNET.{1});", propFieldName, field.Name));
					}
					else
					{
						// This handles arrays of all primative types
						codeToWMI.Line(String.Format("{0}.Value = instNET.{1};", propFieldName, field.Name));
					}
				}


				CimType cimtype = CimType.String;

				if(field.DeclaringType != type)
					continue;


#if REQUIRES_EXPLICIT_DECLARATION_OF_INHERITED_PROPERTIES
                if(InheritedPropertyAttribute.GetAttribute(field) != null)
                    continue;
#else
				// See if this field already exists on the WMI class
				// In other words, is it inherited from a base class
				// 




				bool propertyExists = true;
				try
				{
					PropertyData prop = newClass.Properties[propName];
					// HACK for bug#96863 - The above line used to throw a
					// not found exception.  This was changed with a recent
					// checkin.  If this functionality is not reverted, the
					// following statement should force the necessary 'not
					// found' exception that we are looking for.
					CimType cimType = prop.Type;

					// Make sure that if the property exists, it is inherited
					// If it is local, they probably named two properties with
					// the same name
					if(prop.IsLocal)
					{
						throw new ArgumentException(String.Format(RC.GetString("MEMBERCONFLILCT_EXCEPT"), field.Name), field.Name);
					}
				}
				catch(ManagementException e)
				{
					if(e.ErrorCode != ManagementStatus.NotFound)
						throw;
					else
						propertyExists = false;
				}
				if(propertyExists)
					continue;
#endif


				if(embeddedTypeName != null)
					cimtype = CimType.Object;
				else if(isGenericEmbeddedObject)
					cimtype = CimType.Object;
				else if(t2 == typeof(ManagementObject))
					cimtype = CimType.Object;
				else if(t2 == typeof(SByte))
					cimtype = CimType.SInt8;
				else if(t2 == typeof(Byte))
					cimtype = CimType.UInt8;
				else if(t2 == typeof(Int16))
					cimtype = CimType.SInt16;
				else if(t2 == typeof(UInt16))
					cimtype = CimType.UInt16;
				else if(t2 == typeof(Int32))
					cimtype = CimType.SInt32;
				else if(t2 == typeof(UInt32))
					cimtype = CimType.UInt32;
				else if(t2 == typeof(Int64))
					cimtype = CimType.SInt64;
				else if(t2 == typeof(UInt64))
					cimtype = CimType.UInt64;
				else if(t2 == typeof(Single))
					cimtype = CimType.Real32;
				else if(t2 == typeof(Double))
					cimtype = CimType.Real64;
				else if(t2 == typeof(Boolean))
					cimtype = CimType.Boolean;
				else if(t2 == typeof(String))
					cimtype = CimType.String;
				else if(t2 == typeof(Char))
					cimtype = CimType.Char16;
				else if(t2 == typeof(DateTime))
					cimtype = CimType.DateTime;
				else if(t2 == typeof(TimeSpan))
					cimtype = CimType.DateTime;
				else
					ThrowUnsupportedMember(field);
				// HACK: The following line cause a strange System.InvalidProgramException when run through InstallUtil
				//				throw new Exception("Unsupported type for event member - " + t2.Name);


				//              

#if SUPPORTS_WMI_DEFAULT_VAULES
                Object defaultValue = ManagedDefaultValueAttribute.GetManagedDefaultValue(field);

                // 
                if(null == defaultValue)
                    props.Add(propName, cimtype, false);
                else
                    props.Add(propName, defaultValue, cimtype);
#else
				try
				{
					props.Add(propName, cimtype, isArray);
				}
				catch(ManagementException e)
				{
					ThrowUnsupportedMember(field, e);
				}
#endif

				// Must at 'interval' SubType on TimeSpans
				if(t2 == typeof(TimeSpan))
				{
					PropertyData prop = props[propName];
					prop.Qualifiers.Add("SubType", "interval", false, true, true, true);
				}

				if(embeddedTypeName != null)
				{
					PropertyData prop = props[propName];
					prop.Qualifiers["CIMTYPE"].Value = "object:"+embeddedTypeName;
				}
			}
			codeCCTOR.Line("Marshal.Release(wbemObjectAccessIP);");
			//            codeToWMI.Line("Console.WriteLine(instance.GetText(TextFormat.Mof));");
		}
        public SchemaMapping(Type type, SchemaNaming naming, Hashtable mapTypeToConverterClassName)
        {
            this.codeClassName = (string) mapTypeToConverterClassName[type];
            this.classType = type;
            bool flag = false;
            string baseClassName = ManagedNameAttribute.GetBaseClassName(type);
            this.className = ManagedNameAttribute.GetMemberName(type);
            this.instrumentationType = InstrumentationClassAttribute.GetAttribute(type).InstrumentationType;
            this.classPath = naming.NamespaceName + ":" + this.className;
            if (baseClassName == null)
            {
                this.newClass = new ManagementClass(naming.NamespaceName, "", null);
                this.newClass.SystemProperties["__CLASS"].Value = this.className;
            }
            else
            {
                ManagementClass class2 = new ManagementClass(naming.NamespaceName + ":" + baseClassName);
                if (this.instrumentationType == System.Management.Instrumentation.InstrumentationType.Instance)
                {
                    bool flag2 = false;
                    try
                    {
                        QualifierData data = class2.Qualifiers["abstract"];
                        if (data.Value is bool)
                        {
                            flag2 = (bool) data.Value;
                        }
                    }
                    catch (ManagementException exception)
                    {
                        if (exception.ErrorCode != ManagementStatus.NotFound)
                        {
                            throw;
                        }
                    }
                    if (!flag2)
                    {
                        throw new Exception(RC.GetString("CLASSINST_EXCEPT"));
                    }
                }
                this.newClass = class2.Derive(this.className);
            }
            CodeWriter writer = this.code.AddChild("public class " + this.codeClassName + " : IWmiConverter");
            CodeWriter writer2 = writer.AddChild(new CodeWriter());
            writer2.Line("static ManagementClass managementClass = new ManagementClass(@\"" + this.classPath + "\");");
            writer2.Line("static IntPtr classWbemObjectIP;");
            writer2.Line("static Guid iidIWbemObjectAccess = new Guid(\"49353C9A-516B-11D1-AEA6-00C04FB68820\");");
            writer2.Line("internal ManagementObject instance = managementClass.CreateInstance();");
            writer2.Line("object reflectionInfoTempObj = null ; ");
            writer2.Line("FieldInfo reflectionIWbemClassObjectField = null ; ");
            writer2.Line("IntPtr emptyWbemObject = IntPtr.Zero ; ");
            writer2.Line("IntPtr originalObject = IntPtr.Zero ; ");
            writer2.Line("bool toWmiCalled = false ; ");
            writer2.Line("IntPtr theClone = IntPtr.Zero;");
            writer2.Line("public static ManagementObject emptyInstance = managementClass.CreateInstance();");
            writer2.Line("public IntPtr instWbemObjectAccessIP;");
            CodeWriter writer3 = writer.AddChild("static " + this.codeClassName + "()");
            writer3.Line("classWbemObjectIP = (IntPtr)managementClass;");
            writer3.Line("IntPtr wbemObjectAccessIP;");
            writer3.Line("Marshal.QueryInterface(classWbemObjectIP, ref iidIWbemObjectAccess, out wbemObjectAccessIP);");
            writer3.Line("int cimType;");
            CodeWriter writer4 = writer.AddChild("public " + this.codeClassName + "()");
            writer4.Line("IntPtr wbemObjectIP = (IntPtr)instance;");
            writer4.Line("originalObject = (IntPtr)instance;");
            writer4.Line("Marshal.QueryInterface(wbemObjectIP, ref iidIWbemObjectAccess, out instWbemObjectAccessIP);");
            writer4.Line("FieldInfo tempField = instance.GetType().GetField ( \"_wbemObject\", BindingFlags.Instance | BindingFlags.NonPublic );");
            writer4.Line("if ( tempField == null )");
            writer4.Line("{");
            writer4.Line("   tempField = instance.GetType().GetField ( \"wbemObject\", BindingFlags.Instance | BindingFlags.NonPublic ) ;");
            writer4.Line("}");
            writer4.Line("reflectionInfoTempObj = tempField.GetValue (instance) ;");
            writer4.Line("reflectionIWbemClassObjectField = reflectionInfoTempObj.GetType().GetField (\"pWbemClassObject\", BindingFlags.Instance | BindingFlags.NonPublic );");
            writer4.Line("emptyWbemObject = (IntPtr) emptyInstance;");
            CodeWriter writer5 = writer.AddChild("~" + this.codeClassName + "()");
            writer5.AddChild("if(instWbemObjectAccessIP != IntPtr.Zero)").Line("Marshal.Release(instWbemObjectAccessIP);");
            writer5.Line("if ( toWmiCalled == true )");
            writer5.Line("{");
            writer5.Line("\tMarshal.Release (originalObject);");
            writer5.Line("}");
            CodeWriter writer6 = writer.AddChild("public void ToWMI(object obj)");
            writer6.Line("toWmiCalled = true ;");
            writer6.Line("if(instWbemObjectAccessIP != IntPtr.Zero)");
            writer6.Line("{");
            writer6.Line("    Marshal.Release(instWbemObjectAccessIP);");
            writer6.Line("    instWbemObjectAccessIP = IntPtr.Zero;");
            writer6.Line("}");
            writer6.Line("if(theClone != IntPtr.Zero)");
            writer6.Line("{");
            writer6.Line("    Marshal.Release(theClone);");
            writer6.Line("    theClone = IntPtr.Zero;");
            writer6.Line("}");
            writer6.Line("IWOA.Clone_f(12, emptyWbemObject, out theClone) ;");
            writer6.Line("Marshal.QueryInterface(theClone, ref iidIWbemObjectAccess, out instWbemObjectAccessIP) ;");
            writer6.Line("reflectionIWbemClassObjectField.SetValue ( reflectionInfoTempObj, theClone ) ;");
            writer6.Line(string.Format("{0} instNET = ({0})obj;", type.FullName.Replace('+', '.')));
            writer.AddChild("public static explicit operator IntPtr(" + this.codeClassName + " obj)").Line("return obj.instWbemObjectAccessIP;");
            writer2.Line("public ManagementObject GetInstance() {return instance;}");
            PropertyDataCollection properties = this.newClass.Properties;
            switch (this.instrumentationType)
            {
                case System.Management.Instrumentation.InstrumentationType.Instance:
                    properties.Add("ProcessId", CimType.String, false);
                    properties.Add("InstanceId", CimType.String, false);
                    properties["ProcessId"].Qualifiers.Add("key", true);
                    properties["InstanceId"].Qualifiers.Add("key", true);
                    this.newClass.Qualifiers.Add("dynamic", true, false, false, false, true);
                    this.newClass.Qualifiers.Add("provider", naming.DecoupledProviderInstanceName, false, false, false, true);
                    break;

                case System.Management.Instrumentation.InstrumentationType.Abstract:
                    this.newClass.Qualifiers.Add("abstract", true, false, false, false, true);
                    break;
            }
            int num = 0;
            bool flag3 = false;
            foreach (MemberInfo info in type.GetMembers())
            {
                if (((info is FieldInfo) || (info is PropertyInfo)) && (info.GetCustomAttributes(typeof(IgnoreMemberAttribute), false).Length <= 0))
                {
                    Type fieldType;
                    if (info is FieldInfo)
                    {
                        FieldInfo info2 = info as FieldInfo;
                        if (info2.IsStatic)
                        {
                            ThrowUnsupportedMember(info);
                        }
                    }
                    else if (info is PropertyInfo)
                    {
                        PropertyInfo info3 = info as PropertyInfo;
                        if (!info3.CanRead)
                        {
                            ThrowUnsupportedMember(info);
                        }
                        MethodInfo getMethod = info3.GetGetMethod();
                        if ((null == getMethod) || getMethod.IsStatic)
                        {
                            ThrowUnsupportedMember(info);
                        }
                        if (getMethod.GetParameters().Length > 0)
                        {
                            ThrowUnsupportedMember(info);
                        }
                    }
                    string memberName = ManagedNameAttribute.GetMemberName(info);
                    if (info is FieldInfo)
                    {
                        fieldType = (info as FieldInfo).FieldType;
                    }
                    else
                    {
                        fieldType = (info as PropertyInfo).PropertyType;
                    }
                    bool isArray = false;
                    if (fieldType.IsArray)
                    {
                        if (fieldType.GetArrayRank() != 1)
                        {
                            ThrowUnsupportedMember(info);
                        }
                        isArray = true;
                        fieldType = fieldType.GetElementType();
                    }
                    string str3 = null;
                    string str4 = null;
                    if (mapTypeToConverterClassName.Contains(fieldType))
                    {
                        str4 = (string) mapTypeToConverterClassName[fieldType];
                        str3 = ManagedNameAttribute.GetMemberName(fieldType);
                    }
                    bool flag5 = false;
                    if (fieldType == typeof(object))
                    {
                        flag5 = true;
                        if (!flag)
                        {
                            flag = true;
                            writer2.Line("static Hashtable mapTypeToConverter = new Hashtable();");
                            foreach (DictionaryEntry entry in mapTypeToConverterClassName)
                            {
                                string introduced55 = ((Type) entry.Key).FullName.Replace('+', '.');
                                writer3.Line(string.Format("mapTypeToConverter[typeof({0})] = typeof({1});", introduced55, (string) entry.Value));
                            }
                        }
                    }
                    string str5 = "prop_" + num;
                    string str6 = "handle_" + num++;
                    writer2.Line("static int " + str6 + ";");
                    writer3.Line(string.Format("IWOA.GetPropertyHandle_f27(27, wbemObjectAccessIP, \"{0}\", out cimType, out {1});", memberName, str6));
                    writer2.Line("PropertyData " + str5 + ";");
                    writer4.Line(string.Format("{0} = instance.Properties[\"{1}\"];", str5, memberName));
                    if (flag5)
                    {
                        CodeWriter writer8 = writer6.AddChild(string.Format("if(instNET.{0} != null)", info.Name));
                        writer6.AddChild("else").Line(string.Format("{0}.Value = null;", str5));
                        if (isArray)
                        {
                            writer8.Line(string.Format("int len = instNET.{0}.Length;", info.Name));
                            writer8.Line("ManagementObject[] embeddedObjects = new ManagementObject[len];");
                            writer8.Line("IWmiConverter[] embeddedConverters = new IWmiConverter[len];");
                            CodeWriter writer10 = writer8.AddChild("for(int i=0;i<len;i++)");
                            CodeWriter writer11 = writer10.AddChild(string.Format("if((instNET.{0}[i] != null) && mapTypeToConverter.Contains(instNET.{0}[i].GetType()))", info.Name));
                            writer11.Line(string.Format("Type type = (Type)mapTypeToConverter[instNET.{0}[i].GetType()];", info.Name));
                            writer11.Line("embeddedConverters[i] = (IWmiConverter)Activator.CreateInstance(type);");
                            writer11.Line(string.Format("embeddedConverters[i].ToWMI(instNET.{0}[i]);", info.Name));
                            writer11.Line("embeddedObjects[i] = embeddedConverters[i].GetInstance();");
                            writer10.AddChild("else").Line(string.Format("embeddedObjects[i] = SafeAssign.GetManagementObject(instNET.{0}[i]);", info.Name));
                            writer8.Line(string.Format("{0}.Value = embeddedObjects;", str5));
                        }
                        else
                        {
                            CodeWriter writer12 = writer8.AddChild(string.Format("if(mapTypeToConverter.Contains(instNET.{0}.GetType()))", info.Name));
                            writer12.Line(string.Format("Type type = (Type)mapTypeToConverter[instNET.{0}.GetType()];", info.Name));
                            writer12.Line("IWmiConverter converter = (IWmiConverter)Activator.CreateInstance(type);");
                            writer12.Line(string.Format("converter.ToWMI(instNET.{0});", info.Name));
                            writer12.Line(string.Format("{0}.Value = converter.GetInstance();", str5));
                            writer8.AddChild("else").Line(string.Format("{0}.Value = SafeAssign.GetInstance(instNET.{1});", str5, info.Name));
                        }
                    }
                    else if (str3 != null)
                    {
                        CodeWriter writer13;
                        if (fieldType.IsValueType)
                        {
                            writer13 = writer6;
                        }
                        else
                        {
                            writer13 = writer6.AddChild(string.Format("if(instNET.{0} != null)", info.Name));
                            writer6.AddChild("else").Line(string.Format("{0}.Value = null;", str5));
                        }
                        if (isArray)
                        {
                            writer13.Line(string.Format("int len = instNET.{0}.Length;", info.Name));
                            writer13.Line("ManagementObject[] embeddedObjects = new ManagementObject[len];");
                            writer13.Line(string.Format("{0}[] embeddedConverters = new {0}[len];", str4));
                            CodeWriter writer15 = writer13.AddChild("for(int i=0;i<len;i++)");
                            writer15.Line(string.Format("embeddedConverters[i] = new {0}();", str4));
                            if (fieldType.IsValueType)
                            {
                                writer15.Line(string.Format("embeddedConverters[i].ToWMI(instNET.{0}[i]);", info.Name));
                            }
                            else
                            {
                                writer15.AddChild(string.Format("if(instNET.{0}[i] != null)", info.Name)).Line(string.Format("embeddedConverters[i].ToWMI(instNET.{0}[i]);", info.Name));
                            }
                            writer15.Line("embeddedObjects[i] = embeddedConverters[i].instance;");
                            writer13.Line(string.Format("{0}.Value = embeddedObjects;", str5));
                        }
                        else
                        {
                            writer2.Line(string.Format("{0} lazy_embeddedConverter_{1} = null;", str4, str5));
                            CodeWriter writer18 = writer.AddChild(string.Format("{0} embeddedConverter_{1}", str4, str5)).AddChild("get");
                            writer18.AddChild(string.Format("if(null == lazy_embeddedConverter_{0})", str5)).Line(string.Format("lazy_embeddedConverter_{0} = new {1}();", str5, str4));
                            writer18.Line(string.Format("return lazy_embeddedConverter_{0};", str5));
                            writer13.Line(string.Format("embeddedConverter_{0}.ToWMI(instNET.{1});", str5, info.Name));
                            writer13.Line(string.Format("{0}.Value = embeddedConverter_{0}.instance;", str5));
                        }
                    }
                    else if (!isArray)
                    {
                        if ((fieldType == typeof(byte)) || (fieldType == typeof(sbyte)))
                        {
                            writer6.Line(string.Format("{0} instNET_{1} = instNET.{1} ;", fieldType, info.Name));
                            writer6.Line(string.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 1, ref instNET_{1});", str6, info.Name));
                        }
                        else if (((fieldType == typeof(short)) || (fieldType == typeof(ushort))) || (fieldType == typeof(char)))
                        {
                            writer6.Line(string.Format("{0} instNET_{1} = instNET.{1} ;", fieldType, info.Name));
                            writer6.Line(string.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 2, ref instNET_{1});", str6, info.Name));
                        }
                        else if (((fieldType == typeof(uint)) || (fieldType == typeof(int))) || (fieldType == typeof(float)))
                        {
                            writer6.Line(string.Format("IWOA.WriteDWORD_f31(31, instWbemObjectAccessIP, {0}, instNET.{1});", str6, info.Name));
                        }
                        else if (((fieldType == typeof(ulong)) || (fieldType == typeof(long))) || (fieldType == typeof(double)))
                        {
                            writer6.Line(string.Format("IWOA.WriteQWORD_f33(33, instWbemObjectAccessIP, {0}, instNET.{1});", str6, info.Name));
                        }
                        else if (fieldType == typeof(bool))
                        {
                            writer6.Line(string.Format("if(instNET.{0})", info.Name));
                            writer6.Line(string.Format("    IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 2, ref SafeAssign.boolTrue);", str6));
                            writer6.Line("else");
                            writer6.Line(string.Format("    IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 2, ref SafeAssign.boolFalse);", str6));
                        }
                        else if (fieldType == typeof(string))
                        {
                            writer6.AddChild(string.Format("if(null != instNET.{0})", info.Name)).Line(string.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, (instNET.{1}.Length+1)*2, instNET.{1});", str6, info.Name));
                            writer6.AddChild("else").Line(string.Format("IWOA.Put_f5(5, instWbemObjectAccessIP, \"{0}\", 0, ref nullObj, 8);", memberName));
                            if (!flag3)
                            {
                                flag3 = true;
                                writer2.Line("object nullObj = DBNull.Value;");
                            }
                        }
                        else if ((fieldType == typeof(DateTime)) || (fieldType == typeof(TimeSpan)))
                        {
                            writer6.Line(string.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 52, SafeAssign.WMITimeToString(instNET.{1}));", str6, info.Name));
                        }
                        else
                        {
                            writer6.Line(string.Format("{0}.Value = instNET.{1};", str5, info.Name));
                        }
                    }
                    else if ((fieldType == typeof(DateTime)) || (fieldType == typeof(TimeSpan)))
                    {
                        writer6.AddChild(string.Format("if(null == instNET.{0})", info.Name)).Line(string.Format("{0}.Value = null;", str5));
                        writer6.AddChild("else").Line(string.Format("{0}.Value = SafeAssign.WMITimeArrayToStringArray(instNET.{1});", str5, info.Name));
                    }
                    else
                    {
                        writer6.Line(string.Format("{0}.Value = instNET.{1};", str5, info.Name));
                    }
                    CimType propertyType = CimType.String;
                    if (info.DeclaringType == type)
                    {
                        bool flag6 = true;
                        try
                        {
                            PropertyData data2 = this.newClass.Properties[memberName];
                            CimType type1 = data2.Type;
                            if (data2.IsLocal)
                            {
                                throw new ArgumentException(string.Format(RC.GetString("MEMBERCONFLILCT_EXCEPT"), info.Name), info.Name);
                            }
                        }
                        catch (ManagementException exception2)
                        {
                            if (exception2.ErrorCode != ManagementStatus.NotFound)
                            {
                                throw;
                            }
                            flag6 = false;
                        }
                        if (!flag6)
                        {
                            if (str3 != null)
                            {
                                propertyType = CimType.Object;
                            }
                            else if (flag5)
                            {
                                propertyType = CimType.Object;
                            }
                            else if (fieldType == typeof(ManagementObject))
                            {
                                propertyType = CimType.Object;
                            }
                            else if (fieldType == typeof(sbyte))
                            {
                                propertyType = CimType.SInt8;
                            }
                            else if (fieldType == typeof(byte))
                            {
                                propertyType = CimType.UInt8;
                            }
                            else if (fieldType == typeof(short))
                            {
                                propertyType = CimType.SInt16;
                            }
                            else if (fieldType == typeof(ushort))
                            {
                                propertyType = CimType.UInt16;
                            }
                            else if (fieldType == typeof(int))
                            {
                                propertyType = CimType.SInt32;
                            }
                            else if (fieldType == typeof(uint))
                            {
                                propertyType = CimType.UInt32;
                            }
                            else if (fieldType == typeof(long))
                            {
                                propertyType = CimType.SInt64;
                            }
                            else if (fieldType == typeof(ulong))
                            {
                                propertyType = CimType.UInt64;
                            }
                            else if (fieldType == typeof(float))
                            {
                                propertyType = CimType.Real32;
                            }
                            else if (fieldType == typeof(double))
                            {
                                propertyType = CimType.Real64;
                            }
                            else if (fieldType == typeof(bool))
                            {
                                propertyType = CimType.Boolean;
                            }
                            else if (fieldType == typeof(string))
                            {
                                propertyType = CimType.String;
                            }
                            else if (fieldType == typeof(char))
                            {
                                propertyType = CimType.Char16;
                            }
                            else if (fieldType == typeof(DateTime))
                            {
                                propertyType = CimType.DateTime;
                            }
                            else if (fieldType == typeof(TimeSpan))
                            {
                                propertyType = CimType.DateTime;
                            }
                            else
                            {
                                ThrowUnsupportedMember(info);
                            }
                            try
                            {
                                properties.Add(memberName, propertyType, isArray);
                            }
                            catch (ManagementException exception3)
                            {
                                ThrowUnsupportedMember(info, exception3);
                            }
                            if (fieldType == typeof(TimeSpan))
                            {
                                PropertyData data3 = properties[memberName];
                                data3.Qualifiers.Add("SubType", "interval", false, true, true, true);
                            }
                            if (str3 != null)
                            {
                                PropertyData data4 = properties[memberName];
                                data4.Qualifiers["CIMTYPE"].Value = "object:" + str3;
                            }
                        }
                    }
                }
            }
            writer3.Line("Marshal.Release(wbemObjectAccessIP);");
        }
예제 #33
0
		public SchemaMapping(Type type, SchemaNaming naming, Hashtable mapTypeToConverterClassName)
		{
			int num;
			bool flag;
			MemberInfo memberInfo;
			FieldInfo fieldInfo;
			PropertyInfo propertyInfo;
			MethodInfo getMethod;
			string memberName;
			Type propertyType;
			bool flag1;
			string str;
			string item;
			bool flag2;
			DictionaryEntry dictionaryEntry;
			string str1;
			string str2;
			CodeWriter codeWriter;
			CodeWriter codeWriter1;
			CodeWriter codeWriter2;
			CodeWriter codeWriter3;
			CodeWriter codeWriter4;
			CodeWriter codeWriter5;
			CodeWriter codeWriter6;
			CodeWriter codeWriter7;
			CodeWriter codeWriter8;
			CodeWriter codeWriter9;
			CodeWriter codeWriter10;
			CodeWriter codeWriter11;
			CodeWriter codeWriter12;
			CimType cimType;
			bool flag3;
			PropertyData propertyDatum;
			PropertyData item1;
			PropertyData propertyDatum1;
			MemberInfo[] members;
			int i;
			int num1;
			this.code = new CodeWriter();
			this.codeClassName = (string)mapTypeToConverterClassName[type];
			this.classType = type;
			bool flag4 = false;
			string baseClassName = ManagedNameAttribute.GetBaseClassName(type);
			this.className = ManagedNameAttribute.GetMemberName(type);
			this.instrumentationType = InstrumentationClassAttribute.GetAttribute(type).InstrumentationType;
			this.classPath = string.Concat(naming.NamespaceName, ":", this.className);
			if (baseClassName != null)
			{
				ManagementClass managementClass = new ManagementClass(string.Concat(naming.NamespaceName, ":", baseClassName));
				if (this.instrumentationType == InstrumentationType.Instance)
				{
					bool value = false;
					try
					{
						QualifierData qualifierDatum = managementClass.Qualifiers["abstract"];
						if (qualifierDatum.Value is bool)
						{
							value = (bool)qualifierDatum.Value;
						}
					}
					catch (ManagementException managementException1)
					{
						ManagementException managementException = managementException1;
						if (managementException.ErrorCode != ManagementStatus.NotFound)
						{
							throw;
						}
					}
					if (!value)
					{
						throw new Exception(RC.GetString("CLASSINST_EXCEPT"));
					}
				}
				this.newClass = managementClass.Derive(this.className);
			}
			else
			{
				this.newClass = new ManagementClass(naming.NamespaceName, "", null);
				this.newClass.SystemProperties["__CLASS"].Value = this.className;
			}
			CodeWriter codeWriter13 = this.code.AddChild(string.Concat("public class ", this.codeClassName, " : IWmiConverter"));
			CodeWriter codeWriter14 = codeWriter13.AddChild(new CodeWriter());
			codeWriter14.Line(string.Concat("static ManagementClass managementClass = new ManagementClass(@\"", this.classPath, "\");"));
			codeWriter14.Line("static IntPtr classWbemObjectIP;");
			codeWriter14.Line("static Guid iidIWbemObjectAccess = new Guid(\"49353C9A-516B-11D1-AEA6-00C04FB68820\");");
			codeWriter14.Line("internal ManagementObject instance = managementClass.CreateInstance();");
			codeWriter14.Line("object reflectionInfoTempObj = null ; ");
			codeWriter14.Line("FieldInfo reflectionIWbemClassObjectField = null ; ");
			codeWriter14.Line("IntPtr emptyWbemObject = IntPtr.Zero ; ");
			codeWriter14.Line("IntPtr originalObject = IntPtr.Zero ; ");
			codeWriter14.Line("bool toWmiCalled = false ; ");
			codeWriter14.Line("IntPtr theClone = IntPtr.Zero;");
			codeWriter14.Line("public static ManagementObject emptyInstance = managementClass.CreateInstance();");
			codeWriter14.Line("public IntPtr instWbemObjectAccessIP;");
			CodeWriter codeWriter15 = codeWriter13.AddChild(string.Concat("static ", this.codeClassName, "()"));
			codeWriter15.Line("classWbemObjectIP = (IntPtr)managementClass;");
			codeWriter15.Line("IntPtr wbemObjectAccessIP;");
			codeWriter15.Line("Marshal.QueryInterface(classWbemObjectIP, ref iidIWbemObjectAccess, out wbemObjectAccessIP);");
			codeWriter15.Line("int cimType;");
			CodeWriter codeWriter16 = codeWriter13.AddChild(string.Concat("public ", this.codeClassName, "()"));
			codeWriter16.Line("IntPtr wbemObjectIP = (IntPtr)instance;");
			codeWriter16.Line("originalObject = (IntPtr)instance;");
			codeWriter16.Line("Marshal.QueryInterface(wbemObjectIP, ref iidIWbemObjectAccess, out instWbemObjectAccessIP);");
			codeWriter16.Line("FieldInfo tempField = instance.GetType().GetField ( \"_wbemObject\", BindingFlags.Instance | BindingFlags.NonPublic );");
			codeWriter16.Line("if ( tempField == null )");
			codeWriter16.Line("{");
			codeWriter16.Line("   tempField = instance.GetType().GetField ( \"wbemObject\", BindingFlags.Instance | BindingFlags.NonPublic ) ;");
			codeWriter16.Line("}");
			codeWriter16.Line("reflectionInfoTempObj = tempField.GetValue (instance) ;");
			codeWriter16.Line("reflectionIWbemClassObjectField = reflectionInfoTempObj.GetType().GetField (\"pWbemClassObject\", BindingFlags.Instance | BindingFlags.NonPublic );");
			codeWriter16.Line("emptyWbemObject = (IntPtr) emptyInstance;");
			CodeWriter codeWriter17 = codeWriter13.AddChild(string.Concat("~", this.codeClassName, "()"));
			codeWriter17.AddChild("if(instWbemObjectAccessIP != IntPtr.Zero)").Line("Marshal.Release(instWbemObjectAccessIP);");
			codeWriter17.Line("if ( toWmiCalled == true )");
			codeWriter17.Line("{");
			codeWriter17.Line("\tMarshal.Release (originalObject);");
			codeWriter17.Line("}");
			CodeWriter codeWriter18 = codeWriter13.AddChild("public void ToWMI(object obj)");
			codeWriter18.Line("toWmiCalled = true ;");
			codeWriter18.Line("if(instWbemObjectAccessIP != IntPtr.Zero)");
			codeWriter18.Line("{");
			codeWriter18.Line("    Marshal.Release(instWbemObjectAccessIP);");
			codeWriter18.Line("    instWbemObjectAccessIP = IntPtr.Zero;");
			codeWriter18.Line("}");
			codeWriter18.Line("if(theClone != IntPtr.Zero)");
			codeWriter18.Line("{");
			codeWriter18.Line("    Marshal.Release(theClone);");
			codeWriter18.Line("    theClone = IntPtr.Zero;");
			codeWriter18.Line("}");
			codeWriter18.Line("IWOA.Clone_f(12, emptyWbemObject, out theClone) ;");
			codeWriter18.Line("Marshal.QueryInterface(theClone, ref iidIWbemObjectAccess, out instWbemObjectAccessIP) ;");
			codeWriter18.Line("reflectionIWbemClassObjectField.SetValue ( reflectionInfoTempObj, theClone ) ;");
			codeWriter18.Line(string.Format("{0} instNET = ({0})obj;", type.FullName.Replace('+', '.')));
			CodeWriter codeWriter19 = codeWriter13.AddChild(string.Concat("public static explicit operator IntPtr(", this.codeClassName, " obj)"));
			codeWriter19.Line("return obj.instWbemObjectAccessIP;");
			codeWriter14.Line("public ManagementObject GetInstance() {return instance;}");
			PropertyDataCollection properties = this.newClass.Properties;
			InstrumentationType instrumentationType = this.instrumentationType;
			switch (instrumentationType)
			{
				case InstrumentationType.Instance:
				{
					properties.Add("ProcessId", CimType.String, false);
					properties.Add("InstanceId", CimType.String, false);
					properties["ProcessId"].Qualifiers.Add("key", true);
					properties["InstanceId"].Qualifiers.Add("key", true);
					this.newClass.Qualifiers.Add("dynamic", true, false, false, false, true);
					this.newClass.Qualifiers.Add("provider", naming.DecoupledProviderInstanceName, false, false, false, true);
					num = 0;
					flag = false;
					members = type.GetMembers();
					for (i = 0; i < (int)members.Length; i++)
					{
						memberInfo = members[i];
						if ((memberInfo as FieldInfo != null || memberInfo as PropertyInfo != null) && (int)memberInfo.GetCustomAttributes(typeof(IgnoreMemberAttribute), false).Length <= 0)
						{
							if (memberInfo as FieldInfo == null)
							{
								if (memberInfo as PropertyInfo != null)
								{
									propertyInfo = memberInfo as PropertyInfo;
									if (!propertyInfo.CanRead)
									{
										SchemaMapping.ThrowUnsupportedMember(memberInfo);
									}
									getMethod = propertyInfo.GetGetMethod();
									if (null == getMethod || getMethod.IsStatic)
									{
										SchemaMapping.ThrowUnsupportedMember(memberInfo);
									}
									if ((int)getMethod.GetParameters().Length > 0)
									{
										SchemaMapping.ThrowUnsupportedMember(memberInfo);
									}
								}
							}
							else
							{
								fieldInfo = memberInfo as FieldInfo;
								if (fieldInfo.IsStatic)
								{
									SchemaMapping.ThrowUnsupportedMember(memberInfo);
								}
							}
							memberName = ManagedNameAttribute.GetMemberName(memberInfo);
							if (memberInfo as FieldInfo == null)
							{
								propertyType = (memberInfo as PropertyInfo).PropertyType;
							}
							else
							{
								propertyType = (memberInfo as FieldInfo).FieldType;
							}
							flag1 = false;
							if (propertyType.IsArray)
							{
								if (propertyType.GetArrayRank() != 1)
								{
									SchemaMapping.ThrowUnsupportedMember(memberInfo);
								}
								flag1 = true;
								propertyType = propertyType.GetElementType();
							}
							str = null;
							item = null;
							if (mapTypeToConverterClassName.Contains(propertyType))
							{
								item = (string)mapTypeToConverterClassName[propertyType];
								str = ManagedNameAttribute.GetMemberName(propertyType);
							}
							flag2 = false;
							if (propertyType == typeof(object))
							{
								flag2 = true;
								if (!flag4)
								{
									flag4 = true;
									codeWriter14.Line("static Hashtable mapTypeToConverter = new Hashtable();");
									foreach (DictionaryEntry dictionaryEntry1 in mapTypeToConverterClassName)
									{
										codeWriter15.Line(string.Format("mapTypeToConverter[typeof({0})] = typeof({1});", ((Type)dictionaryEntry1.Key).FullName.Replace('+', '.'), (string)dictionaryEntry1.Value));
									}
								}
							}
							str1 = string.Concat("prop_", (object)num);
							num1 = num;
							num = num1 + 1;
							str2 = string.Concat("handle_", (object)num1);
							codeWriter14.Line(string.Concat("static int ", str2, ";"));
							codeWriter15.Line(string.Format("IWOA.GetPropertyHandle_f27(27, wbemObjectAccessIP, \"{0}\", out cimType, out {1});", memberName, str2));
							codeWriter14.Line(string.Concat("PropertyData ", str1, ";"));
							codeWriter16.Line(string.Format("{0} = instance.Properties[\"{1}\"];", str1, memberName));
							if (!flag2)
							{
								if (str == null)
								{
									if (flag1)
									{
										if (propertyType == typeof(DateTime) || propertyType == typeof(TimeSpan))
										{
											codeWriter18.AddChild(string.Format("if(null == instNET.{0})", memberInfo.Name)).Line(string.Format("{0}.Value = null;", str1));
											codeWriter18.AddChild("else").Line(string.Format("{0}.Value = SafeAssign.WMITimeArrayToStringArray(instNET.{1});", str1, memberInfo.Name));
										}
										else
										{
											codeWriter18.Line(string.Format("{0}.Value = instNET.{1};", str1, memberInfo.Name));
										}
									}
									else
									{
										if (propertyType == typeof(byte) || propertyType == typeof(sbyte))
										{
											codeWriter18.Line(string.Format("{0} instNET_{1} = instNET.{1} ;", propertyType, memberInfo.Name));
											codeWriter18.Line(string.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 1, ref instNET_{1});", str2, memberInfo.Name));
										}
										else
										{
											if (propertyType == typeof(short) || propertyType == typeof(ushort) || propertyType == typeof(char))
											{
												codeWriter18.Line(string.Format("{0} instNET_{1} = instNET.{1} ;", propertyType, memberInfo.Name));
												codeWriter18.Line(string.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 2, ref instNET_{1});", str2, memberInfo.Name));
											}
											else
											{
												if (propertyType == typeof(uint) || propertyType == typeof(int) || propertyType == typeof(float))
												{
													codeWriter18.Line(string.Format("IWOA.WriteDWORD_f31(31, instWbemObjectAccessIP, {0}, instNET.{1});", str2, memberInfo.Name));
												}
												else
												{
													if (propertyType == typeof(ulong) || propertyType == typeof(long) || propertyType == typeof(double))
													{
														codeWriter18.Line(string.Format("IWOA.WriteQWORD_f33(33, instWbemObjectAccessIP, {0}, instNET.{1});", str2, memberInfo.Name));
													}
													else
													{
														if (propertyType != typeof(bool))
														{
															if (propertyType != typeof(string))
															{
																if (propertyType == typeof(DateTime) || propertyType == typeof(TimeSpan))
																{
																	codeWriter18.Line(string.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 52, SafeAssign.WMITimeToString(instNET.{1}));", str2, memberInfo.Name));
																}
																else
																{
																	codeWriter18.Line(string.Format("{0}.Value = instNET.{1};", str1, memberInfo.Name));
																}
															}
															else
															{
																codeWriter12 = codeWriter18.AddChild(string.Format("if(null != instNET.{0})", memberInfo.Name));
																codeWriter12.Line(string.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, (instNET.{1}.Length+1)*2, instNET.{1});", str2, memberInfo.Name));
																codeWriter18.AddChild("else").Line(string.Format("IWOA.Put_f5(5, instWbemObjectAccessIP, \"{0}\", 0, ref nullObj, 8);", memberName));
																if (!flag)
																{
																	flag = true;
																	codeWriter14.Line("object nullObj = DBNull.Value;");
																}
															}
														}
														else
														{
															codeWriter18.Line(string.Format("if(instNET.{0})", memberInfo.Name));
															codeWriter18.Line(string.Format("    IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 2, ref SafeAssign.boolTrue);", str2));
															codeWriter18.Line("else");
															codeWriter18.Line(string.Format("    IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 2, ref SafeAssign.boolFalse);", str2));
														}
													}
												}
											}
										}
									}
								}
								else
								{
									if (!propertyType.IsValueType)
									{
										codeWriter5 = codeWriter18.AddChild(string.Format("if(instNET.{0} != null)", memberInfo.Name));
										codeWriter6 = codeWriter18.AddChild("else");
										codeWriter6.Line(string.Format("{0}.Value = null;", str1));
									}
									else
									{
										codeWriter5 = codeWriter18;
									}
									if (!flag1)
									{
										codeWriter14.Line(string.Format("{0} lazy_embeddedConverter_{1} = null;", item, str1));
										codeWriter9 = codeWriter13.AddChild(string.Format("{0} embeddedConverter_{1}", item, str1));
										codeWriter10 = codeWriter9.AddChild("get");
										codeWriter11 = codeWriter10.AddChild(string.Format("if(null == lazy_embeddedConverter_{0})", str1));
										codeWriter11.Line(string.Format("lazy_embeddedConverter_{0} = new {1}();", str1, item));
										codeWriter10.Line(string.Format("return lazy_embeddedConverter_{0};", str1));
										codeWriter5.Line(string.Format("embeddedConverter_{0}.ToWMI(instNET.{1});", str1, memberInfo.Name));
										codeWriter5.Line(string.Format("{0}.Value = embeddedConverter_{0}.instance;", str1));
									}
									else
									{
										codeWriter5.Line(string.Format("int len = instNET.{0}.Length;", memberInfo.Name));
										codeWriter5.Line("ManagementObject[] embeddedObjects = new ManagementObject[len];");
										codeWriter5.Line(string.Format("{0}[] embeddedConverters = new {0}[len];", item));
										codeWriter7 = codeWriter5.AddChild("for(int i=0;i<len;i++)");
										codeWriter7.Line(string.Format("embeddedConverters[i] = new {0}();", item));
										if (!propertyType.IsValueType)
										{
											codeWriter8 = codeWriter7.AddChild(string.Format("if(instNET.{0}[i] != null)", memberInfo.Name));
											codeWriter8.Line(string.Format("embeddedConverters[i].ToWMI(instNET.{0}[i]);", memberInfo.Name));
										}
										else
										{
											codeWriter7.Line(string.Format("embeddedConverters[i].ToWMI(instNET.{0}[i]);", memberInfo.Name));
										}
										codeWriter7.Line("embeddedObjects[i] = embeddedConverters[i].instance;");
										codeWriter5.Line(string.Format("{0}.Value = embeddedObjects;", str1));
									}
								}
							}
							else
							{
								codeWriter = codeWriter18.AddChild(string.Format("if(instNET.{0} != null)", memberInfo.Name));
								codeWriter1 = codeWriter18.AddChild("else");
								codeWriter1.Line(string.Format("{0}.Value = null;", str1));
								if (!flag1)
								{
									codeWriter4 = codeWriter.AddChild(string.Format("if(mapTypeToConverter.Contains(instNET.{0}.GetType()))", memberInfo.Name));
									codeWriter4.Line(string.Format("Type type = (Type)mapTypeToConverter[instNET.{0}.GetType()];", memberInfo.Name));
									codeWriter4.Line("IWmiConverter converter = (IWmiConverter)Activator.CreateInstance(type);");
									codeWriter4.Line(string.Format("converter.ToWMI(instNET.{0});", memberInfo.Name));
									codeWriter4.Line(string.Format("{0}.Value = converter.GetInstance();", str1));
									codeWriter.AddChild("else").Line(string.Format("{0}.Value = SafeAssign.GetInstance(instNET.{1});", str1, memberInfo.Name));
								}
								else
								{
									codeWriter.Line(string.Format("int len = instNET.{0}.Length;", memberInfo.Name));
									codeWriter.Line("ManagementObject[] embeddedObjects = new ManagementObject[len];");
									codeWriter.Line("IWmiConverter[] embeddedConverters = new IWmiConverter[len];");
									codeWriter2 = codeWriter.AddChild("for(int i=0;i<len;i++)");
									codeWriter3 = codeWriter2.AddChild(string.Format("if((instNET.{0}[i] != null) && mapTypeToConverter.Contains(instNET.{0}[i].GetType()))", memberInfo.Name));
									codeWriter3.Line(string.Format("Type type = (Type)mapTypeToConverter[instNET.{0}[i].GetType()];", memberInfo.Name));
									codeWriter3.Line("embeddedConverters[i] = (IWmiConverter)Activator.CreateInstance(type);");
									codeWriter3.Line(string.Format("embeddedConverters[i].ToWMI(instNET.{0}[i]);", memberInfo.Name));
									codeWriter3.Line("embeddedObjects[i] = embeddedConverters[i].GetInstance();");
									codeWriter2.AddChild("else").Line(string.Format("embeddedObjects[i] = SafeAssign.GetManagementObject(instNET.{0}[i]);", memberInfo.Name));
									codeWriter.Line(string.Format("{0}.Value = embeddedObjects;", str1));
								}
							}
							cimType = CimType.String;
							if (memberInfo.DeclaringType == type)
							{
								flag3 = true;
								try
								{
									propertyDatum = this.newClass.Properties[memberName];
									CimType type1 = propertyDatum.Type;
									if (propertyDatum.IsLocal)
									{
										throw new ArgumentException(string.Format(RC.GetString("MEMBERCONFLILCT_EXCEPT"), memberInfo.Name), memberInfo.Name);
									}
								}
								catch (ManagementException managementException3)
								{
									ManagementException managementException2 = managementException3;
									if (managementException2.ErrorCode == ManagementStatus.NotFound)
									{
										flag3 = false;
									}
									else
									{
										throw;
									}
								}
								if (!flag3)
								{
									if (str == null)
									{
										if (!flag2)
										{
											if (propertyType != typeof(ManagementObject))
											{
												if (propertyType != typeof(sbyte))
												{
													if (propertyType != typeof(byte))
													{
														if (propertyType != typeof(short))
														{
															if (propertyType != typeof(ushort))
															{
																if (propertyType != typeof(int))
																{
																	if (propertyType != typeof(uint))
																	{
																		if (propertyType != typeof(long))
																		{
																			if (propertyType != typeof(ulong))
																			{
																				if (propertyType != typeof(float))
																				{
																					if (propertyType != typeof(double))
																					{
																						if (propertyType != typeof(bool))
																						{
																							if (propertyType != typeof(string))
																							{
																								if (propertyType != typeof(char))
																								{
																									if (propertyType != typeof(DateTime))
																									{
																										if (propertyType != typeof(TimeSpan))
																										{
																											SchemaMapping.ThrowUnsupportedMember(memberInfo);
																										}
																										else
																										{
																											cimType = CimType.DateTime;
																										}
																									}
																									else
																									{
																										cimType = CimType.DateTime;
																									}
																								}
																								else
																								{
																									cimType = CimType.Char16;
																								}
																							}
																							else
																							{
																								cimType = CimType.String;
																							}
																						}
																						else
																						{
																							cimType = CimType.Boolean;
																						}
																					}
																					else
																					{
																						cimType = CimType.Real64;
																					}
																				}
																				else
																				{
																					cimType = CimType.Real32;
																				}
																			}
																			else
																			{
																				cimType = CimType.UInt64;
																			}
																		}
																		else
																		{
																			cimType = CimType.SInt64;
																		}
																	}
																	else
																	{
																		cimType = CimType.UInt32;
																	}
																}
																else
																{
																	cimType = CimType.SInt32;
																}
															}
															else
															{
																cimType = CimType.UInt16;
															}
														}
														else
														{
															cimType = CimType.SInt16;
														}
													}
													else
													{
														cimType = CimType.UInt8;
													}
												}
												else
												{
													cimType = CimType.SInt8;
												}
											}
											else
											{
												cimType = CimType.Object;
											}
										}
										else
										{
											cimType = CimType.Object;
										}
									}
									else
									{
										cimType = CimType.Object;
									}
									try
									{
										properties.Add(memberName, cimType, flag1);
									}
									catch (ManagementException managementException5)
									{
										ManagementException managementException4 = managementException5;
										SchemaMapping.ThrowUnsupportedMember(memberInfo, managementException4);
									}
									if (propertyType == typeof(TimeSpan))
									{
										item1 = properties[memberName];
										item1.Qualifiers.Add("SubType", "interval", false, true, true, true);
									}
									if (str != null)
									{
										propertyDatum1 = properties[memberName];
										propertyDatum1.Qualifiers["CIMTYPE"].Value = string.Concat("object:", str);
									}
								}
							}
						}
					}
					codeWriter15.Line("Marshal.Release(wbemObjectAccessIP);");
					return;
				}
				case InstrumentationType.Event:
				{
					num = 0;
					flag = false;
					members = type.GetMembers();
					for (i = 0; i < (int)members.Length; i++)
					{
						memberInfo = members[i];
						if ((memberInfo as FieldInfo != null || memberInfo as PropertyInfo != null) && (int)memberInfo.GetCustomAttributes(typeof(IgnoreMemberAttribute), false).Length <= 0)
						{
							if (memberInfo as FieldInfo == null)
							{
								if (memberInfo as PropertyInfo != null)
								{
									propertyInfo = memberInfo as PropertyInfo;
									if (!propertyInfo.CanRead)
									{
										SchemaMapping.ThrowUnsupportedMember(memberInfo);
									}
									getMethod = propertyInfo.GetGetMethod();
									if (null == getMethod || getMethod.IsStatic)
									{
										SchemaMapping.ThrowUnsupportedMember(memberInfo);
									}
									if ((int)getMethod.GetParameters().Length > 0)
									{
										SchemaMapping.ThrowUnsupportedMember(memberInfo);
									}
								}
							}
							else
							{
								fieldInfo = memberInfo as FieldInfo;
								if (fieldInfo.IsStatic)
								{
									SchemaMapping.ThrowUnsupportedMember(memberInfo);
								}
							}
							memberName = ManagedNameAttribute.GetMemberName(memberInfo);
							if (memberInfo as FieldInfo == null)
							{
								propertyType = (memberInfo as PropertyInfo).PropertyType;
							}
							else
							{
								propertyType = (memberInfo as FieldInfo).FieldType;
							}
							flag1 = false;
							if (propertyType.IsArray)
							{
								if (propertyType.GetArrayRank() != 1)
								{
									SchemaMapping.ThrowUnsupportedMember(memberInfo);
								}
								flag1 = true;
								propertyType = propertyType.GetElementType();
							}
							str = null;
							item = null;
							if (mapTypeToConverterClassName.Contains(propertyType))
							{
								item = (string)mapTypeToConverterClassName[propertyType];
								str = ManagedNameAttribute.GetMemberName(propertyType);
							}
							flag2 = false;
							if (propertyType == typeof(object))
							{
								flag2 = true;
								if (!flag4)
								{
									flag4 = true;
									codeWriter14.Line("static Hashtable mapTypeToConverter = new Hashtable();");
									foreach (DictionaryEntry dictionaryEntry2 in mapTypeToConverterClassName)
									{
										codeWriter15.Line(string.Format("mapTypeToConverter[typeof({0})] = typeof({1});", ((Type)dictionaryEntry2.Key).FullName.Replace('+', '.'), (string)dictionaryEntry2.Value));
									}
								}
							}
							str1 = string.Concat("prop_", num);
							num1 = num;
							num = num1 + 1;
							str2 = string.Concat("handle_", num1);
							codeWriter14.Line(string.Concat("static int ", str2, ";"));
							codeWriter15.Line(string.Format("IWOA.GetPropertyHandle_f27(27, wbemObjectAccessIP, \"{0}\", out cimType, out {1});", memberName, str2));
							codeWriter14.Line(string.Concat("PropertyData ", str1, ";"));
							codeWriter16.Line(string.Format("{0} = instance.Properties[\"{1}\"];", str1, memberName));
							if (!flag2)
							{
								if (str == null)
								{
									if (flag1)
									{
										if (propertyType == typeof(DateTime) || propertyType == typeof(TimeSpan))
										{
											codeWriter18.AddChild(string.Format("if(null == instNET.{0})", memberInfo.Name)).Line(string.Format("{0}.Value = null;", str1));
											codeWriter18.AddChild("else").Line(string.Format("{0}.Value = SafeAssign.WMITimeArrayToStringArray(instNET.{1});", str1, memberInfo.Name));
										}
										else
										{
											codeWriter18.Line(string.Format("{0}.Value = instNET.{1};", str1, memberInfo.Name));
										}
									}
									else
									{
										if (propertyType == typeof(byte) || propertyType == typeof(sbyte))
										{
											codeWriter18.Line(string.Format("{0} instNET_{1} = instNET.{1} ;", propertyType, memberInfo.Name));
											codeWriter18.Line(string.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 1, ref instNET_{1});", str2, memberInfo.Name));
										}
										else
										{
											if (propertyType == typeof(short) || propertyType == typeof(ushort) || propertyType == typeof(char))
											{
												codeWriter18.Line(string.Format("{0} instNET_{1} = instNET.{1} ;", propertyType, memberInfo.Name));
												codeWriter18.Line(string.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 2, ref instNET_{1});", str2, memberInfo.Name));
											}
											else
											{
												if (propertyType == typeof(uint) || propertyType == typeof(int) || propertyType == typeof(float))
												{
													codeWriter18.Line(string.Format("IWOA.WriteDWORD_f31(31, instWbemObjectAccessIP, {0}, instNET.{1});", str2, memberInfo.Name));
												}
												else
												{
													if (propertyType == typeof(ulong) || propertyType == typeof(long) || propertyType == typeof(double))
													{
														codeWriter18.Line(string.Format("IWOA.WriteQWORD_f33(33, instWbemObjectAccessIP, {0}, instNET.{1});", str2, memberInfo.Name));
													}
													else
													{
														if (propertyType != typeof(bool))
														{
															if (propertyType != typeof(string))
															{
																if (propertyType == typeof(DateTime) || propertyType == typeof(TimeSpan))
																{
																	codeWriter18.Line(string.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 52, SafeAssign.WMITimeToString(instNET.{1}));", str2, memberInfo.Name));
																}
																else
																{
																	codeWriter18.Line(string.Format("{0}.Value = instNET.{1};", str1, memberInfo.Name));
																}
															}
															else
															{
																codeWriter12 = codeWriter18.AddChild(string.Format("if(null != instNET.{0})", memberInfo.Name));
																codeWriter12.Line(string.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, (instNET.{1}.Length+1)*2, instNET.{1});", str2, memberInfo.Name));
																codeWriter18.AddChild("else").Line(string.Format("IWOA.Put_f5(5, instWbemObjectAccessIP, \"{0}\", 0, ref nullObj, 8);", memberName));
																if (!flag)
																{
																	flag = true;
																	codeWriter14.Line("object nullObj = DBNull.Value;");
																}
															}
														}
														else
														{
															codeWriter18.Line(string.Format("if(instNET.{0})", memberInfo.Name));
															codeWriter18.Line(string.Format("    IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 2, ref SafeAssign.boolTrue);", str2));
															codeWriter18.Line("else");
															codeWriter18.Line(string.Format("    IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 2, ref SafeAssign.boolFalse);", str2));
														}
													}
												}
											}
										}
									}
								}
								else
								{
									if (!propertyType.IsValueType)
									{
										codeWriter5 = codeWriter18.AddChild(string.Format("if(instNET.{0} != null)", memberInfo.Name));
										codeWriter6 = codeWriter18.AddChild("else");
										codeWriter6.Line(string.Format("{0}.Value = null;", str1));
									}
									else
									{
										codeWriter5 = codeWriter18;
									}
									if (!flag1)
									{
										codeWriter14.Line(string.Format("{0} lazy_embeddedConverter_{1} = null;", item, str1));
										codeWriter9 = codeWriter13.AddChild(string.Format("{0} embeddedConverter_{1}", item, str1));
										codeWriter10 = codeWriter9.AddChild("get");
										codeWriter11 = codeWriter10.AddChild(string.Format("if(null == lazy_embeddedConverter_{0})", str1));
										codeWriter11.Line(string.Format("lazy_embeddedConverter_{0} = new {1}();", str1, item));
										codeWriter10.Line(string.Format("return lazy_embeddedConverter_{0};", str1));
										codeWriter5.Line(string.Format("embeddedConverter_{0}.ToWMI(instNET.{1});", str1, memberInfo.Name));
										codeWriter5.Line(string.Format("{0}.Value = embeddedConverter_{0}.instance;", str1));
									}
									else
									{
										codeWriter5.Line(string.Format("int len = instNET.{0}.Length;", memberInfo.Name));
										codeWriter5.Line("ManagementObject[] embeddedObjects = new ManagementObject[len];");
										codeWriter5.Line(string.Format("{0}[] embeddedConverters = new {0}[len];", item));
										codeWriter7 = codeWriter5.AddChild("for(int i=0;i<len;i++)");
										codeWriter7.Line(string.Format("embeddedConverters[i] = new {0}();", item));
										if (!propertyType.IsValueType)
										{
											codeWriter8 = codeWriter7.AddChild(string.Format("if(instNET.{0}[i] != null)", memberInfo.Name));
											codeWriter8.Line(string.Format("embeddedConverters[i].ToWMI(instNET.{0}[i]);", memberInfo.Name));
										}
										else
										{
											codeWriter7.Line(string.Format("embeddedConverters[i].ToWMI(instNET.{0}[i]);", memberInfo.Name));
										}
										codeWriter7.Line("embeddedObjects[i] = embeddedConverters[i].instance;");
										codeWriter5.Line(string.Format("{0}.Value = embeddedObjects;", str1));
									}
								}
							}
							else
							{
								codeWriter = codeWriter18.AddChild(string.Format("if(instNET.{0} != null)", memberInfo.Name));
								codeWriter1 = codeWriter18.AddChild("else");
								codeWriter1.Line(string.Format("{0}.Value = null;", str1));
								if (!flag1)
								{
									codeWriter4 = codeWriter.AddChild(string.Format("if(mapTypeToConverter.Contains(instNET.{0}.GetType()))", memberInfo.Name));
									codeWriter4.Line(string.Format("Type type = (Type)mapTypeToConverter[instNET.{0}.GetType()];", memberInfo.Name));
									codeWriter4.Line("IWmiConverter converter = (IWmiConverter)Activator.CreateInstance(type);");
									codeWriter4.Line(string.Format("converter.ToWMI(instNET.{0});", memberInfo.Name));
									codeWriter4.Line(string.Format("{0}.Value = converter.GetInstance();", str1));
									codeWriter.AddChild("else").Line(string.Format("{0}.Value = SafeAssign.GetInstance(instNET.{1});", str1, memberInfo.Name));
								}
								else
								{
									codeWriter.Line(string.Format("int len = instNET.{0}.Length;", memberInfo.Name));
									codeWriter.Line("ManagementObject[] embeddedObjects = new ManagementObject[len];");
									codeWriter.Line("IWmiConverter[] embeddedConverters = new IWmiConverter[len];");
									codeWriter2 = codeWriter.AddChild("for(int i=0;i<len;i++)");
									codeWriter3 = codeWriter2.AddChild(string.Format("if((instNET.{0}[i] != null) && mapTypeToConverter.Contains(instNET.{0}[i].GetType()))", memberInfo.Name));
									codeWriter3.Line(string.Format("Type type = (Type)mapTypeToConverter[instNET.{0}[i].GetType()];", memberInfo.Name));
									codeWriter3.Line("embeddedConverters[i] = (IWmiConverter)Activator.CreateInstance(type);");
									codeWriter3.Line(string.Format("embeddedConverters[i].ToWMI(instNET.{0}[i]);", memberInfo.Name));
									codeWriter3.Line("embeddedObjects[i] = embeddedConverters[i].GetInstance();");
									codeWriter2.AddChild("else").Line(string.Format("embeddedObjects[i] = SafeAssign.GetManagementObject(instNET.{0}[i]);", memberInfo.Name));
									codeWriter.Line(string.Format("{0}.Value = embeddedObjects;", str1));
								}
							}
							cimType = CimType.String;
							if (memberInfo.DeclaringType == type)
							{
								flag3 = true;
								try
								{
									propertyDatum = this.newClass.Properties[memberName];
									CimType type1 = propertyDatum.Type;
									if (propertyDatum.IsLocal)
									{
										throw new ArgumentException(string.Format(RC.GetString("MEMBERCONFLILCT_EXCEPT"), memberInfo.Name), memberInfo.Name);
									}
								}
								catch (ManagementException managementException3)
								{
									ManagementException managementException2 = managementException3;
									if (managementException2.ErrorCode == ManagementStatus.NotFound)
									{
										flag3 = false;
									}
									else
									{
										throw;
									}
								}
								if (!flag3)
								{
									if (str == null)
									{
										if (!flag2)
										{
											if (propertyType != typeof(ManagementObject))
											{
												if (propertyType != typeof(sbyte))
												{
													if (propertyType != typeof(byte))
													{
														if (propertyType != typeof(short))
														{
															if (propertyType != typeof(ushort))
															{
																if (propertyType != typeof(int))
																{
																	if (propertyType != typeof(uint))
																	{
																		if (propertyType != typeof(long))
																		{
																			if (propertyType != typeof(ulong))
																			{
																				if (propertyType != typeof(float))
																				{
																					if (propertyType != typeof(double))
																					{
																						if (propertyType != typeof(bool))
																						{
																							if (propertyType != typeof(string))
																							{
																								if (propertyType != typeof(char))
																								{
																									if (propertyType != typeof(DateTime))
																									{
																										if (propertyType != typeof(TimeSpan))
																										{
																											SchemaMapping.ThrowUnsupportedMember(memberInfo);
																										}
																										else
																										{
																											cimType = CimType.DateTime;
																										}
																									}
																									else
																									{
																										cimType = CimType.DateTime;
																									}
																								}
																								else
																								{
																									cimType = CimType.Char16;
																								}
																							}
																							else
																							{
																								cimType = CimType.String;
																							}
																						}
																						else
																						{
																							cimType = CimType.Boolean;
																						}
																					}
																					else
																					{
																						cimType = CimType.Real64;
																					}
																				}
																				else
																				{
																					cimType = CimType.Real32;
																				}
																			}
																			else
																			{
																				cimType = CimType.UInt64;
																			}
																		}
																		else
																		{
																			cimType = CimType.SInt64;
																		}
																	}
																	else
																	{
																		cimType = CimType.UInt32;
																	}
																}
																else
																{
																	cimType = CimType.SInt32;
																}
															}
															else
															{
																cimType = CimType.UInt16;
															}
														}
														else
														{
															cimType = CimType.SInt16;
														}
													}
													else
													{
														cimType = CimType.UInt8;
													}
												}
												else
												{
													cimType = CimType.SInt8;
												}
											}
											else
											{
												cimType = CimType.Object;
											}
										}
										else
										{
											cimType = CimType.Object;
										}
									}
									else
									{
										cimType = CimType.Object;
									}
									try
									{
										properties.Add(memberName, cimType, flag1);
									}
									catch (ManagementException managementException5)
									{
										ManagementException managementException4 = managementException5;
										SchemaMapping.ThrowUnsupportedMember(memberInfo, managementException4);
									}
									if (propertyType == typeof(TimeSpan))
									{
										item1 = properties[memberName];
										item1.Qualifiers.Add("SubType", "interval", false, true, true, true);
									}
									if (str != null)
									{
										propertyDatum1 = properties[memberName];
										propertyDatum1.Qualifiers["CIMTYPE"].Value = string.Concat("object:", str);
									}
								}
							}
						}
					}
					codeWriter15.Line("Marshal.Release(wbemObjectAccessIP);");
					return;
				}
				case InstrumentationType.Abstract:
				{
					this.newClass.Qualifiers.Add("abstract", true, false, false, false, true);
					num = 0;
					flag = false;
					members = type.GetMembers();
					for (i = 0; i < (int)members.Length; i++)
					{
						memberInfo = members[i];
						if ((memberInfo as FieldInfo != null || memberInfo as PropertyInfo != null) && (int)memberInfo.GetCustomAttributes(typeof(IgnoreMemberAttribute), false).Length <= 0)
						{
							if (memberInfo as FieldInfo == null)
							{
								if (memberInfo as PropertyInfo != null)
								{
									propertyInfo = memberInfo as PropertyInfo;
									if (!propertyInfo.CanRead)
									{
										SchemaMapping.ThrowUnsupportedMember(memberInfo);
									}
									getMethod = propertyInfo.GetGetMethod();
									if (null == getMethod || getMethod.IsStatic)
									{
										SchemaMapping.ThrowUnsupportedMember(memberInfo);
									}
									if ((int)getMethod.GetParameters().Length > 0)
									{
										SchemaMapping.ThrowUnsupportedMember(memberInfo);
									}
								}
							}
							else
							{
								fieldInfo = memberInfo as FieldInfo;
								if (fieldInfo.IsStatic)
								{
									SchemaMapping.ThrowUnsupportedMember(memberInfo);
								}
							}
							memberName = ManagedNameAttribute.GetMemberName(memberInfo);
							if (memberInfo as FieldInfo == null)
							{
								propertyType = (memberInfo as PropertyInfo).PropertyType;
							}
							else
							{
								propertyType = (memberInfo as FieldInfo).FieldType;
							}
							flag1 = false;
							if (propertyType.IsArray)
							{
								if (propertyType.GetArrayRank() != 1)
								{
									SchemaMapping.ThrowUnsupportedMember(memberInfo);
								}
								flag1 = true;
								propertyType = propertyType.GetElementType();
							}
							str = null;
							item = null;
							if (mapTypeToConverterClassName.Contains(propertyType))
							{
								item = (string)mapTypeToConverterClassName[propertyType];
								str = ManagedNameAttribute.GetMemberName(propertyType);
							}
							flag2 = false;
							if (propertyType == typeof(object))
							{
								flag2 = true;
								if (!flag4)
								{
									flag4 = true;
									codeWriter14.Line("static Hashtable mapTypeToConverter = new Hashtable();");
									foreach (DictionaryEntry dictionaryEntry3 in mapTypeToConverterClassName)
									{
										codeWriter15.Line(string.Format("mapTypeToConverter[typeof({0})] = typeof({1});", ((Type)dictionaryEntry3.Key).FullName.Replace('+', '.'), (string)dictionaryEntry3.Value));
									}
								}
							}
							str1 = string.Concat("prop_", (object)num);
							num1 = num;
							num = num1 + 1;
							str2 = string.Concat("handle_", (object)num1);
							codeWriter14.Line(string.Concat("static int ", str2, ";"));
							codeWriter15.Line(string.Format("IWOA.GetPropertyHandle_f27(27, wbemObjectAccessIP, \"{0}\", out cimType, out {1});", memberName, str2));
							codeWriter14.Line(string.Concat("PropertyData ", str1, ";"));
							codeWriter16.Line(string.Format("{0} = instance.Properties[\"{1}\"];", str1, memberName));
							if (!flag2)
							{
								if (str == null)
								{
									if (flag1)
									{
										if (propertyType == typeof(DateTime) || propertyType == typeof(TimeSpan))
										{
											codeWriter18.AddChild(string.Format("if(null == instNET.{0})", memberInfo.Name)).Line(string.Format("{0}.Value = null;", str1));
											codeWriter18.AddChild("else").Line(string.Format("{0}.Value = SafeAssign.WMITimeArrayToStringArray(instNET.{1});", str1, memberInfo.Name));
										}
										else
										{
											codeWriter18.Line(string.Format("{0}.Value = instNET.{1};", str1, memberInfo.Name));
										}
									}
									else
									{
										if (propertyType == typeof(byte) || propertyType == typeof(sbyte))
										{
											codeWriter18.Line(string.Format("{0} instNET_{1} = instNET.{1} ;", propertyType, memberInfo.Name));
											codeWriter18.Line(string.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 1, ref instNET_{1});", str2, memberInfo.Name));
										}
										else
										{
											if (propertyType == typeof(short) || propertyType == typeof(ushort) || propertyType == typeof(char))
											{
												codeWriter18.Line(string.Format("{0} instNET_{1} = instNET.{1} ;", propertyType, memberInfo.Name));
												codeWriter18.Line(string.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 2, ref instNET_{1});", str2, memberInfo.Name));
											}
											else
											{
												if (propertyType == typeof(uint) || propertyType == typeof(int) || propertyType == typeof(float))
												{
													codeWriter18.Line(string.Format("IWOA.WriteDWORD_f31(31, instWbemObjectAccessIP, {0}, instNET.{1});", str2, memberInfo.Name));
												}
												else
												{
													if (propertyType == typeof(ulong) || propertyType == typeof(long) || propertyType == typeof(double))
													{
														codeWriter18.Line(string.Format("IWOA.WriteQWORD_f33(33, instWbemObjectAccessIP, {0}, instNET.{1});", str2, memberInfo.Name));
													}
													else
													{
														if (propertyType != typeof(bool))
														{
															if (propertyType != typeof(string))
															{
																if (propertyType == typeof(DateTime) || propertyType == typeof(TimeSpan))
																{
																	codeWriter18.Line(string.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 52, SafeAssign.WMITimeToString(instNET.{1}));", str2, memberInfo.Name));
																}
																else
																{
																	codeWriter18.Line(string.Format("{0}.Value = instNET.{1};", str1, memberInfo.Name));
																}
															}
															else
															{
																codeWriter12 = codeWriter18.AddChild(string.Format("if(null != instNET.{0})", memberInfo.Name));
																codeWriter12.Line(string.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, (instNET.{1}.Length+1)*2, instNET.{1});", str2, memberInfo.Name));
																codeWriter18.AddChild("else").Line(string.Format("IWOA.Put_f5(5, instWbemObjectAccessIP, \"{0}\", 0, ref nullObj, 8);", memberName));
																if (!flag)
																{
																	flag = true;
																	codeWriter14.Line("object nullObj = DBNull.Value;");
																}
															}
														}
														else
														{
															codeWriter18.Line(string.Format("if(instNET.{0})", memberInfo.Name));
															codeWriter18.Line(string.Format("    IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 2, ref SafeAssign.boolTrue);", str2));
															codeWriter18.Line("else");
															codeWriter18.Line(string.Format("    IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 2, ref SafeAssign.boolFalse);", str2));
														}
													}
												}
											}
										}
									}
								}
								else
								{
									if (!propertyType.IsValueType)
									{
										codeWriter5 = codeWriter18.AddChild(string.Format("if(instNET.{0} != null)", memberInfo.Name));
										codeWriter6 = codeWriter18.AddChild("else");
										codeWriter6.Line(string.Format("{0}.Value = null;", str1));
									}
									else
									{
										codeWriter5 = codeWriter18;
									}
									if (!flag1)
									{
										codeWriter14.Line(string.Format("{0} lazy_embeddedConverter_{1} = null;", item, str1));
										codeWriter9 = codeWriter13.AddChild(string.Format("{0} embeddedConverter_{1}", item, str1));
										codeWriter10 = codeWriter9.AddChild("get");
										codeWriter11 = codeWriter10.AddChild(string.Format("if(null == lazy_embeddedConverter_{0})", str1));
										codeWriter11.Line(string.Format("lazy_embeddedConverter_{0} = new {1}();", str1, item));
										codeWriter10.Line(string.Format("return lazy_embeddedConverter_{0};", str1));
										codeWriter5.Line(string.Format("embeddedConverter_{0}.ToWMI(instNET.{1});", str1, memberInfo.Name));
										codeWriter5.Line(string.Format("{0}.Value = embeddedConverter_{0}.instance;", str1));
									}
									else
									{
										codeWriter5.Line(string.Format("int len = instNET.{0}.Length;", memberInfo.Name));
										codeWriter5.Line("ManagementObject[] embeddedObjects = new ManagementObject[len];");
										codeWriter5.Line(string.Format("{0}[] embeddedConverters = new {0}[len];", item));
										codeWriter7 = codeWriter5.AddChild("for(int i=0;i<len;i++)");
										codeWriter7.Line(string.Format("embeddedConverters[i] = new {0}();", item));
										if (!propertyType.IsValueType)
										{
											codeWriter8 = codeWriter7.AddChild(string.Format("if(instNET.{0}[i] != null)", memberInfo.Name));
											codeWriter8.Line(string.Format("embeddedConverters[i].ToWMI(instNET.{0}[i]);", memberInfo.Name));
										}
										else
										{
											codeWriter7.Line(string.Format("embeddedConverters[i].ToWMI(instNET.{0}[i]);", memberInfo.Name));
										}
										codeWriter7.Line("embeddedObjects[i] = embeddedConverters[i].instance;");
										codeWriter5.Line(string.Format("{0}.Value = embeddedObjects;", str1));
									}
								}
							}
							else
							{
								codeWriter = codeWriter18.AddChild(string.Format("if(instNET.{0} != null)", memberInfo.Name));
								codeWriter1 = codeWriter18.AddChild("else");
								codeWriter1.Line(string.Format("{0}.Value = null;", str1));
								if (!flag1)
								{
									codeWriter4 = codeWriter.AddChild(string.Format("if(mapTypeToConverter.Contains(instNET.{0}.GetType()))", memberInfo.Name));
									codeWriter4.Line(string.Format("Type type = (Type)mapTypeToConverter[instNET.{0}.GetType()];", memberInfo.Name));
									codeWriter4.Line("IWmiConverter converter = (IWmiConverter)Activator.CreateInstance(type);");
									codeWriter4.Line(string.Format("converter.ToWMI(instNET.{0});", memberInfo.Name));
									codeWriter4.Line(string.Format("{0}.Value = converter.GetInstance();", str1));
									codeWriter.AddChild("else").Line(string.Format("{0}.Value = SafeAssign.GetInstance(instNET.{1});", str1, memberInfo.Name));
								}
								else
								{
									codeWriter.Line(string.Format("int len = instNET.{0}.Length;", memberInfo.Name));
									codeWriter.Line("ManagementObject[] embeddedObjects = new ManagementObject[len];");
									codeWriter.Line("IWmiConverter[] embeddedConverters = new IWmiConverter[len];");
									codeWriter2 = codeWriter.AddChild("for(int i=0;i<len;i++)");
									codeWriter3 = codeWriter2.AddChild(string.Format("if((instNET.{0}[i] != null) && mapTypeToConverter.Contains(instNET.{0}[i].GetType()))", memberInfo.Name));
									codeWriter3.Line(string.Format("Type type = (Type)mapTypeToConverter[instNET.{0}[i].GetType()];", memberInfo.Name));
									codeWriter3.Line("embeddedConverters[i] = (IWmiConverter)Activator.CreateInstance(type);");
									codeWriter3.Line(string.Format("embeddedConverters[i].ToWMI(instNET.{0}[i]);", memberInfo.Name));
									codeWriter3.Line("embeddedObjects[i] = embeddedConverters[i].GetInstance();");
									codeWriter2.AddChild("else").Line(string.Format("embeddedObjects[i] = SafeAssign.GetManagementObject(instNET.{0}[i]);", memberInfo.Name));
									codeWriter.Line(string.Format("{0}.Value = embeddedObjects;", str1));
								}
							}
							cimType = CimType.String;
							if (memberInfo.DeclaringType == type)
							{
								flag3 = true;
								try
								{
									propertyDatum = this.newClass.Properties[memberName];
									CimType type1 = propertyDatum.Type;
									if (propertyDatum.IsLocal)
									{
										throw new ArgumentException(string.Format(RC.GetString("MEMBERCONFLILCT_EXCEPT"), memberInfo.Name), memberInfo.Name);
									}
								}
								catch (ManagementException managementException3)
								{
									ManagementException managementException2 = managementException3;
									if (managementException2.ErrorCode == ManagementStatus.NotFound)
									{
										flag3 = false;
									}
									else
									{
										throw;
									}
								}
								if (!flag3)
								{
									if (str == null)
									{
										if (!flag2)
										{
											if (propertyType != typeof(ManagementObject))
											{
												if (propertyType != typeof(sbyte))
												{
													if (propertyType != typeof(byte))
													{
														if (propertyType != typeof(short))
														{
															if (propertyType != typeof(ushort))
															{
																if (propertyType != typeof(int))
																{
																	if (propertyType != typeof(uint))
																	{
																		if (propertyType != typeof(long))
																		{
																			if (propertyType != typeof(ulong))
																			{
																				if (propertyType != typeof(float))
																				{
																					if (propertyType != typeof(double))
																					{
																						if (propertyType != typeof(bool))
																						{
																							if (propertyType != typeof(string))
																							{
																								if (propertyType != typeof(char))
																								{
																									if (propertyType != typeof(DateTime))
																									{
																										if (propertyType != typeof(TimeSpan))
																										{
																											SchemaMapping.ThrowUnsupportedMember(memberInfo);
																										}
																										else
																										{
																											cimType = CimType.DateTime;
																										}
																									}
																									else
																									{
																										cimType = CimType.DateTime;
																									}
																								}
																								else
																								{
																									cimType = CimType.Char16;
																								}
																							}
																							else
																							{
																								cimType = CimType.String;
																							}
																						}
																						else
																						{
																							cimType = CimType.Boolean;
																						}
																					}
																					else
																					{
																						cimType = CimType.Real64;
																					}
																				}
																				else
																				{
																					cimType = CimType.Real32;
																				}
																			}
																			else
																			{
																				cimType = CimType.UInt64;
																			}
																		}
																		else
																		{
																			cimType = CimType.SInt64;
																		}
																	}
																	else
																	{
																		cimType = CimType.UInt32;
																	}
																}
																else
																{
																	cimType = CimType.SInt32;
																}
															}
															else
															{
																cimType = CimType.UInt16;
															}
														}
														else
														{
															cimType = CimType.SInt16;
														}
													}
													else
													{
														cimType = CimType.UInt8;
													}
												}
												else
												{
													cimType = CimType.SInt8;
												}
											}
											else
											{
												cimType = CimType.Object;
											}
										}
										else
										{
											cimType = CimType.Object;
										}
									}
									else
									{
										cimType = CimType.Object;
									}
									try
									{
										properties.Add(memberName, cimType, flag1);
									}
									catch (ManagementException managementException5)
									{
										ManagementException managementException4 = managementException5;
										SchemaMapping.ThrowUnsupportedMember(memberInfo, managementException4);
									}
									if (propertyType == typeof(TimeSpan))
									{
										item1 = properties[memberName];
										item1.Qualifiers.Add("SubType", "interval", false, true, true, true);
									}
									if (str != null)
									{
										propertyDatum1 = properties[memberName];
										propertyDatum1.Qualifiers["CIMTYPE"].Value = string.Concat("object:", str);
									}
								}
							}
						}
					}
					codeWriter15.Line("Marshal.Release(wbemObjectAccessIP);");
					return;
				}
				default:
				{
					num = 0;
					flag = false;
					members = type.GetMembers();
					for (i = 0; i < (int)members.Length; i++)
					{
						memberInfo = members[i];
						if ((memberInfo as FieldInfo != null || memberInfo as PropertyInfo != null) && (int)memberInfo.GetCustomAttributes(typeof(IgnoreMemberAttribute), false).Length <= 0)
						{
							if (memberInfo as FieldInfo == null)
							{
								if (memberInfo as PropertyInfo != null)
								{
									propertyInfo = memberInfo as PropertyInfo;
									if (!propertyInfo.CanRead)
									{
										SchemaMapping.ThrowUnsupportedMember(memberInfo);
									}
									getMethod = propertyInfo.GetGetMethod();
									if (null == getMethod || getMethod.IsStatic)
									{
										SchemaMapping.ThrowUnsupportedMember(memberInfo);
									}
									if ((int)getMethod.GetParameters().Length > 0)
									{
										SchemaMapping.ThrowUnsupportedMember(memberInfo);
									}
								}
							}
							else
							{
								fieldInfo = memberInfo as FieldInfo;
								if (fieldInfo.IsStatic)
								{
									SchemaMapping.ThrowUnsupportedMember(memberInfo);
								}
							}
							memberName = ManagedNameAttribute.GetMemberName(memberInfo);
							if (memberInfo as FieldInfo == null)
							{
								propertyType = (memberInfo as PropertyInfo).PropertyType;
							}
							else
							{
								propertyType = (memberInfo as FieldInfo).FieldType;
							}
							flag1 = false;
							if (propertyType.IsArray)
							{
								if (propertyType.GetArrayRank() != 1)
								{
									SchemaMapping.ThrowUnsupportedMember(memberInfo);
								}
								flag1 = true;
								propertyType = propertyType.GetElementType();
							}
							str = null;
							item = null;
							if (mapTypeToConverterClassName.Contains(propertyType))
							{
								item = (string)mapTypeToConverterClassName[propertyType];
								str = ManagedNameAttribute.GetMemberName(propertyType);
							}
							flag2 = false;
							if (propertyType == typeof(object))
							{
								flag2 = true;
								if (!flag4)
								{
									flag4 = true;
									codeWriter14.Line("static Hashtable mapTypeToConverter = new Hashtable();");
									foreach (DictionaryEntry dictionaryEntry4 in mapTypeToConverterClassName)
									{
										codeWriter15.Line(string.Format("mapTypeToConverter[typeof({0})] = typeof({1});", ((Type)dictionaryEntry4.Key).FullName.Replace('+', '.'), (string)dictionaryEntry4.Value));
									}
								}
							}
							str1 = string.Concat("prop_", (object)num);
							num1 = num;
							num = num1 + 1;
							str2 = string.Concat("handle_", (object)num1);
							codeWriter14.Line(string.Concat("static int ", str2, ";"));
							codeWriter15.Line(string.Format("IWOA.GetPropertyHandle_f27(27, wbemObjectAccessIP, \"{0}\", out cimType, out {1});", memberName, str2));
							codeWriter14.Line(string.Concat("PropertyData ", str1, ";"));
							codeWriter16.Line(string.Format("{0} = instance.Properties[\"{1}\"];", str1, memberName));
							if (!flag2)
							{
								if (str == null)
								{
									if (flag1)
									{
										if (propertyType == typeof(DateTime) || propertyType == typeof(TimeSpan))
										{
											codeWriter18.AddChild(string.Format("if(null == instNET.{0})", memberInfo.Name)).Line(string.Format("{0}.Value = null;", str1));
											codeWriter18.AddChild("else").Line(string.Format("{0}.Value = SafeAssign.WMITimeArrayToStringArray(instNET.{1});", str1, memberInfo.Name));
										}
										else
										{
											codeWriter18.Line(string.Format("{0}.Value = instNET.{1};", str1, memberInfo.Name));
										}
									}
									else
									{
										if (propertyType == typeof(byte) || propertyType == typeof(sbyte))
										{
											codeWriter18.Line(string.Format("{0} instNET_{1} = instNET.{1} ;", propertyType, memberInfo.Name));
											codeWriter18.Line(string.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 1, ref instNET_{1});", str2, memberInfo.Name));
										}
										else
										{
											if (propertyType == typeof(short) || propertyType == typeof(ushort) || propertyType == typeof(char))
											{
												codeWriter18.Line(string.Format("{0} instNET_{1} = instNET.{1} ;", propertyType, memberInfo.Name));
												codeWriter18.Line(string.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 2, ref instNET_{1});", str2, memberInfo.Name));
											}
											else
											{
												if (propertyType == typeof(uint) || propertyType == typeof(int) || propertyType == typeof(float))
												{
													codeWriter18.Line(string.Format("IWOA.WriteDWORD_f31(31, instWbemObjectAccessIP, {0}, instNET.{1});", str2, memberInfo.Name));
												}
												else
												{
													if (propertyType == typeof(ulong) || propertyType == typeof(long) || propertyType == typeof(double))
													{
														codeWriter18.Line(string.Format("IWOA.WriteQWORD_f33(33, instWbemObjectAccessIP, {0}, instNET.{1});", str2, memberInfo.Name));
													}
													else
													{
														if (propertyType != typeof(bool))
														{
															if (propertyType != typeof(string))
															{
																if (propertyType == typeof(DateTime) || propertyType == typeof(TimeSpan))
																{
																	codeWriter18.Line(string.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 52, SafeAssign.WMITimeToString(instNET.{1}));", str2, memberInfo.Name));
																}
																else
																{
																	codeWriter18.Line(string.Format("{0}.Value = instNET.{1};", str1, memberInfo.Name));
																}
															}
															else
															{
																codeWriter12 = codeWriter18.AddChild(string.Format("if(null != instNET.{0})", memberInfo.Name));
																codeWriter12.Line(string.Format("IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, (instNET.{1}.Length+1)*2, instNET.{1});", str2, memberInfo.Name));
																codeWriter18.AddChild("else").Line(string.Format("IWOA.Put_f5(5, instWbemObjectAccessIP, \"{0}\", 0, ref nullObj, 8);", memberName));
																if (!flag)
																{
																	flag = true;
																	codeWriter14.Line("object nullObj = DBNull.Value;");
																}
															}
														}
														else
														{
															codeWriter18.Line(string.Format("if(instNET.{0})", memberInfo.Name));
															codeWriter18.Line(string.Format("    IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 2, ref SafeAssign.boolTrue);", str2));
															codeWriter18.Line("else");
															codeWriter18.Line(string.Format("    IWOA.WritePropertyValue_f28(28, instWbemObjectAccessIP, {0}, 2, ref SafeAssign.boolFalse);", str2));
														}
													}
												}
											}
										}
									}
								}
								else
								{
									if (!propertyType.IsValueType)
									{
										codeWriter5 = codeWriter18.AddChild(string.Format("if(instNET.{0} != null)", memberInfo.Name));
										codeWriter6 = codeWriter18.AddChild("else");
										codeWriter6.Line(string.Format("{0}.Value = null;", str1));
									}
									else
									{
										codeWriter5 = codeWriter18;
									}
									if (!flag1)
									{
										codeWriter14.Line(string.Format("{0} lazy_embeddedConverter_{1} = null;", item, str1));
										codeWriter9 = codeWriter13.AddChild(string.Format("{0} embeddedConverter_{1}", item, str1));
										codeWriter10 = codeWriter9.AddChild("get");
										codeWriter11 = codeWriter10.AddChild(string.Format("if(null == lazy_embeddedConverter_{0})", str1));
										codeWriter11.Line(string.Format("lazy_embeddedConverter_{0} = new {1}();", str1, item));
										codeWriter10.Line(string.Format("return lazy_embeddedConverter_{0};", str1));
										codeWriter5.Line(string.Format("embeddedConverter_{0}.ToWMI(instNET.{1});", str1, memberInfo.Name));
										codeWriter5.Line(string.Format("{0}.Value = embeddedConverter_{0}.instance;", str1));
									}
									else
									{
										codeWriter5.Line(string.Format("int len = instNET.{0}.Length;", memberInfo.Name));
										codeWriter5.Line("ManagementObject[] embeddedObjects = new ManagementObject[len];");
										codeWriter5.Line(string.Format("{0}[] embeddedConverters = new {0}[len];", item));
										codeWriter7 = codeWriter5.AddChild("for(int i=0;i<len;i++)");
										codeWriter7.Line(string.Format("embeddedConverters[i] = new {0}();", item));
										if (!propertyType.IsValueType)
										{
											codeWriter8 = codeWriter7.AddChild(string.Format("if(instNET.{0}[i] != null)", memberInfo.Name));
											codeWriter8.Line(string.Format("embeddedConverters[i].ToWMI(instNET.{0}[i]);", memberInfo.Name));
										}
										else
										{
											codeWriter7.Line(string.Format("embeddedConverters[i].ToWMI(instNET.{0}[i]);", memberInfo.Name));
										}
										codeWriter7.Line("embeddedObjects[i] = embeddedConverters[i].instance;");
										codeWriter5.Line(string.Format("{0}.Value = embeddedObjects;", str1));
									}
								}
							}
							else
							{
								codeWriter = codeWriter18.AddChild(string.Format("if(instNET.{0} != null)", memberInfo.Name));
								codeWriter1 = codeWriter18.AddChild("else");
								codeWriter1.Line(string.Format("{0}.Value = null;", str1));
								if (!flag1)
								{
									codeWriter4 = codeWriter.AddChild(string.Format("if(mapTypeToConverter.Contains(instNET.{0}.GetType()))", memberInfo.Name));
									codeWriter4.Line(string.Format("Type type = (Type)mapTypeToConverter[instNET.{0}.GetType()];", memberInfo.Name));
									codeWriter4.Line("IWmiConverter converter = (IWmiConverter)Activator.CreateInstance(type);");
									codeWriter4.Line(string.Format("converter.ToWMI(instNET.{0});", memberInfo.Name));
									codeWriter4.Line(string.Format("{0}.Value = converter.GetInstance();", str1));
									codeWriter.AddChild("else").Line(string.Format("{0}.Value = SafeAssign.GetInstance(instNET.{1});", str1, memberInfo.Name));
								}
								else
								{
									codeWriter.Line(string.Format("int len = instNET.{0}.Length;", memberInfo.Name));
									codeWriter.Line("ManagementObject[] embeddedObjects = new ManagementObject[len];");
									codeWriter.Line("IWmiConverter[] embeddedConverters = new IWmiConverter[len];");
									codeWriter2 = codeWriter.AddChild("for(int i=0;i<len;i++)");
									codeWriter3 = codeWriter2.AddChild(string.Format("if((instNET.{0}[i] != null) && mapTypeToConverter.Contains(instNET.{0}[i].GetType()))", memberInfo.Name));
									codeWriter3.Line(string.Format("Type type = (Type)mapTypeToConverter[instNET.{0}[i].GetType()];", memberInfo.Name));
									codeWriter3.Line("embeddedConverters[i] = (IWmiConverter)Activator.CreateInstance(type);");
									codeWriter3.Line(string.Format("embeddedConverters[i].ToWMI(instNET.{0}[i]);", memberInfo.Name));
									codeWriter3.Line("embeddedObjects[i] = embeddedConverters[i].GetInstance();");
									codeWriter2.AddChild("else").Line(string.Format("embeddedObjects[i] = SafeAssign.GetManagementObject(instNET.{0}[i]);", memberInfo.Name));
									codeWriter.Line(string.Format("{0}.Value = embeddedObjects;", str1));
								}
							}
							cimType = CimType.String;
							if (memberInfo.DeclaringType == type)
							{
								flag3 = true;
								try
								{
									propertyDatum = this.newClass.Properties[memberName];
									CimType type1 = propertyDatum.Type;
									if (propertyDatum.IsLocal)
									{
										throw new ArgumentException(string.Format(RC.GetString("MEMBERCONFLILCT_EXCEPT"), memberInfo.Name), memberInfo.Name);
									}
								}
								catch (ManagementException managementException3)
								{
									ManagementException managementException2 = managementException3;
									if (managementException2.ErrorCode == ManagementStatus.NotFound)
									{
										flag3 = false;
									}
									else
									{
										throw;
									}
								}
								if (!flag3)
								{
									if (str == null)
									{
										if (!flag2)
										{
											if (propertyType != typeof(ManagementObject))
											{
												if (propertyType != typeof(sbyte))
												{
													if (propertyType != typeof(byte))
													{
														if (propertyType != typeof(short))
														{
															if (propertyType != typeof(ushort))
															{
																if (propertyType != typeof(int))
																{
																	if (propertyType != typeof(uint))
																	{
																		if (propertyType != typeof(long))
																		{
																			if (propertyType != typeof(ulong))
																			{
																				if (propertyType != typeof(float))
																				{
																					if (propertyType != typeof(double))
																					{
																						if (propertyType != typeof(bool))
																						{
																							if (propertyType != typeof(string))
																							{
																								if (propertyType != typeof(char))
																								{
																									if (propertyType != typeof(DateTime))
																									{
																										if (propertyType != typeof(TimeSpan))
																										{
																											SchemaMapping.ThrowUnsupportedMember(memberInfo);
																										}
																										else
																										{
																											cimType = CimType.DateTime;
																										}
																									}
																									else
																									{
																										cimType = CimType.DateTime;
																									}
																								}
																								else
																								{
																									cimType = CimType.Char16;
																								}
																							}
																							else
																							{
																								cimType = CimType.String;
																							}
																						}
																						else
																						{
																							cimType = CimType.Boolean;
																						}
																					}
																					else
																					{
																						cimType = CimType.Real64;
																					}
																				}
																				else
																				{
																					cimType = CimType.Real32;
																				}
																			}
																			else
																			{
																				cimType = CimType.UInt64;
																			}
																		}
																		else
																		{
																			cimType = CimType.SInt64;
																		}
																	}
																	else
																	{
																		cimType = CimType.UInt32;
																	}
																}
																else
																{
																	cimType = CimType.SInt32;
																}
															}
															else
															{
																cimType = CimType.UInt16;
															}
														}
														else
														{
															cimType = CimType.SInt16;
														}
													}
													else
													{
														cimType = CimType.UInt8;
													}
												}
												else
												{
													cimType = CimType.SInt8;
												}
											}
											else
											{
												cimType = CimType.Object;
											}
										}
										else
										{
											cimType = CimType.Object;
										}
									}
									else
									{
										cimType = CimType.Object;
									}
									try
									{
										properties.Add(memberName, cimType, flag1);
									}
									catch (ManagementException managementException5)
									{
										ManagementException managementException4 = managementException5;
										SchemaMapping.ThrowUnsupportedMember(memberInfo, managementException4);
									}
									if (propertyType == typeof(TimeSpan))
									{
										item1 = properties[memberName];
										item1.Qualifiers.Add("SubType", "interval", false, true, true, true);
									}
									if (str != null)
									{
										propertyDatum1 = properties[memberName];
										propertyDatum1.Qualifiers["CIMTYPE"].Value = string.Concat("object:", str);
									}
								}
							}
						}
					}
					codeWriter15.Line("Marshal.Release(wbemObjectAccessIP);");
					return;
				}
			}
		}