support for hotpatching to restore ADV patch support

This commit is contained in:
Ondřej Novák 2025-03-25 19:47:01 +01:00
parent 2be7f5d2b2
commit 04b57b4088
14 changed files with 168 additions and 278 deletions

View file

@ -18,7 +18,7 @@ extern "C" {
* @param size source size - you need to write own size if data has been converted
* @param pointer either to src or newly allocated block with replacement (must be allocated by malloc)
*/
typedef const void *(*ABLOCK_DECODEPROC)(const void *src, int32_t *size);
typedef const void *(*ABLOCK_DECODEPROC)(const void *src, int32_t *size, int handle);
#define freemem(size) free(size);
@ -42,14 +42,15 @@ typedef struct meminfo {
typedef struct thandle_data
{
char src_file[16]; //12
int32_t seekpos; //16
const void *blockdata; //20
char flags; //21
uint8_t path; //22
char src_file[16];
uint32_t offset;
const void *blockdata;
unsigned char src_index;
char flags;
uint8_t path;
short status;
ABLOCK_DECODEPROC loadproc;
unsigned short lockcount; //32
unsigned short lockcount;
uint32_t counter;
uint32_t size;
}THANDLE_DATA;
@ -77,20 +78,17 @@ typedef handle_list *handle_groups[BK_MAJOR_HANDLES];
#define BK_READONLY 32
//extern char *const * mman_pathlist; //tento pointer musi byt naplnen ukazatelem na tabulku cest
extern int memman_handle; //cislo handle naposled zpracovavaneho prikazem ablock
extern char mman_patch; //jednicka zapina moznost pouziti patchu
void *getmem(int32_t size); //alokace pameti pres memman. alokovat pomoci malloc lze ale hrozi nebezpeci ze vrati NULL
void *grealloc(void *m,int32_t size); //realokace pameti pres memman
void *load_file(const char *filename, size_t *size); //obycejne natahne soubor do pameti a vrati ukazatel.
void init_manager(const char *filename,const char *swp); //inicializuje manager. Jmeno filename i swapname nejsou povinne (musi byt NULL kdyz nejsou pouzity)
void init_manager(void); //inicializuje manager. Jmeno filename i swapname nejsou povinne (musi byt NULL kdyz nejsou pouzity)
void def_mman_group_table(const char ** ); //define pointer to table of paths, for each group there is path
THANDLE_DATA *def_handle(int handle,const char *filename,ABLOCK_DECODEPROC decompress,char path); //deklaruje rukojet. promenna decompress je ukazatel na funkci ktera upravi data pred vracenim ukazatele
const void *ablock(int handle); //vraci ukazatel bloku spojeneho s handlem
void *ablock_copy(int handle); //vraci ukazatel bloku spojeneho s handlem
void alock(int handle); //zamyka blok
void aunlock(int handle); //odmyka blok
void aswap(int handle); //zapina swapovani pro blok
void aunswap(int handle); //vypina swapovani pro blok
//void free(void); //free
void close_manager(void); //uzavre manager a uvolni veskerou pamet
void undef_handle(int handle); //uvolni hadle k dalsimu pouziti
@ -106,7 +104,7 @@ void ablock_free(const void *ptr);
int read_group(int index);
char add_patch_file(char *filename); //pripojuje zaplatu
char add_patch_file(const char *filename); //pripojuje zaplatu
#define MMA_READ 1