GameFinder.RegistryUtils 1.2.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package GameFinder.RegistryUtils --version 1.2.0
NuGet\Install-Package GameFinder.RegistryUtils -Version 1.2.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="GameFinder.RegistryUtils" Version="1.2.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add GameFinder.RegistryUtils --version 1.2.0
#r "nuget: GameFinder.RegistryUtils, 1.2.0"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install GameFinder.RegistryUtils as a Cake Addin
#addin nuget:?package=GameFinder.RegistryUtils&version=1.2.0

// Install GameFinder.RegistryUtils as a Cake Tool
#tool nuget:?package=GameFinder.RegistryUtils&version=1.2.0

GameFinder

CI Nuget

.NET 5 library for finding games on Windows.

Supported Stores

  • Steam
  • GOG
  • Bethesda.net Launcher
  • Epic Games Store
  • Origin TODO

Example

var steamHandler = new SteamHandler();
steamHandler.FindAllGames();
foreach (var steamGame in steamHandler.Games)
{
    Console.WriteLine($"{steamGame} is located at {steamGame.Path}");
}

When to use this Library

This library is best used when you have to find multiple different games from different game stores. If you build a tool for only one game then you might better be off finding it via the registry (common method is looking for the Uninstaller). You could still use this library to only find that one game but it's a bit overkill.

If you build some sort of game library manager like Playnite or LaunchBox then you could make massive use of this library.

How it works

Finding Steam Games

Source: SteamHandler.cs

Steam games can be easily found by searching through "Steam Universes". An Universe is simply a folder where you install Steam games. You can find all Universes by parsing the config.vdf file in Steam/config. We can get the Steam folder by opening the registry key HKEY_CURRENT_USER\Software\Valve\Steam and getting the SteamPath value.

The config.vdf file uses Valve's KeyValue format which is similar to JSON:

"InstallConfigStore"
{
	"Software"
	{
		"Valve"
		{
			"Steam"
			{
				"BaseInstallFolder_1"		"F:\\SteamLibrary"
				"BaseInstallFolder_3"		"E:\\SteamLibrary"
			}
		}
	}
}

What we want to look for are these BaseInstallFolder_X values which point to a Universe folder. The steamapps subdirectory contains the appmanifest_*.acf files we need. .acf files have the same KeyValue format as .vdf files so parsing very easy:

"AppState"
{
	"appid"		"8930"
	"Universe"		"1"
	"LauncherPath"		"C:\\Program Files (x86)\\Steam\\steam.exe"
	"name"		"Sid Meier's Civilization V"
	"StateFlags"		"4"
	"installdir"		"Sid Meier's Civilization V"
	"LastUpdated"		"1600350073"
	"UpdateResult"		"0"
	"SizeOnDisk"		"9235434479"
	"buildid"		"4390913"
	"LastOwner"		"76561198110222274"
	"BytesToDownload"		"20736"
	"BytesDownloaded"		"20736"
	"BytesToStage"		"26039"
	"BytesStaged"		"26039"
}

Important in this file are the appid, name and installdir fields. Note: installdir is the name of the folder in Universe/steamapps/common/ where the game is installed. It is not absolute but relative to the common folder.

Finding GOG Games

Source: GOGHandler.cs

GOG stores all information in the registry. This can either be at HKEY_LOCAL_MACHINE\Software\GOG.com\Games or HKEY_LOCAL_MACHINE\Software\WOW6432Node\GOG.com\Games. Simply open the registry key and get all sub-key names. Each sub-key in GOG.com\Games is an installed game with the ID being the name of the sub-key:

GOG Games Tree in Registry

Now you can iterate over all sub-keys to get all the information you need:

GOG Game in Registry

Important fields are path, gameID and gameName.

Finding BethNet Games

Source: BethNetHandler.cs

Finding games installed with the Bethesda.net Launcher was very rather tricky because there are no config files you can parse or simple registry keys you can open. I ended up using a similar method to the GOG Galaxy Bethesda.net plugin by TouwaStar: GitHub. The interesting part is the _scan_games_registry_keys function in betty/local.py:

  1. open the uninstaller registry key at HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall
  2. iterate over every sub-key:
    • find the sub-keys that open the Bethesda Launcher with bethesdanet://uninstall/ as an argument

Bethesda.net Launcher Games Uninstaller in Registry

With this you can find all games installed via Bethesda.net. The important fields are DisplayName, ProductID (64bit value) and Path.

Finding EGS Games

Source: EGSHandler.cs

The Epic Games Store uses manifest files, similar to Steam, which contain all information we need. The path to the manifest folder can be found by opening the registry key HKEY_CURRENT_USER\SOFTWARE\Epic Games\EOS and getting the ModSdkMetadataDir value. Inside the manifest folder you will find .item files which are actually just JSON files with a different extension.

See 8AAFB83044E76B812D3D8C9652E8C13C.item for an example file. Important fields are InstallLocation, DisplayName and CatelogItemId.

Finding Origin Games

TODO

Contributing

See CONTRIBUTING for more information.

License

GPLv3.0, see LICENSE for more information.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net5.0-windows7.0 is compatible.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.1 is compatible. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (7)

Showing the top 5 NuGet packages that depend on GameFinder.RegistryUtils:

Package Downloads
GameFinder.StoreHandlers.Steam

Library for finding games installed with Steam.

GameFinder.StoreHandlers.GOG

Library for finding games installed with GOG Galaxy.

GameFinder

Package Description

GameFinder.StoreHandlers.EGS

Library for finding games installed with the Epic Games Store.

GameFinder.StoreHandlers.Origin

Library for finding games installed with Origin.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
4.2.0 5,612 1/28/2024
4.1.0 2,915 1/8/2024
4.0.0 7,883 9/3/2023
3.2.2 2,642 8/11/2023
3.2.1 1,949 7/25/2023
3.2.0 786 7/25/2023
3.1.0 2,916 5/23/2023
3.0.2 1,172 5/10/2023
3.0.1 763 5/10/2023
3.0.0 845 5/9/2023
2.6.0 2,189 3/7/2023
2.5.0 3,763 1/17/2023
2.4.0 72,867 1/13/2023
2.3.0 2,254 12/16/2022
2.2.2 8,355 11/11/2022
2.2.1 25,478 10/21/2022
2.2.0 1,520 10/21/2022
2.1.0 1,364 10/21/2022
2.0.1 1,399 10/19/2022
2.0.0 1,832 10/15/2022
1.8.0 7,132 6/27/2022
1.7.3 64,056 5/14/2022
1.7.2 50,688 11/10/2021
1.7.1 21,339 8/19/2021
1.7.0 26,532 8/9/2021
1.6.4 1,581 8/3/2021
1.6.3 2,712 7/30/2021
1.6.2 1,800 7/17/2021
1.6.1 2,192 7/10/2021
1.6.0 1,613 7/10/2021
1.5.3 22,822 6/13/2021
1.5.2 1,683 6/9/2021
1.5.1 1,630 6/6/2021
1.5.0 15,260 5/29/2021
1.4.1 31,716 3/26/2021
1.4.0 1,618 3/26/2021
1.3.1 1,638 3/14/2021
1.3.0 1,733 3/13/2021
1.2.0 1,724 3/13/2021