Repository navigation
v2.0.0
Every pack is validated against the published 1.0.0 package, and each intentional break is declared in
src/CheatEngine.SDK/CompatibilitySuppressions.xml and marked Breaking below.
Added
- The package embeds an SPDX 2.2 software bill of materials at
_manifest/spdx_2.2/manifest.spdx.json, and its nuspec
keeps the repository URL and commit. - A security policy with private vulnerability reporting, and a compatibility issue form that captures the exact
package, bridge, Cheat Engine and runtime tuple. LuaOptional<T>lets a generated Lua or Engine API binding distinguish an omitted trailing argument (LUA_TNONE)
from an explicit Luanil, and lets a result read the factual count Lua returned instead of assuming the declared
arity; the Engine API grammar gains matchingopt:,opt-result:andrest:declarations, and every curated spec
must now declare thecontract: ce77header.AobScanner.TryScanWithinBoundsruns an exhaustive or a deadline-bounded, cooperatively terminable AOB scan over an
explicit target range, andTryFindFirstFoundWithinBoundsstops at the first match; both accept byte-array
patterns and explicit range bounds. The deadline/termination overloads and the first-found scan are marked
[Experimental](CESDK5010,CESDK5011, build errors unless acknowledged) until their exact-host evidence lands.TargetReleaseStatus.RefusedRuntimeChangedreports that a target-bound owner was consumed without any Cheat Engine
call because the Lua runtime identity that created it (attach epoch or state generation) is no longer current.RuntimeInfo.TryDeriveTargetArchitecturederives the target CPU architecture from Cheat Engine's own instruction-
family and bitness facts.- Diagnostics
CESDK9102(a direct plugin-library consumer setsPublishAot=true) andCESDK0006(a method exports
a classicCEPlugin_*native entry point) flag the two plugin shapes CheatEngine.SDK does not support;CESDK1020
flags aPointerSizebuilt from the plugin process width instead of a Cheat Engine observation. LuaRuntime.AdmitWorkerThreads()([Experimental("CESDK5001")]) andAdmitMainThreadOnly()switch the Lua thread
admission policy read by the newLuaRuntime.ThreadAdmissionproperty;TryAcquireOperationWithOutcomereports the
factualLuaAdmissionStatus(Admitted,Detached,ThreadNotAdmitted,ExternalStateReset, …) of an admission
attempt instead of only a boolean or an exception.LuaRuntime.ExternalStateResetDetectedreports that Lua was reset outside the SDK's ownresetLuaStatepath.HostLog.IdentifyOnEnableand theCHEATENGINE_SDK_IDENTIFY_ON_ENABLEenvironment variable opt into one bounded,
path-freeCheatEngineSdkIdentification: …log entry per enable attempt (SDK version and commit, bridge and Lua
module fingerprints, host and runtime facts).- A C2 native hostfxr host emulator (
tests/native-host-emulator) measures plugin coexistence (separate and shared
loader folders, the default and component ALC routes) in CI without contacting a live Cheat Engine host.
Changed
- Untagged builds are versioned
2.0.0-alpha.0.NwithAssemblyVersion2.0.0.0, so the[GeneratedCode]attribute
that the generators emit carries 2.0.0.0. - Building this repository requires .NET SDK 10.0.401 exactly (
global.jsonrollForward: disable), and every
project restores against a committed NuGet lock file. Plugin projects that consume the package are not affected. - The packaged native Lua protection bridge is built by CI with a pinned MSVC toolset (14.44) and Windows SDK
(10.0.26100.0), and a second build and a build from a copy in another directory must produce the same bytes; the
toolchain facts are published with every CI run. native/cheatengine-sdk-lua-bridge/bridge-audit-manifest.jsonnow describes the committed bridge DLL and its sources,
and a test checks it against the committed file.- Releases are created as drafts with the SPDX 2.2 SBOM, provenance and SBOM attestations,
SHA256SUMS, sigstore
bundles and a release tuple, and are verified on nuget.org before they are published; the packaging tests run
against the exact package that is published. - Documentation no longer links to the retired
documentations/tree, and no narrative documentation is recreated
under a repositorydocs/folder; a repository test rejects dead links, local paths and relative links in the
packed README. - The CE 7.7 live probe is now compiled with the solution.
- A target that reports the x86 instruction family together with the 64-bit flag — how Cheat Engine reports every x64
target — now resolves to theX64architecture instead of being refused as a contradictory profile. - Integer, address and pointer marshallers refuse a Lua float at or above 2^53 instead of narrowing it silently.
- A zero-match
AOBScanis modeled as the factualAobScanStatus.NoResult, matching how Cheat Engine 7.7 reports it
(no value, read asnil); it is never presented as a "no matches" classification. PointerSize.FromArchitectureis obsolete (CESDK7001); read the target bitness or configured pointer size from
Cheat Engine instead.- Breaking, not reported by ApiCompat: every SDK-owned outcome enum added since 1.0.0 now starts at
Unknown = 0
instead of reading a default value as success:LuaOperationStatusKind,LuaGlobalPushStatus,
InstructionOperationStatus,ProcessOperationStatusKindandAobScanStatus. None of these enums existed in the
published 1.0.0 package, so ApiCompat does not see the renumbering. - Breaking: the
Callbackfields ofAddressListPluginInitandDisassemblerContextPluginInitchanged from a
typed function pointer tovoid*. - Breaking:
MemoryAccessFailure.DestinationTooSmall,WriteFailedandInvalidResultwere renumbered from 4, 5
and 6 to 5, 8 and 9. - Breaking, not reported by ApiCompat:
LuaClassAttributeandLuaPropertyAttributeno longer set
Inherited = false, andMemoryScanSession.ScannerandMemoryScanSession.Resultsare now marked
[RequiresPluginEnabled], so calling them from plugin startup code reportsCESDK1001. - Breaking, behavioral, not reported by ApiCompat (ADR-07, F04): Lua operations are admitted only on the
plugin's captured main thread, or inside a callback the host itself invoked, by default; a worker thread that was
previously admitted is now refused before Cheat Engine's Lua state provider is ever called.MainThread.Invoke's
worker-sidesynchronizehand-off is unaffected: it is the one documented default exception. Admitting arbitrary
worker threads is the new[Experimental("CESDK5001")]opt-in above, held unqualified until Q19 passes at both a
local and a two-copy qualification run. - Every remaining unqualified "one Lua binding per plugin" or "one load context hosts one plugin" claim in source and
README text was reworded to what the SDK can actually observe: one binding per loadedCheatEngine.SDK.Lua
assembly instance. - The generated plugin name is still copied through the process ANSI code page; a non-ASCII name's exact behavior is
documented as unqualified pending a future host-based validation run (no local Cheat Engine qualification is
available for this release).
Removed
- Breaking: removed the obsolete host-symbol compatibility flag
UseHostSymbolTablefromAddressResolutionOptions
(its constructor, property accessors andDeconstructchange); useEngineInspection.ResolveHostAddressfor
host-symbol resolution.
Fixed
- A symbol registration whose release never reached Cheat Engine is no longer read as a successful release.
- An AOB result list is destroyed once, even when the call that would hand it to its caller cannot proceed.
- A scan is stopped before its session is released, a disposed session refuses further scan members, and a release
requested from inside the session's own Cheat Engine wait is deferred instead of re-entering it; a bounded scan's
session is released if staging its allocation fails. - A log sink that writes back into
HostLogfrom its own callback, or that re-enters a plugin lifecycle transition,
is contained instead of recursing or deadlocking; a registration-rejection log no longer runs while the
registration lock is held. - An
resetLuaState()call the SDK was not told about is now detected on the next admitted Lua operation: old
callback and subscription owners are refused deterministically, and nothing is released into the replacement Lua
registry by number. There is still no public SDK reset API.
NuGet package: https://www.nuget.org/packages/CheatEngine.SDK/2.0.0