diff options
author | Yifan Lu | 2016-10-09 13:28:59 -0700 |
---|---|---|
committer | Yifan Lu | 2016-10-09 13:30:03 -0700 |
commit | 5ae0711de4b899b99685d7703b7f2fe9e6848341 (patch) | |
tree | 955bbb0d516187b9b153cd48fa1b1f13d9f74e08 /lib | |
parent | Added basic hook removal support (diff) | |
download | substitute-5ae0711de4b899b99685d7703b7f2fe9e6848341.tar.gz |
Getting the mirror address from Vita exec slab
Diffstat (limited to 'lib')
-rwxr-xr-x | lib/vita/slab.c | 13 | ||||
-rwxr-xr-x | lib/vita/slab.h | 1 |
2 files changed, 14 insertions, 0 deletions
diff --git a/lib/vita/slab.c b/lib/vita/slab.c index 91742a6..0884e5f 100755 --- a/lib/vita/slab.c +++ b/lib/vita/slab.c @@ -298,6 +298,19 @@ void slab_free(struct slab_chain *const sch, const void *const addr) } } +uintptr_t slab_getmirror(struct slab_chain *const sch, const void *const addr) +{ + assert(sch != NULL); + assert(slab_is_valid(sch)); + assert(addr != NULL); + + struct slab_header *const slab = (void *) + ((uintptr_t) addr & sch->alignment_mask); + + + return slab->exe_data + (ptrdiff_t)((char *) addr - (char *) slab); +} + void slab_traverse(const struct slab_chain *const sch, void (*fn)(const void *)) { assert(sch != NULL); diff --git a/lib/vita/slab.h b/lib/vita/slab.h index c8c5d9b..153c008 100755 --- a/lib/vita/slab.h +++ b/lib/vita/slab.h @@ -35,5 +35,6 @@ struct slab_chain { void slab_init(struct slab_chain *, size_t, SceUID); void *slab_alloc(struct slab_chain *, uintptr_t *); void slab_free(struct slab_chain *, const void *); +uintptr_t slab_getmirror(struct slab_chain *, const void *); void slab_traverse(const struct slab_chain *, void (*)(const void *)); void slab_destroy(const struct slab_chain *); |