/********************************************************/ /* ntapi: Native API core library */ /* Copyright (C) 2013--2017 Z. Gilboa */ /* Released under GPLv2 and GPLv3; see COPYING.NTAPI. */ /********************************************************/ #include #include #include #include #include #include "ntapi_impl.h" typedef struct _nt_afd_recv_udp_info { nt_afd_recv_info afd_recv; nt_sockaddr * addr; nt_sockaddr_reply * raddr; } nt_afd_recv_udp_info; int32_t __cdecl __ntapi_sc_recv( __in nt_socket * hssocket, __in const void * buffer, __in size_t len, __out ssize_t * bytes_received __optional, __in nt_sockaddr_reply * raddr __optional, __in uintptr_t afdflags __optional, __in uintptr_t tdiflags __optional, __out nt_iosb volatile * iosb __optional) { nt_afd_buffer afd_buffer; nt_afd_recv_udp_info afd_recv; nt_iosb volatile siosb; iosb = iosb ? iosb : &siosb; /* conditional connect */ if (raddr && (hssocket->protocol == NT_IPPROTO_UDP)) { afd_recv.raddr = raddr; raddr->addrlen = sizeof(raddr->addr); afd_recv.addr = &raddr->addr; } else raddr = 0; /* tdiflags */ if (tdiflags == 0) tdiflags = NT_TDI_RECEIVE_NORMAL; /* afd_buffer */ afd_buffer.length = len; afd_buffer.buffer = (char *)buffer; /* afd_recv.afd_recv */ afd_recv.afd_recv.afd_buffer_array = &afd_buffer; afd_recv.afd_recv.buffer_count = 1; afd_recv.afd_recv.afd_flags = (uint32_t)afdflags; afd_recv.afd_recv.tdi_flags = (uint32_t)tdiflags; if ((hssocket->iostatus = __ntapi->zw_device_io_control_file( hssocket->hsocket, hssocket->hevent, 0, 0, iosb, raddr ? NT_AFD_IOCTL_UDP_RECV : NT_AFD_IOCTL_RECV, &afd_recv, raddr ? sizeof(afd_recv) : sizeof(afd_recv.afd_recv), 0, 0))) return hssocket->iostatus; if (bytes_received) *bytes_received = iosb->info; return NT_STATUS_SUCCESS; }