Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=55842
The bug blames commit 059094c1c18ddc33b04eac53a72fd0eb7510be94 ("ntdll: Define heap block's BLOCK_FLAG_LFH as 0x80.") but actually before the blamed commit that worked essentially by chance.
The problem the patch is solving is that RtlValidateHeap() currently always fails for LFH blocks allocated from large block memory (vs subheap blocks). That can happen for large enough LFH block sizes. In case of the regressed game the user of RtlValidateHeap() is msvcr80.msvcrt_heap_free() which uses HeapValidate() to guess the heap used to allocate the pointer to free. I am attaching a standalone test program which can be used to reproduce the problem without the patch.
[test_lfh_validate.c](/uploads/006b04a9a00ffb7949956b66a275d5cf/test_lfh_validate.c)
--
v3: ntdll: Fix pending free block validation in heap_validate() for LFH blocks.
ntdll: Handle LFH blocks allocated in large blocks in heap_validate_ptr().
https://gitlab.winehq.org/wine/wine/-/merge_requests/4232
--
v8: vkd3d-shader/dxil: Implement the DXIL BINOP instruction.
vkd3d-shader/spirv: Support VKD3D_DATA_UINT in spirv_compiler_emit_neg().
vkd3d-shader/spirv: Handle the UMUL instruction.
vkd3d-shader/spirv: Introduce an IDIV instruction.
vkd3d-shader/spirv: Introduce an FREM instruction.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/409
This requires !423.
--
v3: gitlab: Expect builds to always succeed, even when tests are allowed to fail.
include: Import vkd3d_d3dcompiler.h instead of redefining D3D_BLOB_PART.
ci: Make the MoltenVK logging less verbose.
vkd3d-shader: Explicitly cast vkd3d_shader_global_flags to uint64_t.
ci: Allow the artifact copy to fail.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/445