7static const uint8_t
PATCH_FTOL_X[] = {0xD9, 0x1F, 0x90, 0x90, 0x90};
8static const uint8_t
PATCH_NOP4[] = {0x90, 0x90, 0x90, 0x90};
9static const uint8_t
PATCH_FTOL_Y[] = {0xD9, 0x5D, 0x00, 0x90, 0x90};
24#define SIDECAR_JMP_HOOK_TARGET(NAME, SIG, MASK, REQUIRED) \
27 (const uint8_t *)(SIG), \
35#define SIDECAR_BYTE_PATCH_TARGET(NAME, SIG, MASK, OFFSET, PATCH, ORIGINAL, ORIGINAL_MASK) \
39 (const uint8_t *)(SIG), \
41 DTTR_TEST_PCDOGS_REQUIRED_ALL, \
52 "\x83\xEC\x40\x53\x8B\x5C\x24",
57 "dttr_hook_resolve_pcdogs_path",
58 "\x51\x8D\x44\x24?\x57",
63 "dttr_inputs_hook_dinput_poll",
64 "\x56\x8B\x74\x24?\x56\x8B\x06",
69 "dttr_hook_precision_fast_path",
70 "\x83\xF8?\x7C?\xD9\x43?\xD8\x1D????\xDF\xE0\xF6\xC4\x41\x0F????",
71 "xx?x?xx?xx????xxxxxx????",
78 "dttr_hook_precision_batch_limit_a",
79 "\x8B\x08\xEB?\xA1????\x8B\x0D????\x3B\xC1",
87 "dttr_hook_precision_batch_limit_b",
88 "\x83\xC1\x14\x4E\x75?\xA1????\x8B\x0D????\x3B\xC1",
89 "xxxxx?x????xx????xx",
96 "dttr_hook_precision_ftol_x",
97 "\xDB\x44\x24\x30\xD9\x1F",
105 "dttr_hook_precision_mov_x",
106 "\xDB\x44\x24\x30\xD9\x1F",
114 "dttr_hook_precision_fstp2_x",
115 "\x8D\xAE????\xDB\x44\x24\x30\xD9\x1F",
123 "dttr_hook_precision_fild_x",
124 "\x8D\xAE????\xDB\x44\x24\x30",
132 "dttr_hook_precision_ftol_y",
133 "\x8B\x54\x24\x18\x89\x44\x24\x30",
141 "dttr_hook_precision_mov_y",
142 "\x8B\x54\x24\x18\x89\x44\x24\x30",
150 "dttr_hook_precision_fstp2_y",
151 "\x83\xC0\x14\x50\x55\xD9\x5D\x00",
159 "dttr_hook_precision_fild_y",
160 "\x52\xDB\x44\x24\x34",
168 "dttr_hook_render_quad_snap",
169 "\x53\x8B\x5C\x24\x14\x55\x33\xC9\x56\x57\x85\xDB",
186 "_AIL_allocate_sample_handle@4",
187 "_AIL_close_stream@4",
189 "_AIL_get_preference@4",
190 "_AIL_init_sample@4",
191 "_AIL_open_stream@12",
192 "_AIL_pause_stream@8",
193 "_AIL_release_sample_handle@4",
194 "_AIL_sample_playback_rate@4",
195 "_AIL_sample_status@4",
196 "_AIL_set_digital_master_volume@8",
197 "_AIL_set_preference@8",
198 "_AIL_set_sample_file@12",
199 "_AIL_set_sample_loop_count@8",
200 "_AIL_set_sample_pan@8",
201 "_AIL_set_sample_playback_rate@8",
202 "_AIL_set_sample_volume@8",
203 "_AIL_set_stream_loop_count@8",
204 "_AIL_set_stream_volume@8",
206 "_AIL_start_sample@4",
207 "_AIL_start_stream@4",
209 "_AIL_stop_sample@4",
210 "_AIL_stream_status@4",
211 "_AIL_waveOutClose@4",
212 "_AIL_waveOutOpen@16",
225 size_t fixture_index,
226 const DTTR_TestBinaryFixture *fixture,
228 const DTTR_TestPEImage *image,
280 size_t fixture_index,
281 const DTTR_TestBinaryFixture *fixture,
283 const DTTR_TestPEImage *image,
293 size_t mss32_count = 0;
295 for (
size_t i = 0; i < import_count; i++) {
296 const DTTR_TestImportEntry *entry = &imports[i];
306 "unhandled MSS32 import in %s (%s): %s",
313 assert_true(entry->iat_site != 0);
void dttr_test_assert_target_resolved(const DTTR_TestBinaryFixture *fixture, const DTTR_TestTargetExpectation *target, const DTTR_TestPEImage *image)
bool dttr_test_case_equal(const char *a, const char *b)
bool dttr_test_fixture_required(DTTR_TestFixtureMask required, size_t fixture_index)
const DTTR_BackendState * state
DTTR_Graphics_COM_DirectDrawSurface7 DWORD flags void NULL
DTTR_Graphics_COM_DirectDrawSurface7 DWORD DWORD void void DWORD flags DTTR_Graphics_COM_DirectDrawSurface7 void void *cb void * target
static const DTTR_TestCase TEST_CASES[]
#define DTTR_TEST_PCDOGS_REQUIRED_ALL
#define TARGET_BYTE_PATCH
#define DTTR_TEST_PCDOGS_IMPORT_CAP
#define DTTR_TEST_PCDOGS_REQUIRED_EU_SC
const size_t DTTR_TEST_PCDOGS_SIDECAR_MSS_IMPORT_HOOK_COUNT
const char *const DTTR_TEST_PCDOGS_SIDECAR_MSS_IMPORT_HOOKS[]
const pcdogs_target_expectation DTTR_TEST_PCDOGS_SIDECAR_TARGETS[]
static size_t pcdogs_collect_imports(const DTTR_TestPEImage *image, DTTR_TestImportEntry *imports, size_t imports_cap)
Collect fixture imports for tests that validate recovered sidecar targets.
DTTR_TestTargetKind E_TargetKind
bool pcdogs_fixtures_available()
Report whether all PCDOGS binary fixtures are available for signature tests.
bool pcdogs_for_each_fixture(DTTR_TestPEFixtureVisitor visitor, void *userdata)
Visit each available PCDOGS fixture image for signature and ABI checks.
DTTR_TestTargetExpectation pcdogs_target_expectation
const size_t DTTR_TEST_PCDOGS_SIDECAR_TARGET_COUNT
static void dttr_test_require_available(bool available)
#define DTTR_TEST_MAIN(TESTS)
static const uint8_t ORIGINAL_FILD_X[]
static const uint8_t PATCH_FAST_PATH[]
static const uint8_t ORIGINAL_FILD_Y[]
static const uint8_t PATCH_NOP3[]
#define SIDECAR_JMP_HOOK_TARGET(NAME, SIG, MASK, REQUIRED)
static const uint8_t ORIGINAL_PUSH_EBX[]
static const uint8_t ORIGINAL_BATCH_LIMIT_B[]
static bool assert_targets_for_fixture(size_t fixture_index, const DTTR_TestBinaryFixture *fixture, const char *path, const DTTR_TestPEImage *image, void *userdata)
static const uint8_t ORIGINAL_BATCH_LIMIT_A[]
static const uint8_t ORIGINAL_FAST_PATH[]
static const uint8_t PATCH_FTOL_Y[]
static bool assert_imports_for_fixture(size_t fixture_index, const DTTR_TestBinaryFixture *fixture, const char *path, const DTTR_TestPEImage *image, void *userdata)
static const uint8_t ORIGINAL_FSTP_Y[]
static const uint8_t ORIGINAL_FTOL_CALL[]
static void test_expected_pcdogs_jmp_hook_targets_resolve(void **state)
static const uint8_t PATCH_NOP4[]
static const uint8_t PATCH_FTOL_X[]
static void test_expected_pcdogs_byte_patch_targets_resolve(void **state)
static const uint8_t PATCH_RET[]
static const uint8_t ORIGINAL_FSTP_X[]
static const uint8_t ORIGINAL_MOV_XY[]
static bool import_hook_expected(const char *name)
static void test_targets_matching(E_TargetKind kind)
static void test_expected_mss32_imports_are_hooked(void **state)
#define SIDECAR_BYTE_PATCH_TARGET(NAME, SIG, MASK, OFFSET, PATCH, ORIGINAL, ORIGINAL_MASK)
static const uint8_t PATCH_NOP2[]