mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-23 00:47:31 +09:00
107 lines
2.4 KiB
NASM
107 lines
2.4 KiB
NASM
; This Source Code Form is subject to the terms of the Mozilla Public
|
|
; License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
extrn invoke_copy_to_stack:PROC
|
|
|
|
|
|
.CODE
|
|
|
|
;
|
|
;XPTC__InvokebyIndex(nsISupports* that, uint32_t methodIndex,
|
|
; uint32_t paramCount, nsXPTCVariant* params)
|
|
;
|
|
|
|
XPTC__InvokebyIndex PROC FRAME
|
|
|
|
; store register parameters
|
|
|
|
mov qword ptr [rsp+32], r9 ; params
|
|
mov dword ptr [rsp+24], r8d ; paramCount
|
|
mov dword ptr [rsp+16], edx ; methodIndex
|
|
mov qword ptr [rsp+8], rcx ; that
|
|
|
|
push rbp
|
|
.PUSHREG rbp
|
|
mov rbp, rsp ; store current RSP to RBP
|
|
.SETFRAME rbp, 0
|
|
.ENDPROLOG
|
|
|
|
sub rsp, 32
|
|
|
|
; maybe we don't have any parameters to copy
|
|
|
|
test r8d, r8d
|
|
jz noparams
|
|
|
|
;
|
|
; Build stack for stdcall
|
|
;
|
|
|
|
; 1st parameter is space for parameters
|
|
|
|
mov eax, r8d
|
|
or eax, 1
|
|
shl rax, 3 ; *= 8
|
|
sub rsp, rax
|
|
mov rcx, rsp
|
|
|
|
; 2nd parameter is parameter count
|
|
|
|
mov edx, r8d
|
|
|
|
; 3rd parameter is params
|
|
|
|
mov r8, r9
|
|
|
|
sub rsp, 40
|
|
call invoke_copy_to_stack ; rcx = d
|
|
; edx = paramCount
|
|
; r8 = s
|
|
add rsp, 32
|
|
|
|
; Current stack is the following.
|
|
;
|
|
; 0h: [space (for this)]
|
|
; 8h: [1st parameter]
|
|
; 10h: [2nd parameter]
|
|
; 18h: [3rd parameter]
|
|
; 20h: [4th parameter]
|
|
; ...
|
|
;
|
|
; On Win64 ABI, the first 4 parameters are passed using registers,
|
|
; and others are on stack.
|
|
|
|
; 1st, 2nd and 3rd arguments are passed via registers
|
|
|
|
mov rdx, qword ptr [rsp+8] ; 1st parameter
|
|
movsd xmm1, qword ptr [rsp+8] ; for double
|
|
|
|
mov r8, qword ptr [rsp+16] ; 2nd parameter
|
|
movsd xmm2, qword ptr [rsp+16] ; for double
|
|
|
|
mov r9, qword ptr [rsp+24] ; 3rd parameter
|
|
movsd xmm3, qword ptr [rsp+24] ; for double
|
|
|
|
; rcx register is this
|
|
|
|
mov rcx, qword ptr [rbp+8+8] ; that
|
|
|
|
noparams:
|
|
|
|
; calculate call address
|
|
|
|
mov r11, qword ptr [rcx]
|
|
mov eax, dword ptr [rbp+16+8] ; methodIndex
|
|
|
|
call qword ptr [r11+rax*8] ; stdcall, i.e. callee cleans up stack.
|
|
|
|
mov rsp, rbp
|
|
pop rbp
|
|
|
|
ret
|
|
|
|
XPTC__InvokebyIndex ENDP
|
|
|
|
|
|
END
|