gse/post_build/README.experimental_steamclient.md
alex47exe ae979f1edb * [alex47exe] major overhaul of **generate_emu_config** - custom configs, proper ini parsing, better logging and error handling, helper tools:
* add `-def1` ... `-def5` arguments, which can be used to generate your preferred custom config
    if no `-def` argument is provided, `-def1` will be used by default, to automatically copy from the following folders:
    * `.\_DEFAULT\0` ............... essential emu files, like latest GSE dlls (*steam_api.dll* and *steam_api64.dll*)
    * `.\_DEFAULT\1` ............... other GSE files and folders, including default ini files
    * `.\_DEFAULT\<appid>` ... other GSE files and folders, but only for the current `<appid>`, if the folder exists
  * (Windows only) add some useful helper tools, written in *AutoIt3*:
    * **gse_acw_helper.exe** - add the required achievements schema db files for *Achievement Watcher*, if  .\steam_misc\extra_acw\extra_acw.zip file exists (if generated by `generate_emu_config.exe -acw <appid>`)
    * **gse_debug_switch.exe** - automatically switch between release and debug versions of the emulator, if *steam_api.7z* / *steam_api64.7z* file exists (or *steamclient.7z* / *steamclient64.7z*, if you use the steamclient version)
      paths to release and debug files inside 7z, can be customized in .\steam_misc\tools\au3\scripts\gse_debug_switch.ini
    * **gse_generate_interfaces.exe** - simple x64-x86 launcher for *generate_interfaces.exe*
      it also writes all found steam interfaces to CODEX *steam_emu.ini* (if generated by `generate_emu_config -cdx <appid>`)
      make sure to name your original dll to one of these formats, so it can automatically find its interfaces:
      * `valve_api.dll / valve_api64.dll`
      * `steam_api.dll.bak / steam_api64.dll.bak` or `steam_api.dll.org / steam_api64.dll.org`
      * `steam_api.bak / steam_api64.bak` or `steam_api.org / steam_api64.org`
      * `steam_api_orig.dll / steam_api64_orig.dll` or `steam_api_legit.dll / steam_api64_legit.dll`
    * **gse_lobby_connect.exe** - simple x64-x86 launcher for *lobby_connect.exe*
  * new folder structure, compatible with current and future helper tools --- default arguments are `-acw -cdx -clr <appid>`
    NEVER delete `.\steam_misc\app_backup`, `.\steam_misc\app_info`, `.\steam_misc\tools` and `.\steam_settings` folders
    MIGHT need `.\steam_misc\extra_acw` and `.\steam_misc\extra_cdx` for compatibility with Achievement Watcher and CODEX
  * add `-scx` argument to automatically download images / videos for trading cards, backgrounds, badges, emoticons and other tradable items
    unfortunately I couldn't find any direct steam api method to download the files, so I had to write a rudimentary web scrapper to extract the download links from a third-party website, hence the *scx_gen.py* script might need updating in the future if the website design changes
  * download screenshots and videos:
    * download thumbnails for both screenshots and videos, and compress them to `.zip` files
    * screenshots and videos are now numbered from first to last published, as in the Steam store page
    * add `-vids_low` / `-vids_max` arguments to download all videos, in low and / or high quality
  * create / update .\\*top_owners_ids.txt* when .\\*top_owners_ids.html* is present
  * generate controller action sets txt files for all found controller vdf configs, and zip them inside .\steam_misc\app_backup\app_backup.zip
    by default, the emu supports only `xboxone` and `xbox360` controller configs, though if the're are any issues with the default supported controller action sets inside .\steam_settings\controller folder, you could try to unpack and overwrite action sets for other unsupported controller configs
  * (Windows only) add *AdvancedRun* launchers (cmd console + silent) for `.bat` files and `.py` scripts
* **[alex47exe]** major overhaul of **migrate_gse** - uses the same `.\_DEFAULT\0` and `.\_DEFAULT\1` folder structure for default configs
  it can convert old `.txt` format to `.ini` format, minus *branches.json*, which would require using *top_owners_ids.txt* and some login code from **generate_emu_config**, which should actually be used to properly generate the config files, instead of converting from the old `.txt` format
* [alex47exe] *generate_interfaces.exe* - find all Steam Interfaces instead of only old ones
  the emu will ignore the ones it doesn't require, while we'll have the complete list to write it to CODEX *steam_emu.ini*
* [alex47exe] *lobby_connect.exe* - improve cmd console text alignment
* [alex47exe] `mods_img` instead of `mod_images` (better folder consistency), better example for `mods_img`, minor tweaks to `.ini` and `.md` files
2024-07-30 01:21:09 +01:00

5.9 KiB

What is this ?

