11 KiB
bitmap_group.obj reconstruction log
Outcome
This atomic lane did not close the object. Production source and matching configuration were therefore restored before the evidence-only commit. No partial matching credit is valid.
The best disposable reconstruction reached five of six functions at strict
COFF equality. The remaining function, _bitmap_group_add_bitmap, had the
correct padded size and relocation count, but its instruction schedule and
control-flow layout were not exact. The target's large tag-definition data
table was decoded but not retained because the object could not be admitted.
In plain English: the recovered algorithms are sound, and five compile to the same Xbox machine code. The last function asks VC7 to keep several 16-bit arguments live at once. Our readable spelling assigns the cached bitmap-group type and the depth argument to the opposite registers from January, then lays out two validation branches differently. Those small early choices ripple through the rest of the function. Correct behavior is not sufficient for this project, so the whole object remains parked.
Environment and authority
- January 2002 split COFF is the only matching authority.
- Compiler: XDK 3911 CL 13.00.9254.1.
- Flags: repository defaults, including
/O2 /Oy- /DDEBUG /Dxbox. - HCEA was used only for names, types, and control-flow hypotheses.
tools/coff_compare.pysupplied strict size, normalized-byte, relocation identity, and addend checks.- No assembly,
volatile,__forceinline, undefined behavior, byte patching, compiler-flag change, or comparator exception was used.
January inventory
| Symbol | Target padded bytes | Target relocs | Best result |
|---|---|---|---|
_code_00065210 |
16 | 0 | strict exact |
_code_00065220 |
32 | 2 | strict exact |
_code_00065240 |
1,056 | 47 | strict exact |
_bitmap_group_try_and_get_bitmap |
80 | 2 | strict exact |
_bitmap_group_get_bitmap_from_sequence |
224 | 8 | strict exact |
_bitmap_group_add_bitmap |
1,008 | 59 | nonexact, same size/count |
Strict normalized hashes for the five exact functions:
_code_00065210:1191f37eec740e495eda01ae2ac0969bf44c3c661ce4ae90583b5fdc05c0f707_code_00065220:33c6547344b3c246a1ab1b716d9f08aa8215c50ed15859502f0bf9163bc56e12_code_00065240:668141c5e034183a590516bdf1e6eb650fc4cd01a7e34e6293d7850c69a9ba44_bitmap_group_try_and_get_bitmap: verified strict exact in the whole-object sweep_bitmap_group_get_bitmap_from_sequence: verified strict exact in the whole-object sweep
The unresolved target hash is
b5fee4632a47ed183bb1aec903552bd1b140a591e64d42625900c8b7bf8a7e69.
The best readable candidate remained 1,008 bytes and 59 relocations; its
normalized hash was
cb66dbd3530e77e72696fbc5ea73ada901568acc0aeda564f96d651918fabca0.
Recovered types and interfaces
The lane verified these source-level facts against January instructions:
bitmap_group_add_bitmapreturnsshortand takes seven parameters, each on its own line under the house style.- Width, height, depth, type, format, and mipmap count are all read as 16-bit values from their stack slots.
struct bitmap_datais 48 bytes. Its signature is'bitm'; width, height, depth, type, format, flags, registration point, mipmap count, pixel-data offset, hardware format, and base address offsets were confirmed.- The bitmap group holds pixel data at
+0x30, the bitmap-data tag block at+0x60, and its group type at+0x00. - Block access uses
TAG_BLOCK_GET_ELEMENT, and bitmap-group access uses the typed bitmap-group accessor rather than repeated casts after rawtag_get. bitmap_delete,bitmap_verify, andbitmap_get_pixel_data_sizeprototypes were recovered without changing compiler flags.
Accepted source shapes
The following shapes produced strict-exact individual functions:
- A result local and one final return for
bitmap_group_try_and_get_bitmap. - The natural sequence lookup, including a signed
shortbitmap index and typed tag-block element macros, forbitmap_group_get_bitmap_from_sequence. - The short sprite-loop index in
_code_00065240. Alongindex changed the loop's instruction width; restoring the January-provenshortclosed the entire 1,056-byte function. - An explicit
return;in the void delete callback, per the project house rules.
For _bitmap_group_add_bitmap, the best structural family used:
- explicit scalar initialization of the 48-byte descriptor rather than a blanket clear;
- a
pixels_endlocal alive from function entry, which reproduced the exact0x34stack frame; - a cached signed-short group type loaded after descriptor zero stores;
- early diagnostic exits matching January's four distinct failure epilogues;
- direct
group->...access in the stringized assertions. The former local aliasbitmap_groupwas a real source defect because it emitted the wrong assertion strings; removing it fixed both relocation identities, although it did not solve the instruction schedule.
Measured and rejected families
Do not repeat these without new provenance or a new compiler-control theory.
| Family | Measurement / reason rejected |
|---|---|
Blanket csmemset of the descriptor |
992 bytes / 60 relocs; introduced an extra call relocation. |
| Explicit field initialization | Restored 1,008 / 59 and became the best family. |
Separate word flags local |
1,024-byte variants; wrong live ranges and stores. |
Removing the entry-live pixels_end |
Changed the frame/local layout. |
bitmap_group local alias |
Byte-neutral in most code but produced two wrong stringized assertions; semantically/source-wise rejected. |
Changing the function return to long |
1,024 bytes; wrong ABI/code shape. |
Casting each failure return to short |
No effect; the candidate still used or ax,-1 where January used or eax,-1. |
| Declaration-order and local-name permutations | No useful change in the earliest register assignment. |
| Loading the group type before descriptor initialization | Kept the group pointer in ESI and changed the prologue; rejected. |
| Loading the group type after descriptor initialization | Best prologue, but depth/group-type remained EDX/ECX-swapped. |
Moving the 'bitm' signature store among the width/depth/type stores |
Several distinct hashes; none reproduced January's store position or register assignment. |
register keyword on candidate locals |
No effect under /O2. |
long type/format parameter experiments |
Wrong load widths or no useful change. |
| Local aliases for depth/type | Folded away; no effect. |
| Combined rejection predicate with explicit gotos | Regressed to 960 bytes / 57 relocs and globally reordered validation. |
| Failure-first / success-first branch inversions | Either placed the cube diagnostic on the wrong fallthrough or changed later relocation addresses. |
| Single shared failure return | Cross-jumped epilogues unlike January's four emitted copies. |
First unresolved divergence
After the exact assert prologue, January loads the type parameter into DX and
keeps depth in CX. The candidate loads type into CX and keeps depth in
DX. January then reuses the former type register for zero materialization,
mipmap count, and the cached group type. The candidate performs the same
operations with ECX/EDX exchanged. This begins at function offset +0x35.
The first important control-flow difference follows in the non-interface validation block. January emits:
- three power-of-two checks;
group_type != cubeas the success edge;width == heightas the second success edge;- the square-face failure diagnostic as the forward failure path;
- a jump back into the shared compression-format block.
The readable HCEA-derived form has the same semantics, but VC7 selects a different fallthrough and moves that diagnostic 17 bytes earlier. Later call and assertion relocation identities are correct and stay in the same semantic order, but their addresses drift because of these earlier layout choices.
Decoded target-owned data for reopening
The target owns one external .data section: 1,424 bytes and 152 relocations.
The candidate skeleton owns none. The section has these externally visible
owners:
| Offset | Symbol |
|---|---|
0x000 |
_global_bitmap_reference |
0x00c |
_global_bitmap_reference_optional |
0x35c |
_bitmap_pixel_data |
0x36c |
_color_plate_data |
0x530 |
_bitmap_group |
The internal table map was decoded as follows:
0x018: bitmap-type name table and enum definition;0x030: 18-format name table and enum definition;0x084: six bitmap-data flag names and enum definition;0x0a8: bitmap-data field definitions; block definition at0x168(max=2048, element size 48, callbacks_code_00065210and_code_00065220);0x198: sprite fields; sprite block definition at0x204(max=64, element size 32);0x234: sequence fields; sequence block definition at0x278(max=256, element size 64);0x2a4through0x350: group flags/type/usage/format/sprite-budget and sprite-usage string tables and enum definitions;0x35cand0x36c: the two one-megabyte tag-data definitions;0x380: bitmap-group field table, terminated at0x4f4;0x500: root block definition (max=1, element size 108);0x530: 96-byte'bitm'tag-group descriptor, version 7, postprocess callback_code_00065240.
The target also owns 137 .rdata COMDAT strings before the function-only
diagnostic/assert strings. Their exact names and payloads are visible in the
January COFF symbol inventory. Reconstruct the .data table with typed
tag_reference_definition, tag_enum_definition, tag_data_definition,
tag_block_definition, and tag_field objects; do not use an opaque byte
array or relocation-forcing casts.
House/Berth audit
- Parameters were one per line.
- No-argument functions would use
voidon its own line inside the parentheses; none of the reconstructed functions was a no-argument function. - Void functions ended in explicit
return;. - One final return was used where January codegen permitted it. The add helper's multiple early returns are a measured codegen-required exception.
- Typed tag-block and bitmap-group accessors were used.
- No unnecessary
__declspec(align(...))or alignment pragma was introduced. - The original program's behavior was preserved; no bug was silently fixed.
Reopen criteria
Reopen the object only when at least one of these becomes available:
- original/local-variable or statement-order provenance for January's
_bitmap_group_add_bitmap; - a real C donor that reproduces the complete early register assignment and validation layout under XDK 3911;
- a newly proven legal-C control for the EDX/ECX live-range assignment or the validation fallthrough, not another declaration-name permutation;
- a complete readable reconstruction of the 1,424-byte tag-definition table that can be gated together with a newly improved function candidate.