L3S DRM Developer Guide

The client side of L3S DRM consists of two parts:

  • Statically compiled WASM class library: DRMCore2.a (or DRMCore2_debug.a for more verbose console logging during development)

  • MSFS in-game panel/gauge: ModuleDrmGauge.html, .js, and .css

All security-critical logic is implemented in the WASM module.
The MSFS gauge serves the following purposes:

  • Retrieve the Xbox username

  • Provide a UI for the user to paste their activation key manually

  • Display error messages or status information

L3S DRM checks the work folder of each aircraft for a file named:

license.key

If the file exists and contains a valid key, the DRM system will attempt to activate the product using it.
In this case, the user will not see any activation prompt and everything will be handled in the background.


Client API Key

You can create multiple Client API Keys per project, allowing you to differentiate between direct sales and MSFS Marketplace (incl. Xbox) versions.

  • You can enable/disable Client API Keys at any time via the developer portal.

  • Activation keys issued to users are universal — they will work with all valid Client API Keys associated with the same project.


LVARs

The DRM system exposes the following LVARs (Local Variables), where <ProductName> is derived from the data-expected-product-name attribute in ModuleDrmGauge.html (spaces → underscores, non-alphanumeric characters except -, _, . are stripped):

  • L:DRM_UI_VISIBLE_<ProductName>
    Indicates whether the activation UI should be shown:

    • 0 = Hidden

    • 1 = Visible

If you use .transparentSuccessScreen(true) in C++, you can overlay the DRM screen in front of your normal screen and it will hide automatically when applicable. Otherwise, it is your responsibility to show or hide the gauge based on this value.

  • L:DRM_ACTIVATED_<ProductName>
    Indicates whether the product has been activated.

Security Notice:
L:DRM_ACTIVATED_<ProductName> is not secure and must not be used to authorize access to the aircraft. Use only the DrmSuccessEvent() callback from the WASM module for secure validation.