This is a build of the experimental version of the emu in steamclient mode, with an included loader which was originally written by Rat431 and later modified to suit the needs of this emu.

The backend .dll/.so of Steam is a library called steamclient, this build will act as a steamclient allowing you to retain the original steam_api(64).dll. See both the regular and experimental readmes for how to configure it.


Note that all emu config files should be put beside the steamclient(64).dll

You do not need to create a steam_interfaces.txt file for the steamclient version of the emu


How to use it ?

  1. Copy the following files to any folder:

    • steamclient.dll
    • steamclient64.dll
    • ColdClientLoader.ini
    • steamclient_loader.exe
  2. While it is not mandatory, it is highly recommended to copy the relevant GameOverlayRenderer dll
    This is recommended because some apps check for the existence of this dll, either on disk, on inside their memory space, otherwise they'll trigger custom protection
    When in doubt, just copy both dlls:

    • GameOverlayRenderer.dll: for 32-bit apps
    • GameOverlayRenderer64.dll: for 64-bit apps
  3. Edit ColdClientLoader.ini and specify:

    • AppId: the app ID
    • Exe: the path to the game's executable/launcher, either full path or relative to this loader
    • ExeRunDir (optional): generally this must be set to the folder containing the game's exe, if left empty then it will be automatically set to the folder containing the game's exe.
    • ExeCommandLine (optional): additional args to pass to the exe, example: -dx11 -windowed
      Optionally you can specify a different location for steamclient(64).dll:
    • SteamClientDll: path to steamclient.dll, either full path or relative to this loader
    • SteamClient64Dll: path to steamclient64.dll, either full path or relative to this loader
    • ForceInjectSteamClient: force inject steamclient(64).dll instead of letting the app load it automatically
    • ForceInjectGameOverlayRenderer: force inject GameOverlayRenderer(64).dll instead of letting the app load it automatically.
      These dlls are expected to be in the same folder of steamclient(64).dll
    • ResumeByDebugger: setting this to 1 or y or true will prevent the loader from calling ResumeThread() on the main thread after spawning the .exe, and it will display a mesage with the process ID (PID) so you attach your debugger on it.
      Note that you have to resume the main thread from the debugger after attaching, also the entry breakpoint may not be set automatically, but you can do that manually.
    • DllsToInjectFolder (optional): path to a folder containing dlls to force inject into the app upon start,
      the loader will attempt to detect the dll architecture (32 or 64 bit), if it didn't match the architecture of the exe then it will be ignored.
      Path is either full or relative to this loader
    • IgnoreInjectionError: setting this to 1 or y or true will prevent the loader from displaying an error message when a dll injection fails
    • IgnoreLoaderArchDifference: don't display an error message if the architecture of the loader is different from the app.
      this will result in a silent failure if a dll injection didn't succeed.
      both the loader and the app must have the same arch for the injection to work
    • Mode (in [Persistence] section):
      • 0 = turned off
      • 1 = loader will spawn the exe and keep hanging in the background until you press "OK"
      • 2 = loader will NOT spawn exe, it will just setup the required environment and keep hanging in the background
        you have to run the Exe manually, and finally press "OK" when you've finished playing
        you have to rename the loader to "steam.exe"
        it is advised to run the loader as admin in this mode

Note that any arguments passed to steamclient_loader.exe via command line will be passed to the target .exe.
Example: steamclient_loader.exe -dx11
If the additional exe arguments were both: passed via command line and set in the .ini file, then both will be concatenated and passed to the exe.
This allows the loader to be used/called from other external apps which set additional args.

Using DllsToInjectFolder

The folder specified by this identifier should contain the dll files you'd like to inject in the app earlier during its creation.
All the subfolders inside this folder will be traversed recursively, and the dll files inside these subfolders will be loaded/injected.

Additionally, you can create a file called load_order.txt inside your folder (root level, not inside any subdir), mentioning on each line the dll files to inject.
The order of the lines will instruct the loader which dll to inject first, the dll mentioned on the first line will be injected first and so on.
Each line inside this file has to be the relative path of your target dll, and it should be relative to your folder. Check the example.

If this file is created then the loader will only inject the dll files mentioned inside it, otherwise it will attempt to find all valid dll files and inject them.


Using extra_dlls

This folder contains an experimental dll which, when injected, will attempt to patch the Stub DRM in memory, mainly for newer variants but it also works on some of the older ones.

This isn't a complete solution, just a different method.
This dll is meant to be injected during start-up only, it must NOT be placed inside .\steam_settings\load_dlls, otherwise it would cause a huge FPS drop.


Using GameOverlayRenderer

Some apps verify the existence of this dll, either on disk, or inside their memory space, that's why this dll exists.
It is NOT recommended to ignore this dll.