@@ -54,8 +54,33 @@ function createWindow() {
5454 newModule . addFunctionImport ( postName , "hooks" , postName , retType , retType ) ;
5555 }
5656
57- const funcNames = [ ] ;
57+ const funcNames = { } ;
5858
59+ let main = '' ;
60+ let malloc = '' ;
61+
62+ for ( let i = 0 ; i < module . getNumExports ( ) ; i ++ ) {
63+ const exp = Binaryen . getExportInfo ( module . getExportByIndex ( i ) ) ;
64+ if ( exp . name === "kg" ) {
65+ main = exp . value ;
66+ }
67+ if ( exp . name === "Of" ) {
68+ malloc = exp . value ;
69+ }
70+ }
71+
72+ for ( let i = 0 ; i < module . getNumFunctions ( ) ; i ++ ) {
73+ const funcInfo = Binaryen . getFunctionInfo ( module . getFunctionByIndex ( i ) ) ;
74+ const origName = funcInfo . name ;
75+
76+ if ( origName . includes ( "import" ) ) {
77+ continue ;
78+ }
79+
80+ funcNames [ i ] = origName ;
81+ }
82+
83+ newModule . addGlobal ( "ayuMap" , Binaryen . i32 , true , newModule . i32 . const ( 0 ) ) ;
5984 for ( let i = 0 ; i < module . getNumFunctions ( ) ; i ++ ) {
6085 const funcInfo = Binaryen . getFunctionInfo ( module . getFunctionByIndex ( i ) ) ;
6186 const origName = funcInfo . name ;
@@ -66,8 +91,6 @@ function createWindow() {
6691 continue ;
6792 }
6893
69- funcNames . push ( origName ) ;
70-
7194 addJSHooks ( origName , paramTypes , retType ) ;
7295
7396 const origFuncNewName = `_orig_${ origName } ` ;
@@ -90,24 +113,182 @@ function createWindow() {
90113 defaultValue = newModule . f64 . const ( 0 ) ;
91114 break ;
92115 }
93- const wrapperBody = newModule . block ( null , retType === Binaryen . none ? [
94- newModule . if (
95- newModule . call ( `pre_${ origName } ` , params , Binaryen . i32 ) ,
96- newModule . call ( origFuncNewName , params , retType )
97- ) ,
98- newModule . call ( `post_${ origName } ` , [ ] , retType )
99- ] : [
100- newModule . call ( `post_${ origName } ` , [
116+ if ( origName === main ) {
117+ const wrapperBody = newModule . block ( null , retType === Binaryen . none ? [
118+ newModule . global . set ( "ayuMap" , newModule . call ( malloc , [ newModule . i32 . const ( Object . keys ( funcNames ) . length ) ] , Binaryen . i32 ) ) ,
119+ newModule . if (
120+ newModule . i32 . and (
121+ newModule . i32 . load8_u ( i , 0 , newModule . global . get ( "ayuMap" , Binaryen . i32 ) ) ,
122+ newModule . i32 . const ( 1 )
123+ ) ,
124+ newModule . if (
125+ newModule . call ( `pre_${ origName } ` , params , Binaryen . i32 ) ,
126+ newModule . call ( origFuncNewName , params , retType )
127+ ) ,
128+ newModule . call ( origFuncNewName , params , retType )
129+ ) ,
130+ newModule . if (
131+ newModule . i32 . and (
132+ newModule . i32 . load8_u ( i , 0 , newModule . global . get ( "ayuMap" , Binaryen . i32 ) ) ,
133+ newModule . i32 . const ( 2 )
134+ ) ,
135+ newModule . call ( `post_${ origName } ` , [ ] , retType ) ,
136+ )
137+ ] : [
138+ newModule . global . set ( "ayuMap" , newModule . call ( malloc , [ newModule . i32 . const ( Object . keys ( funcNames ) . length ) ] , Binaryen . i32 ) ) ,
139+ newModule . if (
140+ newModule . i32 . and (
141+ newModule . i32 . load8_u ( i , 0 , newModule . global . get ( "ayuMap" , Binaryen . i32 ) ) ,
142+ newModule . i32 . const ( 2 )
143+ ) ,
144+ newModule . call ( `post_${ origName } ` , [
145+ newModule . if (
146+ newModule . i32 . and (
147+ newModule . i32 . load8_u ( i , 0 , newModule . global . get ( "ayuMap" , Binaryen . i32 ) ) ,
148+ newModule . i32 . const ( 1 )
149+ ) ,
150+ newModule . if (
151+ newModule . call ( `pre_${ origName } ` , params , Binaryen . i32 ) ,
152+ newModule . call ( origFuncNewName , params , retType ) ,
153+ defaultValue
154+ ) ,
155+ newModule . call ( origFuncNewName , params , retType )
156+ ) ,
157+ ] , retType ) ,
158+ newModule . if (
159+ newModule . i32 . and (
160+ newModule . i32 . load8_u ( i , 0 , newModule . global . get ( "ayuMap" , Binaryen . i32 ) ) ,
161+ newModule . i32 . const ( 1 )
162+ ) ,
163+ newModule . if (
164+ newModule . call ( `pre_${ origName } ` , params , Binaryen . i32 ) ,
165+ newModule . call ( origFuncNewName , params , retType ) ,
166+ defaultValue
167+ ) ,
168+ newModule . call ( origFuncNewName , params , retType )
169+ )
170+ )
171+ ] , retType ) ;
172+
173+ newModule . removeFunction ( origName ) ;
174+ newModule . addFunction ( origName , funcInfo . params , funcInfo . results , funcInfo . vars , wrapperBody ) ;
175+ } else {
176+ const wrapperBody = newModule . block ( null , retType === Binaryen . none ? [
101177 newModule . if (
102- newModule . call ( `pre_${ origName } ` , params , Binaryen . i32 ) ,
103- newModule . call ( origFuncNewName , params , retType ) ,
104- defaultValue
105- ) ] , retType )
106- ] , retType ) ;
107-
108- newModule . removeFunction ( origName ) ;
109- newModule . addFunction ( origName , funcInfo . params , funcInfo . results , funcInfo . vars , wrapperBody ) ;
178+ newModule . i32 . and (
179+ newModule . i32 . load8_u ( i , 0 , newModule . global . get ( "ayuMap" , Binaryen . i32 ) ) ,
180+ newModule . i32 . const ( 1 )
181+ ) ,
182+ newModule . if (
183+ newModule . call ( `pre_${ origName } ` , params , Binaryen . i32 ) ,
184+ newModule . call ( origFuncNewName , params , retType )
185+ ) ,
186+ newModule . call ( origFuncNewName , params , retType )
187+ ) ,
188+ newModule . if (
189+ newModule . i32 . and (
190+ newModule . i32 . load8_u ( i , 0 , newModule . global . get ( "ayuMap" , Binaryen . i32 ) ) ,
191+ newModule . i32 . const ( 2 )
192+ ) ,
193+ newModule . call ( `post_${ origName } ` , [ ] , retType ) ,
194+ )
195+ ] : [
196+ newModule . if (
197+ newModule . i32 . and (
198+ newModule . i32 . load8_u ( i , 0 , newModule . global . get ( "ayuMap" , Binaryen . i32 ) ) ,
199+ newModule . i32 . const ( 2 )
200+ ) ,
201+ newModule . call ( `post_${ origName } ` , [
202+ newModule . if (
203+ newModule . i32 . and (
204+ newModule . i32 . load8_u ( i , 0 , newModule . global . get ( "ayuMap" , Binaryen . i32 ) ) ,
205+ newModule . i32 . const ( 1 )
206+ ) ,
207+ newModule . if (
208+ newModule . call ( `pre_${ origName } ` , params , Binaryen . i32 ) ,
209+ newModule . call ( origFuncNewName , params , retType ) ,
210+ defaultValue
211+ ) ,
212+ newModule . call ( origFuncNewName , params , retType )
213+ ) ,
214+ ] , retType ) ,
215+ newModule . if (
216+ newModule . i32 . and (
217+ newModule . i32 . load8_u ( i , 0 , newModule . global . get ( "ayuMap" , Binaryen . i32 ) ) ,
218+ newModule . i32 . const ( 1 )
219+ ) ,
220+ newModule . if (
221+ newModule . call ( `pre_${ origName } ` , params , Binaryen . i32 ) ,
222+ newModule . call ( origFuncNewName , params , retType ) ,
223+ defaultValue
224+ ) ,
225+ newModule . call ( origFuncNewName , params , retType )
226+ )
227+ )
228+ ] , retType ) ;
229+
230+ newModule . removeFunction ( origName ) ;
231+ newModule . addFunction ( origName , funcInfo . params , funcInfo . results , funcInfo . vars , wrapperBody ) ;
232+ }
110233 }
234+
235+ newModule . addFunction ( "registerHookPre" , Binaryen . i32 , Binaryen . none , [ Binaryen . i32 ] ,
236+ newModule . block ( null , [
237+ newModule . i32 . store8 ( 0 , 0 ,
238+ newModule . i32 . add ( newModule . global . get ( "ayuMap" , Binaryen . i32 ) , newModule . local . get ( 0 , Binaryen . i32 ) ) ,
239+ newModule . i32 . or (
240+ newModule . i32 . load8_u ( 0 , 0 ,
241+ newModule . i32 . add ( newModule . global . get ( "ayuMap" , Binaryen . i32 ) , newModule . local . get ( 0 , Binaryen . i32 ) )
242+ ) ,
243+ newModule . i32 . const ( 1 )
244+ )
245+ )
246+ ] )
247+ ) ;
248+ newModule . addFunctionExport ( "registerHookPre" , "registerHookPre" ) ;
249+ newModule . addFunction ( "registerHookPost" , Binaryen . i32 , Binaryen . none , [ Binaryen . i32 ] ,
250+ newModule . block ( null , [
251+ newModule . i32 . store8 ( 0 , 0 ,
252+ newModule . i32 . add ( newModule . global . get ( "ayuMap" , Binaryen . i32 ) , newModule . local . get ( 0 , Binaryen . i32 ) ) ,
253+ newModule . i32 . or (
254+ newModule . i32 . load8_u ( 0 , 0 ,
255+ newModule . i32 . add ( newModule . global . get ( "ayuMap" , Binaryen . i32 ) , newModule . local . get ( 0 , Binaryen . i32 ) )
256+ ) ,
257+ newModule . i32 . const ( 2 )
258+ )
259+ )
260+ ] )
261+ ) ;
262+ newModule . addFunctionExport ( "registerHookPost" , "registerHookPost" ) ;
263+ newModule . addFunction ( "unregisterHookPre" , Binaryen . i32 , Binaryen . none , [ Binaryen . i32 ] ,
264+ newModule . block ( null , [
265+ newModule . i32 . store8 ( 0 , 0 ,
266+ newModule . i32 . add ( newModule . global . get ( "ayuMap" , Binaryen . i32 ) , newModule . local . get ( 0 , Binaryen . i32 ) ) ,
267+ newModule . i32 . and (
268+ newModule . i32 . load8_u ( 0 , 0 ,
269+ newModule . i32 . add ( newModule . global . get ( "ayuMap" , Binaryen . i32 ) , newModule . local . get ( 0 , Binaryen . i32 ) )
270+ ) ,
271+ newModule . i32 . const ( 254 )
272+ )
273+ )
274+ ] )
275+ ) ;
276+ newModule . addFunctionExport ( "unregisterHookPre" , "unregisterHookPre" ) ;
277+ newModule . addFunction ( "unregisterHookPost" , Binaryen . i32 , Binaryen . none , [ Binaryen . i32 ] ,
278+ newModule . block ( null , [
279+ newModule . i32 . store8 ( 0 , 0 ,
280+ newModule . i32 . add ( newModule . global . get ( "ayuMap" , Binaryen . i32 ) , newModule . local . get ( 0 , Binaryen . i32 ) ) ,
281+ newModule . i32 . and (
282+ newModule . i32 . load8_u ( 0 , 0 ,
283+ newModule . i32 . add ( newModule . global . get ( "ayuMap" , Binaryen . i32 ) , newModule . local . get ( 0 , Binaryen . i32 ) )
284+ ) ,
285+ newModule . i32 . const ( 253 )
286+ )
287+ )
288+ ] )
289+ ) ;
290+ newModule . addFunctionExport ( "unregisterHookPost" , "unregisterHookPost" ) ;
291+
111292 win . webContents . executeJavaScript ( `
112293 window.ayuHooks = window.ayuHooks || {};
113294
@@ -118,7 +299,7 @@ function createWindow() {
118299
119300 if (!imports.hooks) imports.hooks = {};
120301
121- wasmFunctionNames.forEach(name => {
302+ Object.values( wasmFunctionNames) .forEach(name => {
122303 const preName = 'pre_' + name;
123304 const postName = 'post_' + name;
124305
0 commit comments