void get_d3d9_offsets(struct d3d9_offsets *offsets) { d3d9_info info = {}; bool success = d3d9_init(info); if (success) { uint8_t **vt = *(uint8_t***)info.device; uint8_t *crr = vt[125]; offsets->present = vtable_offset(info.module, info.device, 17); offsets->present_ex = vtable_offset(info.module, info.device, 121); offsets->present_swap = vtable_offset(info.module, info.swap, 3); for (size_t i = 0; i < MAX_FUNC_SCAN_BYTES; i++) { if (pattern_matches(&crr[i])) { #define get_offset(x) *(uint32_t*)&crr[i + x] #ifdef _WIN64 uint32_t off1 = get_offset(3); uint32_t off2 = get_offset(9); #else uint32_t off1 = get_offset(2); uint32_t off2 = get_offset(8); #endif /* check to make sure offsets are within * expected values */ if (off1 > 0xFFFF || off2 > 0xFFFF) break; /* check to make sure offsets actually point * toward expected data */ #ifdef _MSC_VER __try { uint8_t *ptr = (uint8_t*)(info.device); uint8_t *d3d9_ptr = *(uint8_t**)(ptr + off1); if (d3d9_ptr != (uint8_t*)info.d3d9ex) break; BOOL &is_d3d9ex = *(BOOL*)(d3d9_ptr + off2); if (is_d3d9ex != TRUE) break; } __except(EXCEPTION_EXECUTE_HANDLER) { break; } #endif offsets->d3d9_clsoff = off1; offsets->is_d3d9ex_clsoff = off2; break; } } }
void get_d3d9_offsets(struct d3d9_offsets *offsets) { d3d9_info info = {}; bool success = d3d9_init(info); if (success) { offsets->present = vtable_offset(info.module, info.device, 17); offsets->present_ex = vtable_offset(info.module, info.device, 121); offsets->present_swap = vtable_offset(info.module, info.swap, 3); } d3d9_free(info); }
void get_d3d8_offsets(struct d3d8_offsets *offsets) { d3d8_info info = {}; bool success = d3d8_init(info); if (success) { offsets->present = vtable_offset(info.module, info.device, 15); } d3d8_free(info); }