/********************************************************/ /* 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_server_socket_name_info { uint32_t unknown; uint32_t type; uint32_t service_flags; char sa_data[14]; } nt_afd_server_socket_name_info; struct __addr_memcpy { uint16_t d0; uint16_t d1; uint16_t d2; uint16_t d3; uint16_t d4; uint16_t d5; uint16_t d6; uint16_t d7; }; int32_t __cdecl __ntapi_sc_getpeername_v1( __in nt_socket * hssocket, __in nt_sockaddr * addr, __in uint16_t * addrlen, __out nt_iosb volatile * iosb __optional) { nt_iosb volatile siosb; nt_afd_server_socket_name_info sock_name_info; struct __addr_memcpy * asrc; struct __addr_memcpy * adst; iosb = iosb ? iosb : &siosb; hssocket->iostatus = __ntapi->zw_device_io_control_file( hssocket->hsocket, hssocket->hevent, 0, 0, iosb, NT_AFD_IOCTL_GET_PEER_NAME, 0, 0, &sock_name_info, sizeof(sock_name_info)); __ntapi->sc_wait(hssocket,iosb,0); if (!hssocket->iostatus) { addr->sa_addr_in4.sa_family = hssocket->domain; asrc = (struct __addr_memcpy *)&(sock_name_info.sa_data); adst = (struct __addr_memcpy *)addr; adst->d1 = asrc->d0; adst->d2 = asrc->d1; adst->d3 = asrc->d2; adst->d4 = asrc->d3; adst->d5 = asrc->d4; adst->d6 = asrc->d5; adst->d7 = asrc->d6; *addrlen = (uint16_t)iosb->info; }; return hssocket->iostatus; }