1 2#if defined(_M_IX86) || defined(_M_AMD64) 3#include <asm.inc> 4#elif defined(_M_ARM) 5#include <kxarm.h> 6#endif 7 8#ifdef _M_IX86 9.code32 10 11EXTERN _ndr_client_call:PROC 12 13PUBLIC _call_stubless_func 14_call_stubless_func: 15 16 mov ecx,[esp+4] /* This Pointer */ 17 mov ecx,[ecx] /* This->lpVtbl */ 18 mov ecx,[ecx-8] /* MIDL_STUBLESS_PROXY_INFO */ 19 mov edx,[ecx+8] /* Info->FormatStringOffset */ 20 mov edx,[edx+eax*2] /* FormatStringOffset[index] */ 21 and edx, 0000FFFFh 22 add edx,[ecx+4] /* info->ProcFormatString + offset */ 23 mov eax, [edx+8] /* arguments size */ 24 and eax, 0000FFFFh 25 push eax 26 lea eax, [esp+8] /* &This */ 27 push eax 28 push edx /* format string */ 29 push [ecx] /* info->pstubdesc */ 30 call _ndr_client_call 31 lea esp, [esp+12] 32 pop edx /* arguments size */ 33 mov ecx, [esp] /* return address */ 34 add esp, edx 35 jmp ecx 36 37#elif _M_AMD64 38.code64 39 40EXTERN ndr_client_call:PROC 41 42PUBLIC call_stubless_func 43FUNC call_stubless_func 44 mov [rsp + 8], rcx 45 .SAVEREG rcx, 8 46 mov [rsp + 10h], rdx 47 .SAVEREG rdx, 10h 48 mov [rsp + 18h], r8 49 .SAVEREG r8, 18h 50 mov [rsp + 20h], r9 51 .SAVEREG r9, 20h 52 sub rsp, 38h 53 .ALLOCSTACK 38h 54 .ENDPROLOG 55 56 lea r8, [rsp +38h + 8] /* &This */ 57 mov rcx, [rcx] /* This->lpVtbl */ 58 mov rcx, [rcx - 10h] /* MIDL_STUBLESS_PROXY_INFO */ 59 mov rdx, [rcx + 10h] /* info->FormatStringOffset */ 60 movzx rdx, word ptr [rdx+r10*2] /* FormatStringOffset[index] */ 61 add rdx, [rcx + 8] /* info->ProcFormatString + offset */ 62 mov rcx, [rcx] /* info->pStubDesc */ 63 64 movaps [rsp + 20h], xmm1 65 movaps [rsp + 28h], xmm2 66 movaps [rsp + 30h], xmm3 67 lea r9, [rsp + 18h] /* fpu_args */ 68 call ndr_client_call 69 add rsp, 38h 70 ret 71ENDFUNC 72 73PUBLIC call_server_func 74FUNC call_server_func 75 push rbp 76 .PUSHREG rbp 77 mov rbp, rsp 78 push rsi 79 .PUSHREG rsi 80 push rdi 81 .PUSHREG rdi 82 .ENDPROLOG 83 84 mov rax, rcx /* function to call */ 85 mov rcx, 32 /* allocate max(32,stack_size) bytes of stack space */ 86 cmp r8, rcx 87 cmovg rcx, r8 88 sub rsp, rcx 89 and rsp, NOT 15 90 mov rcx, r8 91 shr rcx, 3 92 mov rdi, rsp 93 mov rsi, rdx 94 rep movsq /* copy arguments */ 95 mov rcx, [rsp] 96 mov rdx, [rsp + 8] 97 mov r8, [rsp + 16] 98 mov r9, [rsp + 24] 99 movd xmm0, rcx 100 movd xmm1, rdx 101 movd xmm2, r8 102 movd xmm3, r9 103 call rax 104 105 lea rsp, [rbp - 16] /* restore stack */ 106 pop rdi 107 pop rsi 108 pop rbp 109 ret 110ENDFUNC 111 112 113PUBLIC NdrClientCall2 114FUNC NdrClientCall2 115 mov [rsp + 18h], r8 116 .SAVEREG r8, 18h 117 mov [rsp + 20h], r9 118 .SAVEREG r9, 20h 119 sub rsp, 28h 120 .ALLOCSTACK 28h 121 .ENDPROLOG 122 123 lea r8, [rsp + 28h + 18h] 124 xor r9, r9 125 call ndr_client_call 126 127 add rsp, 28h 128 ret 129ENDFUNC 130 131EXTERN ndr_async_client_call:PROC 132PUBLIC NdrAsyncClientCall 133FUNC NdrAsyncClientCall 134 mov [rsp + 18h], r8 135 .SAVEREG r8, 18h 136 mov [rsp + 20h], r9 137 .SAVEREG r9, 20h 138 sub rsp, 28h 139 .ALLOCSTACK 28h 140 .ENDPROLOG 141 142 lea r8, [rsp + 28h + 18h] 143 call ndr_async_client_call 144 145 add rsp, 28h 146 ret 147ENDFUNC 148 149#elif _M_ARM 150TEXTAREA 151 152 LEAF_ENTRY call_stubless_func 153 154 /* Unimplemented */ 155 __assertfail 156 bx lr 157 158 LEAF_END call_stubless_func 159 160 LEAF_ENTRY call_server_func 161 162 /* Unimplemented */ 163 __assertfail 164 bx lr 165 166 LEAF_END call_server_func 167 168#endif 169 170END 171