diff options
Diffstat (limited to 'src/socket')
-rw-r--r-- | src/socket/ntapi_sc_recv.c | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/src/socket/ntapi_sc_recv.c b/src/socket/ntapi_sc_recv.c index 2c969af..bdc6165 100644 --- a/src/socket/ntapi_sc_recv.c +++ b/src/socket/ntapi_sc_recv.c @@ -11,21 +11,36 @@ #include <ntapi/ntapi.h> #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_io_status_block * iosb __optional) { nt_afd_buffer afd_buffer; - nt_afd_recv_info afd_recv; + nt_afd_recv_udp_info afd_recv; nt_io_status_block 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; @@ -34,12 +49,12 @@ int32_t __cdecl __ntapi_sc_recv( afd_buffer.length = len; afd_buffer.buffer = (char *)buffer; - /* afd_recv */ - afd_recv.afd_buffer_array = &afd_buffer; - afd_recv.buffer_count = 1; + /* afd_recv.afd_recv */ + afd_recv.afd_recv.afd_buffer_array = &afd_buffer; + afd_recv.afd_recv.buffer_count = 1; - afd_recv.afd_flags = (uint32_t)afdflags; - afd_recv.tdi_flags = (uint32_t)tdiflags; + afd_recv.afd_recv.afd_flags = (uint32_t)afdflags; + afd_recv.afd_recv.tdi_flags = (uint32_t)tdiflags; hssocket->iostatus = __ntapi->zw_device_io_control_file( hssocket->hsocket, @@ -47,9 +62,9 @@ int32_t __cdecl __ntapi_sc_recv( 0, 0, iosb, - NT_AFD_IOCTL_RECV, + raddr ? NT_AFD_IOCTL_UDP_RECV : NT_AFD_IOCTL_RECV, &afd_recv, - sizeof(afd_recv), + raddr ? sizeof(afd_recv) : sizeof(afd_recv.afd_recv), 0, 0); |