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
|
; 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
|