1#ifndef DTTR_SDK_ENABLE_UNSTABLE
2#define DTTR_SDK_ENABLE_UNSTABLE
39 return "invalid argument";
41 return "unresolved symbol";
45 return "unknown entry kind";
47 return "decode unsupported";
49 return "bounds invalid";
51 return "unknown status";
72 if (!entry || !out_entry || !out_size || toc_index < 0) {
91 *out_size = entry->
size;
121 if (!out_entries || !out_count) {
133 *out_count = requested_count;
137 uintptr_t pkg_load_entry_addr = 0;
147 uint32_t toc_addr = 0;
148 const uintptr_t toc_operand_addr = pkg_load_entry_addr
150 memcpy(&toc_addr, (
const void *)toc_operand_addr,
sizeof(toc_addr));
156 *out_count = requested_count;
164 void *visitor_userdata,
183 const void *loaded_entry_base,
184 size_t loaded_entry_size,
234 void *visitor_userdata,
246 loaded_visit->
depth + 1,
255 action =
emit_visit(result, visitor, visitor_userdata, &unsupported_visit);
285 uint32_t toc_count = 0;
296 for (uint32_t i = 0; i < toc_count; ++i) {
313 toc_action =
emit_visit(&result, visitor, userdata, &toc_visit);
326 size_t loaded_size = 0;
358 failed_action =
emit_visit(&result, visitor, userdata, &failed_visit);
384 loaded_action =
emit_visit(&result, visitor, userdata, &loaded_visit);
388 free_entry(
ctx, (int32_t)i, toc_entry, loaded, options->
io_userdata);
394 free_entry(
ctx, (int32_t)i, toc_entry, loaded, options->
io_userdata);
398 free_entry(
ctx, (int32_t)i, toc_entry, loaded, options->
io_userdata);
DTTR_Graphics_COM_Direct3DDevice7 DWORD block DTTR_Graphics_COM_Direct3DDevice7 DWORD block DTTR_Graphics_COM_Direct3DDevice7 void void void void DWORD f BOOL
DTTR_Graphics_COM_Direct3DDevice7 DWORD block DTTR_Graphics_COM_Direct3DDevice7 DWORD block DTTR_Graphics_COM_Direct3DDevice7 void void void void DWORD f FALSE
DTTR_Graphics_COM_DirectDrawSurface7 DWORD flags void NULL
DTTR_PCDOGS_API const struct dttr_pcdogs_function_accessor_PKG_LoadEntry *const DTTR_PCDOGS_F_PKG_LoadEntry
Accessor object for PKG_LoadEntry.
@ DTTR_PCDOGS_FUNCTION_PKG_LOAD_ENTRY
Not yet documented.
DTTR_PCDOGS_API const struct dttr_pcdogs_function_accessor_PKG_FreeResourceData *const DTTR_PCDOGS_F_PKG_FreeResourceData
Accessor object for PKG_FreeResourceData.
bool DTTR_ResultOK(DTTR_Result result)
DTTR_Util_PkgVisitAction(* DTTR_Util_PkgVisitor)(const DTTR_Util_PkgVisit *visit, void *userdata)
DTTR_Util_PkgVisitKind
Object kind reported to a package visitor.
@ DTTR_UTIL_PKG_VISIT_TOC_ENTRY
@ DTTR_UTIL_PKG_VISIT_LOADED_ENTRY
@ DTTR_UTIL_PKG_VISIT_UNSUPPORTED
DTTR_Util_PkgVisitAction
Visitor return value controlling traversal below the current visit.
@ DTTR_UTIL_PKG_VISIT_LOAD_AND_RECURSE
@ DTTR_UTIL_PKG_VISIT_RECURSE
@ DTTR_UTIL_PKG_VISIT_SKIP_SUBTREE
@ DTTR_UTIL_PKG_VISIT_STOP
@ DTTR_UTIL_PKG_VISIT_CONTINUE
bool(* DTTR_Util_PkgLoadEntryFn)(const DTTR_Core_Context *ctx, int32_t toc_index, const DTTR_PCDOGS_T_PKG_TOCEntry *entry, void *userdata, void **out_entry, size_t *out_size, DTTR_Util_PkgVisitStatus *out_status)
#define DTTR_UTIL_PKG_DEFAULT_TOC_COUNT
@ DTTR_UTIL_PKG_DOMAIN_ALL_KNOWN
@ DTTR_UTIL_PKG_DOMAIN_TOC
@ DTTR_UTIL_PKG_DOMAIN_ENTRY
@ DTTR_UTIL_PKG_DOMAIN_KNOWN_CHILDREN
void(* DTTR_Util_PkgFreeEntryFn)(const DTTR_Core_Context *ctx, int32_t toc_index, const DTTR_PCDOGS_T_PKG_TOCEntry *entry, void *entry_data, void *userdata)
DTTR_Util_PkgVisitStatus
Per-visit and whole-walk status values.
@ DTTR_UTIL_PKG_STATUS_UNRESOLVED_SYMBOL
@ DTTR_UTIL_PKG_STATUS_OK
@ DTTR_UTIL_PKG_STATUS_INVALID_ARGUMENT
@ DTTR_UTIL_PKG_STATUS_LOAD_FAILED
@ DTTR_UTIL_PKG_STATUS_DECODE_UNSUPPORTED
@ DTTR_UTIL_PKG_STATUS_UNKNOWN_ENTRY_KIND
@ DTTR_UTIL_PKG_STATUS_BOUNDS_INVALID
DTTR_Result DTTR_PCDOGS_FunctionResolve(const DTTR_Core_Context *ctx, DTTR_PCDOGS_T_Function_ID id, uintptr_t *out_addr)
Package TOC entry used by the package table. Size-lane aliases share this storage.
uint32_t offset
Offset 0x0.
A single callback frame. Pointers are visit-lifetime unless documented by PCDOGS.
DTTR_Util_PkgVisitKind kind
const void * loaded_entry_base
const DTTR_Util_PkgVisit * parent
DTTR_Util_PkgVisitStatus status
const DTTR_PCDOGS_T_PKG_TOCEntry * toc_entry
Walker configuration. Use DTTR_Util_PkgWalk_DefaultOptions() for defaults.
const DTTR_PCDOGS_T_PKG_TOCEntry * toc_entries
DTTR_Util_PkgLoadEntryFn load_entry
DTTR_Util_PkgFreeEntryFn free_entry
Aggregate walk result. Non-fatal per-entry failures keep traversal moving.
DTTR_Util_PkgVisitStatus status
static bool should_load(const DTTR_Util_PkgWalkOptions *options, DTTR_Util_PkgVisitAction action)
const char * DTTR_Util_PkgVisitStatusName(DTTR_Util_PkgVisitStatus status)
static bool emit_decode_boundary(DTTR_Util_PkgWalkResult *result, const DTTR_Util_PkgWalkOptions *options, DTTR_Util_PkgVisitor visitor, void *visitor_userdata, const DTTR_Util_PkgVisit *loaded_visit)
static bool default_load_entry(const DTTR_Core_Context *ctx, int32_t toc_index, const DTTR_PCDOGS_T_PKG_TOCEntry *entry, void *userdata, void **out_entry, size_t *out_size, DTTR_Util_PkgVisitStatus *out_status)
DTTR_Util_PkgWalkOptions DTTR_Util_PkgWalk_DefaultOptions()
static bool should_recurse(DTTR_Util_PkgVisitAction action)
DTTR_Util_PkgWalkResult DTTR_Util_PkgWalk(const DTTR_Core_Context *ctx, const DTTR_Util_PkgWalkOptions *options, DTTR_Util_PkgVisitor visitor, void *userdata)
static DTTR_Util_PkgVisitAction emit_visit(DTTR_Util_PkgWalkResult *result, DTTR_Util_PkgVisitor visitor, void *visitor_userdata, const DTTR_Util_PkgVisit *visit)
static void default_free_entry(const DTTR_Core_Context *ctx, int32_t toc_index, const DTTR_PCDOGS_T_PKG_TOCEntry *entry, void *entry_data, void *userdata)
static bool resolve_toc(const DTTR_Core_Context *ctx, const DTTR_Util_PkgWalkOptions *options, const DTTR_PCDOGS_T_PKG_TOCEntry **out_entries, uint32_t *out_count)
static DTTR_Util_PkgVisit make_visit(const DTTR_Util_PkgWalkOptions *options, DTTR_Util_PkgVisitKind kind, DTTR_Util_PkgVisitStatus status, uint32_t depth, int32_t toc_index, const DTTR_PCDOGS_T_PKG_TOCEntry *toc_entry, const void *ptr, const void *loaded_entry_base, size_t loaded_entry_size, const DTTR_Util_PkgVisit *parent)
static DTTR_Util_PkgWalkResult make_result(DTTR_Util_PkgVisitStatus status)
@ PKG_LOAD_ENTRY_TOC_OPERAND_OFFSET