// Reviewed native contract for supported_build::game_sha256 (September 29 2026). // RVA-only code, pdata and unwind bytes are ASLR invariant. This file is a // production compatibility guard, not an extracted asset or runtime dump. #pragma once #include #include #include #include namespace dingosdk::game::build::v20260929::morph_memory_pool { template consteval auto hex_bytes(const char (&hex)[N]) { static_assert(N % 2 == 1); std::array result{}; const auto nibble = [](char c) -> unsigned { if (c >= '0' && c <= '9') return static_cast(c - '0'); if (c >= 'a' && c <= 'f') return static_cast(c - 'a' + 10); throw "Invalid morph contract hex"; }; for (std::size_t i = 0; i < result.size(); ++i) result[i] = static_cast((nibble(hex[i * 2]) << 4) | nibble(hex[i * 2 + 1])); return result; } // SHA256 9d5371d7d80da2418e82d14fdc28bf77e0d1c26c03ea34a9249e8b4759f2710d inline constexpr auto constructor = hex_bytes( "48895c2408574883ec30488d05670c7804488bf9488901488d415848c7410800000000c5fc1002c5fc11411048894150" "ba0100000048894138448bc2488941304883c0404889414048c74148000000004881c198000000c5f877e8616527024c" "8bcf48c7442420000000004c8d05ee810000488d15c7810000488d8f98000000e85ba427024533c0488d8f98000000ba" "01000000e827c927024c8b4718488d8f98000000ba07000000e812c92702488b5c2440488bc74883c4305fc3"); // SHA256 255be1a04afcfe7c13c7a2f7e327246e06d702a914c8255c889b101daf7dd580 inline constexpr auto constructor_pdata_0 = hex_bytes( "8015b2013c16b20160b1ab06"); // SHA256 95a10c6d2d751622a4535e1f8c8bdca6a784f9865cf0e1039457f8b7b56c3dae inline constexpr auto constructor_unwind_0 = hex_bytes( "010a04000a3408000a520670"); // SHA256 607fea135c302789e7f2deae98ebdd6d31f38e5a44c945694896bc8ed3d300c8 inline constexpr auto morph_initializer = hex_bytes( "48895c2408574881eca0000000488b1d74a59705488d05cd2b790448890546589a05488d05d72b790448890548589a05" "488d05e12b79044889054a589a0548890553589a05e8d6106ffe33ff84c00f8599010000488b054d5e9a054885c0751a" "488b0d194897054c8d053a5e9a05488d1553539a05e8c68adcff486348284c8d15f7f45504488d15d42a790448890d3d" "589a054889150e589a054533c94c89151c589a054533c0893d03589a05c705fd579a050200000048893dfa579a054889" "3d03589a054863402048891508589a05498bd248894c2420488d4c2450893dfd579a05c705f7579a050200000048893d" "f4579a054c8915f5579a0548893df6579a05488905f7579a05e8028ea8ff488b05bb579a05b920150000488b15f7887e" "05488b1d60a497054889442468c644247001e859f4a6ff4885c074194c8bc3488d542450488bc8e8248da8ff48890575" "579a05eb0748893d6c579a0548393d95579a057571488b0594579a05488d4c2450488b1578579a054533c94533c04889" "442420e8888da8ff488b0571579a05b920150000488b157d887e05488b1de6a397054889442468c644247001e8dff3a6" "ff4885c074194c8bc3488d542450488bc8e8aa8ca8ff4889052b579a05eb0748893d22579a05c605c3569a0501488d1d" "f4569a05488d05bd569a05eb03488bc348891d69569a0548891d82569a05488b1da35c9a0548890564569a054889057d" "569a054885db751d488b0d614697054c8d05825c9a05488d159b519a05e80e89dcff488bd8488b0d34569a05488b151d" "569a0548894c243048c74424380000010048634b3448894c2440b9700c0000c644244801e827f3a6ff4885c0740f488d" "542430488bc8e8a52e0100eb03488bc7488b15d9559a05b9700c000048890595569a05488b05d6559a05488944243048" "63432c4889442440c644244801e8def2a6ff4885c07425488d542430488bc8e85c2e010048890555569a05488b9c24b0" "0000004881c4a00000005fc3488b9c24b000000048893d35569a054881c4a00000005fc3"); // SHA256 33d299717f4325f4df48939844e7c9a58b871e085d43ee6c8e515846d718f903 inline constexpr auto morph_initializer_pdata_0 = hex_bytes( "60e4b00154e7b001fcc5ac06"); // SHA256 0805341631737f6e131b8ceadb7b0046158c75a5a77488732dd00253aff37e9f inline constexpr auto morph_initializer_unwind_0 = hex_bytes( "010d05000d3416000d01140006700000"); // SHA256 b0d0e53c6708473c5c8aaaef4e3d8ed0a497990f86a70011d80d572beb784cf9 inline constexpr auto pool_allocate = hex_bytes( "40535556574154415641574883ec304d8be14d8bf84c8bf2488be90f1f440000488b4508a83f751b0f1f840000000000" "488bd04883ca3ff0480fb155087418a83f74ed41b801000000488d4d08488bd0e87b38a6ffebc94c8b4518488d8d9800" "00004533c9c744242004000000498bd7e88b852702488bf84885c07525488bcde81bfbffff4c8b4518488d8d98000000" "4533c9897c2420498bd7e861852702488bf848c7c2c1fffffff0480fc155084883c2c148f7c280ffffff7409488d4d08" "e84b73a6ff4d8bcf4c8bc7488bd5498bcee8eab53102498bd4498bcee8af5c6dfe498bc64883c430415f415e415c5f5e" "5d5bc3"); // SHA256 bec574e7df6885128b3496a7f3996084aae42ba123a546d9026f0e411eee822d inline constexpr auto pool_allocate_pdata_0 = hex_bytes( "a038b2019339b201c4daab06"); // SHA256 eb3d1b62e666c6777ab6187669de7911588d02064dc5bd980db5d82be559a7f5 inline constexpr auto pool_allocate_unwind_0 = hex_bytes( "010f08000f520bf009e007c00570046003500230"); // SHA256 82090f22003a26a5baa782117422d2b7d01692808a90ccb4ed3a3a6533f856f7 inline constexpr auto pool_grow = hex_bytes( "4053555741554883ec68488b4120488bf948894424384533ed488b411848894424400fb64128488b4938488be9884424" "48482b6f30488d05b4ed770448c1fd03c74424303000000066c744244a01004c896c2458c6442449014889442450483b" "4f407310488d4108488947384c8929e9130100004889b424980000004c89a424a00000004c89b424a80000004c897c24" "6085ed741f81fdffffff7f73108d346d0000000085f675114d8bfdeb2cbeffffffffeb05be010000008bd6488d4f4848" "c1e2034533c941b80800000044896c2420e80a1ebf004c8bf88bcd4d8bc74d892ccf4c8b4f38488b4f30493bc9741790" "488b114c89294883c1084989104983c008493bc975ea4c8b77384d8d6008488b5f30493bde7417488b0b4885c9740648" "8b01ff50084883c308493bde75e9488b57304c8bb424a80000004885d27421483b5750488d4f4874174c8b47404c2bc2" "49c1f803458bc049c1e003e8c01dbf008bc6488bb424980000004c897f304c8967384c8ba424a0000000498d0cc74c8b" "7c246048894f40488b0d4258bc05488b5f38488b01ff50604c8d43f8488bc8488d5424304c8b0841ff91880000004c8b" "4720488d8f9800000089ac24900000004533c94489ac2494000000488b84249000000048c1e8208bd548c1e220480bd0" "4c896c242048b80000000000000080480bd0e8894b27024883c468415d5f5d5bc3"); // SHA256 1c0c2e6a97b2eaa9f4277e4648cb8abaae51541b07b177b6476cd4c8ad80bcb3 inline constexpr auto pool_grow_pdata_0 = hex_bytes( "4034b201b434b201b855c606"); // SHA256 38605cfc6c0a2eae2275b9f0d12567636ffb9468d1da3e3d3f7489b0cc42b396 inline constexpr auto pool_grow_unwind_0 = hex_bytes( "010a05000ac206d00470035002300000"); // SHA256 c9e7811d183bf2c809fd4bda01f0ed59e8aa1ea13f8e25bf08700b9c43f85111 inline constexpr auto pool_grow_pdata_1 = hex_bytes( "b434b201c434b201c855c606"); // SHA256 bf698f75148e8b8d93cbee934ca4e804af2b8975b04e04bf4a1428d6f35f49d2 inline constexpr auto pool_grow_unwind_1 = hex_bytes( "2110040010c41400086413004034b201b434b201b855c606"); // SHA256 3e4df33dc716181ae3129bc7911ccd84ce6015430f4a3904ed2ed0c4fdb45f90 inline constexpr auto pool_grow_pdata_2 = hex_bytes( "c434b2017f35b201e055c606"); // SHA256 e16c924644dc1dc90eb3c68bc8a8e63ad65b1205c98cef8ea1cc7c91993ba4ac inline constexpr auto pool_grow_unwind_2 = hex_bytes( "210d04000df40c0008e41500b434b201c434b201c855c606"); // SHA256 640c455ecd23d4077cab2e987610fe1300b6bb2fb999527e2f673b48a6b632f2 inline constexpr auto pool_grow_pdata_3 = hex_bytes( "7f35b201c735b201f855c606"); // SHA256 ec4f597441944f311d301422061c2555e58e09b218f06ebc005204950a947e43 inline constexpr auto pool_grow_unwind_3 = hex_bytes( "2100020000f40c00b434b201c434b201c855c606"); // SHA256 15353f67825a571676015f7940054e1c25ce0aeae9ecfb06285cc1eb34d380ea inline constexpr auto pool_grow_pdata_4 = hex_bytes( "c735b2014136b2010c56c606"); // SHA256 18eed2b26ab659cfce6633d49c6818a9fba7bfc7c56d340924c23e259b1bc9e1 inline constexpr auto pool_grow_unwind_4 = hex_bytes( "210000004034b201b434b201b855c606"); // SHA256 bac5adde31da1384fc6b409a92d261a7112fb4c46d0824eb78b078cc54c08129 inline constexpr auto pool_map_heap_offset = hex_bytes( "40535556574883ec28498be8488bfa488bf1488b460848a980ffffff75660fb6d080e23f80fa3e735b488d4801f0480f" "b14e0875e1488b4630488bcd48c1e92048c7c2ffffffff0fbaf11f488b0cc88bc54889470848890ff0480fc1560848ff" "caf6c23f751248f7c280ffffff7409488d4e08e8483aa6ff488bc74883c4285f5e5d5bc34533c0488d4e08488bd0e8ed" "fea5ffe97affffff"); // SHA256 a45a521d57a2ff5732f925598412e0ab324d4e138c224bfecce8b955ce76acbf inline constexpr auto pool_map_heap_offset_pdata_0 = hex_bytes( "f071b2018872b20120b6ab06"); // SHA256 f28ccee9e54971753b66d1ea62e19a750e5b147360135aca2e5cffe13c1c86eb inline constexpr auto pool_map_heap_offset_unwind_0 = hex_bytes( "01090500094205700460035002300000"); // SHA256 4896d783b760dae884dfc92ca9df2a19f00420d05a6fd73b6e44d0ca1a2d5b90 inline constexpr auto temporary_field_name = hex_bytes( "54656d7052656e6465724d656d6f7279506f6f6c457874656e6453697a6500"); // SHA256 6705479ca5b564ada2ee65fc0f3fa22b5a5e0ce0014c88ccb697eca29df61f15 inline constexpr auto pool_debug_name = hex_bytes( "44696e676f4d6f7270684d656d6f7279506f6f6c00"); // SHA256 73eb8b851694db818e5f16ae4ce8afedba597e738d78c82e7cdb5d3923e71dfd inline constexpr auto settings_constructor = hex_bytes( "40534883ec20488bd9e8528f0004488d05fbef7a04c7432000008002488903488bc3c7432400008000c7432800008002" "c7432c00000001c7433000008000c743340000a0004883c4205bc3"); struct Contract { std::uintptr_t rva; std::span bytes; }; inline constexpr Contract contracts[]{ {0x01b21580, constructor}, {0x08d926c4, constructor_pdata_0}, {0x06abb160, constructor_unwind_0}, {0x01b0e460, morph_initializer}, {0x08d91260, morph_initializer_pdata_0}, {0x06acc5fc, morph_initializer_unwind_0}, {0x01b238a0, pool_allocate}, {0x08d929dc, pool_allocate_pdata_0}, {0x06abdac4, pool_allocate_unwind_0}, {0x01b23440, pool_grow}, {0x08d92970, pool_grow_pdata_0}, {0x06c655b8, pool_grow_unwind_0}, {0x08d9297c, pool_grow_pdata_1}, {0x06c655c8, pool_grow_unwind_1}, {0x08d92988, pool_grow_pdata_2}, {0x06c655e0, pool_grow_unwind_2}, {0x08d92994, pool_grow_pdata_3}, {0x06c655f8, pool_grow_unwind_3}, {0x08d929a0, pool_grow_pdata_4}, {0x06c6560c, pool_grow_unwind_4}, {0x01b271f0, pool_map_heap_offset}, {0x08d92cc4, pool_map_heap_offset_pdata_0}, {0x06abb620, pool_map_heap_offset_unwind_0}, {0x0629fcc0, temporary_field_name}, {0x062a2230, pool_debug_name}, {0x01af1dc0, settings_constructor}, }; inline constexpr std::size_t max_contract_size = [] { std::size_t size = 0; for (const auto& contract : contracts) size = contract.bytes.size() > size ? contract.bytes.size() : size; return size; }(); // Morph heap constructor hooked to raise the render heap capacity. inline constexpr std::uintptr_t constructor_rva = 0x01b21580; // Return addresses of the temporary and permanent morph heap constructions. inline constexpr std::uintptr_t temporary_return = 0x01b0e724; inline constexpr std::uintptr_t permanent_return = 0x01b0e6db; // Globals holding the temporary and permanent morph pools (null until built). inline constexpr std::uintptr_t temporary_pool = 0x074b3d80; inline constexpr std::uintptr_t permanent_pool = 0x074b3d88; } // namespace dingosdk::game::build::v20260929::morph_memory_pool