rizin/subprojects/rzheap/rz_windows/windows_heap_versions.h
2026-04-10 15:46:11 +08:00

267 lines
6.4 KiB
C

// SPDX-FileCopyrightText: 2026 bubblepipe <bubblepipe42@gmail.com>
// SPDX-License-Identifier: LGPL-3.0-only
#ifndef RZ_WINDOWS_HEAP_VERSIONS_H
#define RZ_WINDOWS_HEAP_VERSIONS_H
#include <rz_types.h>
#define RZ_W10_BUILD_UNKNOWN 0
#define RZ_W10_BUILD_1511 10586 /* 1511, Threshold 2 */
#define RZ_W10_BUILD_1607 14393 /* 1607, Redstone 1 */
#define RZ_W10_BUILD_21H1 19043 /* 21H1 */
#define RZ_NT_HEAP_SIGNATURE 0xffeeffee
#define RZ_SEGMENT_HEAP_SIGNATURE 0xddeeddee
#define RZ_NT_HEAP_ENTRY_BUSY 0x01
#define RZ_NT_HEAP_ENTRY_EXTRA 0x02
#define RZ_NT_HEAP_ENTRY_FILL 0x04
#define RZ_NT_HEAP_ENTRY_VIRTUAL 0x08
#define RZ_NT_HEAP_ENTRY_LAST 0x10
#define RZ_NT_HEAP_ENTRY_SETTABLE 0x20
static inline bool rz_w32_has_stack_trace_init_var(int build) {
return build >= RZ_W10_BUILD_1607;
}
static inline bool rz_w32_has_commit_limit_data(int build) {
return build >= RZ_W10_BUILD_21H1;
}
typedef struct rz_w32_heap_entry_layout_t {
ut32 previous_block_private_data;
ut32 size;
ut32 flags;
ut32 small_tag_index;
ut32 previous_size;
ut32 segment_offset;
ut32 unused_bytes;
ut32 struct_size;
ut32 header_offset;
} RzW32HeapEntryLayout;
typedef struct rz_w32_heap_segment_layout_t {
ut32 entry;
ut32 segment_signature;
ut32 segment_flags;
ut32 segment_list_entry;
ut32 heap_ptr;
ut32 base_address;
ut32 number_of_pages;
ut32 first_entry;
ut32 last_valid_entry;
ut32 struct_size;
} RzW32HeapSegmentLayout;
typedef struct rz_w32_heap_layout_t {
ut32 flags;
ut32 force_flags;
ut32 compatibility_flags;
ut32 encode_flag_mask;
ut32 encoding;
ut32 interceptor;
ut32 virtual_mem_thresh;
ut32 signature;
ut32 virtual_alloc_blocks;
ut32 segment_list;
ut32 front_end_heap;
ut32 front_end_heap_type;
ut32 counters;
ut32 tuning_parameters;
ut32 struct_size;
} RzW32HeapLayout;
static const RzW32HeapEntryLayout rz_w32_heap_entry_layout_64 = {
.previous_block_private_data = 0x00,
.size = 0x08,
.flags = 0x0A,
.small_tag_index = 0x0B,
.previous_size = 0x0C,
.segment_offset = 0x0E,
.unused_bytes = 0x0F,
.struct_size = 16,
.header_offset = 8,
};
static const RzW32HeapEntryLayout rz_w32_heap_entry_layout_32 = {
.previous_block_private_data = 0, /* not present on x86 */
.size = 0x00,
.flags = 0x02,
.small_tag_index = 0x03,
.previous_size = 0x04,
.segment_offset = 0x06,
.unused_bytes = 0x07,
.struct_size = 8,
.header_offset = 0,
};
static inline RzW32HeapEntryLayout rz_w32_get_heap_entry_layout(ut8 ptr_size) {
if (ptr_size == 8) {
return rz_w32_heap_entry_layout_64;
}
return rz_w32_heap_entry_layout_32;
}
static const RzW32HeapSegmentLayout rz_w32_heap_segment_layout_64 = {
.entry = 0x00,
.segment_signature = 0x10,
.segment_flags = 0x14,
.segment_list_entry = 0x18,
.heap_ptr = 0x28,
.base_address = 0x30,
.number_of_pages = 0x38,
.first_entry = 0x40,
.last_valid_entry = 0x48,
.struct_size = 0x70,
};
static const RzW32HeapSegmentLayout rz_w32_heap_segment_layout_32 = {
.entry = 0x00,
.segment_signature = 0x08,
.segment_flags = 0x0C,
.segment_list_entry = 0x10,
.heap_ptr = 0x18,
.base_address = 0x1C,
.number_of_pages = 0x20,
.first_entry = 0x24,
.last_valid_entry = 0x28,
.struct_size = 0x40,
};
static inline RzW32HeapSegmentLayout rz_w32_get_heap_segment_layout(ut8 ptr_size) {
if (ptr_size == 8) {
return rz_w32_heap_segment_layout_64;
}
return rz_w32_heap_segment_layout_32;
}
static const RzW32HeapLayout rz_w32_heap_layout_10586_64 = {
.flags = 0x70,
.force_flags = 0x74,
.compatibility_flags = 0x78,
.encode_flag_mask = 0x7C,
.encoding = 0x80,
.interceptor = 0x90,
.virtual_mem_thresh = 0x94,
.signature = 0x98,
.virtual_alloc_blocks = 0x110,
.segment_list = 0x120,
.front_end_heap = 0x170,
.front_end_heap_type = 0x17A,
.counters = 0x0210,
.tuning_parameters = 0x0288,
.struct_size = 0x0298,
};
static const RzW32HeapLayout rz_w32_heap_layout_10586_32 = {
.flags = 0x40,
.force_flags = 0x44,
.compatibility_flags = 0x48,
.encode_flag_mask = 0x4C,
.encoding = 0x50,
.interceptor = 0x58,
.virtual_mem_thresh = 0x5C,
.signature = 0x60,
.virtual_alloc_blocks = 0x9C,
.segment_list = 0xA4,
.front_end_heap = 0xD0,
.front_end_heap_type = 0xD6,
.counters = 0x01E0,
.tuning_parameters = 0x023C,
.struct_size = 0x0248,
};
static const RzW32HeapLayout rz_w32_heap_layout_14393_64 = {
.flags = 0x70,
.force_flags = 0x74,
.compatibility_flags = 0x78,
.encode_flag_mask = 0x7C,
.encoding = 0x80,
.interceptor = 0x90,
.virtual_mem_thresh = 0x94,
.signature = 0x98,
.virtual_alloc_blocks = 0x110,
.segment_list = 0x120,
.front_end_heap = 0x178,
.front_end_heap_type = 0x0182,
.counters = 0x0218,
.tuning_parameters = 0x0290,
.struct_size = 0x02A0,
};
static const RzW32HeapLayout rz_w32_heap_layout_14393_32 = {
.flags = 0x40,
.force_flags = 0x44,
.compatibility_flags = 0x48,
.encode_flag_mask = 0x4C,
.encoding = 0x50,
.interceptor = 0x58,
.virtual_mem_thresh = 0x5C,
.signature = 0x60,
.virtual_alloc_blocks = 0x9C,
.segment_list = 0xA4,
.front_end_heap = 0xD4,
.front_end_heap_type = 0xDA,
.counters = 0x01E4,
.tuning_parameters = 0x0240,
.struct_size = 0x0248,
};
static const RzW32HeapLayout rz_w32_heap_layout_19043_64 = {
.flags = 0x70,
.force_flags = 0x74,
.compatibility_flags = 0x78,
.encode_flag_mask = 0x7C,
.encoding = 0x80,
.interceptor = 0x90,
.virtual_mem_thresh = 0x94,
.signature = 0x98,
.virtual_alloc_blocks = 0x110,
.segment_list = 0x120,
.front_end_heap = 0x198,
.front_end_heap_type = 0x1A2,
.counters = 0x0238,
.tuning_parameters = 0x02B0,
.struct_size = 0x02C0,
};
static const RzW32HeapLayout rz_w32_heap_layout_19043_32 = {
.flags = 0x40,
.force_flags = 0x44,
.compatibility_flags = 0x48,
.encode_flag_mask = 0x4C,
.encoding = 0x50,
.interceptor = 0x58,
.virtual_mem_thresh = 0x5C,
.signature = 0x60,
.virtual_alloc_blocks = 0x9C,
.segment_list = 0xA4,
.front_end_heap = 0xE4,
.front_end_heap_type = 0xEA,
.counters = 0x01F4,
.tuning_parameters = 0x0250,
.struct_size = 0x0258,
};
static inline RzW32HeapLayout rz_w32_get_heap_layout(int build, ut8 ptr_size) {
if (ptr_size == 8) {
if (build >= RZ_W10_BUILD_21H1) {
return rz_w32_heap_layout_19043_64;
}
if (build >= RZ_W10_BUILD_1607) {
return rz_w32_heap_layout_14393_64;
}
return rz_w32_heap_layout_10586_64;
} else {
if (build >= RZ_W10_BUILD_21H1) {
return rz_w32_heap_layout_19043_32;
}
if (build >= RZ_W10_BUILD_1607) {
return rz_w32_heap_layout_14393_32;
}
return rz_w32_heap_layout_10586_32;
}
}
#endif /* RZ_WINDOWS_HEAP_VERSIONS_H */