1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
#define _GNU_SOURCE /* See feature_test_macros(7) */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
#include "wrappedlibs.h"
#include "debug.h"
#include "wrapper.h"
#include "bridge.h"
#include "librarian/library_private.h"
#include "x64emu.h"
#include "emu/x64emu_private.h"
#include "callback.h"
#include "box64context.h"
#include "librarian.h"
#include "myalign.h"
const char* libsqlite3Name = "libsqlite3.so.0";
#define LIBNAME libsqlite3
#define ADDED_FUNCTIONS()
#include "generated/wrappedlibsqlite3types.h"
#include "wrappercallback.h"
typedef struct my_sqlite3_io_methods_s {
int iVersion;
int (*xClose)(void*);
int (*xRead)(void*, void*, int iAmt, int64_t iOfst);
int (*xWrite)(void*, const void*, int iAmt, int64_t iOfst);
int (*xTruncate)(void*, int64_t size);
int (*xSync)(void*, int flags);
int (*xFileSize)(void*, int64_t *pSize);
int (*xLock)(void*, int);
int (*xUnlock)(void*, int);
int (*xCheckReservedLock)(void*, int *pResOut);
int (*xFileControl)(void*, int op, void *pArg);
int (*xSectorSize)(void*);
int (*xDeviceCharacteristics)(void*);
int (*xShmMap)(void*, int iPg, int pgsz, int, void volatile**);
int (*xShmLock)(void*, int offset, int n, int flags);
void (*xShmBarrier)(void*);
int (*xShmUnmap)(void*, int deleteFlag);
int (*xFetch)(void*, int64_t iOfst, int iAmt, void **pp);
int (*xUnfetch)(void*, int64_t iOfst, void *p);
} my_sqlite3_io_methods_t;
typedef struct my_sqlite3_file_s {
const my_sqlite3_io_methods_t *pMethods;
} my_sqlite3_file_t;
#define SUPER() \
GO(0) \
GO(1) \
GO(2) \
GO(3) \
GO(4)
// sqlite3_exec ...
#define GO(A) \
static uintptr_t my_sqlite3_exec_fct_##A = 0; \
static int my_sqlite3_exec_##A(void* a, int b, char** c, char** d) { \
return RunFunctionFmt(my_sqlite3_exec_fct_##A, "pipp", a, b, c, d); \
}
SUPER()
#undef GO
static void *find_sqlite3_exec_fct(void *fct) {
if (!fct) return fct;
if (GetNativeFnc((uintptr_t)fct)) return GetNativeFnc((uintptr_t)fct);
#define GO(A) if (my_sqlite3_exec_fct_##A == (uintptr_t)fct) return my_sqlite3_exec_##A;
SUPER()
#undef GO
#define GO(A) if (my_sqlite3_exec_fct_##A == 0) {my_sqlite3_exec_fct_##A = (uintptr_t)fct; return my_sqlite3_exec_##A; }
SUPER()
#undef GO
printf_log(LOG_NONE, "Warning, no more slot for sqlite3_exec callback\n");
return NULL;
}
#undef SUPER
EXPORT int my_sqlite3_exec(x64emu_t* emu, void *db, char *sql, void* callback, void* data, char **errmsg)
{
return my->sqlite3_exec(db, sql, find_sqlite3_exec_fct(callback), data, errmsg);
}
EXPORT void* my_sqlite3_vmprintf(x64emu_t *emu, void* fmt, x64_va_list_t b) {
(void)emu;
#ifdef CONVERT_VALIST
CONVERT_VALIST(b);
#else
myStackAlignValist(emu, (const char*)fmt, emu->scratch, b);
PREPARE_VALIST;
#endif
return my->sqlite3_vmprintf(fmt, VARARGS);
}
EXPORT void* my_sqlite3_mprintf(x64emu_t *emu, void* fmt, void* b) {
myStackAlign(emu, (const char*)fmt, b, emu->scratch, R_EAX, 1);
PREPARE_VALIST;
return my->sqlite3_vmprintf(fmt, VARARGS);
}
EXPORT void* my_sqlite3_database_file_object(x64emu_t* emu, void* a)
{
my_sqlite3_file_t* ret = my->sqlite3_database_file_object(a);
// add autobridge on all the functions
#define GO(A, W) if(ret->pMethods->A) AddAutomaticBridge(my_lib->w.bridge, W, ret->pMethods->A, 0, #A)
GO(xClose, iFp);
GO(xRead, iFppiI);
GO(xWrite, iFppiI);
GO(xTruncate, iFpI);
GO(xSync, iFpi);
GO(xFileSize, iFpp);
GO(xLock, iFpi);
GO(xUnlock, iFpi);
GO(xCheckReservedLock, iFpp);
GO(xFileControl, iFpip);
GO(xSectorSize, iFp);
GO(xDeviceCharacteristics, iFp);
GO(xShmMap, iFpiiip);
GO(xShmLock, iFpiii);
GO(xShmBarrier, iFp);
GO(xShmUnmap, iFpi);
GO(xFetch, iFpIip);
GO(xUnfetch, iFpIp);
#undef GO
return ret;
}
#include "wrappedlib_init.h"
|