9.6 KiB
game_state.obj matching log
Result
source/saved games/game_state.obj is strict-complete: all 24 functions,
all target-owned read-only data, the callback table, and the BSS aggregate
match the January 14, 2002 object under XDK 3911 CL 13.00.9254.1 with the
repository flags /O2 /Oy- /DDEBUG /Dxbox.
The final lift added the two private helpers, GPU arena allocation, persistent storage restoration, and core-file loading. The existing 18 exact functions were rechecked after every source change.
January-authoritative recovery
code_001af4f0is PDB-correlated with the later namegame_state_header_valid. January gives it a private static convention:headerin ESI,halt_on_errorin BL, and the boolean result in AL.- The validator is one ordered
if/else ifladder over build number, map name, allocation checksum, player count, and cache-file checksum. In the nonfatal persistent-load path VC7 inlines and constant-folds it. Ingame_state_load_coreit remains an out-of-line private-ABI call. code_001af650is the allocation logger. VC7 retains one cdecl copy and inlines it into both CPU and GPU arena allocators. The GPU flag selects the"*"suffix.- The GPU allocator grows downward from
base + 0x345000; CPU and GPU limits are0x305000and0x40000respectively. - Persistent restore naturally inlines the one-entry before-load callback and
game_state_save, while leaving the 13-entry after-load dispatcher as a call. Core loading makes the opposite contextual inlining choice for the after-load dispatcher. These are compiler consequences of the shared readable helpers, not hand-duplicated machine code.
The later HCEX decompilation was used only to suggest names and topology. January disassembly, strings, relocations, sizes, and compiler output were the acceptance authority.
Preserved original defect
The build-number failure text is "expected build #%d but got #%d", but the
arguments are string pointers. This original diagnostic-format bug is
preserved for exact reconstruction. A bug-fixed derivative should replace
both %d conversions with %s; doing that in this exact branch would change
the owned string and relocation identity.
Strict function evidence
| Function | Padded bytes | Relocations | Normalized SHA-256 |
|---|---|---|---|
code_001af4f0 |
352 | 29 | 350352f1b90205366b540a4de2ceed508368e45f565b1501a1f1a734b903ac92 |
code_001af650 |
112 | 11 | 8f67474089a0c650702bf7901d9fe8c32d7b4bcd95c99766c25776c451b68e3b |
game_state_malloc |
272 | 29 | 947befa023fcb18727260717911e26a200633a81ce43001ccd20e14fefde8c4d |
game_state_gpu_malloc |
272 | 29 | edb4f69ac452cdbc47ef929fef9ee43007045b9fb02fe4c7d9c3770ebdeba96e |
game_state_try_and_load_from_persistent_storage |
240 | 21 | d3673bad9698327d0460e4b837d8f75949c6701c8dc381e7a044407a256e4aae |
game_state_load_core |
160 | 10 | 2424a9384c9f1edb3f17c0b3c72137e931068c7936bb749dc25e1e4af5eb30b6 |
The remaining 18 functions also pass section_infos_equal; the complete
object total is 24/24 functions and 2,624/2,624 padded code bytes.
Data and ownership audit
- Callback
.data: 60/60 bytes, 15/15 relocations, exact destinations and order. It contains one before-save, one before-load, and thirteen after-load callbacks. - BSS: 32/32 bytes. The file pointer precedes the 28-byte game-state aggregate at the January offsets.
- All 18 target-owned string COMDAT sections are exact, including assertion text, logger format/path, and core-load status strings.
- XDK headers also instantiate three unrelated select-any D3D lookup tables in the rebuilt object. They are not target-owned sections and are benign header artifacts; no target data credit depends on them.
- The target csplit object exposes private symbols externally, whereas MSVC emits the two private helpers and callback sub-symbols as static. Strict function and relocation-destination equality plus the whole-section data checks prove the semantic ownership.
Source shapes tried
The faithful shared-helper form was sufficient. Replacing the existing inline
logger in game_state_malloc with a call caused VC7 to inline the helper back
to the exact January instruction stream and simultaneously emitted the exact
out-of-line helper. No speculative barrier, pragma, compiler flag, assembly,
volatile qualifier, undefined behavior, or byte patch was needed.
House-rule audit
- No-argument declarations put
voidon its own line. - Every parameter is on its own line in newly added declarations/definitions.
- Callback types explicitly use
(void). - Every added function has an explicit final return and one source-level return.
- No raw tag/object/datum getter casts were introduced.
- No alignment directives or non-default packing were introduced.
Current campaign revalidation (2026-08-13)
This atomic lane began at authoritative tip a8114eb7, where
game_state.obj was still marked NonMatching. Before reconstructing the
remaining functions again, the lane audited all local refs and worktrees and
found the completed but unintegrated result at a9c624c8. That commit was
transplanted onto the current tip in an isolated branch and independently
rebuilt with XDK 3911 CL 13.00.9254.1 and the unchanged repository flags.
In plain English, the object now reproduces all of the original save-state machinery: its lifecycle wrappers, allocation arenas, checksum validation, persistent-storage path, callback table, and global state storage. The later HCEX material helped identify intent, but every accepted byte, call target, string, and layout came from the January target object.
The hardened comparator reproduced all 24 code sections:
| Function | Padded bytes | Relocations | Normalized SHA-256 |
|---|---|---|---|
_dummy |
16 | 0 | 499f1f307c1cb989f968a6b7fcaec591e1828877223d0b0e7e8e8b76cde8c9ca |
_game_state_call_before_save_procs |
16 | 1 | 247599aa11966badf77d9bbec40b25aca3a5e0bc652cb153ca2a57eb58b7c953 |
_game_state_call_before_load_procs |
16 | 1 | 247599aa11966badf77d9bbec40b25aca3a5e0bc652cb153ca2a57eb58b7c953 |
_game_state_call_after_load_procs |
32 | 1 | 29564bc017611472ab8b9a3d80b764564006f2251ac98cffd5ad054321384c62 |
_game_state_dispose |
16 | 2 | 9f760b763648bf9f93ffa324169a776403fafb81f229b53514562ce23ecc4cad |
_game_state_initialize_for_new_map |
176 | 20 | 1c42a262a8e5d490bc55bd146085ab04f97c11fcf80fb687dcadc803afd7ac1e |
_game_state_dispose_from_old_map |
16 | 0 | 499f1f307c1cb989f968a6b7fcaec591e1828877223d0b0e7e8e8b76cde8c9ca |
_game_state_save |
32 | 5 | c5e4b6fdde3e9149ba71a013848b6f9c1235b29fc4014c014c7507dbde060171 |
_game_state_revert |
64 | 6 | a33cc8fffd018e66187b004bf0d4980fdf8ae1c87458798d131092275ecf040d |
_game_state_save_to_persistent_storage |
64 | 5 | 8c480b60afb7fabfa0d3862a1504b16f747daf1e82fbc2ea7f9563025ad2076c |
_game_state_test_persistent_storage |
112 | 4 | 6f8621fad595fd42c8fb7f060435f8596a0f98b7e1779b7f5a63bc27047584fd |
_game_state_save_core |
80 | 6 | 69e6cca4da2fb002c0d3315cc6d372d8a9d0370399ae2895bebe1501defd05c4 |
_game_state_reverted |
32 | 2 | 254f436194c6a97556cf901ee959502670f8d75399cd0c3e7884a99a7e888260 |
_code_001af4f0 |
352 | 29 | 350352f1b90205366b540a4de2ceed508368e45f565b1501a1f1a734b903ac92 |
_code_001af650 |
112 | 11 | 8f67474089a0c650702bf7901d9fe8c32d7b4bcd95c99766c25776c451b68e3b |
_game_state_set_revert_time |
32 | 3 | 40c3b5882654cf42e4a4e217fffd19b863d77593bd7fe9d0a38a0d0b6e4bc4ef |
_game_state_malloc |
272 | 29 | 947befa023fcb18727260717911e26a200633a81ce43001ccd20e14fefde8c4d |
_game_state_gpu_malloc |
272 | 29 | edb4f69ac452cdbc47ef929fef9ee43007045b9fb02fe4c7d9c3770ebdeba96e |
_game_state_data_new |
64 | 4 | 20067ba894d44b980a03bca3828a2bffc909d54654f2577317c244226e5749be |
_game_state_memory_pool_new |
64 | 4 | a8e473abdaee557ad3ec971ed365acb21c85f9c6efaa12f9d29add07f531e133 |
_game_state_lruv_cache_new |
80 | 4 | 7380045f6dc1c73cf2fa48566e81bb86b3eb6faee84035a09e84e9292b6ed7f7 |
_game_state_try_and_load_from_persistent_storage |
240 | 21 | d3673bad9698327d0460e4b837d8f75949c6701c8dc381e7a044407a256e4aae |
_game_state_load_core |
160 | 10 | 2424a9384c9f1edb3f17c0b3c72137e931068c7936bb749dc25e1e4af5eb30b6 |
_game_state_initialize |
80 | 8 | 7d5d8884e49f398ef22ce7499b8b4252a62938d8e8a3c1a0d0f8353dbc4b08f4 |
The target-owned callback .data is 60/60 bytes with 15/15 exact
relocations and normalized hash
5dcc1b5872dd9ff1c234501f1fefda01f664164e1583c3e1bb3dbea47588ab31.
The aggregate .bss is 32/32 bytes with normalized hash
66687aadf862bd776c8fc18b8e9f8e20089714856ee233b3902a591d0d5f2925.
All 18 target-owned string COMDATs also pass strict comparison.
Because game_state.h is included widely, the lane built both the untouched
a8114eb7 tree and the candidate tree from scratch. A targeted strict census
then checked all 29 direct C translation-unit consumers: all 691 functions
that were exact before remain exact, and all 404 previously exact owned data
sections remain exact. The regression tool's raw manifest also reported
debug-record and section-index changes caused by reformatting declarations;
those are not code/data regressions, and the target-authoritative census above
was used to distinguish them rather than waive them.
The full build, ordinary progress report, semantic progress gate, and all 173
tool unit tests pass. The current source still contains the pre-existing early
exit in game_state_revert; it is not newly introduced by this reconstruction
and matches January exactly. Every newly reconstructed function retains one
source-level return and follows the parameter, void, accessor, and explicit
final-return house rules.