mirror of
https://github.com/reactos/reactos.git
synced 2024-10-30 19:41:57 +00:00
147 lines
3.1 KiB
ArmAsm
147 lines
3.1 KiB
ArmAsm
|
|
#include <asm.inc>
|
|
|
|
#ifdef _M_IX86
|
|
.code32
|
|
|
|
EXTERN _ndr_client_call:PROC
|
|
|
|
PUBLIC _call_stubless_func
|
|
_call_stubless_func:
|
|
|
|
mov ecx,[esp+4] /* This Pointer */
|
|
mov ecx,[ecx] /* This->lpVtbl */
|
|
mov ecx,[ecx-8] /* MIDL_STUBLESS_PROXY_INFO */
|
|
mov edx,[ecx+8] /* Info->FormatStringOffset */
|
|
mov edx,[edx+eax*2] /* FormatStringOffset[index] */
|
|
and edx, 0000FFFFh
|
|
add edx,[ecx+4] /* info->ProcFormatString + offset */
|
|
mov eax, [edx+8] /* arguments size */
|
|
and eax, 0000FFFFh
|
|
push eax
|
|
lea eax, [esp+8] /* &This */
|
|
push eax
|
|
push edx /* format string */
|
|
push [ecx] /* info->pstubdesc */
|
|
call _ndr_client_call
|
|
lea esp, [esp+12]
|
|
pop edx /* arguments size */
|
|
mov ecx, [esp] /* return address */
|
|
add esp, edx
|
|
jmp ecx
|
|
#else
|
|
.code64
|
|
|
|
EXTERN ndr_client_call:PROC
|
|
|
|
PUBLIC call_stubless_func
|
|
FUNC call_stubless_func
|
|
mov [rsp + 8], rcx
|
|
.SAVEREG rcx, 8
|
|
mov [rsp + 10h], rdx
|
|
.SAVEREG rdx, 10h
|
|
mov [rsp + 18h], r8
|
|
.SAVEREG r8, 18h
|
|
mov [rsp + 20h], r9
|
|
.SAVEREG r9, 20h
|
|
sub rsp, 38h
|
|
.ALLOCSTACK 38h
|
|
.ENDPROLOG
|
|
|
|
lea r8, [rsp +38h + 8] /* &This */
|
|
mov rcx, [rcx] /* This->lpVtbl */
|
|
mov rcx, [rcx - 10h] /* MIDL_STUBLESS_PROXY_INFO */
|
|
mov rdx, [rcx + 10h] /* info->FormatStringOffset */
|
|
movzx rdx, word ptr [rdx+r10*2] /* FormatStringOffset[index] */
|
|
add rdx, [rcx + 8] /* info->ProcFormatString + offset */
|
|
mov rcx, [rcx] /* info->pStubDesc */
|
|
|
|
movaps [rsp + 20h], xmm1
|
|
movaps [rsp + 28h], xmm2
|
|
movaps [rsp + 30h], xmm3
|
|
lea r9, [rsp + 18h] /* fpu_args */
|
|
call ndr_client_call
|
|
add rsp, 38h
|
|
ret
|
|
ENDFUNC
|
|
|
|
PUBLIC call_server_func
|
|
FUNC call_server_func
|
|
push rbp
|
|
.PUSHREG rbp
|
|
mov rbp, rsp
|
|
push rsi
|
|
.PUSHREG rsi
|
|
push rdi
|
|
.PUSHREG rdi
|
|
.ENDPROLOG
|
|
|
|
mov rax, rcx /* function to call */
|
|
mov rcx, 32 /* allocate max(32,stack_size) bytes of stack space */
|
|
cmp r8, rcx
|
|
cmovg rcx, r8
|
|
sub rsp, rcx
|
|
and rsp, NOT 15
|
|
mov rcx, r8
|
|
shr rcx, 3
|
|
mov rdi, rsp
|
|
mov rsi, rdx
|
|
rep movsq /* copy arguments */
|
|
mov rcx, [rsp]
|
|
mov rdx, [rsp + 8]
|
|
mov r8, [rsp + 16]
|
|
mov r9, [rsp + 24]
|
|
movd xmm0, rcx
|
|
movd xmm1, rdx
|
|
movd xmm2, r8
|
|
movd xmm3, r9
|
|
call rax
|
|
|
|
lea rsp, [rbp - 16] /* restore stack */
|
|
pop rdi
|
|
pop rsi
|
|
pop rbp
|
|
ret
|
|
ENDFUNC
|
|
|
|
|
|
PUBLIC NdrClientCall2
|
|
FUNC NdrClientCall2
|
|
mov [rsp + 18h], r8
|
|
.SAVEREG r8, 18h
|
|
mov [rsp + 20h], r9
|
|
.SAVEREG r9, 20h
|
|
sub rsp, 28h
|
|
.ALLOCSTACK 28h
|
|
.ENDPROLOG
|
|
|
|
lea r8, [rsp + 28h + 18h]
|
|
xor r9, r9
|
|
call ndr_client_call
|
|
|
|
add rsp, 28h
|
|
ret
|
|
ENDFUNC
|
|
|
|
EXTERN ndr_async_client_call:PROC
|
|
PUBLIC NdrAsyncClientCall
|
|
FUNC NdrAsyncClientCall
|
|
mov [rsp + 18h], r8
|
|
.SAVEREG r8, 18h
|
|
mov [rsp + 20h], r9
|
|
.SAVEREG r9, 20h
|
|
sub rsp, 28h
|
|
.ALLOCSTACK 28h
|
|
.ENDPROLOG
|
|
|
|
lea r8, [rsp + 28h + 18h]
|
|
call ndr_async_client_call
|
|
|
|
add rsp, 28h
|
|
ret
|
|
ENDFUNC
|
|
|
|
#endif
|
|
|
|
END
|