(addressInput: FunctionCallInput, ...args: FunctionCallInput[])
| 11 | export type FunctionCallInput = PointerInput | CallableNativeFunction; |
| 12 | |
| 13 | export function callFunction(addressInput: FunctionCallInput, ...args: FunctionCallInput[]): NativePointer | null { |
| 14 | try { |
| 15 | const address = toCallPointer(addressInput); |
| 16 | const nativeArgs = args.map(arg => toCallPointer(arg)); |
| 17 | const fn = new NativeFunction(address, "pointer", nativeArgs.map(() => "pointer")) as unknown as (...callArgs: NativePointer[]) => NativePointer; |
| 18 | const result = fn(...nativeArgs); |
| 19 | const resolved = resolveAddress(result); |
| 20 | log(`[call] ${address}(${nativeArgs.join(", ")}) => ${result}${resolved.length > 0 ? ` ${resolved}` : ""}`, "green"); |
| 21 | return result; |
| 22 | } catch (error) { |
| 23 | log(`[call] failed: ${String(error)}`, "red"); |
| 24 | return null; |
| 25 | } |
| 26 | } |
| 27 | |
| 28 | export function createCallableFunction(address: NativePointer): CallableNativeFunction { |
| 29 | const callable = ((...args: FunctionCallInput[]) => callFunction(address, ...args)) as CallableNativeFunction; |
no test coverage detected