Skip to content

URKit v0.4.0-beta

Latest

Choose a tag to compare

@Jadis0x Jadis0x released this 09 Sep 21:45

Release notes

v0.4.0

Two mods in one process

Two generated mods can now run in the same game. Previously the loader
reported both as loaded, both installed their render hooks, and only one ever
drew — silently, with nothing in the log.

  • The render hook told another mod's viewport apart from the game window by
    the IMGUI_CONTEXT property. Dear ImGui stamps that on the game's main
    window too, so every mod that installed after the first one refused to adopt
    the game's swap chain. It now checks the window class instead.
  • ImGui registers its ImGui Platform class against the game executable, so
    two mods contended for one class atom. Generated projects now compile the
    Win32 backend through third_party/imgui_win32_module_scope.cpp, binding the
    class to the mod's own module. Each mod logs which side of that it landed on,
    once, at startup.
  • Toggling detached viewports at runtime tripped an ImGui assert
    ("Forgot to call UpdatePlatformWindows()"). The frame stamp is now kept
    current whether viewports are on or off, including on the DX12
    command-submission failure path.

MethodPointer is ~90x cheaper

It ran VirtualQuery plus GetModuleHandleEx per call, and
GetModuleHandleEx walks the loader's module list under the loader lock. The
executable ranges of GameAssembly and UnityPlayer are now measured once from
the section headers; addresses outside them still take the original path.
Over a 119,329-method walk: 5735 ms of work down to 64 ms.

IL2CPP

  • has_method(type, name, argc) and has_property(type, name) in generated
    projects. Stripping removes UnityEngine members a game never calls, and until
    now a wrapper couldn't tell that apart from a call returning a default.
  • Il2CppDebugMethodInfo is a real struct instead of void. The debug exports
    that can't be used through an opaque handle were dropped.
  • Hooking a method whose entry point is shared (folded identical bodies) or is
    a generic definition's stub now warns. Both install fine and never fire.

Cursor and input under stripping

Cursor control needed all four Cursor accessors and was disabled entirely
when a game assigned Cursor.visible without reading it back. The setters are
now the capability, the getters only say what to restore, and a build with
stripped getters reads the state from Win32 instead. Mouse-click suppression is
its own capability, so a build without Input.GetKeyDown keeps it.

Other

  • urk-sdk.exe dark UI pass.
  • Highlights finally have usage docs:
    Getting Started step 8 builds a
    world-space overlay end to end, and handbook §12 opens with the two calls it
    comes down to instead of the DirectX pipeline.

Upgrading

Regenerate your project — the render hook, message pump and CMakeLists.txt
update in place, and third_party/imgui_win32_module_scope.cpp is new. The
source list changed, so reconfigure once:

cmake --preset clang-debug
cmake --build --preset clang-debug --parallel

Ship the new version.dll (or winmm.dll / winhttp.dll) with it; the
MethodPointer speed-up is in the loader.