Skip to content

Which features can ViVeTool toggle?

Lucas edited this page Apr 4, 2022 · 2 revisions

ℹ️ To understand what you can and cannot do with ViVe(Tool) we need to go over some of the basics of Feature Management in Windows.

Feature IDs

How are they assigned?

Like in most coding workflows, every significant change in Windows is bound to a task. The ID of that task in Microsoft's internal tracker is what becomes a feature's ID down the road. The set of IDs that one can toggle in a build of Windows is declared in various metadata bits that plug into Windows's compile process. This is why features from one build are not guaranteed to be in the next one — all it takes is a slight metadata edit for that feature's code to be completely disregarded. It still exists in source code but is omitted from the compiled binary.

How do we find them?

Feature references are baked directly into libraries and programs related to said feature, there is no centralized dictionary. In most cases, features are discovered with the help of debugging symbols. These are special files published by Microsoft to aid Windows developers with debugging crashes they encounter when working on their own programs. These files contain information sufficient to pinpoint a feature's ID and name. This needs to be repeated for every single file that ships in Windows, and not all of them get symbols published, especially those pertaining to DRM.

Feature states

Why does toggling specific IDs do nothing even though they are present in a build?

Features have 4 states that they can ship in:

  • Disabled By Default
  • Enabled By Default
  • Always Disabled
  • Always Enabled

When a feature ships in one of the By Default states, the binary housing this feature will contain two code paths - one for the Disabled scenario and one for the Enabled scenario. Toggling these features will produce noticeable changes.

When a feature ships in one of the Always states, toggling it will have no real effect as there's no secondary code path present anymore.

Just like the presence of a feature, the shipping state is also something configured at compile time. That is why a feature can either lose or gain the ability to be toggled from one build to another, or in some cases simply thanks to a cumulative update.

Under the hood of ViVeTool

What happens when I set a feature configuration?

When you ask ViVeTool to toggle a feature for you it will call the relevant Feature Management APIs to fulfill your request. When you see the message Successfully set feature configuration it simply means that the API processed your request. Both ViVeTool and the API provide no guarantee that the configuration you've set is going to result in a meaningful change. This is due to the previously mentioned decentralized nature of IDs present in a build of Windows.

I followed a tutorial and nothing happened

If you followed a tutorial you found online that instructs you to use ViVeTool but you didn't end up with the desired result, chances are that the tutorial is written for a different build/version of Windows than the one you're running. Please do not create issues in the ViVe tracker if you ran into this scenario as it's not something that can be "fixed." It is simply the consequence of IDs being decentralized.