Skip to content

Addresses

addresses.csv (and the same rows in addresses.json) lists 354 of the EP147 addresses the AZ-MODS core uses, one row each:

Column Meaning
name the name the core's source gives the address, if any
v130, v200 the address on each build (tags in Reference)
kind function, vtable, data (writable), rodata (read-only tables, images, strings), mid-function
class the C++ class, for a vtable whose class the core names
meaning the core's one-line comment, when it has one that stands on its own
core_hook yes if the core hooks it, so claim_hook refuses it

Totals: 213 functions, 102 vtables, 26 read-only and 4 writable data addresses, 9 mid-function addresses; 97 are hooked by the core.

Using a row

Put both builds' values in your per-firmware table, the shape Hooks and firmware tags describes:

struct fw_addrs {
    const char *tag;
    uintptr_t   some_fn;        /* what you hook on this firmware */
};

static const struct fw_addrs FW[] = {
    { "ep147-79d43e5de779fc1b", 0x1f5da20 },   /* gui::BpmState::BpmState(self, int deck), 1.30 */
    { "ep147-9e9454e357389ece", 0x20c9d90 },   /* the same function, 2.00 */
};

That example is hooked by the core (core_hook = yes), so a claim on it is refused; it shows the shape, not a target. Before claiming any address, check its first instructions as Reading the program describes.

Vtables

A vtable row is the address a constructed object's first word holds (the "address point", past the offset-to-top and type_info words). Checking an object's first word against it is how the core confirms an object is what it expects before it reads a field. To call or hook a virtual function, read the slot at vtable + 8 * index.

Finding a function that is not here

The map only covers what the core needed. For anything else, see Reading the program: start from a vtable or a string here and walk outward.