static void ProcessArgs(string[] args) { for (int i = 0; i < args.Length; i++) { args[i] = args[i].ToLower(); } #region QueryConfig if (args[0] == "queryconfig") { if (args.Length < 2) { Console.WriteLine("Syntax: queryconfig <all | numeric id> [runtime | boot]\n"); Console.WriteLine("Examples: queryconfig all\n queryconfig 123456 runtime\n"); Console.WriteLine("If no section or an invalid section is specified, 'runtime' will be used"); return; } FeatureConfigurationSection sectionToUse = FeatureConfigurationSection.Runtime; if (args.Length > 2 && args[2] == "boot") { sectionToUse = FeatureConfigurationSection.Boot; } if (args[1] == "all") { var retrievedConfigs = RtlFeatureManager.QueryAllFeatureConfigurations(sectionToUse); if (retrievedConfigs != null) { foreach (var config in retrievedConfigs) { PrintFeatureConfig(config); Console.WriteLine(); } } else { Console.WriteLine("Failed to query feature configurations"); } } else { if (!TryParseDecHexUint(args[1], out uint featureId)) { Console.WriteLine("Couldn't parse feature ID"); return; } var config = RtlFeatureManager.QueryFeatureConfiguration(featureId, sectionToUse); if (config != null) { PrintFeatureConfig(config); } else { Console.WriteLine("Failed to query feature configuration, the specified ID may not exist in the store"); } } } #endregion #region QuerySubs else if (args[0] == "querysubs") { var retrievedSubs = RtlFeatureManager.QueryFeatureUsageSubscriptions(); if (retrievedSubs != null) { foreach (var sub in retrievedSubs) { PrintSubscription(sub); Console.WriteLine(); } } } #endregion #region ChangeStamp else if (args[0] == "changestamp") { Console.WriteLine("Change stamp: {0}", RtlFeatureManager.QueryFeatureConfigurationChangeStamp()); } #endregion #region AddConfig else if (args[0] == "addconfig") { ProcessSetConfig(args, FeatureConfigurationAction.UpdateAll); } #endregion #region DelConfig else if (args[0] == "delconfig") { ProcessSetConfig(args, FeatureConfigurationAction.Delete); } #endregion #region AddSub else if (args[0] == "addsub") { ProcessSetSubs(args, false); } #endregion #region DelSub else if (args[0] == "delsub") { ProcessSetSubs(args, true); } #endregion #region NotifyUsage else if (args[0] == "notifyusage") { if (args.Length < 2) { Console.WriteLine("Syntax: notifyusage <numeric id> <reporting kind> <reporting options>\n"); Console.WriteLine("Examples: notifyusage 123465 2 1"); return; } if (!TryParseDecHexUint(args[1], out uint featureId)) { Console.WriteLine("Couldn't parse feature ID"); return; } if (!TryParseDecHexUshort(args[2], out ushort reportingKind)) { Console.WriteLine("Couldn't parse reporting kind"); return; } if (!TryParseDecHexUshort(args[3], out ushort reportingOptions)) { Console.WriteLine("Couldn't parse reporting options"); return; } int result = RtlFeatureManager.NotifyFeatureUsage(new FeatureUsageReport() { FeatureId = featureId, ReportingKind = reportingKind, ReportingOptions = reportingOptions }); if (result != 0) { Console.WriteLine("An error occurred while firing the notification (hr=0x{0:x8}), no such subscription may exist", result); } else { Console.WriteLine("Successfully fired the feature usage notification"); } } #endregion #region SetBootState else if (args[0] == "setbootstate") { int state = 1; if (args.Length > 1) { if (!int.TryParse(args[1], out state)) { Console.WriteLine("Couldn't parse desired state"); return; } } var result = RtlFeatureManager.SetBootFeatureConfigurationState(ref state); if (result < 0) { Console.WriteLine("Failed to set boot state (hr=0x{0:x8})", result); } else { Console.WriteLine("Successfully set boot state"); } } #endregion #region GetBootState else if (args[0] == "getbootstate") { int state = 0; var result = RtlFeatureManager.GetBootFeatureConfigurationState(ref state); if (result < 0) { Console.WriteLine("Failed to query boot state (hr=0x{0:x8})", result); } else { Console.WriteLine("Boot state: {0}", state); } } #endregion }
static void ProcessSetSubs(string[] args, bool del) { if (args.Length < 5) { string helpPrefix = del ? "del" : "add"; Console.WriteLine("Syntax: {0}sub <numeric id> <reporting kind> <reporting options> <reporting target>\n", helpPrefix); Console.WriteLine("Reporting targets are WNF state names\n"); Console.WriteLine("Examples: {0}sub 123456 2 1 0d83063ea3bdf875", helpPrefix); return; } if (!TryParseDecHexUint(args[1], out uint featureId)) { Console.WriteLine("Couldn't parse feature ID"); return; } if (!TryParseDecHexUshort(args[2], out ushort reportingKind)) { Console.WriteLine("Couldn't parse reporting kind"); return; } if (!TryParseDecHexUshort(args[3], out ushort reportingOptions)) { Console.WriteLine("Couldn't parse reporting options"); return; } if (!ulong.TryParse(args[4], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out ulong reportingTarget)) { Console.WriteLine("Couldn't parse reporting target"); return; } var subList = new List <FeatureUsageSubscription>() { new FeatureUsageSubscription() { FeatureId = featureId, ReportingKind = reportingKind, ReportingOptions = reportingOptions, ReportingTarget = reportingTarget } }; int result; if (del) { result = RtlFeatureManager.RemoveLiveFeatureUsageSubscriptions(subList); } else { result = RtlFeatureManager.AddLiveFeatureUsageSubscriptions(subList); } if (result != 0) { Console.WriteLine("An error occurred while setting a live feature usage subscription (hr=0x{0:x8})", result); return; } if (del) { result = RtlFeatureManager.RemoveBootFeatureUsageSubscriptions(subList) ? 0 : -1; } else { result = RtlFeatureManager.AddBootFeatureUsageSubscriptions(subList) ? 0 : -1; } if (result != 0) { Console.WriteLine("An error occurred while setting a boot feature usage subscription"); } else { Console.WriteLine("Successfully set feature usage subscription"); } }
static void ProcessSetConfig(string[] args, FeatureConfigurationAction actionToUse) { if (args.Length < 3) { string helpPrefix = actionToUse == FeatureConfigurationAction.Delete ? "del" : "add"; Console.WriteLine("Syntax: {0}config <numeric id> <enabled state>\n [enabled state options] [variant] [variant payload kind] [variant payload] [group]\n", helpPrefix); Console.WriteLine("Enabled state types: 0 = Default, 1 = Disabled, 2 = Enabled\n"); Console.WriteLine("Examples: {0}config 23456789 2\n {0}config 23456789 2 1 1 0 0 4", helpPrefix); return; } if (!TryParseDecHexUint(args[1], out uint featureId)) { Console.WriteLine("Couldn't parse feature ID"); return; } if (!TryParseDecHexInt(args[2], out int enabledState)) { Console.WriteLine("Couldn't parse enabled state"); return; } int enabledStateOptions = 1; int variant = 0; int variantPayloadKind = 0; int variantPayload = 0; int group = 4; if (args.Length > 4 && !TryParseDecHexInt(args[3], out enabledStateOptions)) { Console.WriteLine("Couldn't parse enabled state options"); return; } if (args.Length > 5 && !TryParseDecHexInt(args[4], out variant)) { Console.WriteLine("Couldn't parse variant"); return; } if (args.Length > 6 && !TryParseDecHexInt(args[5], out variantPayloadKind)) { Console.WriteLine("Couldn't parse variant payload kind"); return; } if (args.Length > 7 && !TryParseDecHexInt(args[6], out variantPayload)) { Console.WriteLine("Couldn't parse variant payload"); return; } if (args.Length > 8 && !TryParseDecHexInt(args[7], out group)) { Console.WriteLine("Couldn't parse group"); return; } var configs = new List <FeatureConfiguration>() { new FeatureConfiguration() { FeatureId = featureId, EnabledState = (FeatureEnabledState)enabledState, EnabledStateOptions = enabledStateOptions, Group = group, Variant = variant, VariantPayloadKind = variantPayloadKind, VariantPayload = variantPayload, Action = actionToUse } }; int result = RtlFeatureManager.SetLiveFeatureConfigurations(configs, FeatureConfigurationSection.Runtime); if (result != 0) { Console.WriteLine("An error occurred while setting a live feature configuration (hr=0x{0:x8})", result); return; } if (!RtlFeatureManager.SetBootFeatureConfigurations(configs)) { Console.WriteLine("An error occurred while setting a boot feature configuration"); } else { Console.WriteLine("Successfully set feature configuration"); } }
static void ProcessSetConfig(string[] args, FeatureConfigurationAction actionToUse) { if (args.Length < 4) { string helpPrefix = actionToUse == FeatureConfigurationAction.Delete ? "del" : "add"; Console.WriteLine("Syntax: {0}config <runtime | boot> <numeric id> <enabled state>\n [enabled state options] [variant] [variant payload kind] [variant payload] [group]\n", helpPrefix); Console.WriteLine("If an invalid section is specified, 'runtime' will be used\n\nEnabled state types: 0 = Default, 1 = Disabled, 2 = Enabled\n"); Console.WriteLine("Examples: {0}config runtime 123456 2\n {0}config runtime 456789 2 1 4 1 0 0", helpPrefix); return; } FeatureConfigurationSection sectionToUse = FeatureConfigurationSection.Runtime; if (args[1] == "boot") { sectionToUse = FeatureConfigurationSection.Boot; } else { Console.WriteLine("Invalid action, only 'add' or 'delete' are supported"); return; } if (!TryParseDecHexUint(args[2], out uint featureId)) { Console.WriteLine("Couldn't parse feature ID"); return; } if (!TryParseDecHexInt(args[3], out int enabledState)) { Console.WriteLine("Couldn't parse enabled state"); return; } int enabledStateOptions = 1; int variant = 0; int variantPayloadKind = 0; int variantPayload = 0; int group = 4; if (args.Length > 4 && !TryParseDecHexInt(args[4], out enabledStateOptions)) { Console.WriteLine("Couldn't parse enabled state options"); return; } if (args.Length > 5 && !TryParseDecHexInt(args[5], out variant)) { Console.WriteLine("Couldn't parse variant"); return; } if (args.Length > 6 && !TryParseDecHexInt(args[6], out variantPayloadKind)) { Console.WriteLine("Couldn't parse variant payload kind"); return; } if (args.Length > 7 && !TryParseDecHexInt(args[7], out variantPayload)) { Console.WriteLine("Couldn't parse variant payload"); return; } if (args.Length > 8 && !TryParseDecHexInt(args[8], out group)) { Console.WriteLine("Couldn't parse group"); return; } int result = RtlFeatureManager.SetFeatureConfigurations(new List <FeatureConfiguration>() { new FeatureConfiguration() { FeatureId = featureId, EnabledState = (FeatureEnabledState)enabledState, EnabledStateOptions = enabledStateOptions, Group = group, Variant = variant, VariantPayloadKind = variantPayloadKind, VariantPayload = variantPayload, Action = actionToUse } }, sectionToUse); if (result != 0) { Console.WriteLine("An error occurred while setting the feature configuration (hr=0x{0:x8})", result); } else { Console.WriteLine("Successfully set feature configuration"); } }