From: Zhiyi Zhang <zzhang@codeweavers.com> --- dlls/ntdll/ntdll.spec | 1 + dlls/ntdll/signal_arm64ec.c | 1 + dlls/ntdll/unix/alpc.c | 12 ++++++++++++ dlls/wow64/syscall.c | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 51 insertions(+) diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 05160b37a14..84b35d44cc7 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -158,6 +158,7 @@ @ stdcall -syscall NtAlpcAcceptConnectPort(ptr ptr long ptr ptr ptr ptr ptr long) @ stdcall -syscall NtAlpcConnectPort(ptr ptr ptr ptr long ptr ptr ptr ptr ptr ptr) @ stdcall -syscall NtAlpcCreatePort(ptr ptr ptr) +@ stdcall -syscall NtAlpcSendWaitReceivePort(ptr long ptr ptr ptr ptr ptr ptr) @ stub -syscall=0x004c NtApphelpCacheControl @ stdcall -syscall NtAreMappedFilesTheSame(ptr ptr) @ stdcall -syscall NtAssignProcessToJobObject(long long) diff --git a/dlls/ntdll/signal_arm64ec.c b/dlls/ntdll/signal_arm64ec.c index 3d4ef72fdda..2995843c4b5 100644 --- a/dlls/ntdll/signal_arm64ec.c +++ b/dlls/ntdll/signal_arm64ec.c @@ -367,6 +367,7 @@ DEFINE_WRAPPED_SYSCALL(NtAllocateVirtualMemoryEx, (HANDLE process, PVOID *ret, S DEFINE_SYSCALL(NtAlpcAcceptConnectPort, (HANDLE *communication_port, HANDLE connection_port, DWORD flags, OBJECT_ATTRIBUTES *obj_attr, ALPC_PORT_ATTRIBUTES *port_attr, void *port_context, ALPC_PORT_MESSAGE *send_msg, ALPC_MESSAGE_ATTRIBUTES *send_msg_attr, BOOLEAN accept)) DEFINE_SYSCALL(NtAlpcConnectPort, (HANDLE *port_handle, UNICODE_STRING *port_name, OBJECT_ATTRIBUTES *obj_attr, ALPC_PORT_ATTRIBUTES *port_attr, DWORD flags, PSID required_server_sid, ALPC_PORT_MESSAGE *connect_msg, SIZE_T *connect_msg_size, ALPC_MESSAGE_ATTRIBUTES *send_msg_attr, ALPC_MESSAGE_ATTRIBUTES *recv_msg_attr, LARGE_INTEGER *timeout)) DEFINE_SYSCALL(NtAlpcCreatePort, (HANDLE *port_handle, OBJECT_ATTRIBUTES *obj_attr, ALPC_PORT_ATTRIBUTES *port_attr)) +DEFINE_SYSCALL(NtAlpcSendWaitReceivePort, (HANDLE port_handle, DWORD flags, ALPC_PORT_MESSAGE *send_msg, ALPC_MESSAGE_ATTRIBUTES *send_msg_attr, ALPC_PORT_MESSAGE *recv_msg, SIZE_T *recv_buffer_size, ALPC_MESSAGE_ATTRIBUTES *recv_msg_attr, LARGE_INTEGER *timeout)) DEFINE_SYSCALL(NtApphelpCacheControl, (ULONG class, void *context)) DEFINE_SYSCALL(NtAreMappedFilesTheSame, (PVOID addr1, PVOID addr2)) DEFINE_SYSCALL(NtAssignProcessToJobObject, (HANDLE job, HANDLE process)) diff --git a/dlls/ntdll/unix/alpc.c b/dlls/ntdll/unix/alpc.c index 2e2d6e4c137..f4b691c5033 100644 --- a/dlls/ntdll/unix/alpc.c +++ b/dlls/ntdll/unix/alpc.c @@ -57,3 +57,15 @@ NTSTATUS WINAPI NtAlpcCreatePort( HANDLE *port_handle, OBJECT_ATTRIBUTES *obj_at FIXME( "%p, %p, %p stub!\n", port_handle, obj_attr, port_attr ); return STATUS_NOT_IMPLEMENTED; } + +NTSTATUS WINAPI NtAlpcSendWaitReceivePort( HANDLE port_handle, ULONG flags, + ALPC_PORT_MESSAGE *send_msg, + ALPC_MESSAGE_ATTRIBUTES *send_msg_attr, + ALPC_PORT_MESSAGE *recv_msg, SIZE_T *recv_buffer_size, + ALPC_MESSAGE_ATTRIBUTES *recv_msg_attr, + LARGE_INTEGER *timeout ) +{ + FIXME( "%p, %#x, %p, %p, %p, %p, %p, %p stub!\n", port_handle, (unsigned int)flags, send_msg, + send_msg_attr, recv_msg, recv_buffer_size, recv_msg_attr, timeout ); + return STATUS_NOT_IMPLEMENTED; +} diff --git a/dlls/wow64/syscall.c b/dlls/wow64/syscall.c index 5b7faa9dcd4..75a6102774a 100644 --- a/dlls/wow64/syscall.c +++ b/dlls/wow64/syscall.c @@ -569,6 +569,43 @@ NTSTATUS WINAPI wow64_NtAlpcCreatePort( UINT *args ) return status; } +/********************************************************************** + * wow64_NtAlpcSendWaitReceivePort + */ +NTSTATUS WINAPI wow64_NtAlpcSendWaitReceivePort( UINT *args ) +{ + HANDLE handle = get_handle( &args ); + ULONG flags = get_ulong( &args ); + ALPC_PORT_MESSAGE32 *send_msg32 = get_ptr( &args ); + ALPC_MESSAGE_ATTRIBUTES32 *send_msg_attr32 = get_ptr( &args ); + ALPC_PORT_MESSAGE32 *recv_msg32 = get_ptr( &args ); + ULONG *size32 = get_ptr( &args ); + ALPC_MESSAGE_ATTRIBUTES32 *recv_msg_attr32 = get_ptr( &args ); + LARGE_INTEGER *timeout = get_ptr( &args ); + NTSTATUS status; + + ALPC_PORT_MESSAGE *send_msg; + ALPC_MESSAGE_ATTRIBUTES *send_msg_attr; + ALPC_PORT_MESSAGE *recv_msg; + ALPC_MESSAGE_ATTRIBUTES *recv_msg_attr; + SIZE_T size = size32 ? (*size32 + sizeof(ALPC_PORT_MESSAGE) - sizeof(ALPC_PORT_MESSAGE32)) : 65535; + + status = NtAlpcSendWaitReceivePort( handle, flags, alpc_port_message_32to64( &send_msg, send_msg32 ? (sizeof(*send_msg) + send_msg32->DataLength) : 0, send_msg32, TRUE ), + alpc_port_message_attributes_32to64( &send_msg_attr, send_msg_attr32, TRUE ), + alpc_port_message_32to64( &recv_msg, size, recv_msg32, FALSE ), &size, + alpc_port_message_attributes_32to64( &recv_msg_attr, recv_msg_attr32, FALSE ), timeout ); + if (status == STATUS_SUCCESS) + { + alpc_port_message_64to32( recv_msg32, recv_msg ); + alpc_port_message_attributes_64to32( recv_msg_attr32, recv_msg_attr ); + } + else if (status == STATUS_BUFFER_TOO_SMALL && size32) + { + put_size( size32, size - (sizeof(ALPC_PORT_MESSAGE) - sizeof(ALPC_PORT_MESSAGE32)) ); + } + return status; +} + /*********************************************************************** * wow64_NtCallbackReturn */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10932