void ProcessStructuralPhases(ModuleDefinition mod, IDictionary <IConfusion, NameValueCollection> globalParams, IEnumerable <Phase> phases) { ConfusionParameter cParam = new ConfusionParameter(); bool end1 = false; foreach (StructurePhase i in from i in phases where (i is StructurePhase)orderby(int) i.Priority + i.PhaseID * 10 ascending select i) { if (!end1 && i.PhaseID > 1) { MarkModule(mod); MarkObfuscateHelpers(mod); CecilHelper.RefreshTokens(mod); end1 = true; } List <IAnnotationProvider> mems = GetTargets(mod, i.Confusion); if (mems.Count == 0) { continue; } i.Confuser = this; param.Logger.Log("Executing " + i.Confusion.Name + " Phase " + i.PhaseID + "..."); i.Initialize(mod); if (globalParams.ContainsKey(i.Confusion)) { cParam.GlobalParameters = globalParams[i.Confusion]; } else { cParam.GlobalParameters = new NameValueCollection(); } if (i.WholeRun == true) { cParam.Parameters = null; cParam.Target = null; i.Process(cParam); param.Logger.Progress(1); } else { if (i is IProgressProvider) { cParam.Parameters = new NameValueCollection(); foreach (IAnnotationProvider mem in mems) { NameValueCollection memParam = (from set in mem.Annotations["ConfusionSets"] as IDictionary <IConfusion, NameValueCollection> where set.Key.Phases.Contains(i) select set.Value).FirstOrDefault(); string hash = mem.GetHashCode().ToString("X8"); foreach (string pkey in memParam.AllKeys) { cParam.Parameters[hash + "_" + pkey] = memParam[pkey]; } } cParam.Target = mems; (i as IProgressProvider).SetProgresser(param.Logger); i.Process(cParam); } else { double total = mems.Count; int interval = 1; if (total > 1000) { interval = (int)total / 100; } int now = 0; foreach (IAnnotationProvider mem in mems) { cParam.Parameters = (from set in mem.Annotations["ConfusionSets"] as IDictionary <IConfusion, NameValueCollection> where set.Key.Phases.Contains(i) select set.Value).FirstOrDefault(); cParam.Target = mem; i.Process(cParam); if (now % interval == 0 || now == total - 1) { param.Logger.Progress((now + 1) / total); } now++; } } param.Logger.Progress(1); } i.DeInitialize(); } }
public abstract void Process(ConfusionParameter parameter);