From f57e5b6562d0a64da379809863ed464147398f86 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 6 Feb 2010 14:24:55 +0000 Subject: [PATCH] - Build fixes - For some reason when I applied the patch from my other WC to this one, I ended up with 2-3 copies of the same code in each file svn path=/branches/aicom-network-branch/; revision=45460 --- dll/win32/dnsapi/dnsapi/memory.c | 64 - dll/win32/mswsock/dns/addr.c | 195 -- dll/win32/mswsock/dns/debug.c | 42 - dll/win32/mswsock/dns/dnsaddr.c | 600 ----- dll/win32/mswsock/dns/dnsutil.c | 42 - dll/win32/mswsock/dns/flatbuf.c | 348 --- dll/win32/mswsock/dns/hostent.c | 291 --- dll/win32/mswsock/dns/inc/dnslib.h | 405 ++- dll/win32/mswsock/dns/inc/dnslibp.h | 2058 --------------- dll/win32/mswsock/dns/inc/windnsp.h | 140 -- dll/win32/mswsock/dns/ip6.c | 42 - dll/win32/mswsock/dns/memory.c | 198 -- dll/win32/mswsock/dns/name.c | 42 - dll/win32/mswsock/dns/print.c | 42 - dll/win32/mswsock/dns/record.c | 42 - dll/win32/mswsock/dns/rrprint.c | 42 - dll/win32/mswsock/dns/sablob.c | 1935 -------------- dll/win32/mswsock/dns/straddr.c | 1386 ---------- dll/win32/mswsock/dns/string.c | 771 ------ dll/win32/mswsock/dns/table.c | 42 - dll/win32/mswsock/dns/utf8.c | 42 - dll/win32/mswsock/msafd/accept.c | 2925 ---------------------- dll/win32/mswsock/msafd/addrconv.c | 114 - dll/win32/mswsock/msafd/afdsan.c | 42 - dll/win32/mswsock/msafd/async.c | 594 ----- dll/win32/mswsock/msafd/bind.c | 639 ----- dll/win32/mswsock/msafd/connect.c | 2034 --------------- dll/win32/mswsock/msafd/eventsel.c | 1281 ---------- dll/win32/mswsock/msafd/getname.c | 735 ------ dll/win32/mswsock/msafd/helper.c | 2085 ---------------- dll/win32/mswsock/msafd/listen.c | 423 ---- dll/win32/mswsock/msafd/nspeprot.c | 246 -- dll/win32/mswsock/msafd/proc.c | 3474 -------------------------- dll/win32/mswsock/msafd/recv.c | 1686 ------------- dll/win32/mswsock/msafd/sanaccpt.c | 42 - dll/win32/mswsock/msafd/sanconn.c | 42 - dll/win32/mswsock/msafd/sanflow.c | 42 - dll/win32/mswsock/msafd/sanlistn.c | 42 - dll/win32/mswsock/msafd/sanprov.c | 180 -- dll/win32/mswsock/msafd/sanrdma.c | 42 - dll/win32/mswsock/msafd/sanrecv.c | 42 - dll/win32/mswsock/msafd/sansend.c | 42 - dll/win32/mswsock/msafd/sanshutd.c | 42 - dll/win32/mswsock/msafd/sansock.c | 42 - dll/win32/mswsock/msafd/santf.c | 42 - dll/win32/mswsock/msafd/sanutil.c | 42 - dll/win32/mswsock/msafd/select.c | 2964 ---------------------- dll/win32/mswsock/msafd/send.c | 1755 ------------- dll/win32/mswsock/msafd/shutdown.c | 522 ---- dll/win32/mswsock/msafd/sockerr.c | 414 --- dll/win32/mswsock/msafd/socket.c | 2397 ------------------ dll/win32/mswsock/msafd/sockopt.c | 1767 ------------- dll/win32/mswsock/msafd/spi.c | 663 ----- dll/win32/mswsock/msafd/tpackets.c | 42 - dll/win32/mswsock/msafd/tranfile.c | 42 - dll/win32/mswsock/msafd/wspmisc.c | 264 -- dll/win32/mswsock/mswsock.rbuild | 2 +- dll/win32/mswsock/mswsock/init.c | 612 ----- dll/win32/mswsock/mswsock/msext.c | 156 -- dll/win32/mswsock/mswsock/nspgaddr.c | 42 - dll/win32/mswsock/mswsock/nspmisc.c | 42 - dll/win32/mswsock/mswsock/nspsvc.c | 42 - dll/win32/mswsock/mswsock/nsptcpip.c | 42 - dll/win32/mswsock/mswsock/nsputil.c | 42 - dll/win32/mswsock/mswsock/proc.c | 342 --- dll/win32/mswsock/mswsock/recvex.c | 42 - dll/win32/mswsock/mswsock/setup.c | 42 - dll/win32/mswsock/mswsock/stubs.c | 1041 -------- dll/win32/mswsock/rnr20/context.c | 486 ---- dll/win32/mswsock/rnr20/getserv.c | 30 - dll/win32/mswsock/rnr20/init.c | 267 -- dll/win32/mswsock/rnr20/logit.c | 30 - dll/win32/mswsock/rnr20/lookup.c | 1077 -------- dll/win32/mswsock/rnr20/nbt.c | 42 - dll/win32/mswsock/rnr20/nsp.c | 2832 --------------------- dll/win32/mswsock/rnr20/oldutil.c | 663 ----- dll/win32/mswsock/rnr20/proc.c | 132 - dll/win32/mswsock/rnr20/r_comp.c | 30 - dll/win32/mswsock/rnr20/util.c | 96 - dll/win32/mswsock/wsmobile/lpc.c | 48 - dll/win32/mswsock/wsmobile/nsp.c | 84 - dll/win32/mswsock/wsmobile/service.c | 42 - dll/win32/mswsock/wsmobile/update.c | 42 - include/reactos/winsock/msafd.h | 52 - include/reactos/winsock/msafdlib.h | 828 ------ include/reactos/winsock/mswinsock.h | 19 - include/reactos/winsock/rnr20lib.h | 265 -- include/reactos/winsock/wsmobile.h | 84 - 88 files changed, 303 insertions(+), 45812 deletions(-) delete mode 100644 dll/win32/mswsock/dns/inc/dnslibp.h diff --git a/dll/win32/dnsapi/dnsapi/memory.c b/dll/win32/dnsapi/dnsapi/memory.c index 6be36d3ad97..18c957c794c 100644 --- a/dll/win32/dnsapi/dnsapi/memory.c +++ b/dll/win32/dnsapi/dnsapi/memory.c @@ -62,67 +62,3 @@ DnsRecordListFree(PDNS_RECORD Data, { DnsFree(Data, FreeType); } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS system libraries - * FILE: lib/dnsapi/dnsapi/free.c - * PURPOSE: DNSAPI functions built on the ADNS library. - * PROGRAMER: Art Yerkes - * UPDATE HISTORY: - * 12/15/03 -- Created - */ - -#include "precomp.h" - -#define NDEBUG -#include - -VOID -WINAPI -DnsApiFree(IN PVOID Data) -{ - RtlFreeHeap(RtlGetProcessHeap(), 0, Data); -} - -PVOID -WINAPI -DnsApiAlloc(IN DWORD Size) -{ - return RtlAllocateHeap(RtlGetProcessHeap(), 0, Size); -} - -PVOID -WINAPI -DnsQueryConfigAllocEx(IN DNS_CONFIG_TYPE Config, - OUT PVOID pBuffer, - IN OUT PDWORD pBufferLength) -{ - return NULL; -} - -VOID WINAPI -DnsFree(PVOID Data, - DNS_FREE_TYPE FreeType) -{ - switch(FreeType) - { - case DnsFreeFlat: - RtlFreeHeap( RtlGetProcessHeap(), 0, Data ); - break; - - case DnsFreeRecordList: - DnsIntFreeRecordList( (PDNS_RECORD)Data ); - break; - - case DnsFreeParsedMessageFields: - /* assert( FALSE ); XXX arty not yet implemented. */ - break; - } -} - -VOID WINAPI -DnsRecordListFree(PDNS_RECORD Data, - DNS_FREE_TYPE FreeType) -{ - DnsFree(Data, FreeType); -} diff --git a/dll/win32/mswsock/dns/addr.c b/dll/win32/mswsock/dns/addr.c index 8742b3050cd..b91c532e49a 100644 --- a/dll/win32/mswsock/dns/addr.c +++ b/dll/win32/mswsock/dns/addr.c @@ -63,198 +63,3 @@ FamilyInfo_GetForFamily(IN WORD AddressFamily) } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/addr.c - * PURPOSE: Contains the Address Family Information Tables - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -DNS_FAMILY_INFO AddrFamilyTable[3] = -{ - { - AF_INET, - DNS_TYPE_A, - sizeof(IP4_ADDRESS), - sizeof(SOCKADDR_IN), - FIELD_OFFSET(SOCKADDR_IN, sin_addr) - }, - { - AF_INET6, - DNS_TYPE_AAAA, - sizeof(IP6_ADDRESS), - sizeof(SOCKADDR_IN6), - FIELD_OFFSET(SOCKADDR_IN6, sin6_addr) - }, - { - AF_ATM, - DNS_TYPE_ATMA, - sizeof(ATM_ADDRESS), - sizeof(SOCKADDR_ATM), - FIELD_OFFSET(SOCKADDR_ATM, satm_number) - } -}; - -/* FUNCTIONS *****************************************************************/ - -PDNS_FAMILY_INFO -WINAPI -FamilyInfo_GetForFamily(IN WORD AddressFamily) -{ - /* Check which family this is */ - switch (AddressFamily) - { - case AF_INET: - /* Return IPv4 Family Info */ - return &AddrFamilyTable[0]; - - case AF_INET6: - /* Return IPv6 Family Info */ - return &AddrFamilyTable[1]; - - case AF_ATM: - /* Return ATM Family Info */ - return &AddrFamilyTable[2]; - - default: - /* Invalid family */ - return NULL; - } - -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/addr.c - * PURPOSE: Contains the Address Family Information Tables - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -DNS_FAMILY_INFO AddrFamilyTable[3] = -{ - { - AF_INET, - DNS_TYPE_A, - sizeof(IP4_ADDRESS), - sizeof(SOCKADDR_IN), - FIELD_OFFSET(SOCKADDR_IN, sin_addr) - }, - { - AF_INET6, - DNS_TYPE_AAAA, - sizeof(IP6_ADDRESS), - sizeof(SOCKADDR_IN6), - FIELD_OFFSET(SOCKADDR_IN6, sin6_addr) - }, - { - AF_ATM, - DNS_TYPE_ATMA, - sizeof(ATM_ADDRESS), - sizeof(SOCKADDR_ATM), - FIELD_OFFSET(SOCKADDR_ATM, satm_number) - } -}; - -/* FUNCTIONS *****************************************************************/ - -PDNS_FAMILY_INFO -WINAPI -FamilyInfo_GetForFamily(IN WORD AddressFamily) -{ - /* Check which family this is */ - switch (AddressFamily) - { - case AF_INET: - /* Return IPv4 Family Info */ - return &AddrFamilyTable[0]; - - case AF_INET6: - /* Return IPv6 Family Info */ - return &AddrFamilyTable[1]; - - case AF_ATM: - /* Return ATM Family Info */ - return &AddrFamilyTable[2]; - - default: - /* Invalid family */ - return NULL; - } - -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/addr.c - * PURPOSE: Contains the Address Family Information Tables - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -DNS_FAMILY_INFO AddrFamilyTable[3] = -{ - { - AF_INET, - DNS_TYPE_A, - sizeof(IP4_ADDRESS), - sizeof(SOCKADDR_IN), - FIELD_OFFSET(SOCKADDR_IN, sin_addr) - }, - { - AF_INET6, - DNS_TYPE_AAAA, - sizeof(IP6_ADDRESS), - sizeof(SOCKADDR_IN6), - FIELD_OFFSET(SOCKADDR_IN6, sin6_addr) - }, - { - AF_ATM, - DNS_TYPE_ATMA, - sizeof(ATM_ADDRESS), - sizeof(SOCKADDR_ATM), - FIELD_OFFSET(SOCKADDR_ATM, satm_number) - } -}; - -/* FUNCTIONS *****************************************************************/ - -PDNS_FAMILY_INFO -WINAPI -FamilyInfo_GetForFamily(IN WORD AddressFamily) -{ - /* Check which family this is */ - switch (AddressFamily) - { - case AF_INET: - /* Return IPv4 Family Info */ - return &AddrFamilyTable[0]; - - case AF_INET6: - /* Return IPv6 Family Info */ - return &AddrFamilyTable[1]; - - case AF_ATM: - /* Return ATM Family Info */ - return &AddrFamilyTable[2]; - - default: - /* Invalid family */ - return NULL; - } - -} - diff --git a/dll/win32/mswsock/dns/debug.c b/dll/win32/mswsock/dns/debug.c index f194e1e9632..7ec359759b5 100644 --- a/dll/win32/mswsock/dns/debug.c +++ b/dll/win32/mswsock/dns/debug.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/debug.c - * PURPOSE: Contains helpful debugging functions for DNSLIB structures. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/debug.c - * PURPOSE: Contains helpful debugging functions for DNSLIB structures. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/debug.c - * PURPOSE: Contains helpful debugging functions for DNSLIB structures. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/dns/dnsaddr.c b/dll/win32/mswsock/dns/dnsaddr.c index 20ebe48b28f..310a0966f8b 100644 --- a/dll/win32/mswsock/dns/dnsaddr.c +++ b/dll/win32/mswsock/dns/dnsaddr.c @@ -198,603 +198,3 @@ DnsAddrArray_ContainsAddr(IN PDNS_ARRAY DnsAddrArray, return TRUE; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/dnsaddr.c - * PURPOSE: Functions dealing with DNS_ADDRESS and DNS_ARRAY addresses. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -PDNS_ARRAY -WINAPI -DnsAddrArray_Create(ULONG Count) -{ - PDNS_ARRAY DnsAddrArray; - - /* Allocate space for the array and the addresses within it */ - DnsAddrArray = Dns_AllocZero(sizeof(DNS_ARRAY) + - (Count * sizeof(DNS_ADDRESS))); - - /* Write the allocated address count */ - if (DnsAddrArray) DnsAddrArray->AllocatedAddresses = Count; - - /* Return it */ - return DnsAddrArray; -} - -VOID -WINAPI -DnsAddrArray_Free(IN PDNS_ARRAY DnsAddrArray) -{ - /* Just free the entire array */ - Dns_Free(DnsAddrArray); -} - -BOOL -WINAPI -DnsAddrArray_AddIp4(IN PDNS_ARRAY DnsAddrArray, - IN IN_ADDR Address, - IN DWORD AddressType) -{ - DNS_ADDRESS DnsAddress; - - /* Build the DNS Address */ - DnsAddr_BuildFromIp4(&DnsAddress, Address, 0); - - /* Add it to the array */ - return DnsAddrArray_AddAddr(DnsAddrArray, &DnsAddress, 0, AddressType); -} - -BOOL -WINAPI -DnsAddrArray_AddAddr(IN PDNS_ARRAY DnsAddrArray, - IN PDNS_ADDRESS DnsAddress, - IN WORD AddressFamily OPTIONAL, - IN DWORD AddressType OPTIONAL) -{ - /* Make sure we have an array */ - if (!DnsAddrArray) return FALSE; - - /* Check if we should validate the Address Family */ - if (AddressFamily) - { - /* Validate it */ - if (AddressFamily != DnsAddress->AddressFamily) return TRUE; - } - - /* Check if we should validate the Address Type */ - if (AddressType) - { - /* Make sure that this array contains this type of addresses */ - if (!DnsAddrArray_ContainsAddr(DnsAddrArray, DnsAddress, AddressType)) - { - /* Won't be adding it */ - return TRUE; - } - } - - /* Make sure we have space in the array */ - if (DnsAddrArray->AllocatedAddresses < DnsAddrArray->UsedAddresses) - { - return FALSE; - } - - /* Now add the address */ - RtlCopyMemory(&DnsAddrArray->Addresses[DnsAddrArray->UsedAddresses], - DnsAddress, - sizeof(DNS_ADDRESS)); - - /* Return success */ - return TRUE; -} - -VOID -WINAPI -DnsAddr_BuildFromIp4(IN PDNS_ADDRESS DnsAddress, - IN IN_ADDR Address, - IN WORD Port) -{ - /* Clear the address */ - RtlZeroMemory(DnsAddress, sizeof(DNS_ADDRESS)); - - /* Write data */ - DnsAddress->Ip4Address.sin_family = AF_INET; - DnsAddress->Ip4Address.sin_port = Port; - DnsAddress->Ip4Address.sin_addr = Address; - DnsAddress->AddressLength = sizeof(SOCKADDR_IN); -} - -VOID -WINAPI -DnsAddr_BuildFromIp6(IN PDNS_ADDRESS DnsAddress, - IN PIN6_ADDR Address, - IN ULONG ScopeId, - IN WORD Port) -{ - /* Clear the address */ - RtlZeroMemory(DnsAddress, sizeof(DNS_ADDRESS)); - - /* Write data */ - DnsAddress->Ip6Address.sin6_family = AF_INET6; - DnsAddress->Ip6Address.sin6_port = Port; - DnsAddress->Ip6Address.sin6_addr = *Address; - DnsAddress->Ip6Address.sin6_scope_id = ScopeId; - DnsAddress->AddressLength = sizeof(SOCKADDR_IN6); -} - -VOID -WINAPI -DnsAddr_BuildFromAtm(IN PDNS_ADDRESS DnsAddress, - IN DWORD AddressType, - IN PVOID AddressData) -{ - ATM_ADDRESS Address; - - /* Clear the address */ - RtlZeroMemory(DnsAddress, sizeof(DNS_ADDRESS)); - - /* Build an ATM Address */ - Address.AddressType = AddressType; - Address.NumofDigits = DNS_ATMA_MAX_ADDR_LENGTH; - RtlCopyMemory(&Address.Addr, AddressData, DNS_ATMA_MAX_ADDR_LENGTH); - - /* Write data */ - DnsAddress->AtmAddress = Address; - DnsAddress->AddressLength = sizeof(ATM_ADDRESS); -} - -BOOLEAN -WINAPI -DnsAddr_BuildFromDnsRecord(IN PDNS_RECORD DnsRecord, - OUT PDNS_ADDRESS DnsAddr) -{ - /* Check what kind of record this is */ - switch(DnsRecord->wType) - { - /* IPv4 */ - case DNS_TYPE_A: - /* Create the DNS Address */ - DnsAddr_BuildFromIp4(DnsAddr, - *(PIN_ADDR)&DnsRecord->Data.A.IpAddress, - 0); - break; - - /* IPv6 */ - case DNS_TYPE_AAAA: - /* Create the DNS Address */ - DnsAddr_BuildFromIp6(DnsAddr, - (PIN6_ADDR)&DnsRecord->Data.AAAA.Ip6Address, - DnsRecord->dwReserved, - 0); - break; - - /* ATM */ - case DNS_TYPE_ATMA: - /* Create the DNS Address */ - DnsAddr_BuildFromAtm(DnsAddr, - DnsRecord->Data.Atma.AddressType, - &DnsRecord->Data.Atma.Address); - break; - } - - /* Done! */ - return TRUE; -} - -BOOL -WINAPI -DnsAddrArray_ContainsAddr(IN PDNS_ARRAY DnsAddrArray, - IN PDNS_ADDRESS DnsAddress, - IN DWORD AddressType) -{ - /* FIXME */ - return TRUE; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/dnsaddr.c - * PURPOSE: Functions dealing with DNS_ADDRESS and DNS_ARRAY addresses. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -PDNS_ARRAY -WINAPI -DnsAddrArray_Create(ULONG Count) -{ - PDNS_ARRAY DnsAddrArray; - - /* Allocate space for the array and the addresses within it */ - DnsAddrArray = Dns_AllocZero(sizeof(DNS_ARRAY) + - (Count * sizeof(DNS_ADDRESS))); - - /* Write the allocated address count */ - if (DnsAddrArray) DnsAddrArray->AllocatedAddresses = Count; - - /* Return it */ - return DnsAddrArray; -} - -VOID -WINAPI -DnsAddrArray_Free(IN PDNS_ARRAY DnsAddrArray) -{ - /* Just free the entire array */ - Dns_Free(DnsAddrArray); -} - -BOOL -WINAPI -DnsAddrArray_AddIp4(IN PDNS_ARRAY DnsAddrArray, - IN IN_ADDR Address, - IN DWORD AddressType) -{ - DNS_ADDRESS DnsAddress; - - /* Build the DNS Address */ - DnsAddr_BuildFromIp4(&DnsAddress, Address, 0); - - /* Add it to the array */ - return DnsAddrArray_AddAddr(DnsAddrArray, &DnsAddress, 0, AddressType); -} - -BOOL -WINAPI -DnsAddrArray_AddAddr(IN PDNS_ARRAY DnsAddrArray, - IN PDNS_ADDRESS DnsAddress, - IN WORD AddressFamily OPTIONAL, - IN DWORD AddressType OPTIONAL) -{ - /* Make sure we have an array */ - if (!DnsAddrArray) return FALSE; - - /* Check if we should validate the Address Family */ - if (AddressFamily) - { - /* Validate it */ - if (AddressFamily != DnsAddress->AddressFamily) return TRUE; - } - - /* Check if we should validate the Address Type */ - if (AddressType) - { - /* Make sure that this array contains this type of addresses */ - if (!DnsAddrArray_ContainsAddr(DnsAddrArray, DnsAddress, AddressType)) - { - /* Won't be adding it */ - return TRUE; - } - } - - /* Make sure we have space in the array */ - if (DnsAddrArray->AllocatedAddresses < DnsAddrArray->UsedAddresses) - { - return FALSE; - } - - /* Now add the address */ - RtlCopyMemory(&DnsAddrArray->Addresses[DnsAddrArray->UsedAddresses], - DnsAddress, - sizeof(DNS_ADDRESS)); - - /* Return success */ - return TRUE; -} - -VOID -WINAPI -DnsAddr_BuildFromIp4(IN PDNS_ADDRESS DnsAddress, - IN IN_ADDR Address, - IN WORD Port) -{ - /* Clear the address */ - RtlZeroMemory(DnsAddress, sizeof(DNS_ADDRESS)); - - /* Write data */ - DnsAddress->Ip4Address.sin_family = AF_INET; - DnsAddress->Ip4Address.sin_port = Port; - DnsAddress->Ip4Address.sin_addr = Address; - DnsAddress->AddressLength = sizeof(SOCKADDR_IN); -} - -VOID -WINAPI -DnsAddr_BuildFromIp6(IN PDNS_ADDRESS DnsAddress, - IN PIN6_ADDR Address, - IN ULONG ScopeId, - IN WORD Port) -{ - /* Clear the address */ - RtlZeroMemory(DnsAddress, sizeof(DNS_ADDRESS)); - - /* Write data */ - DnsAddress->Ip6Address.sin6_family = AF_INET6; - DnsAddress->Ip6Address.sin6_port = Port; - DnsAddress->Ip6Address.sin6_addr = *Address; - DnsAddress->Ip6Address.sin6_scope_id = ScopeId; - DnsAddress->AddressLength = sizeof(SOCKADDR_IN6); -} - -VOID -WINAPI -DnsAddr_BuildFromAtm(IN PDNS_ADDRESS DnsAddress, - IN DWORD AddressType, - IN PVOID AddressData) -{ - ATM_ADDRESS Address; - - /* Clear the address */ - RtlZeroMemory(DnsAddress, sizeof(DNS_ADDRESS)); - - /* Build an ATM Address */ - Address.AddressType = AddressType; - Address.NumofDigits = DNS_ATMA_MAX_ADDR_LENGTH; - RtlCopyMemory(&Address.Addr, AddressData, DNS_ATMA_MAX_ADDR_LENGTH); - - /* Write data */ - DnsAddress->AtmAddress = Address; - DnsAddress->AddressLength = sizeof(ATM_ADDRESS); -} - -BOOLEAN -WINAPI -DnsAddr_BuildFromDnsRecord(IN PDNS_RECORD DnsRecord, - OUT PDNS_ADDRESS DnsAddr) -{ - /* Check what kind of record this is */ - switch(DnsRecord->wType) - { - /* IPv4 */ - case DNS_TYPE_A: - /* Create the DNS Address */ - DnsAddr_BuildFromIp4(DnsAddr, - *(PIN_ADDR)&DnsRecord->Data.A.IpAddress, - 0); - break; - - /* IPv6 */ - case DNS_TYPE_AAAA: - /* Create the DNS Address */ - DnsAddr_BuildFromIp6(DnsAddr, - (PIN6_ADDR)&DnsRecord->Data.AAAA.Ip6Address, - DnsRecord->dwReserved, - 0); - break; - - /* ATM */ - case DNS_TYPE_ATMA: - /* Create the DNS Address */ - DnsAddr_BuildFromAtm(DnsAddr, - DnsRecord->Data.Atma.AddressType, - &DnsRecord->Data.Atma.Address); - break; - } - - /* Done! */ - return TRUE; -} - -BOOL -WINAPI -DnsAddrArray_ContainsAddr(IN PDNS_ARRAY DnsAddrArray, - IN PDNS_ADDRESS DnsAddress, - IN DWORD AddressType) -{ - /* FIXME */ - return TRUE; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/dnsaddr.c - * PURPOSE: Functions dealing with DNS_ADDRESS and DNS_ARRAY addresses. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -PDNS_ARRAY -WINAPI -DnsAddrArray_Create(ULONG Count) -{ - PDNS_ARRAY DnsAddrArray; - - /* Allocate space for the array and the addresses within it */ - DnsAddrArray = Dns_AllocZero(sizeof(DNS_ARRAY) + - (Count * sizeof(DNS_ADDRESS))); - - /* Write the allocated address count */ - if (DnsAddrArray) DnsAddrArray->AllocatedAddresses = Count; - - /* Return it */ - return DnsAddrArray; -} - -VOID -WINAPI -DnsAddrArray_Free(IN PDNS_ARRAY DnsAddrArray) -{ - /* Just free the entire array */ - Dns_Free(DnsAddrArray); -} - -BOOL -WINAPI -DnsAddrArray_AddIp4(IN PDNS_ARRAY DnsAddrArray, - IN IN_ADDR Address, - IN DWORD AddressType) -{ - DNS_ADDRESS DnsAddress; - - /* Build the DNS Address */ - DnsAddr_BuildFromIp4(&DnsAddress, Address, 0); - - /* Add it to the array */ - return DnsAddrArray_AddAddr(DnsAddrArray, &DnsAddress, 0, AddressType); -} - -BOOL -WINAPI -DnsAddrArray_AddAddr(IN PDNS_ARRAY DnsAddrArray, - IN PDNS_ADDRESS DnsAddress, - IN WORD AddressFamily OPTIONAL, - IN DWORD AddressType OPTIONAL) -{ - /* Make sure we have an array */ - if (!DnsAddrArray) return FALSE; - - /* Check if we should validate the Address Family */ - if (AddressFamily) - { - /* Validate it */ - if (AddressFamily != DnsAddress->AddressFamily) return TRUE; - } - - /* Check if we should validate the Address Type */ - if (AddressType) - { - /* Make sure that this array contains this type of addresses */ - if (!DnsAddrArray_ContainsAddr(DnsAddrArray, DnsAddress, AddressType)) - { - /* Won't be adding it */ - return TRUE; - } - } - - /* Make sure we have space in the array */ - if (DnsAddrArray->AllocatedAddresses < DnsAddrArray->UsedAddresses) - { - return FALSE; - } - - /* Now add the address */ - RtlCopyMemory(&DnsAddrArray->Addresses[DnsAddrArray->UsedAddresses], - DnsAddress, - sizeof(DNS_ADDRESS)); - - /* Return success */ - return TRUE; -} - -VOID -WINAPI -DnsAddr_BuildFromIp4(IN PDNS_ADDRESS DnsAddress, - IN IN_ADDR Address, - IN WORD Port) -{ - /* Clear the address */ - RtlZeroMemory(DnsAddress, sizeof(DNS_ADDRESS)); - - /* Write data */ - DnsAddress->Ip4Address.sin_family = AF_INET; - DnsAddress->Ip4Address.sin_port = Port; - DnsAddress->Ip4Address.sin_addr = Address; - DnsAddress->AddressLength = sizeof(SOCKADDR_IN); -} - -VOID -WINAPI -DnsAddr_BuildFromIp6(IN PDNS_ADDRESS DnsAddress, - IN PIN6_ADDR Address, - IN ULONG ScopeId, - IN WORD Port) -{ - /* Clear the address */ - RtlZeroMemory(DnsAddress, sizeof(DNS_ADDRESS)); - - /* Write data */ - DnsAddress->Ip6Address.sin6_family = AF_INET6; - DnsAddress->Ip6Address.sin6_port = Port; - DnsAddress->Ip6Address.sin6_addr = *Address; - DnsAddress->Ip6Address.sin6_scope_id = ScopeId; - DnsAddress->AddressLength = sizeof(SOCKADDR_IN6); -} - -VOID -WINAPI -DnsAddr_BuildFromAtm(IN PDNS_ADDRESS DnsAddress, - IN DWORD AddressType, - IN PVOID AddressData) -{ - ATM_ADDRESS Address; - - /* Clear the address */ - RtlZeroMemory(DnsAddress, sizeof(DNS_ADDRESS)); - - /* Build an ATM Address */ - Address.AddressType = AddressType; - Address.NumofDigits = DNS_ATMA_MAX_ADDR_LENGTH; - RtlCopyMemory(&Address.Addr, AddressData, DNS_ATMA_MAX_ADDR_LENGTH); - - /* Write data */ - DnsAddress->AtmAddress = Address; - DnsAddress->AddressLength = sizeof(ATM_ADDRESS); -} - -BOOLEAN -WINAPI -DnsAddr_BuildFromDnsRecord(IN PDNS_RECORD DnsRecord, - OUT PDNS_ADDRESS DnsAddr) -{ - /* Check what kind of record this is */ - switch(DnsRecord->wType) - { - /* IPv4 */ - case DNS_TYPE_A: - /* Create the DNS Address */ - DnsAddr_BuildFromIp4(DnsAddr, - *(PIN_ADDR)&DnsRecord->Data.A.IpAddress, - 0); - break; - - /* IPv6 */ - case DNS_TYPE_AAAA: - /* Create the DNS Address */ - DnsAddr_BuildFromIp6(DnsAddr, - (PIN6_ADDR)&DnsRecord->Data.AAAA.Ip6Address, - DnsRecord->dwReserved, - 0); - break; - - /* ATM */ - case DNS_TYPE_ATMA: - /* Create the DNS Address */ - DnsAddr_BuildFromAtm(DnsAddr, - DnsRecord->Data.Atma.AddressType, - &DnsRecord->Data.Atma.Address); - break; - } - - /* Done! */ - return TRUE; -} - -BOOL -WINAPI -DnsAddrArray_ContainsAddr(IN PDNS_ARRAY DnsAddrArray, - IN PDNS_ADDRESS DnsAddress, - IN DWORD AddressType) -{ - /* FIXME */ - return TRUE; -} - diff --git a/dll/win32/mswsock/dns/dnsutil.c b/dll/win32/mswsock/dns/dnsutil.c index 0830457b586..1d0e814d911 100644 --- a/dll/win32/mswsock/dns/dnsutil.c +++ b/dll/win32/mswsock/dns/dnsutil.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/dnsutil.c - * PURPOSE: Contains misc. DNS utility functions, like DNS_STATUS->String. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/dnsutil.c - * PURPOSE: Contains misc. DNS utility functions, like DNS_STATUS->String. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/dnsutil.c - * PURPOSE: Contains misc. DNS utility functions, like DNS_STATUS->String. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/dns/flatbuf.c b/dll/win32/mswsock/dns/flatbuf.c index 6d33b21f71e..dfceb3e82a3 100644 --- a/dll/win32/mswsock/dns/flatbuf.c +++ b/dll/win32/mswsock/dns/flatbuf.c @@ -114,351 +114,3 @@ FlatBuf_Arg_WriteString(IN OUT PULONG_PTR Position, return Destination; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/flatbuf.c - * PURPOSE: Functions for managing the Flat Buffer Implementation (FLATBUF) - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -VOID -WINAPI -FlatBuf_Init(IN PFLATBUFF FlatBuffer, - IN PVOID Buffer, - IN SIZE_T Size) -{ - /* Set up the Flat Buffer start, current and ending position */ - FlatBuffer->Buffer = Buffer; - FlatBuffer->BufferPos = (ULONG_PTR)Buffer; - FlatBuffer->BufferEnd = (PVOID)(FlatBuffer->BufferPos + Size); - - /* Setup the current size and the available size */ - FlatBuffer->BufferSize = FlatBuffer->BufferFreeSize = Size; -} - -PVOID -WINAPI -FlatBuf_Arg_Reserve(IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN SIZE_T Size, - IN ULONG Align) -{ - ULONG_PTR NewPosition, OldPosition = *Position; - SIZE_T NewFreeSize = *FreeSize; - - /* Start by aligning our position */ - if (Align) OldPosition += (Align - 1) & ~Align; - - /* Update it */ - NewPosition = OldPosition + Size; - - /* Update Free Size */ - NewFreeSize += (OldPosition - NewPosition); - - /* Save new values */ - *Position = NewPosition; - *FreeSize = NewFreeSize; - - /* Check if we're out of space or not */ - if (NewFreeSize > 0) return (PVOID)OldPosition; - return NULL; -} - -PVOID -WINAPI -FlatBuf_Arg_CopyMemory(IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN PVOID Buffer, - IN SIZE_T Size, - IN ULONG Align) -{ - PVOID Destination; - - /* First reserve the memory */ - Destination = FlatBuf_Arg_Reserve(Position, FreeSize, Size, Align); - if (Destination) - { - /* We have space, do the copy */ - RtlCopyMemory(Destination, Buffer, Size); - } - - /* Return the pointer to the data */ - return Destination; -} - -PVOID -WINAPI -FlatBuf_Arg_WriteString(IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN PVOID String, - IN BOOLEAN IsUnicode) -{ - PVOID Destination; - SIZE_T StringLength; - ULONG Align; - - /* Calculate the string length */ - if (IsUnicode) - { - /* Get the length in bytes and use WCHAR alignment */ - StringLength = (wcslen((LPWSTR)String) + 1) * sizeof(WCHAR); - Align = sizeof(WCHAR); - } - else - { - /* Get the length in bytes and use CHAR alignment */ - StringLength = strlen((LPSTR)String) + 1; - Align = sizeof(CHAR); - } - - /* Now reserve the memory */ - Destination = FlatBuf_Arg_Reserve(Position, FreeSize, StringLength, Align); - if (Destination) - { - /* We have space, do the copy */ - RtlCopyMemory(Destination, String, StringLength); - } - - /* Return the pointer to the data */ - return Destination; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/flatbuf.c - * PURPOSE: Functions for managing the Flat Buffer Implementation (FLATBUF) - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -VOID -WINAPI -FlatBuf_Init(IN PFLATBUFF FlatBuffer, - IN PVOID Buffer, - IN SIZE_T Size) -{ - /* Set up the Flat Buffer start, current and ending position */ - FlatBuffer->Buffer = Buffer; - FlatBuffer->BufferPos = (ULONG_PTR)Buffer; - FlatBuffer->BufferEnd = (PVOID)(FlatBuffer->BufferPos + Size); - - /* Setup the current size and the available size */ - FlatBuffer->BufferSize = FlatBuffer->BufferFreeSize = Size; -} - -PVOID -WINAPI -FlatBuf_Arg_Reserve(IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN SIZE_T Size, - IN ULONG Align) -{ - ULONG_PTR NewPosition, OldPosition = *Position; - SIZE_T NewFreeSize = *FreeSize; - - /* Start by aligning our position */ - if (Align) OldPosition += (Align - 1) & ~Align; - - /* Update it */ - NewPosition = OldPosition + Size; - - /* Update Free Size */ - NewFreeSize += (OldPosition - NewPosition); - - /* Save new values */ - *Position = NewPosition; - *FreeSize = NewFreeSize; - - /* Check if we're out of space or not */ - if (NewFreeSize > 0) return (PVOID)OldPosition; - return NULL; -} - -PVOID -WINAPI -FlatBuf_Arg_CopyMemory(IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN PVOID Buffer, - IN SIZE_T Size, - IN ULONG Align) -{ - PVOID Destination; - - /* First reserve the memory */ - Destination = FlatBuf_Arg_Reserve(Position, FreeSize, Size, Align); - if (Destination) - { - /* We have space, do the copy */ - RtlCopyMemory(Destination, Buffer, Size); - } - - /* Return the pointer to the data */ - return Destination; -} - -PVOID -WINAPI -FlatBuf_Arg_WriteString(IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN PVOID String, - IN BOOLEAN IsUnicode) -{ - PVOID Destination; - SIZE_T StringLength; - ULONG Align; - - /* Calculate the string length */ - if (IsUnicode) - { - /* Get the length in bytes and use WCHAR alignment */ - StringLength = (wcslen((LPWSTR)String) + 1) * sizeof(WCHAR); - Align = sizeof(WCHAR); - } - else - { - /* Get the length in bytes and use CHAR alignment */ - StringLength = strlen((LPSTR)String) + 1; - Align = sizeof(CHAR); - } - - /* Now reserve the memory */ - Destination = FlatBuf_Arg_Reserve(Position, FreeSize, StringLength, Align); - if (Destination) - { - /* We have space, do the copy */ - RtlCopyMemory(Destination, String, StringLength); - } - - /* Return the pointer to the data */ - return Destination; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/flatbuf.c - * PURPOSE: Functions for managing the Flat Buffer Implementation (FLATBUF) - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -VOID -WINAPI -FlatBuf_Init(IN PFLATBUFF FlatBuffer, - IN PVOID Buffer, - IN SIZE_T Size) -{ - /* Set up the Flat Buffer start, current and ending position */ - FlatBuffer->Buffer = Buffer; - FlatBuffer->BufferPos = (ULONG_PTR)Buffer; - FlatBuffer->BufferEnd = (PVOID)(FlatBuffer->BufferPos + Size); - - /* Setup the current size and the available size */ - FlatBuffer->BufferSize = FlatBuffer->BufferFreeSize = Size; -} - -PVOID -WINAPI -FlatBuf_Arg_Reserve(IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN SIZE_T Size, - IN ULONG Align) -{ - ULONG_PTR NewPosition, OldPosition = *Position; - SIZE_T NewFreeSize = *FreeSize; - - /* Start by aligning our position */ - if (Align) OldPosition += (Align - 1) & ~Align; - - /* Update it */ - NewPosition = OldPosition + Size; - - /* Update Free Size */ - NewFreeSize += (OldPosition - NewPosition); - - /* Save new values */ - *Position = NewPosition; - *FreeSize = NewFreeSize; - - /* Check if we're out of space or not */ - if (NewFreeSize > 0) return (PVOID)OldPosition; - return NULL; -} - -PVOID -WINAPI -FlatBuf_Arg_CopyMemory(IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN PVOID Buffer, - IN SIZE_T Size, - IN ULONG Align) -{ - PVOID Destination; - - /* First reserve the memory */ - Destination = FlatBuf_Arg_Reserve(Position, FreeSize, Size, Align); - if (Destination) - { - /* We have space, do the copy */ - RtlCopyMemory(Destination, Buffer, Size); - } - - /* Return the pointer to the data */ - return Destination; -} - -PVOID -WINAPI -FlatBuf_Arg_WriteString(IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN PVOID String, - IN BOOLEAN IsUnicode) -{ - PVOID Destination; - SIZE_T StringLength; - ULONG Align; - - /* Calculate the string length */ - if (IsUnicode) - { - /* Get the length in bytes and use WCHAR alignment */ - StringLength = (wcslen((LPWSTR)String) + 1) * sizeof(WCHAR); - Align = sizeof(WCHAR); - } - else - { - /* Get the length in bytes and use CHAR alignment */ - StringLength = strlen((LPSTR)String) + 1; - Align = sizeof(CHAR); - } - - /* Now reserve the memory */ - Destination = FlatBuf_Arg_Reserve(Position, FreeSize, StringLength, Align); - if (Destination) - { - /* We have space, do the copy */ - RtlCopyMemory(Destination, String, StringLength); - } - - /* Return the pointer to the data */ - return Destination; -} - diff --git a/dll/win32/mswsock/dns/hostent.c b/dll/win32/mswsock/dns/hostent.c index c444ac28940..f7c9e64bb39 100644 --- a/dll/win32/mswsock/dns/hostent.c +++ b/dll/win32/mswsock/dns/hostent.c @@ -95,294 +95,3 @@ Hostent_ConvertToOffsets(IN PHOSTENT Hostent) } } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/hostent.c - * PURPOSE: Functions for dealing with Host Entry structures - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -PHOSTENT -WINAPI -Hostent_Init(IN PVOID *Buffer, - IN WORD AddressFamily, - IN ULONG AddressSize, - IN ULONG AddressCount, - IN ULONG AliasCount) -{ - PHOSTENT Hostent; - ULONG_PTR BufferPosition = (ULONG_PTR)*Buffer; - - /* Align the hostent on the buffer's 4 byte boundary */ - BufferPosition += 3 & ~3; - - /* Set up the basic data */ - Hostent = (PHOSTENT)BufferPosition; - Hostent->h_length = (WORD)AddressSize; - Hostent->h_addrtype = AddressFamily; - - /* Put aliases after Hostent */ - Hostent->h_aliases = (PCHAR*)((ULONG_PTR)(Hostent + 1) & ~3); - - /* Zero it out */ - RtlZeroMemory(Hostent->h_aliases, AliasCount * sizeof(PCHAR)); - - /* Put addresses after aliases */ - Hostent->h_addr_list = (PCHAR*) - ((ULONG_PTR)Hostent->h_aliases + - (AliasCount * sizeof(PCHAR)) + sizeof(PCHAR)); - - /* Update the location */ - BufferPosition = (ULONG_PTR)Hostent->h_addr_list + - ((AddressCount * sizeof(PCHAR)) + sizeof(PCHAR)); - - /* Send it back */ - *Buffer = (PVOID)BufferPosition; - - /* Return the hostent */ - return Hostent; -} - -VOID -WINAPI -Dns_PtrArrayToOffsetArray(PCHAR *List, - ULONG_PTR Base) -{ - /* Loop every pointer in the list */ - do - { - /* Update the pointer */ - *List = (PCHAR)((ULONG_PTR)*List - Base); - } while(*List++); -} - -VOID -WINAPI -Hostent_ConvertToOffsets(IN PHOSTENT Hostent) -{ - /* Do we have a name? */ - if (Hostent->h_name) - { - /* Update it */ - Hostent->h_name -= (ULONG_PTR)Hostent; - } - - /* Do we have aliases? */ - if (Hostent->h_aliases) - { - /* Update the pointer */ - Hostent->h_aliases -= (ULONG_PTR)Hostent; - - /* Fix them up */ - Dns_PtrArrayToOffsetArray(Hostent->h_aliases, (ULONG_PTR)Hostent); - } - - /* Do we have addresses? */ - if (Hostent->h_addr_list) - { - /* Fix them up */ - Dns_PtrArrayToOffsetArray(Hostent->h_addr_list, (ULONG_PTR)Hostent); - } -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/hostent.c - * PURPOSE: Functions for dealing with Host Entry structures - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -PHOSTENT -WINAPI -Hostent_Init(IN PVOID *Buffer, - IN WORD AddressFamily, - IN ULONG AddressSize, - IN ULONG AddressCount, - IN ULONG AliasCount) -{ - PHOSTENT Hostent; - ULONG_PTR BufferPosition = (ULONG_PTR)*Buffer; - - /* Align the hostent on the buffer's 4 byte boundary */ - BufferPosition += 3 & ~3; - - /* Set up the basic data */ - Hostent = (PHOSTENT)BufferPosition; - Hostent->h_length = (WORD)AddressSize; - Hostent->h_addrtype = AddressFamily; - - /* Put aliases after Hostent */ - Hostent->h_aliases = (PCHAR*)((ULONG_PTR)(Hostent + 1) & ~3); - - /* Zero it out */ - RtlZeroMemory(Hostent->h_aliases, AliasCount * sizeof(PCHAR)); - - /* Put addresses after aliases */ - Hostent->h_addr_list = (PCHAR*) - ((ULONG_PTR)Hostent->h_aliases + - (AliasCount * sizeof(PCHAR)) + sizeof(PCHAR)); - - /* Update the location */ - BufferPosition = (ULONG_PTR)Hostent->h_addr_list + - ((AddressCount * sizeof(PCHAR)) + sizeof(PCHAR)); - - /* Send it back */ - *Buffer = (PVOID)BufferPosition; - - /* Return the hostent */ - return Hostent; -} - -VOID -WINAPI -Dns_PtrArrayToOffsetArray(PCHAR *List, - ULONG_PTR Base) -{ - /* Loop every pointer in the list */ - do - { - /* Update the pointer */ - *List = (PCHAR)((ULONG_PTR)*List - Base); - } while(*List++); -} - -VOID -WINAPI -Hostent_ConvertToOffsets(IN PHOSTENT Hostent) -{ - /* Do we have a name? */ - if (Hostent->h_name) - { - /* Update it */ - Hostent->h_name -= (ULONG_PTR)Hostent; - } - - /* Do we have aliases? */ - if (Hostent->h_aliases) - { - /* Update the pointer */ - Hostent->h_aliases -= (ULONG_PTR)Hostent; - - /* Fix them up */ - Dns_PtrArrayToOffsetArray(Hostent->h_aliases, (ULONG_PTR)Hostent); - } - - /* Do we have addresses? */ - if (Hostent->h_addr_list) - { - /* Fix them up */ - Dns_PtrArrayToOffsetArray(Hostent->h_addr_list, (ULONG_PTR)Hostent); - } -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/hostent.c - * PURPOSE: Functions for dealing with Host Entry structures - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -PHOSTENT -WINAPI -Hostent_Init(IN PVOID *Buffer, - IN WORD AddressFamily, - IN ULONG AddressSize, - IN ULONG AddressCount, - IN ULONG AliasCount) -{ - PHOSTENT Hostent; - ULONG_PTR BufferPosition = (ULONG_PTR)*Buffer; - - /* Align the hostent on the buffer's 4 byte boundary */ - BufferPosition += 3 & ~3; - - /* Set up the basic data */ - Hostent = (PHOSTENT)BufferPosition; - Hostent->h_length = (WORD)AddressSize; - Hostent->h_addrtype = AddressFamily; - - /* Put aliases after Hostent */ - Hostent->h_aliases = (PCHAR*)((ULONG_PTR)(Hostent + 1) & ~3); - - /* Zero it out */ - RtlZeroMemory(Hostent->h_aliases, AliasCount * sizeof(PCHAR)); - - /* Put addresses after aliases */ - Hostent->h_addr_list = (PCHAR*) - ((ULONG_PTR)Hostent->h_aliases + - (AliasCount * sizeof(PCHAR)) + sizeof(PCHAR)); - - /* Update the location */ - BufferPosition = (ULONG_PTR)Hostent->h_addr_list + - ((AddressCount * sizeof(PCHAR)) + sizeof(PCHAR)); - - /* Send it back */ - *Buffer = (PVOID)BufferPosition; - - /* Return the hostent */ - return Hostent; -} - -VOID -WINAPI -Dns_PtrArrayToOffsetArray(PCHAR *List, - ULONG_PTR Base) -{ - /* Loop every pointer in the list */ - do - { - /* Update the pointer */ - *List = (PCHAR)((ULONG_PTR)*List - Base); - } while(*List++); -} - -VOID -WINAPI -Hostent_ConvertToOffsets(IN PHOSTENT Hostent) -{ - /* Do we have a name? */ - if (Hostent->h_name) - { - /* Update it */ - Hostent->h_name -= (ULONG_PTR)Hostent; - } - - /* Do we have aliases? */ - if (Hostent->h_aliases) - { - /* Update the pointer */ - Hostent->h_aliases -= (ULONG_PTR)Hostent; - - /* Fix them up */ - Dns_PtrArrayToOffsetArray(Hostent->h_aliases, (ULONG_PTR)Hostent); - } - - /* Do we have addresses? */ - if (Hostent->h_addr_list) - { - /* Fix them up */ - Dns_PtrArrayToOffsetArray(Hostent->h_addr_list, (ULONG_PTR)Hostent); - } -} - diff --git a/dll/win32/mswsock/dns/inc/dnslib.h b/dll/win32/mswsock/dns/inc/dnslib.h index b19220f6ad0..4c187f15b37 100644 --- a/dll/win32/mswsock/dns/inc/dnslib.h +++ b/dll/win32/mswsock/dns/inc/dnslib.h @@ -1,144 +1,343 @@ /* * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/precomp.h - * PURPOSE: DNSLIB Precompiled Header + * PROJECT: ReactOS Ancillary Function Driver DLL + * FILE: include/mswsock.h + * PURPOSE: Ancillary Function Driver DLL header */ +#ifndef __DNSLIB_H +#define __DNSLIB_H -#define _CRT_SECURE_NO_DEPRECATE -#define _WIN32_WINNT 0x502 -#define WIN32_NO_STATUS +/* INCLUDES ******************************************************************/ +#include -/* PSDK Headers */ -#include -#include -#include +/* ENUMERATIONS **************************************************************/ -/* DNSLIB and DNSAPI Headers */ -#include -#include +typedef enum _DNS_STRING_TYPE +{ + UnicodeString = 1, + Utf8String, + AnsiString, +} DNS_STRING_TYPE; -/* NDK */ -#include +#define IpV4Address 3 -/* EOF */ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/precomp.h - * PURPOSE: DNSLIB Precompiled Header - */ +/* TYPES *********************************************************************/ + +typedef struct _DNS_IPV6_ADDRESS +{ + ULONG Unknown; + ULONG Unknown2; + IP6_ADDRESS Address; + ULONG Unknown3; + ULONG Unknown4; + DWORD Reserved; + ULONG Unknown5; +} DNS_IPV6_ADDRESS, *PDNS_IPV6_ADDRESS; -#define _CRT_SECURE_NO_DEPRECATE -#define _WIN32_WINNT 0x502 -#define WIN32_NO_STATUS +typedef struct _DNS_ADDRESS +{ + union + { + struct + { + WORD AddressFamily; + WORD Port; + ATM_ADDRESS AtmAddress; + }; + SOCKADDR_IN Ip4Address; + SOCKADDR_IN6 Ip6Address; + }; + ULONG AddressLength; + DWORD Sub; + ULONG Flag; +} DNS_ADDRESS, *PDNS_ADDRESS; -/* PSDK Headers */ -#include -#include -#include +typedef struct _DNS_ARRAY +{ + ULONG AllocatedAddresses; + ULONG UsedAddresses; + ULONG Unknown[0x6]; + DNS_ADDRESS Addresses[1]; +} DNS_ARRAY, *PDNS_ARRAY; -/* DNSLIB and DNSAPI Headers */ -#include -#include +typedef struct _DNS_BLOB +{ + LPWSTR Name; + PDNS_ARRAY DnsAddrArray; + PHOSTENT Hostent; + ULONG AliasCount; + ULONG Unknown; + LPWSTR Aliases[8]; +} DNS_BLOB, *PDNS_BLOB; -/* NDK */ -#include +typedef struct _DNS_FAMILY_INFO +{ + WORD AddrType; + WORD DnsType; + DWORD AddressSize; + DWORD SockaddrSize; + DWORD AddressOffset; +} DNS_FAMILY_INFO, *PDNS_FAMILY_INFO; + +typedef struct _FLATBUFF +{ + PVOID Buffer; + PVOID BufferEnd; + ULONG_PTR BufferPos; + SIZE_T BufferSize; + SIZE_T BufferFreeSize; +} FLATBUFF, *PFLATBUFF; -/* EOF */ /* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/precomp.h - * PURPOSE: DNSLIB Precompiled Header + * memory.c + */ +VOID +WINAPI +Dns_Free(IN PVOID Address); + +PVOID +WINAPI +Dns_AllocZero(IN SIZE_T Size); + +/* + * addr.c */ +PDNS_FAMILY_INFO +WINAPI +FamilyInfo_GetForFamily(IN WORD AddressFamily); + +/* + * dnsaddr.c + */ +VOID +WINAPI +DnsAddr_BuildFromIp4( + IN PDNS_ADDRESS DnsAddress, + IN IN_ADDR Address, + IN WORD Unknown +); + +VOID +WINAPI +DnsAddr_BuildFromIp6( + IN PDNS_ADDRESS DnsAddress, + IN PIN6_ADDR Address, + IN ULONG ScopeId, + IN WORD Port +); -#define _CRT_SECURE_NO_DEPRECATE -#define _WIN32_WINNT 0x502 -#define WIN32_NO_STATUS +PDNS_ARRAY +WINAPI +DnsAddrArray_Create(ULONG Count); -/* PSDK Headers */ -#include -#include -#include +BOOL +WINAPI +DnsAddrArray_AddAddr( + IN PDNS_ARRAY DnsAddrArray, + IN PDNS_ADDRESS DnsAddress, + IN WORD AddressFamily OPTIONAL, + IN DWORD AddressType OPTIONAL +); -/* DNSLIB and DNSAPI Headers */ -#include -#include +VOID +WINAPI +DnsAddrArray_Free(IN PDNS_ARRAY DnsAddrArray); -/* NDK */ -#include +BOOL +WINAPI +DnsAddrArray_AddIp4( + IN PDNS_ARRAY DnsAddrArray, + IN IN_ADDR Address, + IN DWORD AddressType +); + +BOOL +WINAPI +DnsAddrArray_ContainsAddr( + IN PDNS_ARRAY DnsAddrArray, + IN PDNS_ADDRESS DnsAddress, + IN DWORD AddressType +); + +BOOLEAN +WINAPI +DnsAddr_BuildFromDnsRecord( + IN PDNS_RECORD DnsRecord, + OUT PDNS_ADDRESS DnsAddr +); -/* EOF */ /* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/precomp.h - * PURPOSE: DNSLIB Precompiled Header + * hostent.c */ +PHOSTENT +WINAPI +Hostent_Init( + IN PVOID *Buffer, + IN WORD AddressFamily, + IN ULONG AddressSize, + IN ULONG AddressCount, + IN ULONG AliasCount +); -#define _CRT_SECURE_NO_DEPRECATE -#define _WIN32_WINNT 0x502 -#define WIN32_NO_STATUS +VOID +WINAPI +Hostent_ConvertToOffsets(IN PHOSTENT Hostent); -/* PSDK Headers */ -#include -#include -#include +/* + * flatbuf.c + */ +VOID +WINAPI +FlatBuf_Init( + IN PFLATBUFF FlatBuffer, + IN PVOID Buffer, + IN SIZE_T Size +); + +PVOID +WINAPI +FlatBuf_Arg_CopyMemory( + IN OUT PULONG_PTR Position, + IN OUT PSIZE_T FreeSize, + IN PVOID Buffer, + IN SIZE_T Size, + IN ULONG Align +); -/* DNSLIB and DNSAPI Headers */ -#include -#include +PVOID +WINAPI +FlatBuf_Arg_Reserve( + IN OUT PULONG_PTR Position, + IN OUT PSIZE_T FreeSize, + IN SIZE_T Size, + IN ULONG Align +); -/* NDK */ -#include +PVOID +WINAPI +FlatBuf_Arg_WriteString( + IN OUT PULONG_PTR Position, + IN OUT PSIZE_T FreeSize, + IN PVOID String, + IN BOOLEAN IsUnicode +); -/* EOF */ /* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/precomp.h - * PURPOSE: DNSLIB Precompiled Header + * sablob.c */ +PDNS_BLOB +WINAPI +SaBlob_Create( + IN ULONG Count +); -#define _CRT_SECURE_NO_DEPRECATE -#define _WIN32_WINNT 0x502 -#define WIN32_NO_STATUS +PDNS_BLOB +WINAPI +SaBlob_CreateFromIp4( + IN LPWSTR Name, + IN ULONG Count, + IN PIN_ADDR AddressArray +); -/* PSDK Headers */ -#include -#include -#include +VOID +WINAPI +SaBlob_Free(IN PDNS_BLOB Blob); -/* DNSLIB and DNSAPI Headers */ -#include -#include +PHOSTENT +WINAPI +SaBlob_CreateHostent( + IN OUT PULONG_PTR BufferPosition, + IN OUT PSIZE_T RemainingBufferSpace, + IN OUT PSIZE_T HostEntrySize, + IN PDNS_BLOB Blob, + IN DWORD StringType, + IN BOOLEAN Relative, + IN BOOLEAN BufferAllocated +); -/* NDK */ -#include +INT +WINAPI +SaBlob_WriteNameOrAlias( + IN PDNS_BLOB Blob, + IN LPWSTR String, + IN BOOLEAN IsAlias +); + +PDNS_BLOB +WINAPI +SaBlob_Query( + IN LPWSTR Name, + IN WORD DnsType, + IN ULONG Flags, + IN PVOID *Reserved, + IN DWORD AddressFamily +); -/* EOF */ /* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/precomp.h - * PURPOSE: DNSLIB Precompiled Header + * string.c + */ +ULONG +WINAPI +Dns_StringCopy( + OUT PVOID Destination, + IN OUT PULONG DestinationSize, + IN PVOID String, + IN ULONG StringSize OPTIONAL, + IN DWORD InputType, + IN DWORD OutputType +); + +LPWSTR +WINAPI +Dns_CreateStringCopy_W(IN LPWSTR Name); + +ULONG +WINAPI +Dns_GetBufferLengthForStringCopy( + IN PVOID String, + IN ULONG Size OPTIONAL, + IN DWORD InputType, + IN DWORD OutputType +); + +/* + * straddr.c */ +BOOLEAN +WINAPI +Dns_StringToAddressW( + OUT PVOID Address, + IN OUT PULONG AddressSize, + IN LPWSTR AddressName, + IN OUT PDWORD AddressFamily +); -#define _CRT_SECURE_NO_DEPRECATE -#define _WIN32_WINNT 0x502 -#define WIN32_NO_STATUS +LPWSTR +WINAPI +Dns_Ip4AddressToReverseName_W( + OUT LPWSTR Name, + IN IN_ADDR Address +); -/* PSDK Headers */ -#include -#include -#include +LPWSTR +WINAPI +Dns_Ip6AddressToReverseName_W( + OUT LPWSTR Name, + IN IN6_ADDR Address +); -/* DNSLIB and DNSAPI Headers */ -#include -#include +BOOLEAN +WINAPI +Dns_ReverseNameToDnsAddr_W( + OUT PDNS_ADDRESS DnsAddr, + IN LPWSTR Name +); -/* NDK */ -#include +BOOLEAN +WINAPI +Dns_Ip4ReverseNameToAddress_W( + OUT PIN_ADDR Address, + IN LPWSTR Name +); -/* EOF */ +#endif diff --git a/dll/win32/mswsock/dns/inc/dnslibp.h b/dll/win32/mswsock/dns/inc/dnslibp.h deleted file mode 100644 index 86359ae9172..00000000000 --- a/dll/win32/mswsock/dns/inc/dnslibp.h +++ /dev/null @@ -1,2058 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Ancillary Function Driver DLL - * FILE: include/mswsock.h - * PURPOSE: Ancillary Function Driver DLL header - */ -#ifndef __DNSLIB_H -#define __DNSLIB_H - -/* INCLUDES ******************************************************************/ -#include - -/* ENUMERATIONS **************************************************************/ - -typedef enum _DNS_STRING_TYPE -{ - UnicodeString = 1, - Utf8String, - AnsiString, -} DNS_STRING_TYPE; - -#define IpV4Address 3 - -/* TYPES *********************************************************************/ - -typedef struct _DNS_IPV6_ADDRESS -{ - ULONG Unknown; - ULONG Unknown2; - IP6_ADDRESS Address; - ULONG Unknown3; - ULONG Unknown4; - DWORD Reserved; - ULONG Unknown5; -} DNS_IPV6_ADDRESS, *PDNS_IPV6_ADDRESS; - -typedef struct _DNS_ADDRESS -{ - union - { - struct - { - WORD AddressFamily; - WORD Port; - ATM_ADDRESS AtmAddress; - }; - SOCKADDR_IN Ip4Address; - SOCKADDR_IN6 Ip6Address; - }; - ULONG AddressLength; - DWORD Sub; - ULONG Flag; -} DNS_ADDRESS, *PDNS_ADDRESS; - -typedef struct _DNS_ARRAY -{ - ULONG AllocatedAddresses; - ULONG UsedAddresses; - ULONG Unknown[0x6]; - DNS_ADDRESS Addresses[1]; -} DNS_ARRAY, *PDNS_ARRAY; - -typedef struct _DNS_BLOB -{ - LPWSTR Name; - PDNS_ARRAY DnsAddrArray; - PHOSTENT Hostent; - ULONG AliasCount; - ULONG Unknown; - LPWSTR Aliases[8]; -} DNS_BLOB, *PDNS_BLOB; - -typedef struct _DNS_FAMILY_INFO -{ - WORD AddrType; - WORD DnsType; - DWORD AddressSize; - DWORD SockaddrSize; - DWORD AddressOffset; -} DNS_FAMILY_INFO, *PDNS_FAMILY_INFO; - -typedef struct _FLATBUFF -{ - PVOID Buffer; - PVOID BufferEnd; - ULONG_PTR BufferPos; - SIZE_T BufferSize; - SIZE_T BufferFreeSize; -} FLATBUFF, *PFLATBUFF; - -/* - * memory.c - */ -VOID -WINAPI -Dns_Free(IN PVOID Address); - -PVOID -WINAPI -Dns_AllocZero(IN SIZE_T Size); - -/* - * addr.c - */ -PDNS_FAMILY_INFO -WINAPI -FamilyInfo_GetForFamily(IN WORD AddressFamily); - -/* - * dnsaddr.c - */ -VOID -WINAPI -DnsAddr_BuildFromIp4( - IN PDNS_ADDRESS DnsAddress, - IN IN_ADDR Address, - IN WORD Unknown -); - -VOID -WINAPI -DnsAddr_BuildFromIp6( - IN PDNS_ADDRESS DnsAddress, - IN PIN6_ADDR Address, - IN ULONG ScopeId, - IN WORD Port -); - -PDNS_ARRAY -WINAPI -DnsAddrArray_Create(ULONG Count); - -BOOL -WINAPI -DnsAddrArray_AddAddr( - IN PDNS_ARRAY DnsAddrArray, - IN PDNS_ADDRESS DnsAddress, - IN WORD AddressFamily OPTIONAL, - IN DWORD AddressType OPTIONAL -); - -VOID -WINAPI -DnsAddrArray_Free(IN PDNS_ARRAY DnsAddrArray); - -BOOL -WINAPI -DnsAddrArray_AddIp4( - IN PDNS_ARRAY DnsAddrArray, - IN IN_ADDR Address, - IN DWORD AddressType -); - -BOOL -WINAPI -DnsAddrArray_ContainsAddr( - IN PDNS_ARRAY DnsAddrArray, - IN PDNS_ADDRESS DnsAddress, - IN DWORD AddressType -); - -BOOLEAN -WINAPI -DnsAddr_BuildFromDnsRecord( - IN PDNS_RECORD DnsRecord, - OUT PDNS_ADDRESS DnsAddr -); - -/* - * hostent.c - */ -PHOSTENT -WINAPI -Hostent_Init( - IN PVOID *Buffer, - IN WORD AddressFamily, - IN ULONG AddressSize, - IN ULONG AddressCount, - IN ULONG AliasCount -); - -VOID -WINAPI -Hostent_ConvertToOffsets(IN PHOSTENT Hostent); - -/* - * flatbuf.c - */ -VOID -WINAPI -FlatBuf_Init( - IN PFLATBUFF FlatBuffer, - IN PVOID Buffer, - IN SIZE_T Size -); - -PVOID -WINAPI -FlatBuf_Arg_CopyMemory( - IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN PVOID Buffer, - IN SIZE_T Size, - IN ULONG Align -); - -PVOID -WINAPI -FlatBuf_Arg_Reserve( - IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN SIZE_T Size, - IN ULONG Align -); - -PVOID -WINAPI -FlatBuf_Arg_WriteString( - IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN PVOID String, - IN BOOLEAN IsUnicode -); - -/* - * sablob.c - */ -PDNS_BLOB -WINAPI -SaBlob_Create( - IN ULONG Count -); - -PDNS_BLOB -WINAPI -SaBlob_CreateFromIp4( - IN LPWSTR Name, - IN ULONG Count, - IN PIN_ADDR AddressArray -); - -VOID -WINAPI -SaBlob_Free(IN PDNS_BLOB Blob); - -PHOSTENT -WINAPI -SaBlob_CreateHostent( - IN OUT PULONG_PTR BufferPosition, - IN OUT PSIZE_T RemainingBufferSpace, - IN OUT PSIZE_T HostEntrySize, - IN PDNS_BLOB Blob, - IN DWORD StringType, - IN BOOLEAN Relative, - IN BOOLEAN BufferAllocated -); - -INT -WINAPI -SaBlob_WriteNameOrAlias( - IN PDNS_BLOB Blob, - IN LPWSTR String, - IN BOOLEAN IsAlias -); - -PDNS_BLOB -WINAPI -SaBlob_Query( - IN LPWSTR Name, - IN WORD DnsType, - IN ULONG Flags, - IN PVOID *Reserved, - IN DWORD AddressFamily -); - -/* - * string.c - */ -ULONG -WINAPI -Dns_StringCopy( - OUT PVOID Destination, - IN OUT PULONG DestinationSize, - IN PVOID String, - IN ULONG StringSize OPTIONAL, - IN DWORD InputType, - IN DWORD OutputType -); - -LPWSTR -WINAPI -Dns_CreateStringCopy_W(IN LPWSTR Name); - -ULONG -WINAPI -Dns_GetBufferLengthForStringCopy( - IN PVOID String, - IN ULONG Size OPTIONAL, - IN DWORD InputType, - IN DWORD OutputType -); - -/* - * straddr.c - */ -BOOLEAN -WINAPI -Dns_StringToAddressW( - OUT PVOID Address, - IN OUT PULONG AddressSize, - IN LPWSTR AddressName, - IN OUT PDWORD AddressFamily -); - -LPWSTR -WINAPI -Dns_Ip4AddressToReverseName_W( - OUT LPWSTR Name, - IN IN_ADDR Address -); - -LPWSTR -WINAPI -Dns_Ip6AddressToReverseName_W( - OUT LPWSTR Name, - IN IN6_ADDR Address -); - -BOOLEAN -WINAPI -Dns_ReverseNameToDnsAddr_W( - OUT PDNS_ADDRESS DnsAddr, - IN LPWSTR Name -); - -BOOLEAN -WINAPI -Dns_Ip4ReverseNameToAddress_W( - OUT PIN_ADDR Address, - IN LPWSTR Name -); - -#endif -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Ancillary Function Driver DLL - * FILE: include/mswsock.h - * PURPOSE: Ancillary Function Driver DLL header - */ -#ifndef __DNSLIB_H -#define __DNSLIB_H - -/* INCLUDES ******************************************************************/ -#include - -/* ENUMERATIONS **************************************************************/ - -typedef enum _DNS_STRING_TYPE -{ - UnicodeString = 1, - Utf8String, - AnsiString, -} DNS_STRING_TYPE; - -#define IpV4Address 3 - -/* TYPES *********************************************************************/ - -typedef struct _DNS_IPV6_ADDRESS -{ - ULONG Unknown; - ULONG Unknown2; - IP6_ADDRESS Address; - ULONG Unknown3; - ULONG Unknown4; - DWORD Reserved; - ULONG Unknown5; -} DNS_IPV6_ADDRESS, *PDNS_IPV6_ADDRESS; - -typedef struct _DNS_ADDRESS -{ - union - { - struct - { - WORD AddressFamily; - WORD Port; - ATM_ADDRESS AtmAddress; - }; - SOCKADDR_IN Ip4Address; - SOCKADDR_IN6 Ip6Address; - }; - ULONG AddressLength; - DWORD Sub; - ULONG Flag; -} DNS_ADDRESS, *PDNS_ADDRESS; - -typedef struct _DNS_ARRAY -{ - ULONG AllocatedAddresses; - ULONG UsedAddresses; - ULONG Unknown[0x6]; - DNS_ADDRESS Addresses[1]; -} DNS_ARRAY, *PDNS_ARRAY; - -typedef struct _DNS_BLOB -{ - LPWSTR Name; - PDNS_ARRAY DnsAddrArray; - PHOSTENT Hostent; - ULONG AliasCount; - ULONG Unknown; - LPWSTR Aliases[8]; -} DNS_BLOB, *PDNS_BLOB; - -typedef struct _DNS_FAMILY_INFO -{ - WORD AddrType; - WORD DnsType; - DWORD AddressSize; - DWORD SockaddrSize; - DWORD AddressOffset; -} DNS_FAMILY_INFO, *PDNS_FAMILY_INFO; - -typedef struct _FLATBUFF -{ - PVOID Buffer; - PVOID BufferEnd; - ULONG_PTR BufferPos; - SIZE_T BufferSize; - SIZE_T BufferFreeSize; -} FLATBUFF, *PFLATBUFF; - -/* - * memory.c - */ -VOID -WINAPI -Dns_Free(IN PVOID Address); - -PVOID -WINAPI -Dns_AllocZero(IN SIZE_T Size); - -/* - * addr.c - */ -PDNS_FAMILY_INFO -WINAPI -FamilyInfo_GetForFamily(IN WORD AddressFamily); - -/* - * dnsaddr.c - */ -VOID -WINAPI -DnsAddr_BuildFromIp4( - IN PDNS_ADDRESS DnsAddress, - IN IN_ADDR Address, - IN WORD Unknown -); - -VOID -WINAPI -DnsAddr_BuildFromIp6( - IN PDNS_ADDRESS DnsAddress, - IN PIN6_ADDR Address, - IN ULONG ScopeId, - IN WORD Port -); - -PDNS_ARRAY -WINAPI -DnsAddrArray_Create(ULONG Count); - -BOOL -WINAPI -DnsAddrArray_AddAddr( - IN PDNS_ARRAY DnsAddrArray, - IN PDNS_ADDRESS DnsAddress, - IN WORD AddressFamily OPTIONAL, - IN DWORD AddressType OPTIONAL -); - -VOID -WINAPI -DnsAddrArray_Free(IN PDNS_ARRAY DnsAddrArray); - -BOOL -WINAPI -DnsAddrArray_AddIp4( - IN PDNS_ARRAY DnsAddrArray, - IN IN_ADDR Address, - IN DWORD AddressType -); - -BOOL -WINAPI -DnsAddrArray_ContainsAddr( - IN PDNS_ARRAY DnsAddrArray, - IN PDNS_ADDRESS DnsAddress, - IN DWORD AddressType -); - -BOOLEAN -WINAPI -DnsAddr_BuildFromDnsRecord( - IN PDNS_RECORD DnsRecord, - OUT PDNS_ADDRESS DnsAddr -); - -/* - * hostent.c - */ -PHOSTENT -WINAPI -Hostent_Init( - IN PVOID *Buffer, - IN WORD AddressFamily, - IN ULONG AddressSize, - IN ULONG AddressCount, - IN ULONG AliasCount -); - -VOID -WINAPI -Hostent_ConvertToOffsets(IN PHOSTENT Hostent); - -/* - * flatbuf.c - */ -VOID -WINAPI -FlatBuf_Init( - IN PFLATBUFF FlatBuffer, - IN PVOID Buffer, - IN SIZE_T Size -); - -PVOID -WINAPI -FlatBuf_Arg_CopyMemory( - IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN PVOID Buffer, - IN SIZE_T Size, - IN ULONG Align -); - -PVOID -WINAPI -FlatBuf_Arg_Reserve( - IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN SIZE_T Size, - IN ULONG Align -); - -PVOID -WINAPI -FlatBuf_Arg_WriteString( - IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN PVOID String, - IN BOOLEAN IsUnicode -); - -/* - * sablob.c - */ -PDNS_BLOB -WINAPI -SaBlob_Create( - IN ULONG Count -); - -PDNS_BLOB -WINAPI -SaBlob_CreateFromIp4( - IN LPWSTR Name, - IN ULONG Count, - IN PIN_ADDR AddressArray -); - -VOID -WINAPI -SaBlob_Free(IN PDNS_BLOB Blob); - -PHOSTENT -WINAPI -SaBlob_CreateHostent( - IN OUT PULONG_PTR BufferPosition, - IN OUT PSIZE_T RemainingBufferSpace, - IN OUT PSIZE_T HostEntrySize, - IN PDNS_BLOB Blob, - IN DWORD StringType, - IN BOOLEAN Relative, - IN BOOLEAN BufferAllocated -); - -INT -WINAPI -SaBlob_WriteNameOrAlias( - IN PDNS_BLOB Blob, - IN LPWSTR String, - IN BOOLEAN IsAlias -); - -PDNS_BLOB -WINAPI -SaBlob_Query( - IN LPWSTR Name, - IN WORD DnsType, - IN ULONG Flags, - IN PVOID *Reserved, - IN DWORD AddressFamily -); - -/* - * string.c - */ -ULONG -WINAPI -Dns_StringCopy( - OUT PVOID Destination, - IN OUT PULONG DestinationSize, - IN PVOID String, - IN ULONG StringSize OPTIONAL, - IN DWORD InputType, - IN DWORD OutputType -); - -LPWSTR -WINAPI -Dns_CreateStringCopy_W(IN LPWSTR Name); - -ULONG -WINAPI -Dns_GetBufferLengthForStringCopy( - IN PVOID String, - IN ULONG Size OPTIONAL, - IN DWORD InputType, - IN DWORD OutputType -); - -/* - * straddr.c - */ -BOOLEAN -WINAPI -Dns_StringToAddressW( - OUT PVOID Address, - IN OUT PULONG AddressSize, - IN LPWSTR AddressName, - IN OUT PDWORD AddressFamily -); - -LPWSTR -WINAPI -Dns_Ip4AddressToReverseName_W( - OUT LPWSTR Name, - IN IN_ADDR Address -); - -LPWSTR -WINAPI -Dns_Ip6AddressToReverseName_W( - OUT LPWSTR Name, - IN IN6_ADDR Address -); - -BOOLEAN -WINAPI -Dns_ReverseNameToDnsAddr_W( - OUT PDNS_ADDRESS DnsAddr, - IN LPWSTR Name -); - -BOOLEAN -WINAPI -Dns_Ip4ReverseNameToAddress_W( - OUT PIN_ADDR Address, - IN LPWSTR Name -); - -#endif -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Ancillary Function Driver DLL - * FILE: include/mswsock.h - * PURPOSE: Ancillary Function Driver DLL header - */ -#ifndef __DNSLIB_H -#define __DNSLIB_H - -/* INCLUDES ******************************************************************/ -#include - -/* ENUMERATIONS **************************************************************/ - -typedef enum _DNS_STRING_TYPE -{ - UnicodeString = 1, - Utf8String, - AnsiString, -} DNS_STRING_TYPE; - -#define IpV4Address 3 - -/* TYPES *********************************************************************/ - -typedef struct _DNS_IPV6_ADDRESS -{ - ULONG Unknown; - ULONG Unknown2; - IP6_ADDRESS Address; - ULONG Unknown3; - ULONG Unknown4; - DWORD Reserved; - ULONG Unknown5; -} DNS_IPV6_ADDRESS, *PDNS_IPV6_ADDRESS; - -typedef struct _DNS_ADDRESS -{ - union - { - struct - { - WORD AddressFamily; - WORD Port; - ATM_ADDRESS AtmAddress; - }; - SOCKADDR_IN Ip4Address; - SOCKADDR_IN6 Ip6Address; - }; - ULONG AddressLength; - DWORD Sub; - ULONG Flag; -} DNS_ADDRESS, *PDNS_ADDRESS; - -typedef struct _DNS_ARRAY -{ - ULONG AllocatedAddresses; - ULONG UsedAddresses; - ULONG Unknown[0x6]; - DNS_ADDRESS Addresses[1]; -} DNS_ARRAY, *PDNS_ARRAY; - -typedef struct _DNS_BLOB -{ - LPWSTR Name; - PDNS_ARRAY DnsAddrArray; - PHOSTENT Hostent; - ULONG AliasCount; - ULONG Unknown; - LPWSTR Aliases[8]; -} DNS_BLOB, *PDNS_BLOB; - -typedef struct _DNS_FAMILY_INFO -{ - WORD AddrType; - WORD DnsType; - DWORD AddressSize; - DWORD SockaddrSize; - DWORD AddressOffset; -} DNS_FAMILY_INFO, *PDNS_FAMILY_INFO; - -typedef struct _FLATBUFF -{ - PVOID Buffer; - PVOID BufferEnd; - ULONG_PTR BufferPos; - SIZE_T BufferSize; - SIZE_T BufferFreeSize; -} FLATBUFF, *PFLATBUFF; - -/* - * memory.c - */ -VOID -WINAPI -Dns_Free(IN PVOID Address); - -PVOID -WINAPI -Dns_AllocZero(IN SIZE_T Size); - -/* - * addr.c - */ -PDNS_FAMILY_INFO -WINAPI -FamilyInfo_GetForFamily(IN WORD AddressFamily); - -/* - * dnsaddr.c - */ -VOID -WINAPI -DnsAddr_BuildFromIp4( - IN PDNS_ADDRESS DnsAddress, - IN IN_ADDR Address, - IN WORD Unknown -); - -VOID -WINAPI -DnsAddr_BuildFromIp6( - IN PDNS_ADDRESS DnsAddress, - IN PIN6_ADDR Address, - IN ULONG ScopeId, - IN WORD Port -); - -PDNS_ARRAY -WINAPI -DnsAddrArray_Create(ULONG Count); - -BOOL -WINAPI -DnsAddrArray_AddAddr( - IN PDNS_ARRAY DnsAddrArray, - IN PDNS_ADDRESS DnsAddress, - IN WORD AddressFamily OPTIONAL, - IN DWORD AddressType OPTIONAL -); - -VOID -WINAPI -DnsAddrArray_Free(IN PDNS_ARRAY DnsAddrArray); - -BOOL -WINAPI -DnsAddrArray_AddIp4( - IN PDNS_ARRAY DnsAddrArray, - IN IN_ADDR Address, - IN DWORD AddressType -); - -BOOL -WINAPI -DnsAddrArray_ContainsAddr( - IN PDNS_ARRAY DnsAddrArray, - IN PDNS_ADDRESS DnsAddress, - IN DWORD AddressType -); - -BOOLEAN -WINAPI -DnsAddr_BuildFromDnsRecord( - IN PDNS_RECORD DnsRecord, - OUT PDNS_ADDRESS DnsAddr -); - -/* - * hostent.c - */ -PHOSTENT -WINAPI -Hostent_Init( - IN PVOID *Buffer, - IN WORD AddressFamily, - IN ULONG AddressSize, - IN ULONG AddressCount, - IN ULONG AliasCount -); - -VOID -WINAPI -Hostent_ConvertToOffsets(IN PHOSTENT Hostent); - -/* - * flatbuf.c - */ -VOID -WINAPI -FlatBuf_Init( - IN PFLATBUFF FlatBuffer, - IN PVOID Buffer, - IN SIZE_T Size -); - -PVOID -WINAPI -FlatBuf_Arg_CopyMemory( - IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN PVOID Buffer, - IN SIZE_T Size, - IN ULONG Align -); - -PVOID -WINAPI -FlatBuf_Arg_Reserve( - IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN SIZE_T Size, - IN ULONG Align -); - -PVOID -WINAPI -FlatBuf_Arg_WriteString( - IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN PVOID String, - IN BOOLEAN IsUnicode -); - -/* - * sablob.c - */ -PDNS_BLOB -WINAPI -SaBlob_Create( - IN ULONG Count -); - -PDNS_BLOB -WINAPI -SaBlob_CreateFromIp4( - IN LPWSTR Name, - IN ULONG Count, - IN PIN_ADDR AddressArray -); - -VOID -WINAPI -SaBlob_Free(IN PDNS_BLOB Blob); - -PHOSTENT -WINAPI -SaBlob_CreateHostent( - IN OUT PULONG_PTR BufferPosition, - IN OUT PSIZE_T RemainingBufferSpace, - IN OUT PSIZE_T HostEntrySize, - IN PDNS_BLOB Blob, - IN DWORD StringType, - IN BOOLEAN Relative, - IN BOOLEAN BufferAllocated -); - -INT -WINAPI -SaBlob_WriteNameOrAlias( - IN PDNS_BLOB Blob, - IN LPWSTR String, - IN BOOLEAN IsAlias -); - -PDNS_BLOB -WINAPI -SaBlob_Query( - IN LPWSTR Name, - IN WORD DnsType, - IN ULONG Flags, - IN PVOID *Reserved, - IN DWORD AddressFamily -); - -/* - * string.c - */ -ULONG -WINAPI -Dns_StringCopy( - OUT PVOID Destination, - IN OUT PULONG DestinationSize, - IN PVOID String, - IN ULONG StringSize OPTIONAL, - IN DWORD InputType, - IN DWORD OutputType -); - -LPWSTR -WINAPI -Dns_CreateStringCopy_W(IN LPWSTR Name); - -ULONG -WINAPI -Dns_GetBufferLengthForStringCopy( - IN PVOID String, - IN ULONG Size OPTIONAL, - IN DWORD InputType, - IN DWORD OutputType -); - -/* - * straddr.c - */ -BOOLEAN -WINAPI -Dns_StringToAddressW( - OUT PVOID Address, - IN OUT PULONG AddressSize, - IN LPWSTR AddressName, - IN OUT PDWORD AddressFamily -); - -LPWSTR -WINAPI -Dns_Ip4AddressToReverseName_W( - OUT LPWSTR Name, - IN IN_ADDR Address -); - -LPWSTR -WINAPI -Dns_Ip6AddressToReverseName_W( - OUT LPWSTR Name, - IN IN6_ADDR Address -); - -BOOLEAN -WINAPI -Dns_ReverseNameToDnsAddr_W( - OUT PDNS_ADDRESS DnsAddr, - IN LPWSTR Name -); - -BOOLEAN -WINAPI -Dns_Ip4ReverseNameToAddress_W( - OUT PIN_ADDR Address, - IN LPWSTR Name -); - -#endif -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Ancillary Function Driver DLL - * FILE: include/mswsock.h - * PURPOSE: Ancillary Function Driver DLL header - */ -#ifndef __DNSLIB_H -#define __DNSLIB_H - -/* INCLUDES ******************************************************************/ -#include - -/* ENUMERATIONS **************************************************************/ - -typedef enum _DNS_STRING_TYPE -{ - UnicodeString = 1, - Utf8String, - AnsiString, -} DNS_STRING_TYPE; - -#define IpV4Address 3 - -/* TYPES *********************************************************************/ - -typedef struct _DNS_IPV6_ADDRESS -{ - ULONG Unknown; - ULONG Unknown2; - IP6_ADDRESS Address; - ULONG Unknown3; - ULONG Unknown4; - DWORD Reserved; - ULONG Unknown5; -} DNS_IPV6_ADDRESS, *PDNS_IPV6_ADDRESS; - -typedef struct _DNS_ADDRESS -{ - union - { - struct - { - WORD AddressFamily; - WORD Port; - ATM_ADDRESS AtmAddress; - }; - SOCKADDR_IN Ip4Address; - SOCKADDR_IN6 Ip6Address; - }; - ULONG AddressLength; - DWORD Sub; - ULONG Flag; -} DNS_ADDRESS, *PDNS_ADDRESS; - -typedef struct _DNS_ARRAY -{ - ULONG AllocatedAddresses; - ULONG UsedAddresses; - ULONG Unknown[0x6]; - DNS_ADDRESS Addresses[1]; -} DNS_ARRAY, *PDNS_ARRAY; - -typedef struct _DNS_BLOB -{ - LPWSTR Name; - PDNS_ARRAY DnsAddrArray; - PHOSTENT Hostent; - ULONG AliasCount; - ULONG Unknown; - LPWSTR Aliases[8]; -} DNS_BLOB, *PDNS_BLOB; - -typedef struct _DNS_FAMILY_INFO -{ - WORD AddrType; - WORD DnsType; - DWORD AddressSize; - DWORD SockaddrSize; - DWORD AddressOffset; -} DNS_FAMILY_INFO, *PDNS_FAMILY_INFO; - -typedef struct _FLATBUFF -{ - PVOID Buffer; - PVOID BufferEnd; - ULONG_PTR BufferPos; - SIZE_T BufferSize; - SIZE_T BufferFreeSize; -} FLATBUFF, *PFLATBUFF; - -/* - * memory.c - */ -VOID -WINAPI -Dns_Free(IN PVOID Address); - -PVOID -WINAPI -Dns_AllocZero(IN SIZE_T Size); - -/* - * addr.c - */ -PDNS_FAMILY_INFO -WINAPI -FamilyInfo_GetForFamily(IN WORD AddressFamily); - -/* - * dnsaddr.c - */ -VOID -WINAPI -DnsAddr_BuildFromIp4( - IN PDNS_ADDRESS DnsAddress, - IN IN_ADDR Address, - IN WORD Unknown -); - -VOID -WINAPI -DnsAddr_BuildFromIp6( - IN PDNS_ADDRESS DnsAddress, - IN PIN6_ADDR Address, - IN ULONG ScopeId, - IN WORD Port -); - -PDNS_ARRAY -WINAPI -DnsAddrArray_Create(ULONG Count); - -BOOL -WINAPI -DnsAddrArray_AddAddr( - IN PDNS_ARRAY DnsAddrArray, - IN PDNS_ADDRESS DnsAddress, - IN WORD AddressFamily OPTIONAL, - IN DWORD AddressType OPTIONAL -); - -VOID -WINAPI -DnsAddrArray_Free(IN PDNS_ARRAY DnsAddrArray); - -BOOL -WINAPI -DnsAddrArray_AddIp4( - IN PDNS_ARRAY DnsAddrArray, - IN IN_ADDR Address, - IN DWORD AddressType -); - -BOOL -WINAPI -DnsAddrArray_ContainsAddr( - IN PDNS_ARRAY DnsAddrArray, - IN PDNS_ADDRESS DnsAddress, - IN DWORD AddressType -); - -BOOLEAN -WINAPI -DnsAddr_BuildFromDnsRecord( - IN PDNS_RECORD DnsRecord, - OUT PDNS_ADDRESS DnsAddr -); - -/* - * hostent.c - */ -PHOSTENT -WINAPI -Hostent_Init( - IN PVOID *Buffer, - IN WORD AddressFamily, - IN ULONG AddressSize, - IN ULONG AddressCount, - IN ULONG AliasCount -); - -VOID -WINAPI -Hostent_ConvertToOffsets(IN PHOSTENT Hostent); - -/* - * flatbuf.c - */ -VOID -WINAPI -FlatBuf_Init( - IN PFLATBUFF FlatBuffer, - IN PVOID Buffer, - IN SIZE_T Size -); - -PVOID -WINAPI -FlatBuf_Arg_CopyMemory( - IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN PVOID Buffer, - IN SIZE_T Size, - IN ULONG Align -); - -PVOID -WINAPI -FlatBuf_Arg_Reserve( - IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN SIZE_T Size, - IN ULONG Align -); - -PVOID -WINAPI -FlatBuf_Arg_WriteString( - IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN PVOID String, - IN BOOLEAN IsUnicode -); - -/* - * sablob.c - */ -PDNS_BLOB -WINAPI -SaBlob_Create( - IN ULONG Count -); - -PDNS_BLOB -WINAPI -SaBlob_CreateFromIp4( - IN LPWSTR Name, - IN ULONG Count, - IN PIN_ADDR AddressArray -); - -VOID -WINAPI -SaBlob_Free(IN PDNS_BLOB Blob); - -PHOSTENT -WINAPI -SaBlob_CreateHostent( - IN OUT PULONG_PTR BufferPosition, - IN OUT PSIZE_T RemainingBufferSpace, - IN OUT PSIZE_T HostEntrySize, - IN PDNS_BLOB Blob, - IN DWORD StringType, - IN BOOLEAN Relative, - IN BOOLEAN BufferAllocated -); - -INT -WINAPI -SaBlob_WriteNameOrAlias( - IN PDNS_BLOB Blob, - IN LPWSTR String, - IN BOOLEAN IsAlias -); - -PDNS_BLOB -WINAPI -SaBlob_Query( - IN LPWSTR Name, - IN WORD DnsType, - IN ULONG Flags, - IN PVOID *Reserved, - IN DWORD AddressFamily -); - -/* - * string.c - */ -ULONG -WINAPI -Dns_StringCopy( - OUT PVOID Destination, - IN OUT PULONG DestinationSize, - IN PVOID String, - IN ULONG StringSize OPTIONAL, - IN DWORD InputType, - IN DWORD OutputType -); - -LPWSTR -WINAPI -Dns_CreateStringCopy_W(IN LPWSTR Name); - -ULONG -WINAPI -Dns_GetBufferLengthForStringCopy( - IN PVOID String, - IN ULONG Size OPTIONAL, - IN DWORD InputType, - IN DWORD OutputType -); - -/* - * straddr.c - */ -BOOLEAN -WINAPI -Dns_StringToAddressW( - OUT PVOID Address, - IN OUT PULONG AddressSize, - IN LPWSTR AddressName, - IN OUT PDWORD AddressFamily -); - -LPWSTR -WINAPI -Dns_Ip4AddressToReverseName_W( - OUT LPWSTR Name, - IN IN_ADDR Address -); - -LPWSTR -WINAPI -Dns_Ip6AddressToReverseName_W( - OUT LPWSTR Name, - IN IN6_ADDR Address -); - -BOOLEAN -WINAPI -Dns_ReverseNameToDnsAddr_W( - OUT PDNS_ADDRESS DnsAddr, - IN LPWSTR Name -); - -BOOLEAN -WINAPI -Dns_Ip4ReverseNameToAddress_W( - OUT PIN_ADDR Address, - IN LPWSTR Name -); - -#endif -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Ancillary Function Driver DLL - * FILE: include/mswsock.h - * PURPOSE: Ancillary Function Driver DLL header - */ -#ifndef __DNSLIB_H -#define __DNSLIB_H - -/* INCLUDES ******************************************************************/ -#include - -/* ENUMERATIONS **************************************************************/ - -typedef enum _DNS_STRING_TYPE -{ - UnicodeString = 1, - Utf8String, - AnsiString, -} DNS_STRING_TYPE; - -#define IpV4Address 3 - -/* TYPES *********************************************************************/ - -typedef struct _DNS_IPV6_ADDRESS -{ - ULONG Unknown; - ULONG Unknown2; - IP6_ADDRESS Address; - ULONG Unknown3; - ULONG Unknown4; - DWORD Reserved; - ULONG Unknown5; -} DNS_IPV6_ADDRESS, *PDNS_IPV6_ADDRESS; - -typedef struct _DNS_ADDRESS -{ - union - { - struct - { - WORD AddressFamily; - WORD Port; - ATM_ADDRESS AtmAddress; - }; - SOCKADDR_IN Ip4Address; - SOCKADDR_IN6 Ip6Address; - }; - ULONG AddressLength; - DWORD Sub; - ULONG Flag; -} DNS_ADDRESS, *PDNS_ADDRESS; - -typedef struct _DNS_ARRAY -{ - ULONG AllocatedAddresses; - ULONG UsedAddresses; - ULONG Unknown[0x6]; - DNS_ADDRESS Addresses[1]; -} DNS_ARRAY, *PDNS_ARRAY; - -typedef struct _DNS_BLOB -{ - LPWSTR Name; - PDNS_ARRAY DnsAddrArray; - PHOSTENT Hostent; - ULONG AliasCount; - ULONG Unknown; - LPWSTR Aliases[8]; -} DNS_BLOB, *PDNS_BLOB; - -typedef struct _DNS_FAMILY_INFO -{ - WORD AddrType; - WORD DnsType; - DWORD AddressSize; - DWORD SockaddrSize; - DWORD AddressOffset; -} DNS_FAMILY_INFO, *PDNS_FAMILY_INFO; - -typedef struct _FLATBUFF -{ - PVOID Buffer; - PVOID BufferEnd; - ULONG_PTR BufferPos; - SIZE_T BufferSize; - SIZE_T BufferFreeSize; -} FLATBUFF, *PFLATBUFF; - -/* - * memory.c - */ -VOID -WINAPI -Dns_Free(IN PVOID Address); - -PVOID -WINAPI -Dns_AllocZero(IN SIZE_T Size); - -/* - * addr.c - */ -PDNS_FAMILY_INFO -WINAPI -FamilyInfo_GetForFamily(IN WORD AddressFamily); - -/* - * dnsaddr.c - */ -VOID -WINAPI -DnsAddr_BuildFromIp4( - IN PDNS_ADDRESS DnsAddress, - IN IN_ADDR Address, - IN WORD Unknown -); - -VOID -WINAPI -DnsAddr_BuildFromIp6( - IN PDNS_ADDRESS DnsAddress, - IN PIN6_ADDR Address, - IN ULONG ScopeId, - IN WORD Port -); - -PDNS_ARRAY -WINAPI -DnsAddrArray_Create(ULONG Count); - -BOOL -WINAPI -DnsAddrArray_AddAddr( - IN PDNS_ARRAY DnsAddrArray, - IN PDNS_ADDRESS DnsAddress, - IN WORD AddressFamily OPTIONAL, - IN DWORD AddressType OPTIONAL -); - -VOID -WINAPI -DnsAddrArray_Free(IN PDNS_ARRAY DnsAddrArray); - -BOOL -WINAPI -DnsAddrArray_AddIp4( - IN PDNS_ARRAY DnsAddrArray, - IN IN_ADDR Address, - IN DWORD AddressType -); - -BOOL -WINAPI -DnsAddrArray_ContainsAddr( - IN PDNS_ARRAY DnsAddrArray, - IN PDNS_ADDRESS DnsAddress, - IN DWORD AddressType -); - -BOOLEAN -WINAPI -DnsAddr_BuildFromDnsRecord( - IN PDNS_RECORD DnsRecord, - OUT PDNS_ADDRESS DnsAddr -); - -/* - * hostent.c - */ -PHOSTENT -WINAPI -Hostent_Init( - IN PVOID *Buffer, - IN WORD AddressFamily, - IN ULONG AddressSize, - IN ULONG AddressCount, - IN ULONG AliasCount -); - -VOID -WINAPI -Hostent_ConvertToOffsets(IN PHOSTENT Hostent); - -/* - * flatbuf.c - */ -VOID -WINAPI -FlatBuf_Init( - IN PFLATBUFF FlatBuffer, - IN PVOID Buffer, - IN SIZE_T Size -); - -PVOID -WINAPI -FlatBuf_Arg_CopyMemory( - IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN PVOID Buffer, - IN SIZE_T Size, - IN ULONG Align -); - -PVOID -WINAPI -FlatBuf_Arg_Reserve( - IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN SIZE_T Size, - IN ULONG Align -); - -PVOID -WINAPI -FlatBuf_Arg_WriteString( - IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN PVOID String, - IN BOOLEAN IsUnicode -); - -/* - * sablob.c - */ -PDNS_BLOB -WINAPI -SaBlob_Create( - IN ULONG Count -); - -PDNS_BLOB -WINAPI -SaBlob_CreateFromIp4( - IN LPWSTR Name, - IN ULONG Count, - IN PIN_ADDR AddressArray -); - -VOID -WINAPI -SaBlob_Free(IN PDNS_BLOB Blob); - -PHOSTENT -WINAPI -SaBlob_CreateHostent( - IN OUT PULONG_PTR BufferPosition, - IN OUT PSIZE_T RemainingBufferSpace, - IN OUT PSIZE_T HostEntrySize, - IN PDNS_BLOB Blob, - IN DWORD StringType, - IN BOOLEAN Relative, - IN BOOLEAN BufferAllocated -); - -INT -WINAPI -SaBlob_WriteNameOrAlias( - IN PDNS_BLOB Blob, - IN LPWSTR String, - IN BOOLEAN IsAlias -); - -PDNS_BLOB -WINAPI -SaBlob_Query( - IN LPWSTR Name, - IN WORD DnsType, - IN ULONG Flags, - IN PVOID *Reserved, - IN DWORD AddressFamily -); - -/* - * string.c - */ -ULONG -WINAPI -Dns_StringCopy( - OUT PVOID Destination, - IN OUT PULONG DestinationSize, - IN PVOID String, - IN ULONG StringSize OPTIONAL, - IN DWORD InputType, - IN DWORD OutputType -); - -LPWSTR -WINAPI -Dns_CreateStringCopy_W(IN LPWSTR Name); - -ULONG -WINAPI -Dns_GetBufferLengthForStringCopy( - IN PVOID String, - IN ULONG Size OPTIONAL, - IN DWORD InputType, - IN DWORD OutputType -); - -/* - * straddr.c - */ -BOOLEAN -WINAPI -Dns_StringToAddressW( - OUT PVOID Address, - IN OUT PULONG AddressSize, - IN LPWSTR AddressName, - IN OUT PDWORD AddressFamily -); - -LPWSTR -WINAPI -Dns_Ip4AddressToReverseName_W( - OUT LPWSTR Name, - IN IN_ADDR Address -); - -LPWSTR -WINAPI -Dns_Ip6AddressToReverseName_W( - OUT LPWSTR Name, - IN IN6_ADDR Address -); - -BOOLEAN -WINAPI -Dns_ReverseNameToDnsAddr_W( - OUT PDNS_ADDRESS DnsAddr, - IN LPWSTR Name -); - -BOOLEAN -WINAPI -Dns_Ip4ReverseNameToAddress_W( - OUT PIN_ADDR Address, - IN LPWSTR Name -); - -#endif -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Ancillary Function Driver DLL - * FILE: include/mswsock.h - * PURPOSE: Ancillary Function Driver DLL header - */ -#ifndef __DNSLIB_H -#define __DNSLIB_H - -/* INCLUDES ******************************************************************/ -#include - -/* ENUMERATIONS **************************************************************/ - -typedef enum _DNS_STRING_TYPE -{ - UnicodeString = 1, - Utf8String, - AnsiString, -} DNS_STRING_TYPE; - -#define IpV4Address 3 - -/* TYPES *********************************************************************/ - -typedef struct _DNS_IPV6_ADDRESS -{ - ULONG Unknown; - ULONG Unknown2; - IP6_ADDRESS Address; - ULONG Unknown3; - ULONG Unknown4; - DWORD Reserved; - ULONG Unknown5; -} DNS_IPV6_ADDRESS, *PDNS_IPV6_ADDRESS; - -typedef struct _DNS_ADDRESS -{ - union - { - struct - { - WORD AddressFamily; - WORD Port; - ATM_ADDRESS AtmAddress; - }; - SOCKADDR_IN Ip4Address; - SOCKADDR_IN6 Ip6Address; - }; - ULONG AddressLength; - DWORD Sub; - ULONG Flag; -} DNS_ADDRESS, *PDNS_ADDRESS; - -typedef struct _DNS_ARRAY -{ - ULONG AllocatedAddresses; - ULONG UsedAddresses; - ULONG Unknown[0x6]; - DNS_ADDRESS Addresses[1]; -} DNS_ARRAY, *PDNS_ARRAY; - -typedef struct _DNS_BLOB -{ - LPWSTR Name; - PDNS_ARRAY DnsAddrArray; - PHOSTENT Hostent; - ULONG AliasCount; - ULONG Unknown; - LPWSTR Aliases[8]; -} DNS_BLOB, *PDNS_BLOB; - -typedef struct _DNS_FAMILY_INFO -{ - WORD AddrType; - WORD DnsType; - DWORD AddressSize; - DWORD SockaddrSize; - DWORD AddressOffset; -} DNS_FAMILY_INFO, *PDNS_FAMILY_INFO; - -typedef struct _FLATBUFF -{ - PVOID Buffer; - PVOID BufferEnd; - ULONG_PTR BufferPos; - SIZE_T BufferSize; - SIZE_T BufferFreeSize; -} FLATBUFF, *PFLATBUFF; - -/* - * memory.c - */ -VOID -WINAPI -Dns_Free(IN PVOID Address); - -PVOID -WINAPI -Dns_AllocZero(IN SIZE_T Size); - -/* - * addr.c - */ -PDNS_FAMILY_INFO -WINAPI -FamilyInfo_GetForFamily(IN WORD AddressFamily); - -/* - * dnsaddr.c - */ -VOID -WINAPI -DnsAddr_BuildFromIp4( - IN PDNS_ADDRESS DnsAddress, - IN IN_ADDR Address, - IN WORD Unknown -); - -VOID -WINAPI -DnsAddr_BuildFromIp6( - IN PDNS_ADDRESS DnsAddress, - IN PIN6_ADDR Address, - IN ULONG ScopeId, - IN WORD Port -); - -PDNS_ARRAY -WINAPI -DnsAddrArray_Create(ULONG Count); - -BOOL -WINAPI -DnsAddrArray_AddAddr( - IN PDNS_ARRAY DnsAddrArray, - IN PDNS_ADDRESS DnsAddress, - IN WORD AddressFamily OPTIONAL, - IN DWORD AddressType OPTIONAL -); - -VOID -WINAPI -DnsAddrArray_Free(IN PDNS_ARRAY DnsAddrArray); - -BOOL -WINAPI -DnsAddrArray_AddIp4( - IN PDNS_ARRAY DnsAddrArray, - IN IN_ADDR Address, - IN DWORD AddressType -); - -BOOL -WINAPI -DnsAddrArray_ContainsAddr( - IN PDNS_ARRAY DnsAddrArray, - IN PDNS_ADDRESS DnsAddress, - IN DWORD AddressType -); - -BOOLEAN -WINAPI -DnsAddr_BuildFromDnsRecord( - IN PDNS_RECORD DnsRecord, - OUT PDNS_ADDRESS DnsAddr -); - -/* - * hostent.c - */ -PHOSTENT -WINAPI -Hostent_Init( - IN PVOID *Buffer, - IN WORD AddressFamily, - IN ULONG AddressSize, - IN ULONG AddressCount, - IN ULONG AliasCount -); - -VOID -WINAPI -Hostent_ConvertToOffsets(IN PHOSTENT Hostent); - -/* - * flatbuf.c - */ -VOID -WINAPI -FlatBuf_Init( - IN PFLATBUFF FlatBuffer, - IN PVOID Buffer, - IN SIZE_T Size -); - -PVOID -WINAPI -FlatBuf_Arg_CopyMemory( - IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN PVOID Buffer, - IN SIZE_T Size, - IN ULONG Align -); - -PVOID -WINAPI -FlatBuf_Arg_Reserve( - IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN SIZE_T Size, - IN ULONG Align -); - -PVOID -WINAPI -FlatBuf_Arg_WriteString( - IN OUT PULONG_PTR Position, - IN OUT PSIZE_T FreeSize, - IN PVOID String, - IN BOOLEAN IsUnicode -); - -/* - * sablob.c - */ -PDNS_BLOB -WINAPI -SaBlob_Create( - IN ULONG Count -); - -PDNS_BLOB -WINAPI -SaBlob_CreateFromIp4( - IN LPWSTR Name, - IN ULONG Count, - IN PIN_ADDR AddressArray -); - -VOID -WINAPI -SaBlob_Free(IN PDNS_BLOB Blob); - -PHOSTENT -WINAPI -SaBlob_CreateHostent( - IN OUT PULONG_PTR BufferPosition, - IN OUT PSIZE_T RemainingBufferSpace, - IN OUT PSIZE_T HostEntrySize, - IN PDNS_BLOB Blob, - IN DWORD StringType, - IN BOOLEAN Relative, - IN BOOLEAN BufferAllocated -); - -INT -WINAPI -SaBlob_WriteNameOrAlias( - IN PDNS_BLOB Blob, - IN LPWSTR String, - IN BOOLEAN IsAlias -); - -PDNS_BLOB -WINAPI -SaBlob_Query( - IN LPWSTR Name, - IN WORD DnsType, - IN ULONG Flags, - IN PVOID *Reserved, - IN DWORD AddressFamily -); - -/* - * string.c - */ -ULONG -WINAPI -Dns_StringCopy( - OUT PVOID Destination, - IN OUT PULONG DestinationSize, - IN PVOID String, - IN ULONG StringSize OPTIONAL, - IN DWORD InputType, - IN DWORD OutputType -); - -LPWSTR -WINAPI -Dns_CreateStringCopy_W(IN LPWSTR Name); - -ULONG -WINAPI -Dns_GetBufferLengthForStringCopy( - IN PVOID String, - IN ULONG Size OPTIONAL, - IN DWORD InputType, - IN DWORD OutputType -); - -/* - * straddr.c - */ -BOOLEAN -WINAPI -Dns_StringToAddressW( - OUT PVOID Address, - IN OUT PULONG AddressSize, - IN LPWSTR AddressName, - IN OUT PDWORD AddressFamily -); - -LPWSTR -WINAPI -Dns_Ip4AddressToReverseName_W( - OUT LPWSTR Name, - IN IN_ADDR Address -); - -LPWSTR -WINAPI -Dns_Ip6AddressToReverseName_W( - OUT LPWSTR Name, - IN IN6_ADDR Address -); - -BOOLEAN -WINAPI -Dns_ReverseNameToDnsAddr_W( - OUT PDNS_ADDRESS DnsAddr, - IN LPWSTR Name -); - -BOOLEAN -WINAPI -Dns_Ip4ReverseNameToAddress_W( - OUT PIN_ADDR Address, - IN LPWSTR Name -); - -#endif diff --git a/dll/win32/mswsock/dns/inc/windnsp.h b/dll/win32/mswsock/dns/inc/windnsp.h index 66cfbd83a12..d67855e56ab 100644 --- a/dll/win32/mswsock/dns/inc/windnsp.h +++ b/dll/win32/mswsock/dns/inc/windnsp.h @@ -26,143 +26,3 @@ DnsApiFree( ); /* EOF */ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNSAPI Header - * FILE: include/libs/dns/windnsp.h - * PURPOSE: DNSLIB Precompiled Header - */ - -PVOID -WINAPI -DnsApiAlloc( - IN DWORD Size -); - -PVOID -WINAPI -DnsQueryConfigAllocEx( - IN DNS_CONFIG_TYPE Config, - OUT PVOID pBuffer, - IN OUT PDWORD pBufferLength -); - -VOID -WINAPI -DnsApiFree( - IN PVOID pBuffer -); - -/* EOF */ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNSAPI Header - * FILE: include/libs/dns/windnsp.h - * PURPOSE: DNSLIB Precompiled Header - */ - -PVOID -WINAPI -DnsApiAlloc( - IN DWORD Size -); - -PVOID -WINAPI -DnsQueryConfigAllocEx( - IN DNS_CONFIG_TYPE Config, - OUT PVOID pBuffer, - IN OUT PDWORD pBufferLength -); - -VOID -WINAPI -DnsApiFree( - IN PVOID pBuffer -); - -/* EOF */ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNSAPI Header - * FILE: include/libs/dns/windnsp.h - * PURPOSE: DNSLIB Precompiled Header - */ - -PVOID -WINAPI -DnsApiAlloc( - IN DWORD Size -); - -PVOID -WINAPI -DnsQueryConfigAllocEx( - IN DNS_CONFIG_TYPE Config, - OUT PVOID pBuffer, - IN OUT PDWORD pBufferLength -); - -VOID -WINAPI -DnsApiFree( - IN PVOID pBuffer -); - -/* EOF */ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNSAPI Header - * FILE: include/libs/dns/windnsp.h - * PURPOSE: DNSLIB Precompiled Header - */ - -PVOID -WINAPI -DnsApiAlloc( - IN DWORD Size -); - -PVOID -WINAPI -DnsQueryConfigAllocEx( - IN DNS_CONFIG_TYPE Config, - OUT PVOID pBuffer, - IN OUT PDWORD pBufferLength -); - -VOID -WINAPI -DnsApiFree( - IN PVOID pBuffer -); - -/* EOF */ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNSAPI Header - * FILE: include/libs/dns/windnsp.h - * PURPOSE: DNSLIB Precompiled Header - */ - -PVOID -WINAPI -DnsApiAlloc( - IN DWORD Size -); - -PVOID -WINAPI -DnsQueryConfigAllocEx( - IN DNS_CONFIG_TYPE Config, - OUT PVOID pBuffer, - IN OUT PDWORD pBufferLength -); - -VOID -WINAPI -DnsApiFree( - IN PVOID pBuffer -); - -/* EOF */ diff --git a/dll/win32/mswsock/dns/ip6.c b/dll/win32/mswsock/dns/ip6.c index 11486427020..921fef41175 100644 --- a/dll/win32/mswsock/dns/ip6.c +++ b/dll/win32/mswsock/dns/ip6.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/ip6.c - * PURPOSE: Functions for dealing with IPv6 Specific issues. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/ip6.c - * PURPOSE: Functions for dealing with IPv6 Specific issues. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/ip6.c - * PURPOSE: Functions for dealing with IPv6 Specific issues. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/dns/memory.c b/dll/win32/mswsock/dns/memory.c index 8db2f0abbb5..183088c86b7 100644 --- a/dll/win32/mswsock/dns/memory.c +++ b/dll/win32/mswsock/dns/memory.c @@ -64,201 +64,3 @@ Dns_AllocZero(IN SIZE_T Size) return Buffer; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/memory.c - * PURPOSE: DNS Memory Manager Implementation and Heap. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -typedef PVOID -(WINAPI *PDNS_ALLOC_FUNCTION)(IN SIZE_T Size); -typedef VOID -(WINAPI *PDNS_FREE_FUNCTION)(IN PVOID Buffer); - -PDNS_ALLOC_FUNCTION pDnsAllocFunction; -PDNS_FREE_FUNCTION pDnsFreeFunction; - -/* FUNCTIONS *****************************************************************/ - -VOID -WINAPI -Dns_Free(IN PVOID Address) -{ - /* Check if whoever imported us specified a special free function */ - if (pDnsFreeFunction) - { - /* Use it */ - pDnsFreeFunction(Address); - } - else - { - /* Use our own */ - LocalFree(Address); - } -} - -PVOID -WINAPI -Dns_AllocZero(IN SIZE_T Size) -{ - PVOID Buffer; - - /* Check if whoever imported us specified a special allocation function */ - if (pDnsAllocFunction) - { - /* Use it to allocate the memory */ - Buffer = pDnsAllocFunction(Size); - if (Buffer) - { - /* Zero it out */ - RtlZeroMemory(Buffer, Size); - } - } - else - { - /* Use our default */ - Buffer = LocalAlloc(LMEM_ZEROINIT, Size); - } - - /* Return the allocate pointer */ - return Buffer; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/memory.c - * PURPOSE: DNS Memory Manager Implementation and Heap. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -typedef PVOID -(WINAPI *PDNS_ALLOC_FUNCTION)(IN SIZE_T Size); -typedef VOID -(WINAPI *PDNS_FREE_FUNCTION)(IN PVOID Buffer); - -PDNS_ALLOC_FUNCTION pDnsAllocFunction; -PDNS_FREE_FUNCTION pDnsFreeFunction; - -/* FUNCTIONS *****************************************************************/ - -VOID -WINAPI -Dns_Free(IN PVOID Address) -{ - /* Check if whoever imported us specified a special free function */ - if (pDnsFreeFunction) - { - /* Use it */ - pDnsFreeFunction(Address); - } - else - { - /* Use our own */ - LocalFree(Address); - } -} - -PVOID -WINAPI -Dns_AllocZero(IN SIZE_T Size) -{ - PVOID Buffer; - - /* Check if whoever imported us specified a special allocation function */ - if (pDnsAllocFunction) - { - /* Use it to allocate the memory */ - Buffer = pDnsAllocFunction(Size); - if (Buffer) - { - /* Zero it out */ - RtlZeroMemory(Buffer, Size); - } - } - else - { - /* Use our default */ - Buffer = LocalAlloc(LMEM_ZEROINIT, Size); - } - - /* Return the allocate pointer */ - return Buffer; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/memory.c - * PURPOSE: DNS Memory Manager Implementation and Heap. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -typedef PVOID -(WINAPI *PDNS_ALLOC_FUNCTION)(IN SIZE_T Size); -typedef VOID -(WINAPI *PDNS_FREE_FUNCTION)(IN PVOID Buffer); - -PDNS_ALLOC_FUNCTION pDnsAllocFunction; -PDNS_FREE_FUNCTION pDnsFreeFunction; - -/* FUNCTIONS *****************************************************************/ - -VOID -WINAPI -Dns_Free(IN PVOID Address) -{ - /* Check if whoever imported us specified a special free function */ - if (pDnsFreeFunction) - { - /* Use it */ - pDnsFreeFunction(Address); - } - else - { - /* Use our own */ - LocalFree(Address); - } -} - -PVOID -WINAPI -Dns_AllocZero(IN SIZE_T Size) -{ - PVOID Buffer; - - /* Check if whoever imported us specified a special allocation function */ - if (pDnsAllocFunction) - { - /* Use it to allocate the memory */ - Buffer = pDnsAllocFunction(Size); - if (Buffer) - { - /* Zero it out */ - RtlZeroMemory(Buffer, Size); - } - } - else - { - /* Use our default */ - Buffer = LocalAlloc(LMEM_ZEROINIT, Size); - } - - /* Return the allocate pointer */ - return Buffer; -} - diff --git a/dll/win32/mswsock/dns/name.c b/dll/win32/mswsock/dns/name.c index 75fdbc925a5..4004912315e 100644 --- a/dll/win32/mswsock/dns/name.c +++ b/dll/win32/mswsock/dns/name.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/name.c - * PURPOSE: Functions dealing with DNS (Canonical, FQDN, Host) Names - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/name.c - * PURPOSE: Functions dealing with DNS (Canonical, FQDN, Host) Names - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/name.c - * PURPOSE: Functions dealing with DNS (Canonical, FQDN, Host) Names - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/dns/print.c b/dll/win32/mswsock/dns/print.c index 956c4eaa03d..bead765eb3c 100644 --- a/dll/win32/mswsock/dns/print.c +++ b/dll/win32/mswsock/dns/print.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/print.c - * PURPOSE: Callback Functions for printing a variety of DNSLIB Structures - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/print.c - * PURPOSE: Callback Functions for printing a variety of DNSLIB Structures - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/print.c - * PURPOSE: Callback Functions for printing a variety of DNSLIB Structures - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/dns/record.c b/dll/win32/mswsock/dns/record.c index 62f577d65e3..c0325a9b850 100644 --- a/dll/win32/mswsock/dns/record.c +++ b/dll/win32/mswsock/dns/record.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/record.c - * PURPOSE: Functions for managing DNS Record structures. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/record.c - * PURPOSE: Functions for managing DNS Record structures. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/record.c - * PURPOSE: Functions for managing DNS Record structures. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/dns/rrprint.c b/dll/win32/mswsock/dns/rrprint.c index 1e302d4395e..29a58ff86ed 100644 --- a/dll/win32/mswsock/dns/rrprint.c +++ b/dll/win32/mswsock/dns/rrprint.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/rrprint.c - * PURPOSE: Callback functions for printing RR Structures for each Record. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/rrprint.c - * PURPOSE: Callback functions for printing RR Structures for each Record. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/rrprint.c - * PURPOSE: Callback functions for printing RR Structures for each Record. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/dns/sablob.c b/dll/win32/mswsock/dns/sablob.c index ff1a9bac9f0..1e9b1845937 100644 --- a/dll/win32/mswsock/dns/sablob.c +++ b/dll/win32/mswsock/dns/sablob.c @@ -643,1938 +643,3 @@ Quickie: return DnsBlob; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/sablob.c - * PURPOSE: Functions for the Saved Answer Blob Implementation - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -PVOID -WINAPI -FlatBuf_Arg_ReserveAlignPointer(IN PVOID Position, - IN PSIZE_T FreeSize, - IN SIZE_T Size) -{ - /* Just a little helper that we use */ - return FlatBuf_Arg_Reserve(Position, FreeSize, Size, sizeof(PVOID)); -} - -PDNS_BLOB -WINAPI -SaBlob_Create(IN ULONG Count) -{ - PDNS_BLOB Blob; - PDNS_ARRAY DnsAddrArray; - - /* Allocate the blob */ - Blob = Dns_AllocZero(sizeof(DNS_BLOB)); - if (Blob) - { - /* Check if it'll hold any addresses */ - if (Count) - { - /* Create the DNS Address Array */ - DnsAddrArray = DnsAddrArray_Create(Count); - if (!DnsAddrArray) - { - /* Failure, free the blob */ - SaBlob_Free(Blob); - SetLastError(ERROR_OUTOFMEMORY); - } - else - { - /* Link it with the blob */ - Blob->DnsAddrArray = DnsAddrArray; - } - } - } - - /* Return the blob */ - return Blob; -} - -PDNS_BLOB -WINAPI -SaBlob_CreateFromIp4(IN LPWSTR Name, - IN ULONG Count, - IN PIN_ADDR AddressArray) -{ - PDNS_BLOB Blob; - LPWSTR NameCopy; - ULONG i; - - /* Create the blob */ - Blob = SaBlob_Create(Count); - if (!Blob) goto Quickie; - - /* If we have a name */ - if (Name) - { - /* Create a copy of it */ - NameCopy = Dns_CreateStringCopy_W(Name); - if (!NameCopy) goto Quickie; - - /* Save the pointer to the name */ - Blob->Name = NameCopy; - } - - /* Loop all the addresses */ - for (i = 0; i < Count; i++) - { - /* Add an entry for this address */ - DnsAddrArray_AddIp4(Blob->DnsAddrArray, AddressArray[i], IpV4Address); - } - - /* Return the blob */ - return Blob; - -Quickie: - /* Free the blob, set error and fail */ - SaBlob_Free(Blob); - SetLastError(ERROR_OUTOFMEMORY); - return NULL; -} - -VOID -WINAPI -SaBlob_Free(IN PDNS_BLOB Blob) -{ - /* Make sure we got a blob */ - if (Blob) - { - /* Free the name */ - Dns_Free(Blob->Name); - - /* Loop the aliases */ - while (Blob->AliasCount) - { - /* Free the alias */ - Dns_Free(Blob->Aliases[Blob->AliasCount]); - - /* Decrease number of aliases */ - Blob->AliasCount--; - } - - /* Free the DNS Address Array */ - DnsAddrArray_Free(Blob->DnsAddrArray); - - /* Free the blob itself */ - Dns_Free(Blob); - } -} - -PHOSTENT -WINAPI -SaBlob_CreateHostent(IN OUT PULONG_PTR BufferPosition, - IN OUT PSIZE_T FreeBufferSpace, - IN OUT PSIZE_T HostEntrySize, - IN PDNS_BLOB Blob, - IN DWORD StringType, - IN BOOLEAN Relative, - IN BOOLEAN BufferAllocated) -{ - PDNS_ARRAY DnsAddrArray = Blob->DnsAddrArray; - ULONG AliasCount = Blob->AliasCount; - WORD AddressFamily = AF_UNSPEC; - ULONG AddressCount = 0, AddressSize = 0, TotalSize, NamePointerSize; - ULONG AliasPointerSize; - PDNS_FAMILY_INFO FamilyInfo = NULL; - ULONG StringLength = 0; - ULONG i; - ULONG HostentSize = 0; - PHOSTENT Hostent = NULL; - ULONG_PTR HostentPtr; - PVOID CurrentAddress; - - /* Check if we actually have any addresses */ - if (DnsAddrArray) - { - /* Get the address family */ - AddressFamily = DnsAddrArray->Addresses[0].AddressFamily; - - /* Get family information */ - FamilyInfo = FamilyInfo_GetForFamily(AddressFamily); - - /* Save the current address count and their size */ - AddressCount = DnsAddrArray->UsedAddresses; - AddressSize = FamilyInfo->AddressSize; - } - - /* Calculate total size for all the addresses, and their pointers */ - TotalSize = AddressSize * AddressCount; - NamePointerSize = AddressCount * sizeof(PVOID) + sizeof(PVOID); - - /* Check if we have a name */ - if (Blob->Name) - { - /* Find out the size we'll need for a copy */ - StringLength = (Dns_GetBufferLengthForStringCopy(Blob->Name, - 0, - UnicodeString, - StringType) + 1) & ~1; - } - - /* Now do the same for the aliases */ - for (i = AliasCount; i; i--) - { - /* Find out the size we'll need for a copy */ - HostentSize += (Dns_GetBufferLengthForStringCopy(Blob->Aliases[i], - 0, - UnicodeString, - StringType) + 1) & ~1; - } - - /* Find out how much the pointers will take */ - AliasPointerSize = AliasCount * sizeof(PVOID) + sizeof(PVOID); - - /* Calculate Hostent Size */ - HostentSize += TotalSize + - NamePointerSize + - AliasPointerSize + - StringLength + - sizeof(HOSTENT); - - /* Check if we already have a buffer */ - if (!BufferAllocated) - { - /* We don't, allocate space ourselves */ - HostentPtr = (ULONG_PTR)Dns_AllocZero(HostentSize); - } - else - { - /* We do, so allocate space in the buffer */ - HostentPtr = (ULONG_PTR)FlatBuf_Arg_ReserveAlignPointer(BufferPosition, - FreeBufferSpace, - HostentSize); - } - - /* Make sure we got space */ - if (HostentPtr) - { - /* Initialize it */ - Hostent = Hostent_Init((PVOID)&HostentPtr, - AddressFamily, - AddressSize, - AddressCount, - AliasCount); - } - - /* Loop the addresses */ - for (i = 0; i < AddressCount; i++) - { - /* Get the pointer of the current address */ - CurrentAddress = (PVOID)((ULONG_PTR)&DnsAddrArray->Addresses[i] + - FamilyInfo->AddressOffset); - - /* Write the pointer */ - Hostent->h_addr_list[i] = (PCHAR)HostentPtr; - - /* Copy the address */ - RtlCopyMemory((PVOID)HostentPtr, CurrentAddress, AddressSize); - - /* Advance the buffer */ - HostentPtr += AddressSize; - } - - /* Check if we have a name */ - if (Blob->Name) - { - /* Align our current position */ - HostentPtr += 1 & ~1; - - /* Save our name here */ - Hostent->h_name = (LPSTR)HostentPtr; - - /* Now copy it in the blob */ - HostentPtr += Dns_StringCopy((PVOID)HostentPtr, - NULL, - Blob->Name, - 0, - UnicodeString, - StringType); - } - - /* Loop the Aliases */ - for (i = AliasCount; i; i--) - { - /* Align our current position */ - HostentPtr += 1 & ~1; - - /* Save our alias here */ - Hostent->h_aliases[i] = (LPSTR)HostentPtr; - - /* Now copy it in the blob */ - HostentPtr += Dns_StringCopy((PVOID)HostentPtr, - NULL, - Blob->Aliases[i], - 0, - UnicodeString, - StringType); - } - - /* Check if the caller didn't have a buffer */ - if (!BufferAllocated) - { - /* Return the size; not needed if we had a blob, since it's internal */ - *HostEntrySize = *BufferPosition - (ULONG_PTR)HostentPtr; - } - - /* Convert to Offsets if requested */ - if(Relative) Hostent_ConvertToOffsets(Hostent); - - /* Return the full, complete, hostent */ - return Hostent; -} - -INT -WINAPI -SaBlob_WriteNameOrAlias(IN PDNS_BLOB Blob, - IN LPWSTR String, - IN BOOLEAN IsAlias) -{ - /* Check if this is an alias */ - if (!IsAlias) - { - /* It's not. Simply create a copy of the string */ - Blob->Name = Dns_CreateStringCopy_W(String); - if (!Blob->Name) return GetLastError(); - } - else - { - /* Does it have a name, and less then 8 aliases? */ - if ((Blob->Name) && (Blob->AliasCount <= 8)) - { - /* Yup, create a copy of the string and increase the alias count */ - Blob->Aliases[Blob->AliasCount] = Dns_CreateStringCopy_W(String); - Blob->AliasCount++; - } - else - { - /* Invalid request! */ - return ERROR_MORE_DATA; - } - } - - /* Return Success */ - return ERROR_SUCCESS; -} - -INT -WINAPI -SaBlob_WriteAddress(IN PDNS_BLOB Blob, - OUT PDNS_ADDRESS DnsAddr) -{ - /* Check if we have an array yet */ - if (!Blob->DnsAddrArray) - { - /* Allocate one! */ - Blob->DnsAddrArray = DnsAddrArray_Create(1); - if (!Blob->DnsAddrArray) return ERROR_OUTOFMEMORY; - } - - /* Add this address */ - return DnsAddrArray_AddAddr(Blob->DnsAddrArray, DnsAddr, AF_UNSPEC, 0) ? - ERROR_SUCCESS: - ERROR_MORE_DATA; -} - -BOOLEAN -WINAPI -SaBlob_IsSupportedAddrType(WORD DnsType) -{ - /* Check for valid Types that we support */ - return (DnsType == DNS_TYPE_A || - DnsType == DNS_TYPE_ATMA || - DnsType == DNS_TYPE_AAAA); -} - -INT -WINAPI -SaBlob_WriteRecords(OUT PDNS_BLOB Blob, - IN PDNS_RECORD DnsRecord, - IN BOOLEAN DoAlias) -{ - DNS_ADDRESS DnsAddress; - INT ErrorCode = STATUS_INVALID_PARAMETER; - BOOLEAN WroteOnce = FALSE; - - /* Zero out the Address */ - RtlZeroMemory(&DnsAddress, sizeof(DnsAddress)); - - /* Loop through all the Records */ - while (DnsRecord) - { - /* Is this not an answer? */ - if (DnsRecord->Flags.S.Section != DNSREC_ANSWER) - { - /* Then simply move on to the next DNS Record */ - DnsRecord = DnsRecord->pNext; - continue; - } - - /* Check the type of thsi record */ - switch(DnsRecord->wType) - { - /* Regular IPv4, v6 or ATM Record */ - case DNS_TYPE_A: - case DNS_TYPE_AAAA: - case DNS_TYPE_ATMA: - - /* Create a DNS Address from the record */ - DnsAddr_BuildFromDnsRecord(DnsRecord, &DnsAddress); - - /* Add it to the DNS Blob */ - ErrorCode = SaBlob_WriteAddress(Blob, &DnsAddress); - - /* Add the name, if needed */ - if ((DoAlias) && - (!WroteOnce) && - (!Blob->Name) && - (DnsRecord->pName)) - { - /* Write the name from the DNS Record */ - ErrorCode = SaBlob_WriteNameOrAlias(Blob, - DnsRecord->pName, - FALSE); - WroteOnce = TRUE; - } - break; - - case DNS_TYPE_CNAME: - - /* Just write the alias name */ - ErrorCode = SaBlob_WriteNameOrAlias(Blob, - DnsRecord->pName, - TRUE); - break; - - case DNS_TYPE_PTR: - - /* Check if we already have a name */ - if (Blob->Name) - { - /* We don't, so add this as a name */ - ErrorCode = SaBlob_WriteNameOrAlias(Blob, - DnsRecord->pName, - FALSE); - } - else - { - /* We do, so add it as an alias */ - ErrorCode = SaBlob_WriteNameOrAlias(Blob, - DnsRecord->pName, - TRUE); - } - break; - default: - break; - } - - /* Next record */ - DnsRecord = DnsRecord->pNext; - } - - /* Return error code */ - return ErrorCode; -} - -PDNS_BLOB -WINAPI -SaBlob_CreateFromRecords(IN PDNS_RECORD DnsRecord, - IN BOOLEAN DoAliases, - IN DWORD DnsType) -{ - PDNS_RECORD LocalDnsRecord; - ULONG ProcessedCount = 0; - PDNS_BLOB DnsBlob; - INT ErrorCode; - DNS_ADDRESS DnsAddress; - - /* Find out how many DNS Addresses to allocate */ - LocalDnsRecord = DnsRecord; - while (LocalDnsRecord) - { - /* Make sure this record is an answer */ - if ((LocalDnsRecord->Flags.S.Section == DNSREC_ANSWER) && - (SaBlob_IsSupportedAddrType(LocalDnsRecord->wType))) - { - /* Increase number of records to process */ - ProcessedCount++; - } - - /* Move to the next record */ - LocalDnsRecord = LocalDnsRecord->pNext; - } - - /* Create the DNS Blob */ - DnsBlob = SaBlob_Create(ProcessedCount); - if (!DnsBlob) - { - /* Fail */ - ErrorCode = GetLastError(); - goto Quickie; - } - - /* Write the record to the DNS Blob */ - ErrorCode = SaBlob_WriteRecords(DnsBlob, DnsRecord, TRUE); - if (ErrorCode != NO_ERROR) - { - /* We failed... but do we still have valid data? */ - if ((DnsBlob->Name) || (DnsBlob->AliasCount)) - { - /* We'll just assume success then */ - ErrorCode = NO_ERROR; - } - else - { - /* Ok, last chance..do you have a DNS Address Array? */ - if ((DnsBlob->DnsAddrArray) && - (DnsBlob->DnsAddrArray->UsedAddresses)) - { - /* Boy are you lucky! */ - ErrorCode = NO_ERROR; - } - } - - /* Buh-bye! */ - goto Quickie; - } - - /* Check if this is a PTR record */ - if ((DnsRecord->wType == DNS_TYPE_PTR) || - ((DnsType == DNS_TYPE_PTR) && - (DnsRecord->wType == DNS_TYPE_CNAME) && - (DnsRecord->Flags.S.Section == DNSREC_ANSWER))) - { - /* Get a DNS Address Structure */ - if (Dns_ReverseNameToDnsAddr_W(&DnsAddress, DnsRecord->pName)) - { - /* Add it to the Blob */ - if (SaBlob_WriteAddress(DnsBlob, &DnsAddress)) ErrorCode = NO_ERROR; - } - } - - /* Ok...do we still not have a name? */ - if (!(DnsBlob->Name) && (DoAliases) && (LocalDnsRecord)) - { - /* We have an local DNS Record, so just use it to write the name */ - ErrorCode = SaBlob_WriteNameOrAlias(DnsBlob, - LocalDnsRecord->pName, - FALSE); - } - -Quickie: - /* Check error code */ - if (ErrorCode != NO_ERROR) - { - /* Free the blob and set the error */ - SaBlob_Free(DnsBlob); - DnsBlob = NULL; - SetLastError(ErrorCode); - } - - /* Return */ - return DnsBlob; -} - -PDNS_BLOB -WINAPI -SaBlob_Query(IN LPWSTR Name, - IN WORD DnsType, - IN ULONG Flags, - IN PVOID *Reserved, - IN DWORD AddressFamily) -{ - PDNS_RECORD DnsRecord = NULL; - INT ErrorCode; - PDNS_BLOB DnsBlob = NULL; - LPWSTR LocalName, LocalNameCopy; - - /* If they want reserved data back, clear it out in case we fail */ - if (Reserved) *Reserved = NULL; - - /* Query DNS */ - ErrorCode = DnsQuery_W(Name, - DnsType, - Flags, - NULL, - &DnsRecord, - Reserved); - if (ErrorCode != ERROR_SUCCESS) - { - /* We failed... did the caller use reserved data? */ - if (Reserved && *Reserved) - { - /* He did, and it was valid. Free it */ - DnsApiFree(*Reserved); - *Reserved = NULL; - } - - /* Normalize error code */ - if (ErrorCode == RPC_S_SERVER_UNAVAILABLE) ErrorCode = WSATRY_AGAIN; - goto Quickie; - } - - /* Now create the Blob from the DNS Records */ - DnsBlob = SaBlob_CreateFromRecords(DnsRecord, TRUE, DnsType); - if (!DnsBlob) - { - /* Failed, get error code */ - ErrorCode = GetLastError(); - goto Quickie; - } - - /* Make sure it has a name */ - if (!DnsBlob->Name) - { - /* It doesn't, fail */ - ErrorCode = DNS_INFO_NO_RECORDS; - goto Quickie; - } - - /* Check if the name is local or loopback */ - if (!(DnsNameCompare_W(DnsBlob->Name, L"localhost")) && - !(DnsNameCompare_W(DnsBlob->Name, L"loopback"))) - { - /* Nothing left to do, exit! */ - goto Quickie; - } - - /* This is a local name...query it */ - DnsQueryConfig(DnsConfigFullHostName_W, - DNS_CONFIG_FLAG_ALLOC, - NULL, - NULL, - &LocalName, - 0); - if (LocalName) - { - /* Create a copy for the caller */ - LocalNameCopy = Dns_CreateStringCopy_W(LocalName); - if (LocalNameCopy) - { - /* Overwrite the one in the blob */ - DnsBlob->Name = LocalNameCopy; - } - else - { - /* We failed to make a copy, free memory */ - DnsApiFree(LocalName); - } - } - -Quickie: - /* Free the DNS Record if we have one */ - if (DnsRecord) DnsRecordListFree(DnsRecord, DnsFreeRecordList); - - /* Check if this is a failure path with an active blob */ - if ((ErrorCode != ERROR_SUCCESS) && (DnsBlob)) - { - /* Free the blob */ - SaBlob_Free(DnsBlob); - DnsBlob = NULL; - } - - /* Set the last error and return */ - SetLastError(ErrorCode); - return DnsBlob; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/sablob.c - * PURPOSE: Functions for the Saved Answer Blob Implementation - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -PVOID -WINAPI -FlatBuf_Arg_ReserveAlignPointer(IN PVOID Position, - IN PSIZE_T FreeSize, - IN SIZE_T Size) -{ - /* Just a little helper that we use */ - return FlatBuf_Arg_Reserve(Position, FreeSize, Size, sizeof(PVOID)); -} - -PDNS_BLOB -WINAPI -SaBlob_Create(IN ULONG Count) -{ - PDNS_BLOB Blob; - PDNS_ARRAY DnsAddrArray; - - /* Allocate the blob */ - Blob = Dns_AllocZero(sizeof(DNS_BLOB)); - if (Blob) - { - /* Check if it'll hold any addresses */ - if (Count) - { - /* Create the DNS Address Array */ - DnsAddrArray = DnsAddrArray_Create(Count); - if (!DnsAddrArray) - { - /* Failure, free the blob */ - SaBlob_Free(Blob); - SetLastError(ERROR_OUTOFMEMORY); - } - else - { - /* Link it with the blob */ - Blob->DnsAddrArray = DnsAddrArray; - } - } - } - - /* Return the blob */ - return Blob; -} - -PDNS_BLOB -WINAPI -SaBlob_CreateFromIp4(IN LPWSTR Name, - IN ULONG Count, - IN PIN_ADDR AddressArray) -{ - PDNS_BLOB Blob; - LPWSTR NameCopy; - ULONG i; - - /* Create the blob */ - Blob = SaBlob_Create(Count); - if (!Blob) goto Quickie; - - /* If we have a name */ - if (Name) - { - /* Create a copy of it */ - NameCopy = Dns_CreateStringCopy_W(Name); - if (!NameCopy) goto Quickie; - - /* Save the pointer to the name */ - Blob->Name = NameCopy; - } - - /* Loop all the addresses */ - for (i = 0; i < Count; i++) - { - /* Add an entry for this address */ - DnsAddrArray_AddIp4(Blob->DnsAddrArray, AddressArray[i], IpV4Address); - } - - /* Return the blob */ - return Blob; - -Quickie: - /* Free the blob, set error and fail */ - SaBlob_Free(Blob); - SetLastError(ERROR_OUTOFMEMORY); - return NULL; -} - -VOID -WINAPI -SaBlob_Free(IN PDNS_BLOB Blob) -{ - /* Make sure we got a blob */ - if (Blob) - { - /* Free the name */ - Dns_Free(Blob->Name); - - /* Loop the aliases */ - while (Blob->AliasCount) - { - /* Free the alias */ - Dns_Free(Blob->Aliases[Blob->AliasCount]); - - /* Decrease number of aliases */ - Blob->AliasCount--; - } - - /* Free the DNS Address Array */ - DnsAddrArray_Free(Blob->DnsAddrArray); - - /* Free the blob itself */ - Dns_Free(Blob); - } -} - -PHOSTENT -WINAPI -SaBlob_CreateHostent(IN OUT PULONG_PTR BufferPosition, - IN OUT PSIZE_T FreeBufferSpace, - IN OUT PSIZE_T HostEntrySize, - IN PDNS_BLOB Blob, - IN DWORD StringType, - IN BOOLEAN Relative, - IN BOOLEAN BufferAllocated) -{ - PDNS_ARRAY DnsAddrArray = Blob->DnsAddrArray; - ULONG AliasCount = Blob->AliasCount; - WORD AddressFamily = AF_UNSPEC; - ULONG AddressCount = 0, AddressSize = 0, TotalSize, NamePointerSize; - ULONG AliasPointerSize; - PDNS_FAMILY_INFO FamilyInfo = NULL; - ULONG StringLength = 0; - ULONG i; - ULONG HostentSize = 0; - PHOSTENT Hostent = NULL; - ULONG_PTR HostentPtr; - PVOID CurrentAddress; - - /* Check if we actually have any addresses */ - if (DnsAddrArray) - { - /* Get the address family */ - AddressFamily = DnsAddrArray->Addresses[0].AddressFamily; - - /* Get family information */ - FamilyInfo = FamilyInfo_GetForFamily(AddressFamily); - - /* Save the current address count and their size */ - AddressCount = DnsAddrArray->UsedAddresses; - AddressSize = FamilyInfo->AddressSize; - } - - /* Calculate total size for all the addresses, and their pointers */ - TotalSize = AddressSize * AddressCount; - NamePointerSize = AddressCount * sizeof(PVOID) + sizeof(PVOID); - - /* Check if we have a name */ - if (Blob->Name) - { - /* Find out the size we'll need for a copy */ - StringLength = (Dns_GetBufferLengthForStringCopy(Blob->Name, - 0, - UnicodeString, - StringType) + 1) & ~1; - } - - /* Now do the same for the aliases */ - for (i = AliasCount; i; i--) - { - /* Find out the size we'll need for a copy */ - HostentSize += (Dns_GetBufferLengthForStringCopy(Blob->Aliases[i], - 0, - UnicodeString, - StringType) + 1) & ~1; - } - - /* Find out how much the pointers will take */ - AliasPointerSize = AliasCount * sizeof(PVOID) + sizeof(PVOID); - - /* Calculate Hostent Size */ - HostentSize += TotalSize + - NamePointerSize + - AliasPointerSize + - StringLength + - sizeof(HOSTENT); - - /* Check if we already have a buffer */ - if (!BufferAllocated) - { - /* We don't, allocate space ourselves */ - HostentPtr = (ULONG_PTR)Dns_AllocZero(HostentSize); - } - else - { - /* We do, so allocate space in the buffer */ - HostentPtr = (ULONG_PTR)FlatBuf_Arg_ReserveAlignPointer(BufferPosition, - FreeBufferSpace, - HostentSize); - } - - /* Make sure we got space */ - if (HostentPtr) - { - /* Initialize it */ - Hostent = Hostent_Init((PVOID)&HostentPtr, - AddressFamily, - AddressSize, - AddressCount, - AliasCount); - } - - /* Loop the addresses */ - for (i = 0; i < AddressCount; i++) - { - /* Get the pointer of the current address */ - CurrentAddress = (PVOID)((ULONG_PTR)&DnsAddrArray->Addresses[i] + - FamilyInfo->AddressOffset); - - /* Write the pointer */ - Hostent->h_addr_list[i] = (PCHAR)HostentPtr; - - /* Copy the address */ - RtlCopyMemory((PVOID)HostentPtr, CurrentAddress, AddressSize); - - /* Advance the buffer */ - HostentPtr += AddressSize; - } - - /* Check if we have a name */ - if (Blob->Name) - { - /* Align our current position */ - HostentPtr += 1 & ~1; - - /* Save our name here */ - Hostent->h_name = (LPSTR)HostentPtr; - - /* Now copy it in the blob */ - HostentPtr += Dns_StringCopy((PVOID)HostentPtr, - NULL, - Blob->Name, - 0, - UnicodeString, - StringType); - } - - /* Loop the Aliases */ - for (i = AliasCount; i; i--) - { - /* Align our current position */ - HostentPtr += 1 & ~1; - - /* Save our alias here */ - Hostent->h_aliases[i] = (LPSTR)HostentPtr; - - /* Now copy it in the blob */ - HostentPtr += Dns_StringCopy((PVOID)HostentPtr, - NULL, - Blob->Aliases[i], - 0, - UnicodeString, - StringType); - } - - /* Check if the caller didn't have a buffer */ - if (!BufferAllocated) - { - /* Return the size; not needed if we had a blob, since it's internal */ - *HostEntrySize = *BufferPosition - (ULONG_PTR)HostentPtr; - } - - /* Convert to Offsets if requested */ - if(Relative) Hostent_ConvertToOffsets(Hostent); - - /* Return the full, complete, hostent */ - return Hostent; -} - -INT -WINAPI -SaBlob_WriteNameOrAlias(IN PDNS_BLOB Blob, - IN LPWSTR String, - IN BOOLEAN IsAlias) -{ - /* Check if this is an alias */ - if (!IsAlias) - { - /* It's not. Simply create a copy of the string */ - Blob->Name = Dns_CreateStringCopy_W(String); - if (!Blob->Name) return GetLastError(); - } - else - { - /* Does it have a name, and less then 8 aliases? */ - if ((Blob->Name) && (Blob->AliasCount <= 8)) - { - /* Yup, create a copy of the string and increase the alias count */ - Blob->Aliases[Blob->AliasCount] = Dns_CreateStringCopy_W(String); - Blob->AliasCount++; - } - else - { - /* Invalid request! */ - return ERROR_MORE_DATA; - } - } - - /* Return Success */ - return ERROR_SUCCESS; -} - -INT -WINAPI -SaBlob_WriteAddress(IN PDNS_BLOB Blob, - OUT PDNS_ADDRESS DnsAddr) -{ - /* Check if we have an array yet */ - if (!Blob->DnsAddrArray) - { - /* Allocate one! */ - Blob->DnsAddrArray = DnsAddrArray_Create(1); - if (!Blob->DnsAddrArray) return ERROR_OUTOFMEMORY; - } - - /* Add this address */ - return DnsAddrArray_AddAddr(Blob->DnsAddrArray, DnsAddr, AF_UNSPEC, 0) ? - ERROR_SUCCESS: - ERROR_MORE_DATA; -} - -BOOLEAN -WINAPI -SaBlob_IsSupportedAddrType(WORD DnsType) -{ - /* Check for valid Types that we support */ - return (DnsType == DNS_TYPE_A || - DnsType == DNS_TYPE_ATMA || - DnsType == DNS_TYPE_AAAA); -} - -INT -WINAPI -SaBlob_WriteRecords(OUT PDNS_BLOB Blob, - IN PDNS_RECORD DnsRecord, - IN BOOLEAN DoAlias) -{ - DNS_ADDRESS DnsAddress; - INT ErrorCode = STATUS_INVALID_PARAMETER; - BOOLEAN WroteOnce = FALSE; - - /* Zero out the Address */ - RtlZeroMemory(&DnsAddress, sizeof(DnsAddress)); - - /* Loop through all the Records */ - while (DnsRecord) - { - /* Is this not an answer? */ - if (DnsRecord->Flags.S.Section != DNSREC_ANSWER) - { - /* Then simply move on to the next DNS Record */ - DnsRecord = DnsRecord->pNext; - continue; - } - - /* Check the type of thsi record */ - switch(DnsRecord->wType) - { - /* Regular IPv4, v6 or ATM Record */ - case DNS_TYPE_A: - case DNS_TYPE_AAAA: - case DNS_TYPE_ATMA: - - /* Create a DNS Address from the record */ - DnsAddr_BuildFromDnsRecord(DnsRecord, &DnsAddress); - - /* Add it to the DNS Blob */ - ErrorCode = SaBlob_WriteAddress(Blob, &DnsAddress); - - /* Add the name, if needed */ - if ((DoAlias) && - (!WroteOnce) && - (!Blob->Name) && - (DnsRecord->pName)) - { - /* Write the name from the DNS Record */ - ErrorCode = SaBlob_WriteNameOrAlias(Blob, - DnsRecord->pName, - FALSE); - WroteOnce = TRUE; - } - break; - - case DNS_TYPE_CNAME: - - /* Just write the alias name */ - ErrorCode = SaBlob_WriteNameOrAlias(Blob, - DnsRecord->pName, - TRUE); - break; - - case DNS_TYPE_PTR: - - /* Check if we already have a name */ - if (Blob->Name) - { - /* We don't, so add this as a name */ - ErrorCode = SaBlob_WriteNameOrAlias(Blob, - DnsRecord->pName, - FALSE); - } - else - { - /* We do, so add it as an alias */ - ErrorCode = SaBlob_WriteNameOrAlias(Blob, - DnsRecord->pName, - TRUE); - } - break; - default: - break; - } - - /* Next record */ - DnsRecord = DnsRecord->pNext; - } - - /* Return error code */ - return ErrorCode; -} - -PDNS_BLOB -WINAPI -SaBlob_CreateFromRecords(IN PDNS_RECORD DnsRecord, - IN BOOLEAN DoAliases, - IN DWORD DnsType) -{ - PDNS_RECORD LocalDnsRecord; - ULONG ProcessedCount = 0; - PDNS_BLOB DnsBlob; - INT ErrorCode; - DNS_ADDRESS DnsAddress; - - /* Find out how many DNS Addresses to allocate */ - LocalDnsRecord = DnsRecord; - while (LocalDnsRecord) - { - /* Make sure this record is an answer */ - if ((LocalDnsRecord->Flags.S.Section == DNSREC_ANSWER) && - (SaBlob_IsSupportedAddrType(LocalDnsRecord->wType))) - { - /* Increase number of records to process */ - ProcessedCount++; - } - - /* Move to the next record */ - LocalDnsRecord = LocalDnsRecord->pNext; - } - - /* Create the DNS Blob */ - DnsBlob = SaBlob_Create(ProcessedCount); - if (!DnsBlob) - { - /* Fail */ - ErrorCode = GetLastError(); - goto Quickie; - } - - /* Write the record to the DNS Blob */ - ErrorCode = SaBlob_WriteRecords(DnsBlob, DnsRecord, TRUE); - if (ErrorCode != NO_ERROR) - { - /* We failed... but do we still have valid data? */ - if ((DnsBlob->Name) || (DnsBlob->AliasCount)) - { - /* We'll just assume success then */ - ErrorCode = NO_ERROR; - } - else - { - /* Ok, last chance..do you have a DNS Address Array? */ - if ((DnsBlob->DnsAddrArray) && - (DnsBlob->DnsAddrArray->UsedAddresses)) - { - /* Boy are you lucky! */ - ErrorCode = NO_ERROR; - } - } - - /* Buh-bye! */ - goto Quickie; - } - - /* Check if this is a PTR record */ - if ((DnsRecord->wType == DNS_TYPE_PTR) || - ((DnsType == DNS_TYPE_PTR) && - (DnsRecord->wType == DNS_TYPE_CNAME) && - (DnsRecord->Flags.S.Section == DNSREC_ANSWER))) - { - /* Get a DNS Address Structure */ - if (Dns_ReverseNameToDnsAddr_W(&DnsAddress, DnsRecord->pName)) - { - /* Add it to the Blob */ - if (SaBlob_WriteAddress(DnsBlob, &DnsAddress)) ErrorCode = NO_ERROR; - } - } - - /* Ok...do we still not have a name? */ - if (!(DnsBlob->Name) && (DoAliases) && (LocalDnsRecord)) - { - /* We have an local DNS Record, so just use it to write the name */ - ErrorCode = SaBlob_WriteNameOrAlias(DnsBlob, - LocalDnsRecord->pName, - FALSE); - } - -Quickie: - /* Check error code */ - if (ErrorCode != NO_ERROR) - { - /* Free the blob and set the error */ - SaBlob_Free(DnsBlob); - DnsBlob = NULL; - SetLastError(ErrorCode); - } - - /* Return */ - return DnsBlob; -} - -PDNS_BLOB -WINAPI -SaBlob_Query(IN LPWSTR Name, - IN WORD DnsType, - IN ULONG Flags, - IN PVOID *Reserved, - IN DWORD AddressFamily) -{ - PDNS_RECORD DnsRecord = NULL; - INT ErrorCode; - PDNS_BLOB DnsBlob = NULL; - LPWSTR LocalName, LocalNameCopy; - - /* If they want reserved data back, clear it out in case we fail */ - if (Reserved) *Reserved = NULL; - - /* Query DNS */ - ErrorCode = DnsQuery_W(Name, - DnsType, - Flags, - NULL, - &DnsRecord, - Reserved); - if (ErrorCode != ERROR_SUCCESS) - { - /* We failed... did the caller use reserved data? */ - if (Reserved && *Reserved) - { - /* He did, and it was valid. Free it */ - DnsApiFree(*Reserved); - *Reserved = NULL; - } - - /* Normalize error code */ - if (ErrorCode == RPC_S_SERVER_UNAVAILABLE) ErrorCode = WSATRY_AGAIN; - goto Quickie; - } - - /* Now create the Blob from the DNS Records */ - DnsBlob = SaBlob_CreateFromRecords(DnsRecord, TRUE, DnsType); - if (!DnsBlob) - { - /* Failed, get error code */ - ErrorCode = GetLastError(); - goto Quickie; - } - - /* Make sure it has a name */ - if (!DnsBlob->Name) - { - /* It doesn't, fail */ - ErrorCode = DNS_INFO_NO_RECORDS; - goto Quickie; - } - - /* Check if the name is local or loopback */ - if (!(DnsNameCompare_W(DnsBlob->Name, L"localhost")) && - !(DnsNameCompare_W(DnsBlob->Name, L"loopback"))) - { - /* Nothing left to do, exit! */ - goto Quickie; - } - - /* This is a local name...query it */ - DnsQueryConfig(DnsConfigFullHostName_W, - DNS_CONFIG_FLAG_ALLOC, - NULL, - NULL, - &LocalName, - 0); - if (LocalName) - { - /* Create a copy for the caller */ - LocalNameCopy = Dns_CreateStringCopy_W(LocalName); - if (LocalNameCopy) - { - /* Overwrite the one in the blob */ - DnsBlob->Name = LocalNameCopy; - } - else - { - /* We failed to make a copy, free memory */ - DnsApiFree(LocalName); - } - } - -Quickie: - /* Free the DNS Record if we have one */ - if (DnsRecord) DnsRecordListFree(DnsRecord, DnsFreeRecordList); - - /* Check if this is a failure path with an active blob */ - if ((ErrorCode != ERROR_SUCCESS) && (DnsBlob)) - { - /* Free the blob */ - SaBlob_Free(DnsBlob); - DnsBlob = NULL; - } - - /* Set the last error and return */ - SetLastError(ErrorCode); - return DnsBlob; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/sablob.c - * PURPOSE: Functions for the Saved Answer Blob Implementation - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -PVOID -WINAPI -FlatBuf_Arg_ReserveAlignPointer(IN PVOID Position, - IN PSIZE_T FreeSize, - IN SIZE_T Size) -{ - /* Just a little helper that we use */ - return FlatBuf_Arg_Reserve(Position, FreeSize, Size, sizeof(PVOID)); -} - -PDNS_BLOB -WINAPI -SaBlob_Create(IN ULONG Count) -{ - PDNS_BLOB Blob; - PDNS_ARRAY DnsAddrArray; - - /* Allocate the blob */ - Blob = Dns_AllocZero(sizeof(DNS_BLOB)); - if (Blob) - { - /* Check if it'll hold any addresses */ - if (Count) - { - /* Create the DNS Address Array */ - DnsAddrArray = DnsAddrArray_Create(Count); - if (!DnsAddrArray) - { - /* Failure, free the blob */ - SaBlob_Free(Blob); - SetLastError(ERROR_OUTOFMEMORY); - } - else - { - /* Link it with the blob */ - Blob->DnsAddrArray = DnsAddrArray; - } - } - } - - /* Return the blob */ - return Blob; -} - -PDNS_BLOB -WINAPI -SaBlob_CreateFromIp4(IN LPWSTR Name, - IN ULONG Count, - IN PIN_ADDR AddressArray) -{ - PDNS_BLOB Blob; - LPWSTR NameCopy; - ULONG i; - - /* Create the blob */ - Blob = SaBlob_Create(Count); - if (!Blob) goto Quickie; - - /* If we have a name */ - if (Name) - { - /* Create a copy of it */ - NameCopy = Dns_CreateStringCopy_W(Name); - if (!NameCopy) goto Quickie; - - /* Save the pointer to the name */ - Blob->Name = NameCopy; - } - - /* Loop all the addresses */ - for (i = 0; i < Count; i++) - { - /* Add an entry for this address */ - DnsAddrArray_AddIp4(Blob->DnsAddrArray, AddressArray[i], IpV4Address); - } - - /* Return the blob */ - return Blob; - -Quickie: - /* Free the blob, set error and fail */ - SaBlob_Free(Blob); - SetLastError(ERROR_OUTOFMEMORY); - return NULL; -} - -VOID -WINAPI -SaBlob_Free(IN PDNS_BLOB Blob) -{ - /* Make sure we got a blob */ - if (Blob) - { - /* Free the name */ - Dns_Free(Blob->Name); - - /* Loop the aliases */ - while (Blob->AliasCount) - { - /* Free the alias */ - Dns_Free(Blob->Aliases[Blob->AliasCount]); - - /* Decrease number of aliases */ - Blob->AliasCount--; - } - - /* Free the DNS Address Array */ - DnsAddrArray_Free(Blob->DnsAddrArray); - - /* Free the blob itself */ - Dns_Free(Blob); - } -} - -PHOSTENT -WINAPI -SaBlob_CreateHostent(IN OUT PULONG_PTR BufferPosition, - IN OUT PSIZE_T FreeBufferSpace, - IN OUT PSIZE_T HostEntrySize, - IN PDNS_BLOB Blob, - IN DWORD StringType, - IN BOOLEAN Relative, - IN BOOLEAN BufferAllocated) -{ - PDNS_ARRAY DnsAddrArray = Blob->DnsAddrArray; - ULONG AliasCount = Blob->AliasCount; - WORD AddressFamily = AF_UNSPEC; - ULONG AddressCount = 0, AddressSize = 0, TotalSize, NamePointerSize; - ULONG AliasPointerSize; - PDNS_FAMILY_INFO FamilyInfo = NULL; - ULONG StringLength = 0; - ULONG i; - ULONG HostentSize = 0; - PHOSTENT Hostent = NULL; - ULONG_PTR HostentPtr; - PVOID CurrentAddress; - - /* Check if we actually have any addresses */ - if (DnsAddrArray) - { - /* Get the address family */ - AddressFamily = DnsAddrArray->Addresses[0].AddressFamily; - - /* Get family information */ - FamilyInfo = FamilyInfo_GetForFamily(AddressFamily); - - /* Save the current address count and their size */ - AddressCount = DnsAddrArray->UsedAddresses; - AddressSize = FamilyInfo->AddressSize; - } - - /* Calculate total size for all the addresses, and their pointers */ - TotalSize = AddressSize * AddressCount; - NamePointerSize = AddressCount * sizeof(PVOID) + sizeof(PVOID); - - /* Check if we have a name */ - if (Blob->Name) - { - /* Find out the size we'll need for a copy */ - StringLength = (Dns_GetBufferLengthForStringCopy(Blob->Name, - 0, - UnicodeString, - StringType) + 1) & ~1; - } - - /* Now do the same for the aliases */ - for (i = AliasCount; i; i--) - { - /* Find out the size we'll need for a copy */ - HostentSize += (Dns_GetBufferLengthForStringCopy(Blob->Aliases[i], - 0, - UnicodeString, - StringType) + 1) & ~1; - } - - /* Find out how much the pointers will take */ - AliasPointerSize = AliasCount * sizeof(PVOID) + sizeof(PVOID); - - /* Calculate Hostent Size */ - HostentSize += TotalSize + - NamePointerSize + - AliasPointerSize + - StringLength + - sizeof(HOSTENT); - - /* Check if we already have a buffer */ - if (!BufferAllocated) - { - /* We don't, allocate space ourselves */ - HostentPtr = (ULONG_PTR)Dns_AllocZero(HostentSize); - } - else - { - /* We do, so allocate space in the buffer */ - HostentPtr = (ULONG_PTR)FlatBuf_Arg_ReserveAlignPointer(BufferPosition, - FreeBufferSpace, - HostentSize); - } - - /* Make sure we got space */ - if (HostentPtr) - { - /* Initialize it */ - Hostent = Hostent_Init((PVOID)&HostentPtr, - AddressFamily, - AddressSize, - AddressCount, - AliasCount); - } - - /* Loop the addresses */ - for (i = 0; i < AddressCount; i++) - { - /* Get the pointer of the current address */ - CurrentAddress = (PVOID)((ULONG_PTR)&DnsAddrArray->Addresses[i] + - FamilyInfo->AddressOffset); - - /* Write the pointer */ - Hostent->h_addr_list[i] = (PCHAR)HostentPtr; - - /* Copy the address */ - RtlCopyMemory((PVOID)HostentPtr, CurrentAddress, AddressSize); - - /* Advance the buffer */ - HostentPtr += AddressSize; - } - - /* Check if we have a name */ - if (Blob->Name) - { - /* Align our current position */ - HostentPtr += 1 & ~1; - - /* Save our name here */ - Hostent->h_name = (LPSTR)HostentPtr; - - /* Now copy it in the blob */ - HostentPtr += Dns_StringCopy((PVOID)HostentPtr, - NULL, - Blob->Name, - 0, - UnicodeString, - StringType); - } - - /* Loop the Aliases */ - for (i = AliasCount; i; i--) - { - /* Align our current position */ - HostentPtr += 1 & ~1; - - /* Save our alias here */ - Hostent->h_aliases[i] = (LPSTR)HostentPtr; - - /* Now copy it in the blob */ - HostentPtr += Dns_StringCopy((PVOID)HostentPtr, - NULL, - Blob->Aliases[i], - 0, - UnicodeString, - StringType); - } - - /* Check if the caller didn't have a buffer */ - if (!BufferAllocated) - { - /* Return the size; not needed if we had a blob, since it's internal */ - *HostEntrySize = *BufferPosition - (ULONG_PTR)HostentPtr; - } - - /* Convert to Offsets if requested */ - if(Relative) Hostent_ConvertToOffsets(Hostent); - - /* Return the full, complete, hostent */ - return Hostent; -} - -INT -WINAPI -SaBlob_WriteNameOrAlias(IN PDNS_BLOB Blob, - IN LPWSTR String, - IN BOOLEAN IsAlias) -{ - /* Check if this is an alias */ - if (!IsAlias) - { - /* It's not. Simply create a copy of the string */ - Blob->Name = Dns_CreateStringCopy_W(String); - if (!Blob->Name) return GetLastError(); - } - else - { - /* Does it have a name, and less then 8 aliases? */ - if ((Blob->Name) && (Blob->AliasCount <= 8)) - { - /* Yup, create a copy of the string and increase the alias count */ - Blob->Aliases[Blob->AliasCount] = Dns_CreateStringCopy_W(String); - Blob->AliasCount++; - } - else - { - /* Invalid request! */ - return ERROR_MORE_DATA; - } - } - - /* Return Success */ - return ERROR_SUCCESS; -} - -INT -WINAPI -SaBlob_WriteAddress(IN PDNS_BLOB Blob, - OUT PDNS_ADDRESS DnsAddr) -{ - /* Check if we have an array yet */ - if (!Blob->DnsAddrArray) - { - /* Allocate one! */ - Blob->DnsAddrArray = DnsAddrArray_Create(1); - if (!Blob->DnsAddrArray) return ERROR_OUTOFMEMORY; - } - - /* Add this address */ - return DnsAddrArray_AddAddr(Blob->DnsAddrArray, DnsAddr, AF_UNSPEC, 0) ? - ERROR_SUCCESS: - ERROR_MORE_DATA; -} - -BOOLEAN -WINAPI -SaBlob_IsSupportedAddrType(WORD DnsType) -{ - /* Check for valid Types that we support */ - return (DnsType == DNS_TYPE_A || - DnsType == DNS_TYPE_ATMA || - DnsType == DNS_TYPE_AAAA); -} - -INT -WINAPI -SaBlob_WriteRecords(OUT PDNS_BLOB Blob, - IN PDNS_RECORD DnsRecord, - IN BOOLEAN DoAlias) -{ - DNS_ADDRESS DnsAddress; - INT ErrorCode = STATUS_INVALID_PARAMETER; - BOOLEAN WroteOnce = FALSE; - - /* Zero out the Address */ - RtlZeroMemory(&DnsAddress, sizeof(DnsAddress)); - - /* Loop through all the Records */ - while (DnsRecord) - { - /* Is this not an answer? */ - if (DnsRecord->Flags.S.Section != DNSREC_ANSWER) - { - /* Then simply move on to the next DNS Record */ - DnsRecord = DnsRecord->pNext; - continue; - } - - /* Check the type of thsi record */ - switch(DnsRecord->wType) - { - /* Regular IPv4, v6 or ATM Record */ - case DNS_TYPE_A: - case DNS_TYPE_AAAA: - case DNS_TYPE_ATMA: - - /* Create a DNS Address from the record */ - DnsAddr_BuildFromDnsRecord(DnsRecord, &DnsAddress); - - /* Add it to the DNS Blob */ - ErrorCode = SaBlob_WriteAddress(Blob, &DnsAddress); - - /* Add the name, if needed */ - if ((DoAlias) && - (!WroteOnce) && - (!Blob->Name) && - (DnsRecord->pName)) - { - /* Write the name from the DNS Record */ - ErrorCode = SaBlob_WriteNameOrAlias(Blob, - DnsRecord->pName, - FALSE); - WroteOnce = TRUE; - } - break; - - case DNS_TYPE_CNAME: - - /* Just write the alias name */ - ErrorCode = SaBlob_WriteNameOrAlias(Blob, - DnsRecord->pName, - TRUE); - break; - - case DNS_TYPE_PTR: - - /* Check if we already have a name */ - if (Blob->Name) - { - /* We don't, so add this as a name */ - ErrorCode = SaBlob_WriteNameOrAlias(Blob, - DnsRecord->pName, - FALSE); - } - else - { - /* We do, so add it as an alias */ - ErrorCode = SaBlob_WriteNameOrAlias(Blob, - DnsRecord->pName, - TRUE); - } - break; - default: - break; - } - - /* Next record */ - DnsRecord = DnsRecord->pNext; - } - - /* Return error code */ - return ErrorCode; -} - -PDNS_BLOB -WINAPI -SaBlob_CreateFromRecords(IN PDNS_RECORD DnsRecord, - IN BOOLEAN DoAliases, - IN DWORD DnsType) -{ - PDNS_RECORD LocalDnsRecord; - ULONG ProcessedCount = 0; - PDNS_BLOB DnsBlob; - INT ErrorCode; - DNS_ADDRESS DnsAddress; - - /* Find out how many DNS Addresses to allocate */ - LocalDnsRecord = DnsRecord; - while (LocalDnsRecord) - { - /* Make sure this record is an answer */ - if ((LocalDnsRecord->Flags.S.Section == DNSREC_ANSWER) && - (SaBlob_IsSupportedAddrType(LocalDnsRecord->wType))) - { - /* Increase number of records to process */ - ProcessedCount++; - } - - /* Move to the next record */ - LocalDnsRecord = LocalDnsRecord->pNext; - } - - /* Create the DNS Blob */ - DnsBlob = SaBlob_Create(ProcessedCount); - if (!DnsBlob) - { - /* Fail */ - ErrorCode = GetLastError(); - goto Quickie; - } - - /* Write the record to the DNS Blob */ - ErrorCode = SaBlob_WriteRecords(DnsBlob, DnsRecord, TRUE); - if (ErrorCode != NO_ERROR) - { - /* We failed... but do we still have valid data? */ - if ((DnsBlob->Name) || (DnsBlob->AliasCount)) - { - /* We'll just assume success then */ - ErrorCode = NO_ERROR; - } - else - { - /* Ok, last chance..do you have a DNS Address Array? */ - if ((DnsBlob->DnsAddrArray) && - (DnsBlob->DnsAddrArray->UsedAddresses)) - { - /* Boy are you lucky! */ - ErrorCode = NO_ERROR; - } - } - - /* Buh-bye! */ - goto Quickie; - } - - /* Check if this is a PTR record */ - if ((DnsRecord->wType == DNS_TYPE_PTR) || - ((DnsType == DNS_TYPE_PTR) && - (DnsRecord->wType == DNS_TYPE_CNAME) && - (DnsRecord->Flags.S.Section == DNSREC_ANSWER))) - { - /* Get a DNS Address Structure */ - if (Dns_ReverseNameToDnsAddr_W(&DnsAddress, DnsRecord->pName)) - { - /* Add it to the Blob */ - if (SaBlob_WriteAddress(DnsBlob, &DnsAddress)) ErrorCode = NO_ERROR; - } - } - - /* Ok...do we still not have a name? */ - if (!(DnsBlob->Name) && (DoAliases) && (LocalDnsRecord)) - { - /* We have an local DNS Record, so just use it to write the name */ - ErrorCode = SaBlob_WriteNameOrAlias(DnsBlob, - LocalDnsRecord->pName, - FALSE); - } - -Quickie: - /* Check error code */ - if (ErrorCode != NO_ERROR) - { - /* Free the blob and set the error */ - SaBlob_Free(DnsBlob); - DnsBlob = NULL; - SetLastError(ErrorCode); - } - - /* Return */ - return DnsBlob; -} - -PDNS_BLOB -WINAPI -SaBlob_Query(IN LPWSTR Name, - IN WORD DnsType, - IN ULONG Flags, - IN PVOID *Reserved, - IN DWORD AddressFamily) -{ - PDNS_RECORD DnsRecord = NULL; - INT ErrorCode; - PDNS_BLOB DnsBlob = NULL; - LPWSTR LocalName, LocalNameCopy; - - /* If they want reserved data back, clear it out in case we fail */ - if (Reserved) *Reserved = NULL; - - /* Query DNS */ - ErrorCode = DnsQuery_W(Name, - DnsType, - Flags, - NULL, - &DnsRecord, - Reserved); - if (ErrorCode != ERROR_SUCCESS) - { - /* We failed... did the caller use reserved data? */ - if (Reserved && *Reserved) - { - /* He did, and it was valid. Free it */ - DnsApiFree(*Reserved); - *Reserved = NULL; - } - - /* Normalize error code */ - if (ErrorCode == RPC_S_SERVER_UNAVAILABLE) ErrorCode = WSATRY_AGAIN; - goto Quickie; - } - - /* Now create the Blob from the DNS Records */ - DnsBlob = SaBlob_CreateFromRecords(DnsRecord, TRUE, DnsType); - if (!DnsBlob) - { - /* Failed, get error code */ - ErrorCode = GetLastError(); - goto Quickie; - } - - /* Make sure it has a name */ - if (!DnsBlob->Name) - { - /* It doesn't, fail */ - ErrorCode = DNS_INFO_NO_RECORDS; - goto Quickie; - } - - /* Check if the name is local or loopback */ - if (!(DnsNameCompare_W(DnsBlob->Name, L"localhost")) && - !(DnsNameCompare_W(DnsBlob->Name, L"loopback"))) - { - /* Nothing left to do, exit! */ - goto Quickie; - } - - /* This is a local name...query it */ - DnsQueryConfig(DnsConfigFullHostName_W, - DNS_CONFIG_FLAG_ALLOC, - NULL, - NULL, - &LocalName, - 0); - if (LocalName) - { - /* Create a copy for the caller */ - LocalNameCopy = Dns_CreateStringCopy_W(LocalName); - if (LocalNameCopy) - { - /* Overwrite the one in the blob */ - DnsBlob->Name = LocalNameCopy; - } - else - { - /* We failed to make a copy, free memory */ - DnsApiFree(LocalName); - } - } - -Quickie: - /* Free the DNS Record if we have one */ - if (DnsRecord) DnsRecordListFree(DnsRecord, DnsFreeRecordList); - - /* Check if this is a failure path with an active blob */ - if ((ErrorCode != ERROR_SUCCESS) && (DnsBlob)) - { - /* Free the blob */ - SaBlob_Free(DnsBlob); - DnsBlob = NULL; - } - - /* Set the last error and return */ - SetLastError(ErrorCode); - return DnsBlob; -} - diff --git a/dll/win32/mswsock/dns/straddr.c b/dll/win32/mswsock/dns/straddr.c index 4bf80f51b8b..4215a80dbf0 100644 --- a/dll/win32/mswsock/dns/straddr.c +++ b/dll/win32/mswsock/dns/straddr.c @@ -460,1389 +460,3 @@ Dns_ReverseNameToDnsAddr_W(OUT PDNS_ADDRESS DnsAddr, TRUE); } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/straddr.c - * PURPOSE: Functions for address<->string conversion. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -LPWSTR -WINAPI -Dns_Ip6AddressToReverseName_W(OUT LPWSTR Name, - IN IN6_ADDR Address) -{ - /* FIXME */ - return NULL; -} - -LPWSTR -WINAPI -Dns_Ip4AddressToReverseName_W(OUT LPWSTR Name, - IN IN_ADDR Address) -{ - /* Simply append the ARPA string */ - return Name + (wsprintfW(Name, - L"%u.%u.%u.%u.in-addr.arpa.", - Address.S_un.S_addr >> 24, - Address.S_un.S_addr >> 10, - Address.S_un.S_addr >> 8, - Address.S_un.S_addr) * sizeof(WCHAR)); -} - -BOOLEAN -WINAPI -Dns_Ip4ReverseNameToAddress_A(OUT PIN_ADDR Address, - IN LPSTR Name) -{ - /* FIXME */ - return FALSE; -} - -BOOLEAN -WINAPI -Dns_Ip6ReverseNameToAddress_A(OUT PIN6_ADDR Address, - IN LPSTR Name) -{ - /* FIXME */ - return FALSE; -} - -BOOLEAN -WINAPI -Dns_Ip6StringToAddress_A(OUT PIN6_ADDR Address, - IN LPSTR Name) -{ - PCHAR Terminator; - NTSTATUS Status; - - /* Let RTL Do it for us */ - Status = RtlIpv6StringToAddressA(Name, &Terminator, Address); - if (NT_SUCCESS(Status)) return TRUE; - - /* We failed */ - return FALSE; -} - -BOOLEAN -WINAPI -Dns_Ip6StringToAddress_W(OUT PIN6_ADDR Address, - IN LPWSTR Name) -{ - PCHAR Terminator; - NTSTATUS Status; - - /* Let RTL Do it for us */ - Status = RtlIpv6StringToAddressW(Name, &Terminator, Address); - if (NT_SUCCESS(Status)) return TRUE; - - /* We failed */ - return FALSE; -} - -BOOLEAN -WINAPI -Dns_Ip4StringToAddress_A(OUT PIN_ADDR Address, - IN LPSTR Name) -{ - ULONG Addr; - - /* Use inet_addr to convert it... */ - Addr = inet_addr(Name); - if (Addr == -1) - { - /* Check if it's the wildcard (which is ok...) */ - if (strcmp("255.255.255.255", Name)) return FALSE; - } - - /* If we got here, then we suceeded... return the address */ - Address->S_un.S_addr = Addr; - return TRUE; -} - -BOOLEAN -WINAPI -Dns_Ip4StringToAddress_W(OUT PIN_ADDR Address, - IN LPWSTR Name) -{ - CHAR AnsiName[16]; - ULONG Size = sizeof(AnsiName); - INT ErrorCode; - - /* Make a copy of the name in ANSI */ - ErrorCode = Dns_StringCopy(&AnsiName, - &Size, - Name, - 0, - UnicodeString, - AnsiString); - if (ErrorCode) - { - /* Copy made sucesfully, now convert it */ - ErrorCode = Dns_Ip4StringToAddress_A(Address, AnsiName); - } - - /* Return either 0 bytes copied (failure == false) or conversion status */ - return ErrorCode; -} - -BOOLEAN -WINAPI -Dns_Ip4ReverseNameToAddress_W(OUT PIN_ADDR Address, - IN LPWSTR Name) -{ - CHAR AnsiName[32]; - ULONG Size = sizeof(AnsiName); - INT ErrorCode; - - /* Make a copy of the name in ANSI */ - ErrorCode = Dns_StringCopy(&AnsiName, - &Size, - Name, - 0, - UnicodeString, - AnsiString); - if (ErrorCode) - { - /* Copy made sucesfully, now convert it */ - ErrorCode = Dns_Ip4ReverseNameToAddress_A(Address, AnsiName); - } - - /* Return either 0 bytes copied (failure == false) or conversion status */ - return ErrorCode; -} - -BOOLEAN -WINAPI -Dns_StringToAddressEx(OUT PVOID Address, - IN OUT PULONG AddressSize, - IN PVOID AddressName, - IN OUT PDWORD AddressFamily, - IN BOOLEAN Unicode, - IN BOOLEAN Reverse) -{ - DWORD Af = *AddressFamily; - ULONG AddrSize = *AddressSize; - IN6_ADDR Addr; - BOOLEAN Return; - INT ErrorCode; - CHAR AnsiName[INET6_ADDRSTRLEN + sizeof("ip6.arpa.")]; - ULONG Size = sizeof(AnsiName); - - /* First check if this is a reverse address string */ - if (Reverse) - { - /* Convert it right now to ANSI as an optimization */ - Dns_StringCopy(AnsiName, - &Size, - AddressName, - 0, - UnicodeString, - AnsiString); - - /* Use the ANSI Name instead */ - AddressName = AnsiName; - } - - /* - * If the caller doesn't know what the family is, we'll assume IPv4 and - * check if we failed or not. If the caller told us it's IPv4, then just - * do IPv4... - */ - if ((Af == AF_UNSPEC) || (Af == AF_INET)) - { - /* Now check if the caller gave us the reverse name or not */ - if (Reverse) - { - /* Get the Address */ - Return = Dns_Ip4ReverseNameToAddress_A((PIN_ADDR)&Addr, AddressName); - } - else - { - /* Check if the caller gave us unicode or not */ - if (Unicode) - { - /* Get the Address */ - Return = Dns_Ip4StringToAddress_W((PIN_ADDR)&Addr, AddressName); - } - else - { - /* Get the Address */ - Return = Dns_Ip4StringToAddress_A((PIN_ADDR)&Addr, AddressName); - } - } - - /* Check if we suceeded */ - if (Return) - { - /* Save address family */ - Af = AF_INET; - - /* Check if the address size matches */ - if (AddrSize < sizeof(IN_ADDR)) - { - /* Invalid match, set error code */ - ErrorCode = ERROR_MORE_DATA; - } - else - { - /* It matches, save the address! */ - *(PIN_ADDR)Address = *(PIN_ADDR)&Addr; - } - } - } - - /* If we are here, either AF_INET6 was specified or IPv4 failed */ - if ((Af == AF_UNSPEC) || (Af == AF_INET6)) - { - /* Now check if the caller gave us the reverse name or not */ - if (Reverse) - { - /* Get the Address */ - Return = Dns_Ip6ReverseNameToAddress_A(&Addr, AddressName); - } - else - { - /* Check if the caller gave us unicode or not */ - if (Unicode) - { - /* Get the Address */ - Return = Dns_Ip6StringToAddress_W(&Addr, AddressName); - } - else - { - /* Get the Address */ - Return = Dns_Ip6StringToAddress_A(&Addr, AddressName); - } - } - - /* Check if we suceeded */ - if (Return) - { - /* Save address family */ - Af = AF_INET6; - - /* Check if the address size matches */ - if (AddrSize < sizeof(IN6_ADDR)) - { - /* Invalid match, set error code */ - ErrorCode = ERROR_MORE_DATA; - } - else - { - /* It matches, save the address! */ - *(PIN6_ADDR)Address = Addr; - } - } - } - else if (Af != AF_INET) - { - /* You're like.. ATM or something? Get outta here! */ - Af = AF_UNSPEC; - ErrorCode = WSA_INVALID_PARAMETER; - } - - /* Set error if we had one */ - if (ErrorCode) SetLastError(ErrorCode); - - /* Return the address family and size */ - *AddressFamily = Af; - *AddressSize = AddrSize; - - /* Return success or failure */ - return (ErrorCode == ERROR_SUCCESS); -} - -BOOLEAN -WINAPI -Dns_StringToAddressW(OUT PVOID Address, - IN OUT PULONG AddressSize, - IN LPWSTR AddressName, - IN OUT PDWORD AddressFamily) -{ - /* Call the common API */ - return Dns_StringToAddressEx(Address, - AddressSize, - AddressName, - AddressFamily, - TRUE, - FALSE); -} - -BOOLEAN -WINAPI -Dns_StringToDnsAddrEx(OUT PDNS_ADDRESS DnsAddr, - IN PVOID AddressName, - IN DWORD AddressFamily, - IN BOOLEAN Unicode, - IN BOOLEAN Reverse) -{ - IN6_ADDR Addr; - BOOLEAN Return; - INT ErrorCode = ERROR_SUCCESS; - CHAR AnsiName[INET6_ADDRSTRLEN + sizeof("ip6.arpa.")]; - ULONG Size = sizeof(AnsiName); - - /* First check if this is a reverse address string */ - if ((Reverse) && (Unicode)) - { - /* Convert it right now to ANSI as an optimization */ - Dns_StringCopy(AnsiName, - &Size, - AddressName, - 0, - UnicodeString, - AnsiString); - - /* Use the ANSI Name instead */ - AddressName = AnsiName; - } - - /* - * If the caller doesn't know what the family is, we'll assume IPv4 and - * check if we failed or not. If the caller told us it's IPv4, then just - * do IPv4... - */ - if ((AddressFamily == AF_UNSPEC) || (AddressFamily == AF_INET)) - { - /* Now check if the caller gave us the reverse name or not */ - if (Reverse) - { - /* Get the Address */ - Return = Dns_Ip4ReverseNameToAddress_A((PIN_ADDR)&Addr, AddressName); - } - else - { - /* Check if the caller gave us unicode or not */ - if (Unicode) - { - /* Get the Address */ - Return = Dns_Ip4StringToAddress_W((PIN_ADDR)&Addr, AddressName); - } - else - { - /* Get the Address */ - Return = Dns_Ip4StringToAddress_A((PIN_ADDR)&Addr, AddressName); - } - } - - /* Check if we suceeded */ - if (Return) - { - /* Build the IPv4 Address */ - DnsAddr_BuildFromIp4(DnsAddr, *(PIN_ADDR)&Addr, 0); - - /* So we don't go in the code below... */ - AddressFamily = AF_INET; - } - } - - /* If we are here, either AF_INET6 was specified or IPv4 failed */ - if ((AddressFamily == AF_UNSPEC) || (AddressFamily == AF_INET6)) - { - /* Now check if the caller gave us the reverse name or not */ - if (Reverse) - { - /* Get the Address */ - Return = Dns_Ip6ReverseNameToAddress_A(&Addr, AddressName); - if (Return) - { - /* Build the IPv6 Address */ - DnsAddr_BuildFromIp6(DnsAddr, &Addr, 0, 0); - } - else - { - goto Quickie; - } - } - else - { - /* Check if the caller gave us unicode or not */ - if (Unicode) - { - /* Get the Address */ - if (NT_SUCCESS(RtlIpv6StringToAddressExW(AddressName, - &DnsAddr->Ip6Address.sin6_addr, - &DnsAddr->Ip6Address.sin6_scope_id, - &DnsAddr->Ip6Address.sin6_port))) - Return = TRUE; - else - Return = FALSE; - } - else - { - /* Get the Address */ - if (NT_SUCCESS(RtlIpv6StringToAddressExA(AddressName, - &DnsAddr->Ip6Address.sin6_addr, - &DnsAddr->Ip6Address.sin6_scope_id, - &DnsAddr->Ip6Address.sin6_port))) - Return = TRUE; - else - Return = FALSE; - } - } - - /* Check if we suceeded */ - if (Return) - { - /* Finish setting up the structure */ - DnsAddr->Ip6Address.sin6_family = AF_INET6; - DnsAddr->AddressLength = sizeof(SOCKADDR_IN6); - } - } - else if (AddressFamily != AF_INET) - { - /* You're like.. ATM or something? Get outta here! */ - RtlZeroMemory(DnsAddr, sizeof(DNS_ADDRESS)); - SetLastError(WSA_INVALID_PARAMETER); - } - -Quickie: - /* Return success or failure */ - return (ErrorCode == ERROR_SUCCESS); -} - -BOOLEAN -WINAPI -Dns_ReverseNameToDnsAddr_W(OUT PDNS_ADDRESS DnsAddr, - IN LPWSTR Name) -{ - /* Call the common API */ - return Dns_StringToDnsAddrEx(DnsAddr, - Name, - AF_UNSPEC, - TRUE, - TRUE); -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/straddr.c - * PURPOSE: Functions for address<->string conversion. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -LPWSTR -WINAPI -Dns_Ip6AddressToReverseName_W(OUT LPWSTR Name, - IN IN6_ADDR Address) -{ - /* FIXME */ - return NULL; -} - -LPWSTR -WINAPI -Dns_Ip4AddressToReverseName_W(OUT LPWSTR Name, - IN IN_ADDR Address) -{ - /* Simply append the ARPA string */ - return Name + (wsprintfW(Name, - L"%u.%u.%u.%u.in-addr.arpa.", - Address.S_un.S_addr >> 24, - Address.S_un.S_addr >> 10, - Address.S_un.S_addr >> 8, - Address.S_un.S_addr) * sizeof(WCHAR)); -} - -BOOLEAN -WINAPI -Dns_Ip4ReverseNameToAddress_A(OUT PIN_ADDR Address, - IN LPSTR Name) -{ - /* FIXME */ - return FALSE; -} - -BOOLEAN -WINAPI -Dns_Ip6ReverseNameToAddress_A(OUT PIN6_ADDR Address, - IN LPSTR Name) -{ - /* FIXME */ - return FALSE; -} - -BOOLEAN -WINAPI -Dns_Ip6StringToAddress_A(OUT PIN6_ADDR Address, - IN LPSTR Name) -{ - PCHAR Terminator; - NTSTATUS Status; - - /* Let RTL Do it for us */ - Status = RtlIpv6StringToAddressA(Name, &Terminator, Address); - if (NT_SUCCESS(Status)) return TRUE; - - /* We failed */ - return FALSE; -} - -BOOLEAN -WINAPI -Dns_Ip6StringToAddress_W(OUT PIN6_ADDR Address, - IN LPWSTR Name) -{ - PCHAR Terminator; - NTSTATUS Status; - - /* Let RTL Do it for us */ - Status = RtlIpv6StringToAddressW(Name, &Terminator, Address); - if (NT_SUCCESS(Status)) return TRUE; - - /* We failed */ - return FALSE; -} - -BOOLEAN -WINAPI -Dns_Ip4StringToAddress_A(OUT PIN_ADDR Address, - IN LPSTR Name) -{ - ULONG Addr; - - /* Use inet_addr to convert it... */ - Addr = inet_addr(Name); - if (Addr == -1) - { - /* Check if it's the wildcard (which is ok...) */ - if (strcmp("255.255.255.255", Name)) return FALSE; - } - - /* If we got here, then we suceeded... return the address */ - Address->S_un.S_addr = Addr; - return TRUE; -} - -BOOLEAN -WINAPI -Dns_Ip4StringToAddress_W(OUT PIN_ADDR Address, - IN LPWSTR Name) -{ - CHAR AnsiName[16]; - ULONG Size = sizeof(AnsiName); - INT ErrorCode; - - /* Make a copy of the name in ANSI */ - ErrorCode = Dns_StringCopy(&AnsiName, - &Size, - Name, - 0, - UnicodeString, - AnsiString); - if (ErrorCode) - { - /* Copy made sucesfully, now convert it */ - ErrorCode = Dns_Ip4StringToAddress_A(Address, AnsiName); - } - - /* Return either 0 bytes copied (failure == false) or conversion status */ - return ErrorCode; -} - -BOOLEAN -WINAPI -Dns_Ip4ReverseNameToAddress_W(OUT PIN_ADDR Address, - IN LPWSTR Name) -{ - CHAR AnsiName[32]; - ULONG Size = sizeof(AnsiName); - INT ErrorCode; - - /* Make a copy of the name in ANSI */ - ErrorCode = Dns_StringCopy(&AnsiName, - &Size, - Name, - 0, - UnicodeString, - AnsiString); - if (ErrorCode) - { - /* Copy made sucesfully, now convert it */ - ErrorCode = Dns_Ip4ReverseNameToAddress_A(Address, AnsiName); - } - - /* Return either 0 bytes copied (failure == false) or conversion status */ - return ErrorCode; -} - -BOOLEAN -WINAPI -Dns_StringToAddressEx(OUT PVOID Address, - IN OUT PULONG AddressSize, - IN PVOID AddressName, - IN OUT PDWORD AddressFamily, - IN BOOLEAN Unicode, - IN BOOLEAN Reverse) -{ - DWORD Af = *AddressFamily; - ULONG AddrSize = *AddressSize; - IN6_ADDR Addr; - BOOLEAN Return; - INT ErrorCode; - CHAR AnsiName[INET6_ADDRSTRLEN + sizeof("ip6.arpa.")]; - ULONG Size = sizeof(AnsiName); - - /* First check if this is a reverse address string */ - if (Reverse) - { - /* Convert it right now to ANSI as an optimization */ - Dns_StringCopy(AnsiName, - &Size, - AddressName, - 0, - UnicodeString, - AnsiString); - - /* Use the ANSI Name instead */ - AddressName = AnsiName; - } - - /* - * If the caller doesn't know what the family is, we'll assume IPv4 and - * check if we failed or not. If the caller told us it's IPv4, then just - * do IPv4... - */ - if ((Af == AF_UNSPEC) || (Af == AF_INET)) - { - /* Now check if the caller gave us the reverse name or not */ - if (Reverse) - { - /* Get the Address */ - Return = Dns_Ip4ReverseNameToAddress_A((PIN_ADDR)&Addr, AddressName); - } - else - { - /* Check if the caller gave us unicode or not */ - if (Unicode) - { - /* Get the Address */ - Return = Dns_Ip4StringToAddress_W((PIN_ADDR)&Addr, AddressName); - } - else - { - /* Get the Address */ - Return = Dns_Ip4StringToAddress_A((PIN_ADDR)&Addr, AddressName); - } - } - - /* Check if we suceeded */ - if (Return) - { - /* Save address family */ - Af = AF_INET; - - /* Check if the address size matches */ - if (AddrSize < sizeof(IN_ADDR)) - { - /* Invalid match, set error code */ - ErrorCode = ERROR_MORE_DATA; - } - else - { - /* It matches, save the address! */ - *(PIN_ADDR)Address = *(PIN_ADDR)&Addr; - } - } - } - - /* If we are here, either AF_INET6 was specified or IPv4 failed */ - if ((Af == AF_UNSPEC) || (Af == AF_INET6)) - { - /* Now check if the caller gave us the reverse name or not */ - if (Reverse) - { - /* Get the Address */ - Return = Dns_Ip6ReverseNameToAddress_A(&Addr, AddressName); - } - else - { - /* Check if the caller gave us unicode or not */ - if (Unicode) - { - /* Get the Address */ - Return = Dns_Ip6StringToAddress_W(&Addr, AddressName); - } - else - { - /* Get the Address */ - Return = Dns_Ip6StringToAddress_A(&Addr, AddressName); - } - } - - /* Check if we suceeded */ - if (Return) - { - /* Save address family */ - Af = AF_INET6; - - /* Check if the address size matches */ - if (AddrSize < sizeof(IN6_ADDR)) - { - /* Invalid match, set error code */ - ErrorCode = ERROR_MORE_DATA; - } - else - { - /* It matches, save the address! */ - *(PIN6_ADDR)Address = Addr; - } - } - } - else if (Af != AF_INET) - { - /* You're like.. ATM or something? Get outta here! */ - Af = AF_UNSPEC; - ErrorCode = WSA_INVALID_PARAMETER; - } - - /* Set error if we had one */ - if (ErrorCode) SetLastError(ErrorCode); - - /* Return the address family and size */ - *AddressFamily = Af; - *AddressSize = AddrSize; - - /* Return success or failure */ - return (ErrorCode == ERROR_SUCCESS); -} - -BOOLEAN -WINAPI -Dns_StringToAddressW(OUT PVOID Address, - IN OUT PULONG AddressSize, - IN LPWSTR AddressName, - IN OUT PDWORD AddressFamily) -{ - /* Call the common API */ - return Dns_StringToAddressEx(Address, - AddressSize, - AddressName, - AddressFamily, - TRUE, - FALSE); -} - -BOOLEAN -WINAPI -Dns_StringToDnsAddrEx(OUT PDNS_ADDRESS DnsAddr, - IN PVOID AddressName, - IN DWORD AddressFamily, - IN BOOLEAN Unicode, - IN BOOLEAN Reverse) -{ - IN6_ADDR Addr; - BOOLEAN Return; - INT ErrorCode = ERROR_SUCCESS; - CHAR AnsiName[INET6_ADDRSTRLEN + sizeof("ip6.arpa.")]; - ULONG Size = sizeof(AnsiName); - - /* First check if this is a reverse address string */ - if ((Reverse) && (Unicode)) - { - /* Convert it right now to ANSI as an optimization */ - Dns_StringCopy(AnsiName, - &Size, - AddressName, - 0, - UnicodeString, - AnsiString); - - /* Use the ANSI Name instead */ - AddressName = AnsiName; - } - - /* - * If the caller doesn't know what the family is, we'll assume IPv4 and - * check if we failed or not. If the caller told us it's IPv4, then just - * do IPv4... - */ - if ((AddressFamily == AF_UNSPEC) || (AddressFamily == AF_INET)) - { - /* Now check if the caller gave us the reverse name or not */ - if (Reverse) - { - /* Get the Address */ - Return = Dns_Ip4ReverseNameToAddress_A((PIN_ADDR)&Addr, AddressName); - } - else - { - /* Check if the caller gave us unicode or not */ - if (Unicode) - { - /* Get the Address */ - Return = Dns_Ip4StringToAddress_W((PIN_ADDR)&Addr, AddressName); - } - else - { - /* Get the Address */ - Return = Dns_Ip4StringToAddress_A((PIN_ADDR)&Addr, AddressName); - } - } - - /* Check if we suceeded */ - if (Return) - { - /* Build the IPv4 Address */ - DnsAddr_BuildFromIp4(DnsAddr, *(PIN_ADDR)&Addr, 0); - - /* So we don't go in the code below... */ - AddressFamily = AF_INET; - } - } - - /* If we are here, either AF_INET6 was specified or IPv4 failed */ - if ((AddressFamily == AF_UNSPEC) || (AddressFamily == AF_INET6)) - { - /* Now check if the caller gave us the reverse name or not */ - if (Reverse) - { - /* Get the Address */ - Return = Dns_Ip6ReverseNameToAddress_A(&Addr, AddressName); - if (Return) - { - /* Build the IPv6 Address */ - DnsAddr_BuildFromIp6(DnsAddr, &Addr, 0, 0); - } - else - { - goto Quickie; - } - } - else - { - /* Check if the caller gave us unicode or not */ - if (Unicode) - { - /* Get the Address */ - if (NT_SUCCESS(RtlIpv6StringToAddressExW(AddressName, - &DnsAddr->Ip6Address.sin6_addr, - &DnsAddr->Ip6Address.sin6_scope_id, - &DnsAddr->Ip6Address.sin6_port))) - Return = TRUE; - else - Return = FALSE; - } - else - { - /* Get the Address */ - if (NT_SUCCESS(RtlIpv6StringToAddressExA(AddressName, - &DnsAddr->Ip6Address.sin6_addr, - &DnsAddr->Ip6Address.sin6_scope_id, - &DnsAddr->Ip6Address.sin6_port))) - Return = TRUE; - else - Return = FALSE; - } - } - - /* Check if we suceeded */ - if (Return) - { - /* Finish setting up the structure */ - DnsAddr->Ip6Address.sin6_family = AF_INET6; - DnsAddr->AddressLength = sizeof(SOCKADDR_IN6); - } - } - else if (AddressFamily != AF_INET) - { - /* You're like.. ATM or something? Get outta here! */ - RtlZeroMemory(DnsAddr, sizeof(DNS_ADDRESS)); - SetLastError(WSA_INVALID_PARAMETER); - } - -Quickie: - /* Return success or failure */ - return (ErrorCode == ERROR_SUCCESS); -} - -BOOLEAN -WINAPI -Dns_ReverseNameToDnsAddr_W(OUT PDNS_ADDRESS DnsAddr, - IN LPWSTR Name) -{ - /* Call the common API */ - return Dns_StringToDnsAddrEx(DnsAddr, - Name, - AF_UNSPEC, - TRUE, - TRUE); -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/straddr.c - * PURPOSE: Functions for address<->string conversion. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -LPWSTR -WINAPI -Dns_Ip6AddressToReverseName_W(OUT LPWSTR Name, - IN IN6_ADDR Address) -{ - /* FIXME */ - return NULL; -} - -LPWSTR -WINAPI -Dns_Ip4AddressToReverseName_W(OUT LPWSTR Name, - IN IN_ADDR Address) -{ - /* Simply append the ARPA string */ - return Name + (wsprintfW(Name, - L"%u.%u.%u.%u.in-addr.arpa.", - Address.S_un.S_addr >> 24, - Address.S_un.S_addr >> 10, - Address.S_un.S_addr >> 8, - Address.S_un.S_addr) * sizeof(WCHAR)); -} - -BOOLEAN -WINAPI -Dns_Ip4ReverseNameToAddress_A(OUT PIN_ADDR Address, - IN LPSTR Name) -{ - /* FIXME */ - return FALSE; -} - -BOOLEAN -WINAPI -Dns_Ip6ReverseNameToAddress_A(OUT PIN6_ADDR Address, - IN LPSTR Name) -{ - /* FIXME */ - return FALSE; -} - -BOOLEAN -WINAPI -Dns_Ip6StringToAddress_A(OUT PIN6_ADDR Address, - IN LPSTR Name) -{ - PCHAR Terminator; - NTSTATUS Status; - - /* Let RTL Do it for us */ - Status = RtlIpv6StringToAddressA(Name, &Terminator, Address); - if (NT_SUCCESS(Status)) return TRUE; - - /* We failed */ - return FALSE; -} - -BOOLEAN -WINAPI -Dns_Ip6StringToAddress_W(OUT PIN6_ADDR Address, - IN LPWSTR Name) -{ - PCHAR Terminator; - NTSTATUS Status; - - /* Let RTL Do it for us */ - Status = RtlIpv6StringToAddressW(Name, &Terminator, Address); - if (NT_SUCCESS(Status)) return TRUE; - - /* We failed */ - return FALSE; -} - -BOOLEAN -WINAPI -Dns_Ip4StringToAddress_A(OUT PIN_ADDR Address, - IN LPSTR Name) -{ - ULONG Addr; - - /* Use inet_addr to convert it... */ - Addr = inet_addr(Name); - if (Addr == -1) - { - /* Check if it's the wildcard (which is ok...) */ - if (strcmp("255.255.255.255", Name)) return FALSE; - } - - /* If we got here, then we suceeded... return the address */ - Address->S_un.S_addr = Addr; - return TRUE; -} - -BOOLEAN -WINAPI -Dns_Ip4StringToAddress_W(OUT PIN_ADDR Address, - IN LPWSTR Name) -{ - CHAR AnsiName[16]; - ULONG Size = sizeof(AnsiName); - INT ErrorCode; - - /* Make a copy of the name in ANSI */ - ErrorCode = Dns_StringCopy(&AnsiName, - &Size, - Name, - 0, - UnicodeString, - AnsiString); - if (ErrorCode) - { - /* Copy made sucesfully, now convert it */ - ErrorCode = Dns_Ip4StringToAddress_A(Address, AnsiName); - } - - /* Return either 0 bytes copied (failure == false) or conversion status */ - return ErrorCode; -} - -BOOLEAN -WINAPI -Dns_Ip4ReverseNameToAddress_W(OUT PIN_ADDR Address, - IN LPWSTR Name) -{ - CHAR AnsiName[32]; - ULONG Size = sizeof(AnsiName); - INT ErrorCode; - - /* Make a copy of the name in ANSI */ - ErrorCode = Dns_StringCopy(&AnsiName, - &Size, - Name, - 0, - UnicodeString, - AnsiString); - if (ErrorCode) - { - /* Copy made sucesfully, now convert it */ - ErrorCode = Dns_Ip4ReverseNameToAddress_A(Address, AnsiName); - } - - /* Return either 0 bytes copied (failure == false) or conversion status */ - return ErrorCode; -} - -BOOLEAN -WINAPI -Dns_StringToAddressEx(OUT PVOID Address, - IN OUT PULONG AddressSize, - IN PVOID AddressName, - IN OUT PDWORD AddressFamily, - IN BOOLEAN Unicode, - IN BOOLEAN Reverse) -{ - DWORD Af = *AddressFamily; - ULONG AddrSize = *AddressSize; - IN6_ADDR Addr; - BOOLEAN Return; - INT ErrorCode; - CHAR AnsiName[INET6_ADDRSTRLEN + sizeof("ip6.arpa.")]; - ULONG Size = sizeof(AnsiName); - - /* First check if this is a reverse address string */ - if (Reverse) - { - /* Convert it right now to ANSI as an optimization */ - Dns_StringCopy(AnsiName, - &Size, - AddressName, - 0, - UnicodeString, - AnsiString); - - /* Use the ANSI Name instead */ - AddressName = AnsiName; - } - - /* - * If the caller doesn't know what the family is, we'll assume IPv4 and - * check if we failed or not. If the caller told us it's IPv4, then just - * do IPv4... - */ - if ((Af == AF_UNSPEC) || (Af == AF_INET)) - { - /* Now check if the caller gave us the reverse name or not */ - if (Reverse) - { - /* Get the Address */ - Return = Dns_Ip4ReverseNameToAddress_A((PIN_ADDR)&Addr, AddressName); - } - else - { - /* Check if the caller gave us unicode or not */ - if (Unicode) - { - /* Get the Address */ - Return = Dns_Ip4StringToAddress_W((PIN_ADDR)&Addr, AddressName); - } - else - { - /* Get the Address */ - Return = Dns_Ip4StringToAddress_A((PIN_ADDR)&Addr, AddressName); - } - } - - /* Check if we suceeded */ - if (Return) - { - /* Save address family */ - Af = AF_INET; - - /* Check if the address size matches */ - if (AddrSize < sizeof(IN_ADDR)) - { - /* Invalid match, set error code */ - ErrorCode = ERROR_MORE_DATA; - } - else - { - /* It matches, save the address! */ - *(PIN_ADDR)Address = *(PIN_ADDR)&Addr; - } - } - } - - /* If we are here, either AF_INET6 was specified or IPv4 failed */ - if ((Af == AF_UNSPEC) || (Af == AF_INET6)) - { - /* Now check if the caller gave us the reverse name or not */ - if (Reverse) - { - /* Get the Address */ - Return = Dns_Ip6ReverseNameToAddress_A(&Addr, AddressName); - } - else - { - /* Check if the caller gave us unicode or not */ - if (Unicode) - { - /* Get the Address */ - Return = Dns_Ip6StringToAddress_W(&Addr, AddressName); - } - else - { - /* Get the Address */ - Return = Dns_Ip6StringToAddress_A(&Addr, AddressName); - } - } - - /* Check if we suceeded */ - if (Return) - { - /* Save address family */ - Af = AF_INET6; - - /* Check if the address size matches */ - if (AddrSize < sizeof(IN6_ADDR)) - { - /* Invalid match, set error code */ - ErrorCode = ERROR_MORE_DATA; - } - else - { - /* It matches, save the address! */ - *(PIN6_ADDR)Address = Addr; - } - } - } - else if (Af != AF_INET) - { - /* You're like.. ATM or something? Get outta here! */ - Af = AF_UNSPEC; - ErrorCode = WSA_INVALID_PARAMETER; - } - - /* Set error if we had one */ - if (ErrorCode) SetLastError(ErrorCode); - - /* Return the address family and size */ - *AddressFamily = Af; - *AddressSize = AddrSize; - - /* Return success or failure */ - return (ErrorCode == ERROR_SUCCESS); -} - -BOOLEAN -WINAPI -Dns_StringToAddressW(OUT PVOID Address, - IN OUT PULONG AddressSize, - IN LPWSTR AddressName, - IN OUT PDWORD AddressFamily) -{ - /* Call the common API */ - return Dns_StringToAddressEx(Address, - AddressSize, - AddressName, - AddressFamily, - TRUE, - FALSE); -} - -BOOLEAN -WINAPI -Dns_StringToDnsAddrEx(OUT PDNS_ADDRESS DnsAddr, - IN PVOID AddressName, - IN DWORD AddressFamily, - IN BOOLEAN Unicode, - IN BOOLEAN Reverse) -{ - IN6_ADDR Addr; - BOOLEAN Return; - INT ErrorCode = ERROR_SUCCESS; - CHAR AnsiName[INET6_ADDRSTRLEN + sizeof("ip6.arpa.")]; - ULONG Size = sizeof(AnsiName); - - /* First check if this is a reverse address string */ - if ((Reverse) && (Unicode)) - { - /* Convert it right now to ANSI as an optimization */ - Dns_StringCopy(AnsiName, - &Size, - AddressName, - 0, - UnicodeString, - AnsiString); - - /* Use the ANSI Name instead */ - AddressName = AnsiName; - } - - /* - * If the caller doesn't know what the family is, we'll assume IPv4 and - * check if we failed or not. If the caller told us it's IPv4, then just - * do IPv4... - */ - if ((AddressFamily == AF_UNSPEC) || (AddressFamily == AF_INET)) - { - /* Now check if the caller gave us the reverse name or not */ - if (Reverse) - { - /* Get the Address */ - Return = Dns_Ip4ReverseNameToAddress_A((PIN_ADDR)&Addr, AddressName); - } - else - { - /* Check if the caller gave us unicode or not */ - if (Unicode) - { - /* Get the Address */ - Return = Dns_Ip4StringToAddress_W((PIN_ADDR)&Addr, AddressName); - } - else - { - /* Get the Address */ - Return = Dns_Ip4StringToAddress_A((PIN_ADDR)&Addr, AddressName); - } - } - - /* Check if we suceeded */ - if (Return) - { - /* Build the IPv4 Address */ - DnsAddr_BuildFromIp4(DnsAddr, *(PIN_ADDR)&Addr, 0); - - /* So we don't go in the code below... */ - AddressFamily = AF_INET; - } - } - - /* If we are here, either AF_INET6 was specified or IPv4 failed */ - if ((AddressFamily == AF_UNSPEC) || (AddressFamily == AF_INET6)) - { - /* Now check if the caller gave us the reverse name or not */ - if (Reverse) - { - /* Get the Address */ - Return = Dns_Ip6ReverseNameToAddress_A(&Addr, AddressName); - if (Return) - { - /* Build the IPv6 Address */ - DnsAddr_BuildFromIp6(DnsAddr, &Addr, 0, 0); - } - else - { - goto Quickie; - } - } - else - { - /* Check if the caller gave us unicode or not */ - if (Unicode) - { - /* Get the Address */ - if (NT_SUCCESS(RtlIpv6StringToAddressExW(AddressName, - &DnsAddr->Ip6Address.sin6_addr, - &DnsAddr->Ip6Address.sin6_scope_id, - &DnsAddr->Ip6Address.sin6_port))) - Return = TRUE; - else - Return = FALSE; - } - else - { - /* Get the Address */ - if (NT_SUCCESS(RtlIpv6StringToAddressExA(AddressName, - &DnsAddr->Ip6Address.sin6_addr, - &DnsAddr->Ip6Address.sin6_scope_id, - &DnsAddr->Ip6Address.sin6_port))) - Return = TRUE; - else - Return = FALSE; - } - } - - /* Check if we suceeded */ - if (Return) - { - /* Finish setting up the structure */ - DnsAddr->Ip6Address.sin6_family = AF_INET6; - DnsAddr->AddressLength = sizeof(SOCKADDR_IN6); - } - } - else if (AddressFamily != AF_INET) - { - /* You're like.. ATM or something? Get outta here! */ - RtlZeroMemory(DnsAddr, sizeof(DNS_ADDRESS)); - SetLastError(WSA_INVALID_PARAMETER); - } - -Quickie: - /* Return success or failure */ - return (ErrorCode == ERROR_SUCCESS); -} - -BOOLEAN -WINAPI -Dns_ReverseNameToDnsAddr_W(OUT PDNS_ADDRESS DnsAddr, - IN LPWSTR Name) -{ - /* Call the common API */ - return Dns_StringToDnsAddrEx(DnsAddr, - Name, - AF_UNSPEC, - TRUE, - TRUE); -} - diff --git a/dll/win32/mswsock/dns/string.c b/dll/win32/mswsock/dns/string.c index d15e4e0d443..e5ec0cfa935 100644 --- a/dll/win32/mswsock/dns/string.c +++ b/dll/win32/mswsock/dns/string.c @@ -255,774 +255,3 @@ Dns_GetBufferLengthForStringCopy(IN PVOID String, return OutputSize; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/string.c - * PURPOSE: functions for string manipulation and conversion. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -ULONG -WINAPI -Dns_StringCopy(OUT PVOID Destination, - IN OUT PULONG DestinationSize, - IN PVOID String, - IN ULONG StringSize OPTIONAL, - IN DWORD InputType, - IN DWORD OutputType) -{ - ULONG DestSize; - ULONG OutputSize = 0; - - /* Check if the caller already gave us the string size */ - if (!StringSize) - { - /* He didn't, get the input type */ - if (InputType == UnicodeString) - { - /* Unicode string, calculate the size */ - StringSize = (ULONG)wcslen((LPWSTR)String); - } - else - { - /* ANSI or UTF-8 sting, get the size */ - StringSize = (ULONG)strlen((LPSTR)String); - } - } - - /* Check if we have a limit on the desination size */ - if (DestinationSize) - { - /* Make sure that we can respect it */ - DestSize = Dns_GetBufferLengthForStringCopy(String, - StringSize, - InputType, - OutputType); - if (*DestinationSize < DestSize) - { - /* Fail due to missing buffer space */ - SetLastError(ERROR_MORE_DATA); - - /* Return how much data we actually need */ - *DestinationSize = DestSize; - return 0; - } - else if (!DestSize) - { - /* Fail due to invalid data */ - SetLastError(ERROR_INVALID_DATA); - return 0; - } - - /* Return how much data we actually need */ - *DestinationSize = DestSize; - } - - /* Now check if this is a Unicode String as input */ - if (InputType == UnicodeString) - { - /* Check if the output is ANSI */ - if (OutputType == AnsiString) - { - /* Convert and return the final desination size */ - OutputSize = WideCharToMultiByte(CP_ACP, - 0, - String, - StringSize, - Destination, - -1, - NULL, - NULL) + 1; - } - else if (OutputType == UnicodeString) - { - /* Copy the string */ - StringSize = StringSize * sizeof(WCHAR); - RtlMoveMemory(Destination, String, StringSize); - - /* Return output length */ - OutputSize = StringSize + 2; - } - else if (OutputType == Utf8String) - { - /* FIXME */ - OutputSize = 0; - } - } - else if (InputType == AnsiString) - { - /* It's ANSI, is the output ansi too? */ - if (OutputType == AnsiString) - { - /* Copy the string */ - RtlMoveMemory(Destination, String, StringSize); - - /* Return output length */ - OutputSize = StringSize + 1; - } - else if (OutputType == UnicodeString) - { - /* Convert to Unicode and return size */ - OutputSize = MultiByteToWideChar(CP_ACP, - 0, - String, - StringSize, - Destination, - -1) * sizeof(WCHAR) + 2; - } - else if (OutputType == Utf8String) - { - /* FIXME */ - OutputSize = 0; - } - } - else if (InputType == Utf8String) - { - /* FIXME */ - OutputSize = 0; - } - - /* Return the output size */ - return OutputSize; -} - -LPWSTR -WINAPI -Dns_CreateStringCopy_W(IN LPWSTR Name) -{ - SIZE_T StringLength; - LPWSTR NameCopy; - - /* Make sure that we have a name */ - if (!Name) - { - /* Fail */ - SetLastError(ERROR_INVALID_PARAMETER); - return NULL; - } - - /* Find out the size of the string */ - StringLength = (wcslen(Name) + 1) * sizeof(WCHAR); - - /* Allocate space for the copy */ - NameCopy = Dns_AllocZero(StringLength); - if (NameCopy) - { - /* Copy it */ - RtlCopyMemory(NameCopy, Name, StringLength); - } - else - { - /* Fail */ - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - } - - /* Return the copy */ - return NameCopy; -} - -ULONG -WINAPI -Dns_GetBufferLengthForStringCopy(IN PVOID String, - IN ULONG Size OPTIONAL, - IN DWORD InputType, - IN DWORD OutputType) -{ - ULONG OutputSize = 0; - - /* Check what kind of string this is */ - if (InputType == UnicodeString) - { - /* Check if we have a size */ - if (!Size) - { - /* Get it ourselves */ - Size = (ULONG)wcslen(String); - } - - /* Check the output type */ - if (OutputType == UnicodeString) - { - /* Convert the size to bytes */ - OutputSize = (Size + 1) * sizeof(WCHAR); - } - else if (OutputType == Utf8String) - { - /* FIXME */ - OutputSize = 0; - } - else - { - /* Find out how much it will be in ANSI bytes */ - OutputSize = WideCharToMultiByte(CP_ACP, - 0, - String, - Size, - NULL, - 0, - NULL, - NULL) + 1; - } - } - else if (InputType == AnsiString) - { - /* Check if we have a size */ - if (!Size) - { - /* Get it ourselves */ - Size = (ULONG)strlen(String); - } - - /* Check the output type */ - if (OutputType == AnsiString) - { - /* Just add a byte for the null char */ - OutputSize = Size + 1; - } - else if (OutputType == UnicodeString) - { - /* Calculate the bytes for a Unicode string */ - OutputSize = (MultiByteToWideChar(CP_ACP, - 0, - String, - Size, - NULL, - 0) + 1) * sizeof(WCHAR); - } - else if (OutputType == Utf8String) - { - /* FIXME */ - OutputSize = 0; - } - } - else if (InputType == Utf8String) - { - /* FIXME */ - OutputSize = 0; - } - - /* Return the size required */ - return OutputSize; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/string.c - * PURPOSE: functions for string manipulation and conversion. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -ULONG -WINAPI -Dns_StringCopy(OUT PVOID Destination, - IN OUT PULONG DestinationSize, - IN PVOID String, - IN ULONG StringSize OPTIONAL, - IN DWORD InputType, - IN DWORD OutputType) -{ - ULONG DestSize; - ULONG OutputSize = 0; - - /* Check if the caller already gave us the string size */ - if (!StringSize) - { - /* He didn't, get the input type */ - if (InputType == UnicodeString) - { - /* Unicode string, calculate the size */ - StringSize = (ULONG)wcslen((LPWSTR)String); - } - else - { - /* ANSI or UTF-8 sting, get the size */ - StringSize = (ULONG)strlen((LPSTR)String); - } - } - - /* Check if we have a limit on the desination size */ - if (DestinationSize) - { - /* Make sure that we can respect it */ - DestSize = Dns_GetBufferLengthForStringCopy(String, - StringSize, - InputType, - OutputType); - if (*DestinationSize < DestSize) - { - /* Fail due to missing buffer space */ - SetLastError(ERROR_MORE_DATA); - - /* Return how much data we actually need */ - *DestinationSize = DestSize; - return 0; - } - else if (!DestSize) - { - /* Fail due to invalid data */ - SetLastError(ERROR_INVALID_DATA); - return 0; - } - - /* Return how much data we actually need */ - *DestinationSize = DestSize; - } - - /* Now check if this is a Unicode String as input */ - if (InputType == UnicodeString) - { - /* Check if the output is ANSI */ - if (OutputType == AnsiString) - { - /* Convert and return the final desination size */ - OutputSize = WideCharToMultiByte(CP_ACP, - 0, - String, - StringSize, - Destination, - -1, - NULL, - NULL) + 1; - } - else if (OutputType == UnicodeString) - { - /* Copy the string */ - StringSize = StringSize * sizeof(WCHAR); - RtlMoveMemory(Destination, String, StringSize); - - /* Return output length */ - OutputSize = StringSize + 2; - } - else if (OutputType == Utf8String) - { - /* FIXME */ - OutputSize = 0; - } - } - else if (InputType == AnsiString) - { - /* It's ANSI, is the output ansi too? */ - if (OutputType == AnsiString) - { - /* Copy the string */ - RtlMoveMemory(Destination, String, StringSize); - - /* Return output length */ - OutputSize = StringSize + 1; - } - else if (OutputType == UnicodeString) - { - /* Convert to Unicode and return size */ - OutputSize = MultiByteToWideChar(CP_ACP, - 0, - String, - StringSize, - Destination, - -1) * sizeof(WCHAR) + 2; - } - else if (OutputType == Utf8String) - { - /* FIXME */ - OutputSize = 0; - } - } - else if (InputType == Utf8String) - { - /* FIXME */ - OutputSize = 0; - } - - /* Return the output size */ - return OutputSize; -} - -LPWSTR -WINAPI -Dns_CreateStringCopy_W(IN LPWSTR Name) -{ - SIZE_T StringLength; - LPWSTR NameCopy; - - /* Make sure that we have a name */ - if (!Name) - { - /* Fail */ - SetLastError(ERROR_INVALID_PARAMETER); - return NULL; - } - - /* Find out the size of the string */ - StringLength = (wcslen(Name) + 1) * sizeof(WCHAR); - - /* Allocate space for the copy */ - NameCopy = Dns_AllocZero(StringLength); - if (NameCopy) - { - /* Copy it */ - RtlCopyMemory(NameCopy, Name, StringLength); - } - else - { - /* Fail */ - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - } - - /* Return the copy */ - return NameCopy; -} - -ULONG -WINAPI -Dns_GetBufferLengthForStringCopy(IN PVOID String, - IN ULONG Size OPTIONAL, - IN DWORD InputType, - IN DWORD OutputType) -{ - ULONG OutputSize = 0; - - /* Check what kind of string this is */ - if (InputType == UnicodeString) - { - /* Check if we have a size */ - if (!Size) - { - /* Get it ourselves */ - Size = (ULONG)wcslen(String); - } - - /* Check the output type */ - if (OutputType == UnicodeString) - { - /* Convert the size to bytes */ - OutputSize = (Size + 1) * sizeof(WCHAR); - } - else if (OutputType == Utf8String) - { - /* FIXME */ - OutputSize = 0; - } - else - { - /* Find out how much it will be in ANSI bytes */ - OutputSize = WideCharToMultiByte(CP_ACP, - 0, - String, - Size, - NULL, - 0, - NULL, - NULL) + 1; - } - } - else if (InputType == AnsiString) - { - /* Check if we have a size */ - if (!Size) - { - /* Get it ourselves */ - Size = (ULONG)strlen(String); - } - - /* Check the output type */ - if (OutputType == AnsiString) - { - /* Just add a byte for the null char */ - OutputSize = Size + 1; - } - else if (OutputType == UnicodeString) - { - /* Calculate the bytes for a Unicode string */ - OutputSize = (MultiByteToWideChar(CP_ACP, - 0, - String, - Size, - NULL, - 0) + 1) * sizeof(WCHAR); - } - else if (OutputType == Utf8String) - { - /* FIXME */ - OutputSize = 0; - } - } - else if (InputType == Utf8String) - { - /* FIXME */ - OutputSize = 0; - } - - /* Return the size required */ - return OutputSize; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/string.c - * PURPOSE: functions for string manipulation and conversion. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -ULONG -WINAPI -Dns_StringCopy(OUT PVOID Destination, - IN OUT PULONG DestinationSize, - IN PVOID String, - IN ULONG StringSize OPTIONAL, - IN DWORD InputType, - IN DWORD OutputType) -{ - ULONG DestSize; - ULONG OutputSize = 0; - - /* Check if the caller already gave us the string size */ - if (!StringSize) - { - /* He didn't, get the input type */ - if (InputType == UnicodeString) - { - /* Unicode string, calculate the size */ - StringSize = (ULONG)wcslen((LPWSTR)String); - } - else - { - /* ANSI or UTF-8 sting, get the size */ - StringSize = (ULONG)strlen((LPSTR)String); - } - } - - /* Check if we have a limit on the desination size */ - if (DestinationSize) - { - /* Make sure that we can respect it */ - DestSize = Dns_GetBufferLengthForStringCopy(String, - StringSize, - InputType, - OutputType); - if (*DestinationSize < DestSize) - { - /* Fail due to missing buffer space */ - SetLastError(ERROR_MORE_DATA); - - /* Return how much data we actually need */ - *DestinationSize = DestSize; - return 0; - } - else if (!DestSize) - { - /* Fail due to invalid data */ - SetLastError(ERROR_INVALID_DATA); - return 0; - } - - /* Return how much data we actually need */ - *DestinationSize = DestSize; - } - - /* Now check if this is a Unicode String as input */ - if (InputType == UnicodeString) - { - /* Check if the output is ANSI */ - if (OutputType == AnsiString) - { - /* Convert and return the final desination size */ - OutputSize = WideCharToMultiByte(CP_ACP, - 0, - String, - StringSize, - Destination, - -1, - NULL, - NULL) + 1; - } - else if (OutputType == UnicodeString) - { - /* Copy the string */ - StringSize = StringSize * sizeof(WCHAR); - RtlMoveMemory(Destination, String, StringSize); - - /* Return output length */ - OutputSize = StringSize + 2; - } - else if (OutputType == Utf8String) - { - /* FIXME */ - OutputSize = 0; - } - } - else if (InputType == AnsiString) - { - /* It's ANSI, is the output ansi too? */ - if (OutputType == AnsiString) - { - /* Copy the string */ - RtlMoveMemory(Destination, String, StringSize); - - /* Return output length */ - OutputSize = StringSize + 1; - } - else if (OutputType == UnicodeString) - { - /* Convert to Unicode and return size */ - OutputSize = MultiByteToWideChar(CP_ACP, - 0, - String, - StringSize, - Destination, - -1) * sizeof(WCHAR) + 2; - } - else if (OutputType == Utf8String) - { - /* FIXME */ - OutputSize = 0; - } - } - else if (InputType == Utf8String) - { - /* FIXME */ - OutputSize = 0; - } - - /* Return the output size */ - return OutputSize; -} - -LPWSTR -WINAPI -Dns_CreateStringCopy_W(IN LPWSTR Name) -{ - SIZE_T StringLength; - LPWSTR NameCopy; - - /* Make sure that we have a name */ - if (!Name) - { - /* Fail */ - SetLastError(ERROR_INVALID_PARAMETER); - return NULL; - } - - /* Find out the size of the string */ - StringLength = (wcslen(Name) + 1) * sizeof(WCHAR); - - /* Allocate space for the copy */ - NameCopy = Dns_AllocZero(StringLength); - if (NameCopy) - { - /* Copy it */ - RtlCopyMemory(NameCopy, Name, StringLength); - } - else - { - /* Fail */ - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - } - - /* Return the copy */ - return NameCopy; -} - -ULONG -WINAPI -Dns_GetBufferLengthForStringCopy(IN PVOID String, - IN ULONG Size OPTIONAL, - IN DWORD InputType, - IN DWORD OutputType) -{ - ULONG OutputSize = 0; - - /* Check what kind of string this is */ - if (InputType == UnicodeString) - { - /* Check if we have a size */ - if (!Size) - { - /* Get it ourselves */ - Size = (ULONG)wcslen(String); - } - - /* Check the output type */ - if (OutputType == UnicodeString) - { - /* Convert the size to bytes */ - OutputSize = (Size + 1) * sizeof(WCHAR); - } - else if (OutputType == Utf8String) - { - /* FIXME */ - OutputSize = 0; - } - else - { - /* Find out how much it will be in ANSI bytes */ - OutputSize = WideCharToMultiByte(CP_ACP, - 0, - String, - Size, - NULL, - 0, - NULL, - NULL) + 1; - } - } - else if (InputType == AnsiString) - { - /* Check if we have a size */ - if (!Size) - { - /* Get it ourselves */ - Size = (ULONG)strlen(String); - } - - /* Check the output type */ - if (OutputType == AnsiString) - { - /* Just add a byte for the null char */ - OutputSize = Size + 1; - } - else if (OutputType == UnicodeString) - { - /* Calculate the bytes for a Unicode string */ - OutputSize = (MultiByteToWideChar(CP_ACP, - 0, - String, - Size, - NULL, - 0) + 1) * sizeof(WCHAR); - } - else if (OutputType == Utf8String) - { - /* FIXME */ - OutputSize = 0; - } - } - else if (InputType == Utf8String) - { - /* FIXME */ - OutputSize = 0; - } - - /* Return the size required */ - return OutputSize; -} - diff --git a/dll/win32/mswsock/dns/table.c b/dll/win32/mswsock/dns/table.c index 7660cae281c..266c81b7296 100644 --- a/dll/win32/mswsock/dns/table.c +++ b/dll/win32/mswsock/dns/table.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/table.c - * PURPOSE: Functions for doing Table lookups, such as LUP Flags. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/table.c - * PURPOSE: Functions for doing Table lookups, such as LUP Flags. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/table.c - * PURPOSE: Functions for doing Table lookups, such as LUP Flags. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/dns/utf8.c b/dll/win32/mswsock/dns/utf8.c index 55d218bfede..1cb6aa8bd59 100644 --- a/dll/win32/mswsock/dns/utf8.c +++ b/dll/win32/mswsock/dns/utf8.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/utf8.c - * PURPOSE: Functions for doing UTF8 string conversion and manipulation. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/utf8.c - * PURPOSE: Functions for doing UTF8 string conversion and manipulation. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS DNS Shared Library - * FILE: lib/dnslib/utf8.c - * PURPOSE: Functions for doing UTF8 string conversion and manipulation. - */ - -/* INCLUDES ******************************************************************/ -#include "precomp.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/msafd/accept.c b/dll/win32/mswsock/msafd/accept.c index 83789067c92..a8644530f5d 100644 --- a/dll/win32/mswsock/msafd/accept.c +++ b/dll/win32/mswsock/msafd/accept.c @@ -973,2928 +973,3 @@ error: return AcceptedHandle; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -SockCoreAccept(IN PSOCKET_INFORMATION Socket, - IN PSOCKET_INFORMATION AcceptedSocket) -{ - INT ErrorCode, ReturnValue; - BOOLEAN BlockMode = Socket->SharedData.NonBlocking; - BOOLEAN Oob = Socket->SharedData.OobInline; - INT HelperContextSize; - PVOID HelperContext = NULL; - HWND hWnd = 0; - UINT wMsg = 0; - HANDLE EventObject = NULL; - ULONG AsyncEvents = 0, NetworkEvents = 0; - CHAR HelperBuffer[256]; - - /* Set the new state */ - AcceptedSocket->SharedData.State = SocketConnected; - - /* Copy some of the settings */ - AcceptedSocket->SharedData.LingerData = Socket->SharedData.LingerData; - AcceptedSocket->SharedData.SizeOfRecvBuffer = Socket->SharedData.SizeOfRecvBuffer; - AcceptedSocket->SharedData.SizeOfSendBuffer = Socket->SharedData.SizeOfSendBuffer; - AcceptedSocket->SharedData.Broadcast = Socket->SharedData.Broadcast; - AcceptedSocket->SharedData.Debug = Socket->SharedData.Debug; - AcceptedSocket->SharedData.OobInline = Socket->SharedData.OobInline; - AcceptedSocket->SharedData.ReuseAddresses = Socket->SharedData.ReuseAddresses; - AcceptedSocket->SharedData.SendTimeout = Socket->SharedData.SendTimeout; - AcceptedSocket->SharedData.RecvTimeout = Socket->SharedData.RecvTimeout; - - /* Check if the old socket had async select */ - if (Socket->SharedData.AsyncEvents) - { - /* Copy the data while we're still under the lock */ - AsyncEvents = Socket->SharedData.AsyncEvents; - hWnd = Socket->SharedData.hWnd; - wMsg = Socket->SharedData.wMsg; - } - else if (Socket->NetworkEvents) - { - /* Copy the data while we're still under the lock */ - NetworkEvents = Socket->NetworkEvents; - EventObject = Socket->EventObject; - } - - /* Check how much space is needed for the context */ - ReturnValue = Socket->HelperData->WSHGetSocketInformation(Socket->HelperContext, - Socket->Handle, - Socket->TdiAddressHandle, - Socket->TdiConnectionHandle, - SOL_INTERNAL, - SO_CONTEXT, - NULL, - &HelperContextSize); - if (ReturnValue == NO_ERROR) - { - /* Check if our stack buffer is large enough to hold it */ - if (HelperContextSize <= sizeof(HelperBuffer)) - { - /* Use it */ - HelperContext = (PVOID)HelperBuffer; - } - else - { - /* Allocate from the heap instead */ - HelperContext = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - HelperContextSize); - if (!HelperContext) - { - /* Unlock the socket and fail */ - LeaveCriticalSection(&Socket->Lock); - return WSAENOBUFS; - } - } - - /* Get the context */ - ReturnValue = Socket->HelperData->WSHGetSocketInformation(Socket->HelperContext, - Socket->Handle, - Socket->TdiAddressHandle, - Socket->TdiConnectionHandle, - SOL_INTERNAL, - SO_CONTEXT, - HelperContext, - &HelperContextSize); - } - - /* We're done with the old socket, so we can release the lock */ - LeaveCriticalSection(&Socket->Lock); - - /* Get the TDI Handles for the new socket */ - ErrorCode = SockGetTdiHandles(AcceptedSocket); - - /* Check if we have the handles and the context */ - if ((ErrorCode == NO_ERROR) && (ReturnValue == NO_ERROR)) - { - /* Set the context */ - AcceptedSocket->HelperData->WSHGetSocketInformation(AcceptedSocket->HelperContext, - AcceptedSocket->Handle, - AcceptedSocket->TdiAddressHandle, - AcceptedSocket->TdiConnectionHandle, - SOL_INTERNAL, - SO_CONTEXT, - HelperContext, - &HelperContextSize); - } - - /* Check if we should free from heap */ - if (HelperContext && (HelperContext != (PVOID)HelperBuffer)) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, HelperContext); - } - - /* Check if the old socket was non-blocking */ - if (BlockMode) - { - /* Set the new one like that too */ - ErrorCode = SockSetInformation(AcceptedSocket, - AFD_INFO_BLOCKING_MODE, - &BlockMode, - NULL, - NULL); - if (ErrorCode != NO_ERROR) return ErrorCode; - } - - /* Set it internally as well */ - AcceptedSocket->SharedData.NonBlocking = Socket->SharedData.NonBlocking; - - /* Check if inlined OOB was enabled */ - if (Oob) - { - /* Set the new one like that too */ - ErrorCode = SockSetInformation(AcceptedSocket, - AFD_INFO_INLINING_MODE, - &Oob, - NULL, - NULL); - if (ErrorCode != NO_ERROR) return ErrorCode; - } - - /* Set it internally as well */ - AcceptedSocket->SharedData.OobInline = Socket->SharedData.OobInline; - - /* Update the Window Sizes */ - ErrorCode = SockUpdateWindowSizes(AcceptedSocket, FALSE); - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Check if async select was enabled */ - if (AsyncEvents) - { - /* Call WSPAsyncSelect on the accepted socket too */ - ErrorCode = SockAsyncSelectHelper(AcceptedSocket, - hWnd, - wMsg, - AsyncEvents); - } - else if (NetworkEvents) - { - /* WSPEventSelect was enabled instead, call it on the new socket */ - ErrorCode = SockEventSelectHelper(AcceptedSocket, - EventObject, - NetworkEvents); - } - - /* Check for failure */ - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Set the new context in AFD */ - ErrorCode = SockSetHandleContext(AcceptedSocket); - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Return success*/ - return NO_ERROR; -} - -SOCKET -WSPAPI -WSPAccept(SOCKET Handle, - SOCKADDR FAR * SocketAddress, - LPINT SocketAddressLength, - LPCONDITIONPROC lpfnCondition, - DWORD_PTR dwCallbackData, - LPINT lpErrno) -{ - INT ErrorCode, ReturnValue; - PSOCKET_INFORMATION Socket, AcceptedSocket = NULL; - PWINSOCK_TEB_DATA ThreadData; - CHAR AfdAcceptBuffer[32]; - PAFD_RECEIVED_ACCEPT_DATA ReceivedAcceptData = NULL; - ULONG ReceiveBufferSize; - FD_SET ReadFds; - TIMEVAL Timeout; - NTSTATUS Status; - IO_STATUS_BLOCK IoStatusBlock; - ULONG AddressBufferSize; - CHAR AddressBuffer[sizeof(SOCKADDR)]; - PVOID SockAddress; - ULONG ConnectDataSize; - PVOID ConnectData = NULL; - AFD_PENDING_ACCEPT_DATA PendingAcceptData; - INT AddressSize; - PVOID CalleeDataBuffer = NULL; - WSABUF CallerId, CalleeId, CallerData, CalleeData; - GROUP GroupId; - LPQOS Qos = NULL, GroupQos = NULL; - BOOLEAN ValidGroup = TRUE; - AFD_DEFER_ACCEPT_DATA DeferData; - ULONG BytesReturned; - SOCKET AcceptedHandle = INVALID_SOCKET; - AFD_ACCEPT_DATA AcceptData; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Invalid for datagram sockets */ - if (MSAFD_IS_DGRAM_SOCK(Socket)) - { - /* Fail */ - ErrorCode = WSAEOPNOTSUPP; - goto error; - } - - /* Only valid if the socket is listening */ - if (!Socket->SharedData.Listening) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Validate address length */ - if (SocketAddressLength && - (Socket->HelperData->MinWSAddressLength > *SocketAddressLength)) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Calculate how much space we'll need for the Receive Buffer */ - ReceiveBufferSize = sizeof(AFD_RECEIVED_ACCEPT_DATA) + - sizeof(TRANSPORT_ADDRESS) + - Socket->HelperData->MaxTDIAddressLength; - - /* Check if our stack buffer is large enough */ - if (ReceiveBufferSize <= sizeof(AfdAcceptBuffer)) - { - /* Use the stack */ - ReceivedAcceptData = (PVOID)AfdAcceptBuffer; - } - else - { - /* Allocate from heap */ - ReceivedAcceptData = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - ReceiveBufferSize); - if (!ReceivedAcceptData) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - } - - /* If this is non-blocking, make sure there's something for us to accept */ - if (Socket->SharedData.NonBlocking) - { - /* Set up a nonblocking select */ - FD_ZERO(&ReadFds); - FD_SET(Handle, &ReadFds); - Timeout.tv_sec = 0; - Timeout.tv_usec = 0; - - /* See if there's any data */ - ReturnValue = WSPSelect(1, - &ReadFds, - NULL, - NULL, - &Timeout, - lpErrno); - if (ReturnValue == SOCKET_ERROR) - { - /* Fail */ - ErrorCode = *lpErrno; - goto error; - } - - /* Make sure we got a read back */ - if (!FD_ISSET(Handle, &ReadFds)) - { - /* Fail */ - ErrorCode = WSAEWOULDBLOCK; - goto error; - } - } - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_WAIT_FOR_LISTEN, - NULL, - 0, - ReceivedAcceptData, - ReceiveBufferSize); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion outside the lock */ - LeaveCriticalSection(&Socket->Lock); - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - MAYBE_BLOCKING_HOOK, - NO_TIMEOUT); - EnterCriticalSection(&Socket->Lock); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Check if we got a condition callback */ - if (lpfnCondition) - { - /* Find out how much space we'll need for the address */ - AddressBufferSize = Socket->HelperData->MaxWSAddressLength; - - /* Check if our local buffer is enough */ - if (AddressBufferSize <= sizeof(AddressBuffer)) - { - /* It is, use the stack */ - SockAddress = (PVOID)AddressBuffer; - } - else - { - /* Allocate from heap */ - SockAddress = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - AddressBufferSize); - if (!SockAddress) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - } - - /* Assume no connect data */ - ConnectDataSize = 0; - - /* Make sure we support connect data */ - if ((Socket->SharedData.ServiceFlags1 & XP1_CONNECT_DATA)) - { - /* Find out how much data is pending */ - PendingAcceptData.SequenceNumber = ReceivedAcceptData->SequenceNumber; - PendingAcceptData.ReturnSize = TRUE; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_GET_PENDING_CONNECT_DATA, - &PendingAcceptData, - sizeof(PendingAcceptData), - &PendingAcceptData, - sizeof(PendingAcceptData)); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* How much data to allocate */ - ConnectDataSize = PtrToUlong(IoStatusBlock.Information); - if (ConnectDataSize) - { - /* Allocate needed space */ - ConnectData = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - ConnectDataSize); - if (!ConnectData) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - - /* Setup the structure to actually get the data now */ - PendingAcceptData.SequenceNumber = ReceivedAcceptData->SequenceNumber; - PendingAcceptData.ReturnSize = FALSE; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_GET_PENDING_CONNECT_DATA, - &PendingAcceptData, - sizeof(PendingAcceptData), - ConnectData, - ConnectDataSize); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - } - } - - if ((Socket->SharedData.ServiceFlags1 & XP1_QOS_SUPPORTED)) - { - /* Set the accept data */ - AcceptData.SequenceNumber = ReceivedAcceptData->SequenceNumber; - AcceptData.ListenHandle = Socket->WshContext.Handle; - - /* Save it in the TEB */ - ThreadData->AcceptData = &AcceptData; - - /* Send the IOCTL to get QOS Size */ - BytesReturned = 0; - ReturnValue = WSPIoctl(Handle, - SIO_GET_QOS, - NULL, - 0, - NULL, - 0, - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - - /* Check if it failed (it should) */ - if (ReturnValue == SOCKET_ERROR) - { - /* Check if it failed because it had no buffer (it should) */ - if (ErrorCode == WSAEFAULT) - { - /* Make sure it told us how many bytes it needed */ - if (BytesReturned) - { - /* Allocate memory for it */ - Qos = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - BytesReturned); - if (!Qos) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - - /* Save the accept data and set the QoS */ - ThreadData->AcceptData = &AcceptData; - ReturnValue = WSPIoctl(Handle, - SIO_GET_QOS, - NULL, - 0, - Qos, - BytesReturned, - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - } - } - else - { - /* We got some other weird, error, fail. */ - goto error; - } - } - - /* Save the accept in the TEB */ - ThreadData->AcceptData = &AcceptData; - - /* Send the IOCTL to get Group QOS Size */ - BytesReturned = 0; - ReturnValue = WSPIoctl(Handle, - SIO_GET_GROUP_QOS, - NULL, - 0, - NULL, - 0, - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - - /* Check if it failed (it should) */ - if (ReturnValue == SOCKET_ERROR) - { - /* Check if it failed because it had no buffer (it should) */ - if (ErrorCode == WSAEFAULT) - { - /* Make sure it told us how many bytes it needed */ - if (BytesReturned) - { - /* Allocate memory for it */ - GroupQos = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - BytesReturned); - if (!GroupQos) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - - /* Save the accept data and set the QoS */ - ThreadData->AcceptData = &AcceptData; - ReturnValue = WSPIoctl(Handle, - SIO_GET_QOS, - NULL, - 0, - GroupQos, - BytesReturned, - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - } - } - else - { - /* We got some other weird, error, fail. */ - goto error; - } - } - } - - /* Build Callee ID */ - CalleeId.buf = (PVOID)Socket->LocalAddress; - CalleeId.len = Socket->SharedData.SizeOfLocalAddress; - - /* Set up Address in SOCKADDR Format */ - SockBuildSockaddr((PSOCKADDR)SockAddress, - &AddressSize, - &ReceivedAcceptData->Address); - - /* Build Caller ID */ - CallerId.buf = (PVOID)SockAddress; - CallerId.len = AddressSize; - - /* Build Caller Data */ - CallerData.buf = ConnectData; - CallerData.len = ConnectDataSize; - - /* Check if socket supports Conditional Accept */ - if (Socket->SharedData.UseDelayedAcceptance) - { - /* Allocate Buffer for Callee Data */ - CalleeDataBuffer = SockAllocateHeapRoutine(SockPrivateHeap, 0, 4096); - if (CalleeDataBuffer) - { - /* Fill the structure */ - CalleeData.buf = CalleeDataBuffer; - CalleeData.len = 4096; - } - else - { - /* Don't fail, just don't use this... */ - CalleeData.len = 0; - } - } - else - { - /* Nothing */ - CalleeData.buf = NULL; - CalleeData.len = 0; - } - - /* Call the Condition Function */ - ReturnValue = (lpfnCondition)(&CallerId, - !CallerData.buf ? NULL : & CallerData, - NULL, - NULL, - &CalleeId, - !CalleeData.buf ? NULL: & CalleeData, - &GroupId, - dwCallbackData); - - if ((ReturnValue == CF_ACCEPT) && - (GroupId) && - (GroupId != SG_UNCONSTRAINED_GROUP) && - (GroupId != SG_CONSTRAINED_GROUP)) - { - /* Check for validity */ - ErrorCode = SockIsAddressConsistentWithConstrainedGroup(Socket, - GroupId, - SockAddress, - AddressSize); - ValidGroup = (ErrorCode == NO_ERROR); - } - - /* Check if the address was from the heap */ - if (SockAddress != AddressBuffer) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, SockAddress); - } - - /* Check if it was accepted */ - if (ReturnValue == CF_ACCEPT) - { - /* Check if the group is invalid, however */ - if (!ValidGroup) goto error; - - /* Now check if QOS is supported */ - if ((Socket->SharedData.ServiceFlags1 & XP1_QOS_SUPPORTED)) - { - /* Check if we had Qos */ - if (Qos) - { - /* Set the accept data */ - AcceptData.SequenceNumber = ReceivedAcceptData->SequenceNumber; - AcceptData.ListenHandle = Socket->WshContext.Handle; - - /* Save it in the TEB */ - ThreadData->AcceptData = &AcceptData; - - /* Send the IOCTL */ - BytesReturned = 0; - ReturnValue = WSPIoctl(Handle, - SIO_SET_QOS, - Qos, - sizeof(*Qos), - NULL, - 0, - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - if (ReturnValue == SOCKET_ERROR) goto error; - } - - /* Check if we had Group Qos */ - if (GroupQos) - { - /* Set the accept data */ - AcceptData.SequenceNumber = ReceivedAcceptData->SequenceNumber; - AcceptData.ListenHandle = Socket->WshContext.Handle; - - /* Save it in the TEB */ - ThreadData->AcceptData = &AcceptData; - - /* Send the IOCTL */ - ReturnValue = WSPIoctl(Handle, - SIO_SET_GROUP_QOS, - GroupQos, - sizeof(*GroupQos), - NULL, - 0, - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - if (ReturnValue == SOCKET_ERROR) goto error; - } - } - - /* Check if delayed acceptance is used and we have callee data */ - if ((Socket->HelperData->UseDelayedAcceptance) && (CalleeData.len)) - { - /* Save the accept data in the TEB */ - ThreadData->AcceptData = &AcceptData; - - /* Set the connect data */ - ErrorCode = SockGetConnectData(Socket, - IOCTL_AFD_SET_CONNECT_DATA, - CalleeData.buf, - CalleeData.len, - NULL); - if (ErrorCode == SOCKET_ERROR) goto error; - } - } - else - { - /* Callback rejected. Build Defer Structure */ - DeferData.SequenceNumber = ReceivedAcceptData->SequenceNumber; - DeferData.RejectConnection = (ReturnValue == CF_REJECT); - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_DEFER_ACCEPT, - &DeferData, - sizeof(DeferData), - NULL, - 0); - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - if (ReturnValue == CF_REJECT) - { - /* The connection was refused */ - ErrorCode = WSAECONNREFUSED; - } - else - { - /* The connection was deferred */ - ErrorCode = WSATRY_AGAIN; - } - - /* Fail */ - goto error; - } - } - - /* Create a new Socket */ - ErrorCode = SockSocket(Socket->SharedData.AddressFamily, - Socket->SharedData.SocketType, - Socket->SharedData.Protocol, - &Socket->ProviderId, - GroupId, - Socket->SharedData.CreateFlags, - Socket->SharedData.ProviderFlags, - Socket->SharedData.ServiceFlags1, - Socket->SharedData.CatalogEntryId, - &AcceptedSocket); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - goto error; - } - - /* Set up the Accept Structure */ - AcceptData.ListenHandle = AcceptedSocket->WshContext.Handle; - AcceptData.SequenceNumber = ReceivedAcceptData->SequenceNumber; - - /* Build the socket address */ - SockBuildSockaddr(AcceptedSocket->RemoteAddress, - &AcceptedSocket->SharedData.SizeOfRemoteAddress, - &ReceivedAcceptData->Address); - - /* Copy the local address */ - RtlCopyMemory(AcceptedSocket->LocalAddress, - Socket->LocalAddress, - Socket->SharedData.SizeOfLocalAddress); - AcceptedSocket->SharedData.SizeOfLocalAddress = Socket->SharedData.SizeOfLocalAddress; - - /* We can release the accepted socket's lock now */ - LeaveCriticalSection(&AcceptedSocket->Lock); - - /* Send IOCTL to Accept */ - AcceptData.UseSAN = SockSanEnabled; - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_ACCEPT, - &AcceptData, - sizeof(AcceptData), - NULL, - 0); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion outside the lock */ - LeaveCriticalSection(&Socket->Lock); - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - MAYBE_BLOCKING_HOOK, - NO_TIMEOUT); - EnterCriticalSection(&Socket->Lock); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Notify the helper DLL */ - ErrorCode = SockNotifyHelperDll(AcceptedSocket, WSH_NOTIFY_ACCEPT); - if (ErrorCode != NO_ERROR) goto error; - - /* If the caller sent a socket address pointer and length */ - if (SocketAddress && SocketAddressLength) - { - /* Return the address in its buffer */ - ErrorCode = SockBuildSockaddr(SocketAddress, - SocketAddressLength, - &ReceivedAcceptData->Address); - if (ErrorCode != NO_ERROR) goto error; - } - - /* Check if async select was active */ - if (SockAsyncSelectCalled) - { - /* Re-enable the regular accept event */ - SockReenableAsyncSelectEvent(Socket, FD_ACCEPT); - } - - /* Finally, do the internal core accept code */ - ErrorCode = SockCoreAccept(Socket, AcceptedSocket); - if (ErrorCode != NO_ERROR) goto error; - - /* Call WPU to tell it about the new handle */ - AcceptedHandle = SockUpcallTable->lpWPUModifyIFSHandle(AcceptedSocket->SharedData.CatalogEntryId, - (SOCKET)AcceptedSocket->WshContext.Handle, - &ErrorCode); - - /* Dereference the socket and clear its pointer for error code logic */ - SockDereferenceSocket(Socket); - Socket = NULL; - -error: - - /* Check if we have a socket here */ - if (Socket) - { - /* Check if async select was active */ - if (SockAsyncSelectCalled) - { - /* Re-enable the regular accept event */ - SockReenableAsyncSelectEvent(Socket, FD_ACCEPT); - } - - /* Unlock and dereference it */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - - /* Check if we got the accepted socket */ - if (AcceptedSocket) - { - /* Check if the accepted socket also has a handle */ - if (ErrorCode == NO_ERROR) - { - /* Close the socket */ - SockCloseSocket(AcceptedSocket); - } - - /* Dereference it */ - SockDereferenceSocket(AcceptedSocket); - } - - /* Check if the accept buffer was from the heap */ - if (ReceivedAcceptData && (ReceivedAcceptData != (PVOID)AfdAcceptBuffer)) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, ReceivedAcceptData); - } - - /* Check if we have a connect data buffer */ - if (ConnectData) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, ConnectData); - } - - /* Check if we have a callee data buffer */ - if (CalleeDataBuffer) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, CalleeDataBuffer); - } - - /* Check if we have allocated QOS structures */ - if (Qos) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, Qos); - } - if (GroupQos) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, GroupQos); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return INVALID_SOCKET; - } - - /* Return the new handle */ - return AcceptedHandle; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -SockCoreAccept(IN PSOCKET_INFORMATION Socket, - IN PSOCKET_INFORMATION AcceptedSocket) -{ - INT ErrorCode, ReturnValue; - BOOLEAN BlockMode = Socket->SharedData.NonBlocking; - BOOLEAN Oob = Socket->SharedData.OobInline; - INT HelperContextSize; - PVOID HelperContext = NULL; - HWND hWnd = 0; - UINT wMsg = 0; - HANDLE EventObject = NULL; - ULONG AsyncEvents = 0, NetworkEvents = 0; - CHAR HelperBuffer[256]; - - /* Set the new state */ - AcceptedSocket->SharedData.State = SocketConnected; - - /* Copy some of the settings */ - AcceptedSocket->SharedData.LingerData = Socket->SharedData.LingerData; - AcceptedSocket->SharedData.SizeOfRecvBuffer = Socket->SharedData.SizeOfRecvBuffer; - AcceptedSocket->SharedData.SizeOfSendBuffer = Socket->SharedData.SizeOfSendBuffer; - AcceptedSocket->SharedData.Broadcast = Socket->SharedData.Broadcast; - AcceptedSocket->SharedData.Debug = Socket->SharedData.Debug; - AcceptedSocket->SharedData.OobInline = Socket->SharedData.OobInline; - AcceptedSocket->SharedData.ReuseAddresses = Socket->SharedData.ReuseAddresses; - AcceptedSocket->SharedData.SendTimeout = Socket->SharedData.SendTimeout; - AcceptedSocket->SharedData.RecvTimeout = Socket->SharedData.RecvTimeout; - - /* Check if the old socket had async select */ - if (Socket->SharedData.AsyncEvents) - { - /* Copy the data while we're still under the lock */ - AsyncEvents = Socket->SharedData.AsyncEvents; - hWnd = Socket->SharedData.hWnd; - wMsg = Socket->SharedData.wMsg; - } - else if (Socket->NetworkEvents) - { - /* Copy the data while we're still under the lock */ - NetworkEvents = Socket->NetworkEvents; - EventObject = Socket->EventObject; - } - - /* Check how much space is needed for the context */ - ReturnValue = Socket->HelperData->WSHGetSocketInformation(Socket->HelperContext, - Socket->Handle, - Socket->TdiAddressHandle, - Socket->TdiConnectionHandle, - SOL_INTERNAL, - SO_CONTEXT, - NULL, - &HelperContextSize); - if (ReturnValue == NO_ERROR) - { - /* Check if our stack buffer is large enough to hold it */ - if (HelperContextSize <= sizeof(HelperBuffer)) - { - /* Use it */ - HelperContext = (PVOID)HelperBuffer; - } - else - { - /* Allocate from the heap instead */ - HelperContext = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - HelperContextSize); - if (!HelperContext) - { - /* Unlock the socket and fail */ - LeaveCriticalSection(&Socket->Lock); - return WSAENOBUFS; - } - } - - /* Get the context */ - ReturnValue = Socket->HelperData->WSHGetSocketInformation(Socket->HelperContext, - Socket->Handle, - Socket->TdiAddressHandle, - Socket->TdiConnectionHandle, - SOL_INTERNAL, - SO_CONTEXT, - HelperContext, - &HelperContextSize); - } - - /* We're done with the old socket, so we can release the lock */ - LeaveCriticalSection(&Socket->Lock); - - /* Get the TDI Handles for the new socket */ - ErrorCode = SockGetTdiHandles(AcceptedSocket); - - /* Check if we have the handles and the context */ - if ((ErrorCode == NO_ERROR) && (ReturnValue == NO_ERROR)) - { - /* Set the context */ - AcceptedSocket->HelperData->WSHGetSocketInformation(AcceptedSocket->HelperContext, - AcceptedSocket->Handle, - AcceptedSocket->TdiAddressHandle, - AcceptedSocket->TdiConnectionHandle, - SOL_INTERNAL, - SO_CONTEXT, - HelperContext, - &HelperContextSize); - } - - /* Check if we should free from heap */ - if (HelperContext && (HelperContext != (PVOID)HelperBuffer)) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, HelperContext); - } - - /* Check if the old socket was non-blocking */ - if (BlockMode) - { - /* Set the new one like that too */ - ErrorCode = SockSetInformation(AcceptedSocket, - AFD_INFO_BLOCKING_MODE, - &BlockMode, - NULL, - NULL); - if (ErrorCode != NO_ERROR) return ErrorCode; - } - - /* Set it internally as well */ - AcceptedSocket->SharedData.NonBlocking = Socket->SharedData.NonBlocking; - - /* Check if inlined OOB was enabled */ - if (Oob) - { - /* Set the new one like that too */ - ErrorCode = SockSetInformation(AcceptedSocket, - AFD_INFO_INLINING_MODE, - &Oob, - NULL, - NULL); - if (ErrorCode != NO_ERROR) return ErrorCode; - } - - /* Set it internally as well */ - AcceptedSocket->SharedData.OobInline = Socket->SharedData.OobInline; - - /* Update the Window Sizes */ - ErrorCode = SockUpdateWindowSizes(AcceptedSocket, FALSE); - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Check if async select was enabled */ - if (AsyncEvents) - { - /* Call WSPAsyncSelect on the accepted socket too */ - ErrorCode = SockAsyncSelectHelper(AcceptedSocket, - hWnd, - wMsg, - AsyncEvents); - } - else if (NetworkEvents) - { - /* WSPEventSelect was enabled instead, call it on the new socket */ - ErrorCode = SockEventSelectHelper(AcceptedSocket, - EventObject, - NetworkEvents); - } - - /* Check for failure */ - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Set the new context in AFD */ - ErrorCode = SockSetHandleContext(AcceptedSocket); - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Return success*/ - return NO_ERROR; -} - -SOCKET -WSPAPI -WSPAccept(SOCKET Handle, - SOCKADDR FAR * SocketAddress, - LPINT SocketAddressLength, - LPCONDITIONPROC lpfnCondition, - DWORD_PTR dwCallbackData, - LPINT lpErrno) -{ - INT ErrorCode, ReturnValue; - PSOCKET_INFORMATION Socket, AcceptedSocket = NULL; - PWINSOCK_TEB_DATA ThreadData; - CHAR AfdAcceptBuffer[32]; - PAFD_RECEIVED_ACCEPT_DATA ReceivedAcceptData = NULL; - ULONG ReceiveBufferSize; - FD_SET ReadFds; - TIMEVAL Timeout; - NTSTATUS Status; - IO_STATUS_BLOCK IoStatusBlock; - ULONG AddressBufferSize; - CHAR AddressBuffer[sizeof(SOCKADDR)]; - PVOID SockAddress; - ULONG ConnectDataSize; - PVOID ConnectData = NULL; - AFD_PENDING_ACCEPT_DATA PendingAcceptData; - INT AddressSize; - PVOID CalleeDataBuffer = NULL; - WSABUF CallerId, CalleeId, CallerData, CalleeData; - GROUP GroupId; - LPQOS Qos = NULL, GroupQos = NULL; - BOOLEAN ValidGroup = TRUE; - AFD_DEFER_ACCEPT_DATA DeferData; - ULONG BytesReturned; - SOCKET AcceptedHandle = INVALID_SOCKET; - AFD_ACCEPT_DATA AcceptData; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Invalid for datagram sockets */ - if (MSAFD_IS_DGRAM_SOCK(Socket)) - { - /* Fail */ - ErrorCode = WSAEOPNOTSUPP; - goto error; - } - - /* Only valid if the socket is listening */ - if (!Socket->SharedData.Listening) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Validate address length */ - if (SocketAddressLength && - (Socket->HelperData->MinWSAddressLength > *SocketAddressLength)) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Calculate how much space we'll need for the Receive Buffer */ - ReceiveBufferSize = sizeof(AFD_RECEIVED_ACCEPT_DATA) + - sizeof(TRANSPORT_ADDRESS) + - Socket->HelperData->MaxTDIAddressLength; - - /* Check if our stack buffer is large enough */ - if (ReceiveBufferSize <= sizeof(AfdAcceptBuffer)) - { - /* Use the stack */ - ReceivedAcceptData = (PVOID)AfdAcceptBuffer; - } - else - { - /* Allocate from heap */ - ReceivedAcceptData = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - ReceiveBufferSize); - if (!ReceivedAcceptData) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - } - - /* If this is non-blocking, make sure there's something for us to accept */ - if (Socket->SharedData.NonBlocking) - { - /* Set up a nonblocking select */ - FD_ZERO(&ReadFds); - FD_SET(Handle, &ReadFds); - Timeout.tv_sec = 0; - Timeout.tv_usec = 0; - - /* See if there's any data */ - ReturnValue = WSPSelect(1, - &ReadFds, - NULL, - NULL, - &Timeout, - lpErrno); - if (ReturnValue == SOCKET_ERROR) - { - /* Fail */ - ErrorCode = *lpErrno; - goto error; - } - - /* Make sure we got a read back */ - if (!FD_ISSET(Handle, &ReadFds)) - { - /* Fail */ - ErrorCode = WSAEWOULDBLOCK; - goto error; - } - } - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_WAIT_FOR_LISTEN, - NULL, - 0, - ReceivedAcceptData, - ReceiveBufferSize); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion outside the lock */ - LeaveCriticalSection(&Socket->Lock); - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - MAYBE_BLOCKING_HOOK, - NO_TIMEOUT); - EnterCriticalSection(&Socket->Lock); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Check if we got a condition callback */ - if (lpfnCondition) - { - /* Find out how much space we'll need for the address */ - AddressBufferSize = Socket->HelperData->MaxWSAddressLength; - - /* Check if our local buffer is enough */ - if (AddressBufferSize <= sizeof(AddressBuffer)) - { - /* It is, use the stack */ - SockAddress = (PVOID)AddressBuffer; - } - else - { - /* Allocate from heap */ - SockAddress = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - AddressBufferSize); - if (!SockAddress) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - } - - /* Assume no connect data */ - ConnectDataSize = 0; - - /* Make sure we support connect data */ - if ((Socket->SharedData.ServiceFlags1 & XP1_CONNECT_DATA)) - { - /* Find out how much data is pending */ - PendingAcceptData.SequenceNumber = ReceivedAcceptData->SequenceNumber; - PendingAcceptData.ReturnSize = TRUE; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_GET_PENDING_CONNECT_DATA, - &PendingAcceptData, - sizeof(PendingAcceptData), - &PendingAcceptData, - sizeof(PendingAcceptData)); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* How much data to allocate */ - ConnectDataSize = PtrToUlong(IoStatusBlock.Information); - if (ConnectDataSize) - { - /* Allocate needed space */ - ConnectData = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - ConnectDataSize); - if (!ConnectData) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - - /* Setup the structure to actually get the data now */ - PendingAcceptData.SequenceNumber = ReceivedAcceptData->SequenceNumber; - PendingAcceptData.ReturnSize = FALSE; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_GET_PENDING_CONNECT_DATA, - &PendingAcceptData, - sizeof(PendingAcceptData), - ConnectData, - ConnectDataSize); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - } - } - - if ((Socket->SharedData.ServiceFlags1 & XP1_QOS_SUPPORTED)) - { - /* Set the accept data */ - AcceptData.SequenceNumber = ReceivedAcceptData->SequenceNumber; - AcceptData.ListenHandle = Socket->WshContext.Handle; - - /* Save it in the TEB */ - ThreadData->AcceptData = &AcceptData; - - /* Send the IOCTL to get QOS Size */ - BytesReturned = 0; - ReturnValue = WSPIoctl(Handle, - SIO_GET_QOS, - NULL, - 0, - NULL, - 0, - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - - /* Check if it failed (it should) */ - if (ReturnValue == SOCKET_ERROR) - { - /* Check if it failed because it had no buffer (it should) */ - if (ErrorCode == WSAEFAULT) - { - /* Make sure it told us how many bytes it needed */ - if (BytesReturned) - { - /* Allocate memory for it */ - Qos = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - BytesReturned); - if (!Qos) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - - /* Save the accept data and set the QoS */ - ThreadData->AcceptData = &AcceptData; - ReturnValue = WSPIoctl(Handle, - SIO_GET_QOS, - NULL, - 0, - Qos, - BytesReturned, - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - } - } - else - { - /* We got some other weird, error, fail. */ - goto error; - } - } - - /* Save the accept in the TEB */ - ThreadData->AcceptData = &AcceptData; - - /* Send the IOCTL to get Group QOS Size */ - BytesReturned = 0; - ReturnValue = WSPIoctl(Handle, - SIO_GET_GROUP_QOS, - NULL, - 0, - NULL, - 0, - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - - /* Check if it failed (it should) */ - if (ReturnValue == SOCKET_ERROR) - { - /* Check if it failed because it had no buffer (it should) */ - if (ErrorCode == WSAEFAULT) - { - /* Make sure it told us how many bytes it needed */ - if (BytesReturned) - { - /* Allocate memory for it */ - GroupQos = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - BytesReturned); - if (!GroupQos) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - - /* Save the accept data and set the QoS */ - ThreadData->AcceptData = &AcceptData; - ReturnValue = WSPIoctl(Handle, - SIO_GET_QOS, - NULL, - 0, - GroupQos, - BytesReturned, - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - } - } - else - { - /* We got some other weird, error, fail. */ - goto error; - } - } - } - - /* Build Callee ID */ - CalleeId.buf = (PVOID)Socket->LocalAddress; - CalleeId.len = Socket->SharedData.SizeOfLocalAddress; - - /* Set up Address in SOCKADDR Format */ - SockBuildSockaddr((PSOCKADDR)SockAddress, - &AddressSize, - &ReceivedAcceptData->Address); - - /* Build Caller ID */ - CallerId.buf = (PVOID)SockAddress; - CallerId.len = AddressSize; - - /* Build Caller Data */ - CallerData.buf = ConnectData; - CallerData.len = ConnectDataSize; - - /* Check if socket supports Conditional Accept */ - if (Socket->SharedData.UseDelayedAcceptance) - { - /* Allocate Buffer for Callee Data */ - CalleeDataBuffer = SockAllocateHeapRoutine(SockPrivateHeap, 0, 4096); - if (CalleeDataBuffer) - { - /* Fill the structure */ - CalleeData.buf = CalleeDataBuffer; - CalleeData.len = 4096; - } - else - { - /* Don't fail, just don't use this... */ - CalleeData.len = 0; - } - } - else - { - /* Nothing */ - CalleeData.buf = NULL; - CalleeData.len = 0; - } - - /* Call the Condition Function */ - ReturnValue = (lpfnCondition)(&CallerId, - !CallerData.buf ? NULL : & CallerData, - NULL, - NULL, - &CalleeId, - !CalleeData.buf ? NULL: & CalleeData, - &GroupId, - dwCallbackData); - - if ((ReturnValue == CF_ACCEPT) && - (GroupId) && - (GroupId != SG_UNCONSTRAINED_GROUP) && - (GroupId != SG_CONSTRAINED_GROUP)) - { - /* Check for validity */ - ErrorCode = SockIsAddressConsistentWithConstrainedGroup(Socket, - GroupId, - SockAddress, - AddressSize); - ValidGroup = (ErrorCode == NO_ERROR); - } - - /* Check if the address was from the heap */ - if (SockAddress != AddressBuffer) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, SockAddress); - } - - /* Check if it was accepted */ - if (ReturnValue == CF_ACCEPT) - { - /* Check if the group is invalid, however */ - if (!ValidGroup) goto error; - - /* Now check if QOS is supported */ - if ((Socket->SharedData.ServiceFlags1 & XP1_QOS_SUPPORTED)) - { - /* Check if we had Qos */ - if (Qos) - { - /* Set the accept data */ - AcceptData.SequenceNumber = ReceivedAcceptData->SequenceNumber; - AcceptData.ListenHandle = Socket->WshContext.Handle; - - /* Save it in the TEB */ - ThreadData->AcceptData = &AcceptData; - - /* Send the IOCTL */ - BytesReturned = 0; - ReturnValue = WSPIoctl(Handle, - SIO_SET_QOS, - Qos, - sizeof(*Qos), - NULL, - 0, - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - if (ReturnValue == SOCKET_ERROR) goto error; - } - - /* Check if we had Group Qos */ - if (GroupQos) - { - /* Set the accept data */ - AcceptData.SequenceNumber = ReceivedAcceptData->SequenceNumber; - AcceptData.ListenHandle = Socket->WshContext.Handle; - - /* Save it in the TEB */ - ThreadData->AcceptData = &AcceptData; - - /* Send the IOCTL */ - ReturnValue = WSPIoctl(Handle, - SIO_SET_GROUP_QOS, - GroupQos, - sizeof(*GroupQos), - NULL, - 0, - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - if (ReturnValue == SOCKET_ERROR) goto error; - } - } - - /* Check if delayed acceptance is used and we have callee data */ - if ((Socket->HelperData->UseDelayedAcceptance) && (CalleeData.len)) - { - /* Save the accept data in the TEB */ - ThreadData->AcceptData = &AcceptData; - - /* Set the connect data */ - ErrorCode = SockGetConnectData(Socket, - IOCTL_AFD_SET_CONNECT_DATA, - CalleeData.buf, - CalleeData.len, - NULL); - if (ErrorCode == SOCKET_ERROR) goto error; - } - } - else - { - /* Callback rejected. Build Defer Structure */ - DeferData.SequenceNumber = ReceivedAcceptData->SequenceNumber; - DeferData.RejectConnection = (ReturnValue == CF_REJECT); - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_DEFER_ACCEPT, - &DeferData, - sizeof(DeferData), - NULL, - 0); - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - if (ReturnValue == CF_REJECT) - { - /* The connection was refused */ - ErrorCode = WSAECONNREFUSED; - } - else - { - /* The connection was deferred */ - ErrorCode = WSATRY_AGAIN; - } - - /* Fail */ - goto error; - } - } - - /* Create a new Socket */ - ErrorCode = SockSocket(Socket->SharedData.AddressFamily, - Socket->SharedData.SocketType, - Socket->SharedData.Protocol, - &Socket->ProviderId, - GroupId, - Socket->SharedData.CreateFlags, - Socket->SharedData.ProviderFlags, - Socket->SharedData.ServiceFlags1, - Socket->SharedData.CatalogEntryId, - &AcceptedSocket); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - goto error; - } - - /* Set up the Accept Structure */ - AcceptData.ListenHandle = AcceptedSocket->WshContext.Handle; - AcceptData.SequenceNumber = ReceivedAcceptData->SequenceNumber; - - /* Build the socket address */ - SockBuildSockaddr(AcceptedSocket->RemoteAddress, - &AcceptedSocket->SharedData.SizeOfRemoteAddress, - &ReceivedAcceptData->Address); - - /* Copy the local address */ - RtlCopyMemory(AcceptedSocket->LocalAddress, - Socket->LocalAddress, - Socket->SharedData.SizeOfLocalAddress); - AcceptedSocket->SharedData.SizeOfLocalAddress = Socket->SharedData.SizeOfLocalAddress; - - /* We can release the accepted socket's lock now */ - LeaveCriticalSection(&AcceptedSocket->Lock); - - /* Send IOCTL to Accept */ - AcceptData.UseSAN = SockSanEnabled; - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_ACCEPT, - &AcceptData, - sizeof(AcceptData), - NULL, - 0); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion outside the lock */ - LeaveCriticalSection(&Socket->Lock); - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - MAYBE_BLOCKING_HOOK, - NO_TIMEOUT); - EnterCriticalSection(&Socket->Lock); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Notify the helper DLL */ - ErrorCode = SockNotifyHelperDll(AcceptedSocket, WSH_NOTIFY_ACCEPT); - if (ErrorCode != NO_ERROR) goto error; - - /* If the caller sent a socket address pointer and length */ - if (SocketAddress && SocketAddressLength) - { - /* Return the address in its buffer */ - ErrorCode = SockBuildSockaddr(SocketAddress, - SocketAddressLength, - &ReceivedAcceptData->Address); - if (ErrorCode != NO_ERROR) goto error; - } - - /* Check if async select was active */ - if (SockAsyncSelectCalled) - { - /* Re-enable the regular accept event */ - SockReenableAsyncSelectEvent(Socket, FD_ACCEPT); - } - - /* Finally, do the internal core accept code */ - ErrorCode = SockCoreAccept(Socket, AcceptedSocket); - if (ErrorCode != NO_ERROR) goto error; - - /* Call WPU to tell it about the new handle */ - AcceptedHandle = SockUpcallTable->lpWPUModifyIFSHandle(AcceptedSocket->SharedData.CatalogEntryId, - (SOCKET)AcceptedSocket->WshContext.Handle, - &ErrorCode); - - /* Dereference the socket and clear its pointer for error code logic */ - SockDereferenceSocket(Socket); - Socket = NULL; - -error: - - /* Check if we have a socket here */ - if (Socket) - { - /* Check if async select was active */ - if (SockAsyncSelectCalled) - { - /* Re-enable the regular accept event */ - SockReenableAsyncSelectEvent(Socket, FD_ACCEPT); - } - - /* Unlock and dereference it */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - - /* Check if we got the accepted socket */ - if (AcceptedSocket) - { - /* Check if the accepted socket also has a handle */ - if (ErrorCode == NO_ERROR) - { - /* Close the socket */ - SockCloseSocket(AcceptedSocket); - } - - /* Dereference it */ - SockDereferenceSocket(AcceptedSocket); - } - - /* Check if the accept buffer was from the heap */ - if (ReceivedAcceptData && (ReceivedAcceptData != (PVOID)AfdAcceptBuffer)) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, ReceivedAcceptData); - } - - /* Check if we have a connect data buffer */ - if (ConnectData) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, ConnectData); - } - - /* Check if we have a callee data buffer */ - if (CalleeDataBuffer) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, CalleeDataBuffer); - } - - /* Check if we have allocated QOS structures */ - if (Qos) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, Qos); - } - if (GroupQos) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, GroupQos); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return INVALID_SOCKET; - } - - /* Return the new handle */ - return AcceptedHandle; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -SockCoreAccept(IN PSOCKET_INFORMATION Socket, - IN PSOCKET_INFORMATION AcceptedSocket) -{ - INT ErrorCode, ReturnValue; - BOOLEAN BlockMode = Socket->SharedData.NonBlocking; - BOOLEAN Oob = Socket->SharedData.OobInline; - INT HelperContextSize; - PVOID HelperContext = NULL; - HWND hWnd = 0; - UINT wMsg = 0; - HANDLE EventObject = NULL; - ULONG AsyncEvents = 0, NetworkEvents = 0; - CHAR HelperBuffer[256]; - - /* Set the new state */ - AcceptedSocket->SharedData.State = SocketConnected; - - /* Copy some of the settings */ - AcceptedSocket->SharedData.LingerData = Socket->SharedData.LingerData; - AcceptedSocket->SharedData.SizeOfRecvBuffer = Socket->SharedData.SizeOfRecvBuffer; - AcceptedSocket->SharedData.SizeOfSendBuffer = Socket->SharedData.SizeOfSendBuffer; - AcceptedSocket->SharedData.Broadcast = Socket->SharedData.Broadcast; - AcceptedSocket->SharedData.Debug = Socket->SharedData.Debug; - AcceptedSocket->SharedData.OobInline = Socket->SharedData.OobInline; - AcceptedSocket->SharedData.ReuseAddresses = Socket->SharedData.ReuseAddresses; - AcceptedSocket->SharedData.SendTimeout = Socket->SharedData.SendTimeout; - AcceptedSocket->SharedData.RecvTimeout = Socket->SharedData.RecvTimeout; - - /* Check if the old socket had async select */ - if (Socket->SharedData.AsyncEvents) - { - /* Copy the data while we're still under the lock */ - AsyncEvents = Socket->SharedData.AsyncEvents; - hWnd = Socket->SharedData.hWnd; - wMsg = Socket->SharedData.wMsg; - } - else if (Socket->NetworkEvents) - { - /* Copy the data while we're still under the lock */ - NetworkEvents = Socket->NetworkEvents; - EventObject = Socket->EventObject; - } - - /* Check how much space is needed for the context */ - ReturnValue = Socket->HelperData->WSHGetSocketInformation(Socket->HelperContext, - Socket->Handle, - Socket->TdiAddressHandle, - Socket->TdiConnectionHandle, - SOL_INTERNAL, - SO_CONTEXT, - NULL, - &HelperContextSize); - if (ReturnValue == NO_ERROR) - { - /* Check if our stack buffer is large enough to hold it */ - if (HelperContextSize <= sizeof(HelperBuffer)) - { - /* Use it */ - HelperContext = (PVOID)HelperBuffer; - } - else - { - /* Allocate from the heap instead */ - HelperContext = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - HelperContextSize); - if (!HelperContext) - { - /* Unlock the socket and fail */ - LeaveCriticalSection(&Socket->Lock); - return WSAENOBUFS; - } - } - - /* Get the context */ - ReturnValue = Socket->HelperData->WSHGetSocketInformation(Socket->HelperContext, - Socket->Handle, - Socket->TdiAddressHandle, - Socket->TdiConnectionHandle, - SOL_INTERNAL, - SO_CONTEXT, - HelperContext, - &HelperContextSize); - } - - /* We're done with the old socket, so we can release the lock */ - LeaveCriticalSection(&Socket->Lock); - - /* Get the TDI Handles for the new socket */ - ErrorCode = SockGetTdiHandles(AcceptedSocket); - - /* Check if we have the handles and the context */ - if ((ErrorCode == NO_ERROR) && (ReturnValue == NO_ERROR)) - { - /* Set the context */ - AcceptedSocket->HelperData->WSHGetSocketInformation(AcceptedSocket->HelperContext, - AcceptedSocket->Handle, - AcceptedSocket->TdiAddressHandle, - AcceptedSocket->TdiConnectionHandle, - SOL_INTERNAL, - SO_CONTEXT, - HelperContext, - &HelperContextSize); - } - - /* Check if we should free from heap */ - if (HelperContext && (HelperContext != (PVOID)HelperBuffer)) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, HelperContext); - } - - /* Check if the old socket was non-blocking */ - if (BlockMode) - { - /* Set the new one like that too */ - ErrorCode = SockSetInformation(AcceptedSocket, - AFD_INFO_BLOCKING_MODE, - &BlockMode, - NULL, - NULL); - if (ErrorCode != NO_ERROR) return ErrorCode; - } - - /* Set it internally as well */ - AcceptedSocket->SharedData.NonBlocking = Socket->SharedData.NonBlocking; - - /* Check if inlined OOB was enabled */ - if (Oob) - { - /* Set the new one like that too */ - ErrorCode = SockSetInformation(AcceptedSocket, - AFD_INFO_INLINING_MODE, - &Oob, - NULL, - NULL); - if (ErrorCode != NO_ERROR) return ErrorCode; - } - - /* Set it internally as well */ - AcceptedSocket->SharedData.OobInline = Socket->SharedData.OobInline; - - /* Update the Window Sizes */ - ErrorCode = SockUpdateWindowSizes(AcceptedSocket, FALSE); - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Check if async select was enabled */ - if (AsyncEvents) - { - /* Call WSPAsyncSelect on the accepted socket too */ - ErrorCode = SockAsyncSelectHelper(AcceptedSocket, - hWnd, - wMsg, - AsyncEvents); - } - else if (NetworkEvents) - { - /* WSPEventSelect was enabled instead, call it on the new socket */ - ErrorCode = SockEventSelectHelper(AcceptedSocket, - EventObject, - NetworkEvents); - } - - /* Check for failure */ - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Set the new context in AFD */ - ErrorCode = SockSetHandleContext(AcceptedSocket); - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Return success*/ - return NO_ERROR; -} - -SOCKET -WSPAPI -WSPAccept(SOCKET Handle, - SOCKADDR FAR * SocketAddress, - LPINT SocketAddressLength, - LPCONDITIONPROC lpfnCondition, - DWORD_PTR dwCallbackData, - LPINT lpErrno) -{ - INT ErrorCode, ReturnValue; - PSOCKET_INFORMATION Socket, AcceptedSocket = NULL; - PWINSOCK_TEB_DATA ThreadData; - CHAR AfdAcceptBuffer[32]; - PAFD_RECEIVED_ACCEPT_DATA ReceivedAcceptData = NULL; - ULONG ReceiveBufferSize; - FD_SET ReadFds; - TIMEVAL Timeout; - NTSTATUS Status; - IO_STATUS_BLOCK IoStatusBlock; - ULONG AddressBufferSize; - CHAR AddressBuffer[sizeof(SOCKADDR)]; - PVOID SockAddress; - ULONG ConnectDataSize; - PVOID ConnectData = NULL; - AFD_PENDING_ACCEPT_DATA PendingAcceptData; - INT AddressSize; - PVOID CalleeDataBuffer = NULL; - WSABUF CallerId, CalleeId, CallerData, CalleeData; - GROUP GroupId; - LPQOS Qos = NULL, GroupQos = NULL; - BOOLEAN ValidGroup = TRUE; - AFD_DEFER_ACCEPT_DATA DeferData; - ULONG BytesReturned; - SOCKET AcceptedHandle = INVALID_SOCKET; - AFD_ACCEPT_DATA AcceptData; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Invalid for datagram sockets */ - if (MSAFD_IS_DGRAM_SOCK(Socket)) - { - /* Fail */ - ErrorCode = WSAEOPNOTSUPP; - goto error; - } - - /* Only valid if the socket is listening */ - if (!Socket->SharedData.Listening) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Validate address length */ - if (SocketAddressLength && - (Socket->HelperData->MinWSAddressLength > *SocketAddressLength)) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Calculate how much space we'll need for the Receive Buffer */ - ReceiveBufferSize = sizeof(AFD_RECEIVED_ACCEPT_DATA) + - sizeof(TRANSPORT_ADDRESS) + - Socket->HelperData->MaxTDIAddressLength; - - /* Check if our stack buffer is large enough */ - if (ReceiveBufferSize <= sizeof(AfdAcceptBuffer)) - { - /* Use the stack */ - ReceivedAcceptData = (PVOID)AfdAcceptBuffer; - } - else - { - /* Allocate from heap */ - ReceivedAcceptData = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - ReceiveBufferSize); - if (!ReceivedAcceptData) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - } - - /* If this is non-blocking, make sure there's something for us to accept */ - if (Socket->SharedData.NonBlocking) - { - /* Set up a nonblocking select */ - FD_ZERO(&ReadFds); - FD_SET(Handle, &ReadFds); - Timeout.tv_sec = 0; - Timeout.tv_usec = 0; - - /* See if there's any data */ - ReturnValue = WSPSelect(1, - &ReadFds, - NULL, - NULL, - &Timeout, - lpErrno); - if (ReturnValue == SOCKET_ERROR) - { - /* Fail */ - ErrorCode = *lpErrno; - goto error; - } - - /* Make sure we got a read back */ - if (!FD_ISSET(Handle, &ReadFds)) - { - /* Fail */ - ErrorCode = WSAEWOULDBLOCK; - goto error; - } - } - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_WAIT_FOR_LISTEN, - NULL, - 0, - ReceivedAcceptData, - ReceiveBufferSize); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion outside the lock */ - LeaveCriticalSection(&Socket->Lock); - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - MAYBE_BLOCKING_HOOK, - NO_TIMEOUT); - EnterCriticalSection(&Socket->Lock); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Check if we got a condition callback */ - if (lpfnCondition) - { - /* Find out how much space we'll need for the address */ - AddressBufferSize = Socket->HelperData->MaxWSAddressLength; - - /* Check if our local buffer is enough */ - if (AddressBufferSize <= sizeof(AddressBuffer)) - { - /* It is, use the stack */ - SockAddress = (PVOID)AddressBuffer; - } - else - { - /* Allocate from heap */ - SockAddress = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - AddressBufferSize); - if (!SockAddress) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - } - - /* Assume no connect data */ - ConnectDataSize = 0; - - /* Make sure we support connect data */ - if ((Socket->SharedData.ServiceFlags1 & XP1_CONNECT_DATA)) - { - /* Find out how much data is pending */ - PendingAcceptData.SequenceNumber = ReceivedAcceptData->SequenceNumber; - PendingAcceptData.ReturnSize = TRUE; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_GET_PENDING_CONNECT_DATA, - &PendingAcceptData, - sizeof(PendingAcceptData), - &PendingAcceptData, - sizeof(PendingAcceptData)); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* How much data to allocate */ - ConnectDataSize = PtrToUlong(IoStatusBlock.Information); - if (ConnectDataSize) - { - /* Allocate needed space */ - ConnectData = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - ConnectDataSize); - if (!ConnectData) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - - /* Setup the structure to actually get the data now */ - PendingAcceptData.SequenceNumber = ReceivedAcceptData->SequenceNumber; - PendingAcceptData.ReturnSize = FALSE; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_GET_PENDING_CONNECT_DATA, - &PendingAcceptData, - sizeof(PendingAcceptData), - ConnectData, - ConnectDataSize); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - } - } - - if ((Socket->SharedData.ServiceFlags1 & XP1_QOS_SUPPORTED)) - { - /* Set the accept data */ - AcceptData.SequenceNumber = ReceivedAcceptData->SequenceNumber; - AcceptData.ListenHandle = Socket->WshContext.Handle; - - /* Save it in the TEB */ - ThreadData->AcceptData = &AcceptData; - - /* Send the IOCTL to get QOS Size */ - BytesReturned = 0; - ReturnValue = WSPIoctl(Handle, - SIO_GET_QOS, - NULL, - 0, - NULL, - 0, - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - - /* Check if it failed (it should) */ - if (ReturnValue == SOCKET_ERROR) - { - /* Check if it failed because it had no buffer (it should) */ - if (ErrorCode == WSAEFAULT) - { - /* Make sure it told us how many bytes it needed */ - if (BytesReturned) - { - /* Allocate memory for it */ - Qos = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - BytesReturned); - if (!Qos) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - - /* Save the accept data and set the QoS */ - ThreadData->AcceptData = &AcceptData; - ReturnValue = WSPIoctl(Handle, - SIO_GET_QOS, - NULL, - 0, - Qos, - BytesReturned, - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - } - } - else - { - /* We got some other weird, error, fail. */ - goto error; - } - } - - /* Save the accept in the TEB */ - ThreadData->AcceptData = &AcceptData; - - /* Send the IOCTL to get Group QOS Size */ - BytesReturned = 0; - ReturnValue = WSPIoctl(Handle, - SIO_GET_GROUP_QOS, - NULL, - 0, - NULL, - 0, - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - - /* Check if it failed (it should) */ - if (ReturnValue == SOCKET_ERROR) - { - /* Check if it failed because it had no buffer (it should) */ - if (ErrorCode == WSAEFAULT) - { - /* Make sure it told us how many bytes it needed */ - if (BytesReturned) - { - /* Allocate memory for it */ - GroupQos = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - BytesReturned); - if (!GroupQos) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - - /* Save the accept data and set the QoS */ - ThreadData->AcceptData = &AcceptData; - ReturnValue = WSPIoctl(Handle, - SIO_GET_QOS, - NULL, - 0, - GroupQos, - BytesReturned, - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - } - } - else - { - /* We got some other weird, error, fail. */ - goto error; - } - } - } - - /* Build Callee ID */ - CalleeId.buf = (PVOID)Socket->LocalAddress; - CalleeId.len = Socket->SharedData.SizeOfLocalAddress; - - /* Set up Address in SOCKADDR Format */ - SockBuildSockaddr((PSOCKADDR)SockAddress, - &AddressSize, - &ReceivedAcceptData->Address); - - /* Build Caller ID */ - CallerId.buf = (PVOID)SockAddress; - CallerId.len = AddressSize; - - /* Build Caller Data */ - CallerData.buf = ConnectData; - CallerData.len = ConnectDataSize; - - /* Check if socket supports Conditional Accept */ - if (Socket->SharedData.UseDelayedAcceptance) - { - /* Allocate Buffer for Callee Data */ - CalleeDataBuffer = SockAllocateHeapRoutine(SockPrivateHeap, 0, 4096); - if (CalleeDataBuffer) - { - /* Fill the structure */ - CalleeData.buf = CalleeDataBuffer; - CalleeData.len = 4096; - } - else - { - /* Don't fail, just don't use this... */ - CalleeData.len = 0; - } - } - else - { - /* Nothing */ - CalleeData.buf = NULL; - CalleeData.len = 0; - } - - /* Call the Condition Function */ - ReturnValue = (lpfnCondition)(&CallerId, - !CallerData.buf ? NULL : & CallerData, - NULL, - NULL, - &CalleeId, - !CalleeData.buf ? NULL: & CalleeData, - &GroupId, - dwCallbackData); - - if ((ReturnValue == CF_ACCEPT) && - (GroupId) && - (GroupId != SG_UNCONSTRAINED_GROUP) && - (GroupId != SG_CONSTRAINED_GROUP)) - { - /* Check for validity */ - ErrorCode = SockIsAddressConsistentWithConstrainedGroup(Socket, - GroupId, - SockAddress, - AddressSize); - ValidGroup = (ErrorCode == NO_ERROR); - } - - /* Check if the address was from the heap */ - if (SockAddress != AddressBuffer) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, SockAddress); - } - - /* Check if it was accepted */ - if (ReturnValue == CF_ACCEPT) - { - /* Check if the group is invalid, however */ - if (!ValidGroup) goto error; - - /* Now check if QOS is supported */ - if ((Socket->SharedData.ServiceFlags1 & XP1_QOS_SUPPORTED)) - { - /* Check if we had Qos */ - if (Qos) - { - /* Set the accept data */ - AcceptData.SequenceNumber = ReceivedAcceptData->SequenceNumber; - AcceptData.ListenHandle = Socket->WshContext.Handle; - - /* Save it in the TEB */ - ThreadData->AcceptData = &AcceptData; - - /* Send the IOCTL */ - BytesReturned = 0; - ReturnValue = WSPIoctl(Handle, - SIO_SET_QOS, - Qos, - sizeof(*Qos), - NULL, - 0, - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - if (ReturnValue == SOCKET_ERROR) goto error; - } - - /* Check if we had Group Qos */ - if (GroupQos) - { - /* Set the accept data */ - AcceptData.SequenceNumber = ReceivedAcceptData->SequenceNumber; - AcceptData.ListenHandle = Socket->WshContext.Handle; - - /* Save it in the TEB */ - ThreadData->AcceptData = &AcceptData; - - /* Send the IOCTL */ - ReturnValue = WSPIoctl(Handle, - SIO_SET_GROUP_QOS, - GroupQos, - sizeof(*GroupQos), - NULL, - 0, - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - if (ReturnValue == SOCKET_ERROR) goto error; - } - } - - /* Check if delayed acceptance is used and we have callee data */ - if ((Socket->HelperData->UseDelayedAcceptance) && (CalleeData.len)) - { - /* Save the accept data in the TEB */ - ThreadData->AcceptData = &AcceptData; - - /* Set the connect data */ - ErrorCode = SockGetConnectData(Socket, - IOCTL_AFD_SET_CONNECT_DATA, - CalleeData.buf, - CalleeData.len, - NULL); - if (ErrorCode == SOCKET_ERROR) goto error; - } - } - else - { - /* Callback rejected. Build Defer Structure */ - DeferData.SequenceNumber = ReceivedAcceptData->SequenceNumber; - DeferData.RejectConnection = (ReturnValue == CF_REJECT); - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_DEFER_ACCEPT, - &DeferData, - sizeof(DeferData), - NULL, - 0); - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - if (ReturnValue == CF_REJECT) - { - /* The connection was refused */ - ErrorCode = WSAECONNREFUSED; - } - else - { - /* The connection was deferred */ - ErrorCode = WSATRY_AGAIN; - } - - /* Fail */ - goto error; - } - } - - /* Create a new Socket */ - ErrorCode = SockSocket(Socket->SharedData.AddressFamily, - Socket->SharedData.SocketType, - Socket->SharedData.Protocol, - &Socket->ProviderId, - GroupId, - Socket->SharedData.CreateFlags, - Socket->SharedData.ProviderFlags, - Socket->SharedData.ServiceFlags1, - Socket->SharedData.CatalogEntryId, - &AcceptedSocket); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - goto error; - } - - /* Set up the Accept Structure */ - AcceptData.ListenHandle = AcceptedSocket->WshContext.Handle; - AcceptData.SequenceNumber = ReceivedAcceptData->SequenceNumber; - - /* Build the socket address */ - SockBuildSockaddr(AcceptedSocket->RemoteAddress, - &AcceptedSocket->SharedData.SizeOfRemoteAddress, - &ReceivedAcceptData->Address); - - /* Copy the local address */ - RtlCopyMemory(AcceptedSocket->LocalAddress, - Socket->LocalAddress, - Socket->SharedData.SizeOfLocalAddress); - AcceptedSocket->SharedData.SizeOfLocalAddress = Socket->SharedData.SizeOfLocalAddress; - - /* We can release the accepted socket's lock now */ - LeaveCriticalSection(&AcceptedSocket->Lock); - - /* Send IOCTL to Accept */ - AcceptData.UseSAN = SockSanEnabled; - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_ACCEPT, - &AcceptData, - sizeof(AcceptData), - NULL, - 0); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion outside the lock */ - LeaveCriticalSection(&Socket->Lock); - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - MAYBE_BLOCKING_HOOK, - NO_TIMEOUT); - EnterCriticalSection(&Socket->Lock); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Notify the helper DLL */ - ErrorCode = SockNotifyHelperDll(AcceptedSocket, WSH_NOTIFY_ACCEPT); - if (ErrorCode != NO_ERROR) goto error; - - /* If the caller sent a socket address pointer and length */ - if (SocketAddress && SocketAddressLength) - { - /* Return the address in its buffer */ - ErrorCode = SockBuildSockaddr(SocketAddress, - SocketAddressLength, - &ReceivedAcceptData->Address); - if (ErrorCode != NO_ERROR) goto error; - } - - /* Check if async select was active */ - if (SockAsyncSelectCalled) - { - /* Re-enable the regular accept event */ - SockReenableAsyncSelectEvent(Socket, FD_ACCEPT); - } - - /* Finally, do the internal core accept code */ - ErrorCode = SockCoreAccept(Socket, AcceptedSocket); - if (ErrorCode != NO_ERROR) goto error; - - /* Call WPU to tell it about the new handle */ - AcceptedHandle = SockUpcallTable->lpWPUModifyIFSHandle(AcceptedSocket->SharedData.CatalogEntryId, - (SOCKET)AcceptedSocket->WshContext.Handle, - &ErrorCode); - - /* Dereference the socket and clear its pointer for error code logic */ - SockDereferenceSocket(Socket); - Socket = NULL; - -error: - - /* Check if we have a socket here */ - if (Socket) - { - /* Check if async select was active */ - if (SockAsyncSelectCalled) - { - /* Re-enable the regular accept event */ - SockReenableAsyncSelectEvent(Socket, FD_ACCEPT); - } - - /* Unlock and dereference it */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - - /* Check if we got the accepted socket */ - if (AcceptedSocket) - { - /* Check if the accepted socket also has a handle */ - if (ErrorCode == NO_ERROR) - { - /* Close the socket */ - SockCloseSocket(AcceptedSocket); - } - - /* Dereference it */ - SockDereferenceSocket(AcceptedSocket); - } - - /* Check if the accept buffer was from the heap */ - if (ReceivedAcceptData && (ReceivedAcceptData != (PVOID)AfdAcceptBuffer)) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, ReceivedAcceptData); - } - - /* Check if we have a connect data buffer */ - if (ConnectData) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, ConnectData); - } - - /* Check if we have a callee data buffer */ - if (CalleeDataBuffer) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, CalleeDataBuffer); - } - - /* Check if we have allocated QOS structures */ - if (Qos) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, Qos); - } - if (GroupQos) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, GroupQos); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return INVALID_SOCKET; - } - - /* Return the new handle */ - return AcceptedHandle; -} - diff --git a/dll/win32/mswsock/msafd/addrconv.c b/dll/win32/mswsock/msafd/addrconv.c index 896ccab8748..f699ba800ae 100644 --- a/dll/win32/mswsock/msafd/addrconv.c +++ b/dll/win32/mswsock/msafd/addrconv.c @@ -36,117 +36,3 @@ WSPStringToAddress(IN LPWSTR AddressString, return 0; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -WSPAddressToString(IN LPSOCKADDR lpsaAddress, - IN DWORD dwAddressLength, - IN LPWSAPROTOCOL_INFOW lpProtocolInfo, - OUT LPWSTR lpszAddressString, - IN OUT LPDWORD lpdwAddressStringLength, - OUT LPINT lpErrno) -{ - return 0; -} - -INT -WSPAPI -WSPStringToAddress(IN LPWSTR AddressString, - IN INT AddressFamily, - IN LPWSAPROTOCOL_INFOW lpProtocolInfo, - OUT LPSOCKADDR lpAddress, - IN OUT LPINT lpAddressLength, - OUT LPINT lpErrno) -{ - return 0; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -WSPAddressToString(IN LPSOCKADDR lpsaAddress, - IN DWORD dwAddressLength, - IN LPWSAPROTOCOL_INFOW lpProtocolInfo, - OUT LPWSTR lpszAddressString, - IN OUT LPDWORD lpdwAddressStringLength, - OUT LPINT lpErrno) -{ - return 0; -} - -INT -WSPAPI -WSPStringToAddress(IN LPWSTR AddressString, - IN INT AddressFamily, - IN LPWSAPROTOCOL_INFOW lpProtocolInfo, - OUT LPSOCKADDR lpAddress, - IN OUT LPINT lpAddressLength, - OUT LPINT lpErrno) -{ - return 0; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -WSPAddressToString(IN LPSOCKADDR lpsaAddress, - IN DWORD dwAddressLength, - IN LPWSAPROTOCOL_INFOW lpProtocolInfo, - OUT LPWSTR lpszAddressString, - IN OUT LPDWORD lpdwAddressStringLength, - OUT LPINT lpErrno) -{ - return 0; -} - -INT -WSPAPI -WSPStringToAddress(IN LPWSTR AddressString, - IN INT AddressFamily, - IN LPWSAPROTOCOL_INFOW lpProtocolInfo, - OUT LPSOCKADDR lpAddress, - IN OUT LPINT lpAddressLength, - OUT LPINT lpErrno) -{ - return 0; -} - diff --git a/dll/win32/mswsock/msafd/afdsan.c b/dll/win32/mswsock/msafd/afdsan.c index 3e062e90d63..bd1ad2806dc 100644 --- a/dll/win32/mswsock/msafd/afdsan.c +++ b/dll/win32/mswsock/msafd/afdsan.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/msafd/async.c b/dll/win32/mswsock/msafd/async.c index 1f4635f34eb..a47987d7f83 100644 --- a/dll/win32/mswsock/msafd/async.c +++ b/dll/win32/mswsock/msafd/async.c @@ -196,597 +196,3 @@ SockAsyncThread(PVOID Context) FreeLibraryAndExitThread(hInstance, NO_ERROR); } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -HANDLE SockAsyncQueuePort; -LONG SockAsyncThreadReferenceCount; - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -SockCreateAsyncQueuePort(VOID) -{ - NTSTATUS Status; - OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleFlags; - - /* Create the port */ - Status = NtCreateIoCompletion(&SockAsyncQueuePort, - IO_COMPLETION_ALL_ACCESS, - NULL, - -1); - - /* Protect Handle */ - HandleFlags.ProtectFromClose = TRUE; - HandleFlags.Inherit = FALSE; - Status = NtSetInformationObject(SockAsyncQueuePort, - ObjectHandleFlagInformation, - &HandleFlags, - sizeof(HandleFlags)); - - /* Return */ - return NO_ERROR; -} - -VOID -WSPAPI -SockHandleAsyncIndication(IN PASYNC_COMPLETION_ROUTINE Callback, - IN PVOID Context, - IN PIO_STATUS_BLOCK IoStatusBlock) -{ - /* Call the completion routine */ - (*Callback)(Context, IoStatusBlock); -} - -BOOLEAN -WSPAPI -SockCheckAndReferenceAsyncThread(VOID) -{ - LONG Count; - HANDLE hAsyncThread; - DWORD AsyncThreadId; - HANDLE AsyncEvent; - NTSTATUS Status; - INT ErrorCode; - HINSTANCE hInstance; - PWINSOCK_TEB_DATA ThreadData; - - /* Loop while trying to increase the reference count */ - do - { - /* Get the count, and check if it's already been started */ - Count = SockAsyncThreadReferenceCount; - if ((Count > 0) && (InterlockedCompareExchange(&SockAsyncThreadReferenceCount, - Count + 1, - Count) == Count)) - { - /* Simply return */ - return TRUE; - } - } while (Count > 0); - - /* Acquire the lock */ - SockAcquireRwLockExclusive(&SocketGlobalLock); - - /* Check if no completion port exists already and create it */ - if (!SockAsyncQueuePort) SockCreateAsyncQueuePort(); - - /* Create an extra reference so the thread stays alive */ - ErrorCode = GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, - (LPCTSTR)WSPStartup, - &hInstance); - - /* Create the Async Event */ - Status = NtCreateEvent(&AsyncEvent, - EVENT_ALL_ACCESS, - NULL, - NotificationEvent, - FALSE); - - /* Allocate the TEB Block */ - ThreadData = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(*ThreadData)); - if (!ThreadData) - { - /* Release the lock, close the event, free extra reference and fail */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - NtClose(AsyncEvent); - FreeLibrary(hInstance); - return FALSE; - } - - /* Initialize thread data */ - RtlZeroMemory(ThreadData, sizeof(*ThreadData)); - ThreadData->EventHandle = AsyncEvent; - ThreadData->SocketHandle = (SOCKET)hInstance; - - /* Create the Async Thread */ - hAsyncThread = CreateThread(NULL, - 0, - (LPTHREAD_START_ROUTINE)SockAsyncThread, - ThreadData, - 0, - &AsyncThreadId); - - /* Close the Handle */ - NtClose(hAsyncThread); - - /* Increase the Reference Count */ - InterlockedExchangeAdd(&SockAsyncThreadReferenceCount, 2); - - /* Release lock and return success */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - return TRUE; -} - -INT -WSPAPI -SockAsyncThread(PVOID Context) -{ - PVOID AsyncContext; - PASYNC_COMPLETION_ROUTINE AsyncCompletionRoutine; - IO_STATUS_BLOCK IoStatusBlock; - NTSTATUS Status; - LARGE_INTEGER Timeout; - PWINSOCK_TEB_DATA ThreadData = (PWINSOCK_TEB_DATA)Context; - HINSTANCE hInstance = (HINSTANCE)ThreadData->SocketHandle; - - /* Return the socket handle back to its unhacked value */ - ThreadData->SocketHandle = INVALID_SOCKET; - - /* Setup the Thread Data pointer */ - NtCurrentTeb()->WinSockData = ThreadData; - - /* Make the Thread Higher Priority */ - SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL); - - /* Setup timeout */ - Timeout.QuadPart = Int32x32To64(300, 10000000); - - /* Do a KQUEUE/WorkItem Style Loop, thanks to IoCompletion Ports */ - do { - /* Get the next completion item */ - Status = NtRemoveIoCompletion(SockAsyncQueuePort, - (PVOID*)&AsyncCompletionRoutine, - &AsyncContext, - &IoStatusBlock, - &Timeout); - /* Check for success */ - if (NT_SUCCESS(Status)) - { - /* Check if this isn't the termination command */ - if (AsyncCompletionRoutine != (PVOID)-1) - { - /* Call the routine */ - SockHandleAsyncIndication(AsyncCompletionRoutine, - Context, - &IoStatusBlock); - } - else - { - /* We have to terminate, fake a timeout */ - Status = STATUS_TIMEOUT; - InterlockedDecrement(&SockAsyncThreadReferenceCount); - } - } - else if ((SockAsyncThreadReferenceCount > 1) && (NT_ERROR(Status))) - { - /* It Failed, sleep for a second */ - Sleep(1000); - } - } while (((Status != STATUS_TIMEOUT) && - (SockWspStartupCount > 0)) || - InterlockedCompareExchange(&SockAsyncThreadReferenceCount, 0, 1) != 1); - - /* Release the lock */ - SockReleaseRwLockShared(&SocketGlobalLock); - - /* Remove our extra reference */ - FreeLibraryAndExitThread(hInstance, NO_ERROR); -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -HANDLE SockAsyncQueuePort; -LONG SockAsyncThreadReferenceCount; - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -SockCreateAsyncQueuePort(VOID) -{ - NTSTATUS Status; - OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleFlags; - - /* Create the port */ - Status = NtCreateIoCompletion(&SockAsyncQueuePort, - IO_COMPLETION_ALL_ACCESS, - NULL, - -1); - - /* Protect Handle */ - HandleFlags.ProtectFromClose = TRUE; - HandleFlags.Inherit = FALSE; - Status = NtSetInformationObject(SockAsyncQueuePort, - ObjectHandleFlagInformation, - &HandleFlags, - sizeof(HandleFlags)); - - /* Return */ - return NO_ERROR; -} - -VOID -WSPAPI -SockHandleAsyncIndication(IN PASYNC_COMPLETION_ROUTINE Callback, - IN PVOID Context, - IN PIO_STATUS_BLOCK IoStatusBlock) -{ - /* Call the completion routine */ - (*Callback)(Context, IoStatusBlock); -} - -BOOLEAN -WSPAPI -SockCheckAndReferenceAsyncThread(VOID) -{ - LONG Count; - HANDLE hAsyncThread; - DWORD AsyncThreadId; - HANDLE AsyncEvent; - NTSTATUS Status; - INT ErrorCode; - HINSTANCE hInstance; - PWINSOCK_TEB_DATA ThreadData; - - /* Loop while trying to increase the reference count */ - do - { - /* Get the count, and check if it's already been started */ - Count = SockAsyncThreadReferenceCount; - if ((Count > 0) && (InterlockedCompareExchange(&SockAsyncThreadReferenceCount, - Count + 1, - Count) == Count)) - { - /* Simply return */ - return TRUE; - } - } while (Count > 0); - - /* Acquire the lock */ - SockAcquireRwLockExclusive(&SocketGlobalLock); - - /* Check if no completion port exists already and create it */ - if (!SockAsyncQueuePort) SockCreateAsyncQueuePort(); - - /* Create an extra reference so the thread stays alive */ - ErrorCode = GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, - (LPCTSTR)WSPStartup, - &hInstance); - - /* Create the Async Event */ - Status = NtCreateEvent(&AsyncEvent, - EVENT_ALL_ACCESS, - NULL, - NotificationEvent, - FALSE); - - /* Allocate the TEB Block */ - ThreadData = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(*ThreadData)); - if (!ThreadData) - { - /* Release the lock, close the event, free extra reference and fail */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - NtClose(AsyncEvent); - FreeLibrary(hInstance); - return FALSE; - } - - /* Initialize thread data */ - RtlZeroMemory(ThreadData, sizeof(*ThreadData)); - ThreadData->EventHandle = AsyncEvent; - ThreadData->SocketHandle = (SOCKET)hInstance; - - /* Create the Async Thread */ - hAsyncThread = CreateThread(NULL, - 0, - (LPTHREAD_START_ROUTINE)SockAsyncThread, - ThreadData, - 0, - &AsyncThreadId); - - /* Close the Handle */ - NtClose(hAsyncThread); - - /* Increase the Reference Count */ - InterlockedExchangeAdd(&SockAsyncThreadReferenceCount, 2); - - /* Release lock and return success */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - return TRUE; -} - -INT -WSPAPI -SockAsyncThread(PVOID Context) -{ - PVOID AsyncContext; - PASYNC_COMPLETION_ROUTINE AsyncCompletionRoutine; - IO_STATUS_BLOCK IoStatusBlock; - NTSTATUS Status; - LARGE_INTEGER Timeout; - PWINSOCK_TEB_DATA ThreadData = (PWINSOCK_TEB_DATA)Context; - HINSTANCE hInstance = (HINSTANCE)ThreadData->SocketHandle; - - /* Return the socket handle back to its unhacked value */ - ThreadData->SocketHandle = INVALID_SOCKET; - - /* Setup the Thread Data pointer */ - NtCurrentTeb()->WinSockData = ThreadData; - - /* Make the Thread Higher Priority */ - SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL); - - /* Setup timeout */ - Timeout.QuadPart = Int32x32To64(300, 10000000); - - /* Do a KQUEUE/WorkItem Style Loop, thanks to IoCompletion Ports */ - do { - /* Get the next completion item */ - Status = NtRemoveIoCompletion(SockAsyncQueuePort, - (PVOID*)&AsyncCompletionRoutine, - &AsyncContext, - &IoStatusBlock, - &Timeout); - /* Check for success */ - if (NT_SUCCESS(Status)) - { - /* Check if this isn't the termination command */ - if (AsyncCompletionRoutine != (PVOID)-1) - { - /* Call the routine */ - SockHandleAsyncIndication(AsyncCompletionRoutine, - Context, - &IoStatusBlock); - } - else - { - /* We have to terminate, fake a timeout */ - Status = STATUS_TIMEOUT; - InterlockedDecrement(&SockAsyncThreadReferenceCount); - } - } - else if ((SockAsyncThreadReferenceCount > 1) && (NT_ERROR(Status))) - { - /* It Failed, sleep for a second */ - Sleep(1000); - } - } while (((Status != STATUS_TIMEOUT) && - (SockWspStartupCount > 0)) || - InterlockedCompareExchange(&SockAsyncThreadReferenceCount, 0, 1) != 1); - - /* Release the lock */ - SockReleaseRwLockShared(&SocketGlobalLock); - - /* Remove our extra reference */ - FreeLibraryAndExitThread(hInstance, NO_ERROR); -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -HANDLE SockAsyncQueuePort; -LONG SockAsyncThreadReferenceCount; - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -SockCreateAsyncQueuePort(VOID) -{ - NTSTATUS Status; - OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleFlags; - - /* Create the port */ - Status = NtCreateIoCompletion(&SockAsyncQueuePort, - IO_COMPLETION_ALL_ACCESS, - NULL, - -1); - - /* Protect Handle */ - HandleFlags.ProtectFromClose = TRUE; - HandleFlags.Inherit = FALSE; - Status = NtSetInformationObject(SockAsyncQueuePort, - ObjectHandleFlagInformation, - &HandleFlags, - sizeof(HandleFlags)); - - /* Return */ - return NO_ERROR; -} - -VOID -WSPAPI -SockHandleAsyncIndication(IN PASYNC_COMPLETION_ROUTINE Callback, - IN PVOID Context, - IN PIO_STATUS_BLOCK IoStatusBlock) -{ - /* Call the completion routine */ - (*Callback)(Context, IoStatusBlock); -} - -BOOLEAN -WSPAPI -SockCheckAndReferenceAsyncThread(VOID) -{ - LONG Count; - HANDLE hAsyncThread; - DWORD AsyncThreadId; - HANDLE AsyncEvent; - NTSTATUS Status; - INT ErrorCode; - HINSTANCE hInstance; - PWINSOCK_TEB_DATA ThreadData; - - /* Loop while trying to increase the reference count */ - do - { - /* Get the count, and check if it's already been started */ - Count = SockAsyncThreadReferenceCount; - if ((Count > 0) && (InterlockedCompareExchange(&SockAsyncThreadReferenceCount, - Count + 1, - Count) == Count)) - { - /* Simply return */ - return TRUE; - } - } while (Count > 0); - - /* Acquire the lock */ - SockAcquireRwLockExclusive(&SocketGlobalLock); - - /* Check if no completion port exists already and create it */ - if (!SockAsyncQueuePort) SockCreateAsyncQueuePort(); - - /* Create an extra reference so the thread stays alive */ - ErrorCode = GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, - (LPCTSTR)WSPStartup, - &hInstance); - - /* Create the Async Event */ - Status = NtCreateEvent(&AsyncEvent, - EVENT_ALL_ACCESS, - NULL, - NotificationEvent, - FALSE); - - /* Allocate the TEB Block */ - ThreadData = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(*ThreadData)); - if (!ThreadData) - { - /* Release the lock, close the event, free extra reference and fail */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - NtClose(AsyncEvent); - FreeLibrary(hInstance); - return FALSE; - } - - /* Initialize thread data */ - RtlZeroMemory(ThreadData, sizeof(*ThreadData)); - ThreadData->EventHandle = AsyncEvent; - ThreadData->SocketHandle = (SOCKET)hInstance; - - /* Create the Async Thread */ - hAsyncThread = CreateThread(NULL, - 0, - (LPTHREAD_START_ROUTINE)SockAsyncThread, - ThreadData, - 0, - &AsyncThreadId); - - /* Close the Handle */ - NtClose(hAsyncThread); - - /* Increase the Reference Count */ - InterlockedExchangeAdd(&SockAsyncThreadReferenceCount, 2); - - /* Release lock and return success */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - return TRUE; -} - -INT -WSPAPI -SockAsyncThread(PVOID Context) -{ - PVOID AsyncContext; - PASYNC_COMPLETION_ROUTINE AsyncCompletionRoutine; - IO_STATUS_BLOCK IoStatusBlock; - NTSTATUS Status; - LARGE_INTEGER Timeout; - PWINSOCK_TEB_DATA ThreadData = (PWINSOCK_TEB_DATA)Context; - HINSTANCE hInstance = (HINSTANCE)ThreadData->SocketHandle; - - /* Return the socket handle back to its unhacked value */ - ThreadData->SocketHandle = INVALID_SOCKET; - - /* Setup the Thread Data pointer */ - NtCurrentTeb()->WinSockData = ThreadData; - - /* Make the Thread Higher Priority */ - SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL); - - /* Setup timeout */ - Timeout.QuadPart = Int32x32To64(300, 10000000); - - /* Do a KQUEUE/WorkItem Style Loop, thanks to IoCompletion Ports */ - do { - /* Get the next completion item */ - Status = NtRemoveIoCompletion(SockAsyncQueuePort, - (PVOID*)&AsyncCompletionRoutine, - &AsyncContext, - &IoStatusBlock, - &Timeout); - /* Check for success */ - if (NT_SUCCESS(Status)) - { - /* Check if this isn't the termination command */ - if (AsyncCompletionRoutine != (PVOID)-1) - { - /* Call the routine */ - SockHandleAsyncIndication(AsyncCompletionRoutine, - Context, - &IoStatusBlock); - } - else - { - /* We have to terminate, fake a timeout */ - Status = STATUS_TIMEOUT; - InterlockedDecrement(&SockAsyncThreadReferenceCount); - } - } - else if ((SockAsyncThreadReferenceCount > 1) && (NT_ERROR(Status))) - { - /* It Failed, sleep for a second */ - Sleep(1000); - } - } while (((Status != STATUS_TIMEOUT) && - (SockWspStartupCount > 0)) || - InterlockedCompareExchange(&SockAsyncThreadReferenceCount, 0, 1) != 1); - - /* Release the lock */ - SockReleaseRwLockShared(&SocketGlobalLock); - - /* Remove our extra reference */ - FreeLibraryAndExitThread(hInstance, NO_ERROR); -} - diff --git a/dll/win32/mswsock/msafd/bind.c b/dll/win32/mswsock/msafd/bind.c index a2325c24fce..fa3ff3b21ba 100644 --- a/dll/win32/mswsock/msafd/bind.c +++ b/dll/win32/mswsock/msafd/bind.c @@ -211,642 +211,3 @@ error: return NO_ERROR; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -WSPBind(SOCKET Handle, - const SOCKADDR *SocketAddress, - INT SocketAddressLength, - LPINT lpErrno) -{ - INT ErrorCode; - IO_STATUS_BLOCK IoStatusBlock; - PAFD_BIND_DATA BindData; - PSOCKET_INFORMATION Socket; - NTSTATUS Status; - PTDI_ADDRESS_INFO TdiAddress = NULL; - SOCKADDR_INFO SocketInfo; - PWINSOCK_TEB_DATA ThreadData; - CHAR AddressBuffer[FIELD_OFFSET(TDI_ADDRESS_INFO, Address) + - MAX_TDI_ADDRESS_LENGTH]; - ULONG BindDataLength, TdiAddressLength; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* If the socket is already bound, fail */ - if (Socket->SharedData.State != SocketOpen) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Normalize address size */ - if (SocketAddressLength > Socket->HelperData->MaxWSAddressLength) - { - /* Don't go beyond the maximum */ - SocketAddressLength = Socket->HelperData->MaxWSAddressLength; - } - - /* Get Address Information */ - ErrorCode = Socket->HelperData->WSHGetSockaddrType((PSOCKADDR)SocketAddress, - SocketAddressLength, - &SocketInfo); - if (ErrorCode != NO_ERROR) goto error; - - /* Check how big the Bind and TDI Address Data will be */ - BindDataLength = Socket->HelperData->MaxTDIAddressLength + - FIELD_OFFSET(AFD_BIND_DATA, Address); - TdiAddressLength = Socket->HelperData->MaxTDIAddressLength + - FIELD_OFFSET(TDI_ADDRESS_INFO, Address); - - /* Check if we can fit it in the stack */ - if ((TdiAddressLength <= sizeof(AddressBuffer)) && - (BindDataLength <= sizeof(AddressBuffer))) - { - /* Use the stack */ - TdiAddress = (PVOID)AddressBuffer; - BindData = (PAFD_BIND_DATA)AddressBuffer; - } - else - { - /* Allocate from the heap */ - TdiAddress = SockAllocateHeapRoutine(SockPrivateHeap, 0, TdiAddressLength); - if (!TdiAddress) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - BindData = (PAFD_BIND_DATA)TdiAddress; - } - - /* Set the Share Type */ - if (Socket->SharedData.ExclusiveAddressUse) - { - BindData->ShareType = AFD_SHARE_EXCLUSIVE; - } - else if (SocketInfo.EndpointInfo == SockaddrEndpointInfoWildcard) - { - BindData->ShareType = AFD_SHARE_WILDCARD; - } - else if (Socket->SharedData.ReuseAddresses) - { - BindData->ShareType = AFD_SHARE_REUSE; - } - else - { - BindData->ShareType = AFD_SHARE_UNIQUE; - } - - /* Build the TDI Address */ - ErrorCode = SockBuildTdiAddress(&BindData->Address, - (PSOCKADDR)SocketAddress, - SocketAddressLength); - if (ErrorCode != NO_ERROR) goto error; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_BIND, - BindData, - BindDataLength, - TdiAddress, - TdiAddressLength); - - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion outside the lock */ - LeaveCriticalSection(&Socket->Lock); - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - EnterCriticalSection(&Socket->Lock); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Save the TDI Address handle */ - Socket->TdiAddressHandle = (HANDLE)IoStatusBlock.Information; - - /* Notify the helper DLL */ - ErrorCode = SockNotifyHelperDll(Socket, WSH_NOTIFY_BIND); - if (ErrorCode != NO_ERROR) goto error; - - /* Re-create Sockaddr format */ - ErrorCode = SockBuildSockaddr(Socket->LocalAddress, - &SocketAddressLength, - &TdiAddress->Address); - if (ErrorCode != NO_ERROR) goto error; - - /* Set us as bound */ - Socket->SharedData.State = SocketBound; - - /* Send the new data to AFD */ - ErrorCode = SockSetHandleContext(Socket); - if (ErrorCode != NO_ERROR) goto error; - - /* Update the window sizes */ - ErrorCode = SockUpdateWindowSizes(Socket, FALSE); - if (ErrorCode != NO_ERROR) goto error; - -error: - /* Check if we have a socket here */ - if (Socket) - { - /* Release the lock and dereference */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - - /* Check if we should free the TDI address */ - if ((TdiAddress) && (TdiAddress != (PVOID)AddressBuffer)) - { - /* Free the Buffer */ - RtlFreeHeap(SockPrivateHeap, 0, TdiAddress); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -WSPBind(SOCKET Handle, - const SOCKADDR *SocketAddress, - INT SocketAddressLength, - LPINT lpErrno) -{ - INT ErrorCode; - IO_STATUS_BLOCK IoStatusBlock; - PAFD_BIND_DATA BindData; - PSOCKET_INFORMATION Socket; - NTSTATUS Status; - PTDI_ADDRESS_INFO TdiAddress = NULL; - SOCKADDR_INFO SocketInfo; - PWINSOCK_TEB_DATA ThreadData; - CHAR AddressBuffer[FIELD_OFFSET(TDI_ADDRESS_INFO, Address) + - MAX_TDI_ADDRESS_LENGTH]; - ULONG BindDataLength, TdiAddressLength; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* If the socket is already bound, fail */ - if (Socket->SharedData.State != SocketOpen) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Normalize address size */ - if (SocketAddressLength > Socket->HelperData->MaxWSAddressLength) - { - /* Don't go beyond the maximum */ - SocketAddressLength = Socket->HelperData->MaxWSAddressLength; - } - - /* Get Address Information */ - ErrorCode = Socket->HelperData->WSHGetSockaddrType((PSOCKADDR)SocketAddress, - SocketAddressLength, - &SocketInfo); - if (ErrorCode != NO_ERROR) goto error; - - /* Check how big the Bind and TDI Address Data will be */ - BindDataLength = Socket->HelperData->MaxTDIAddressLength + - FIELD_OFFSET(AFD_BIND_DATA, Address); - TdiAddressLength = Socket->HelperData->MaxTDIAddressLength + - FIELD_OFFSET(TDI_ADDRESS_INFO, Address); - - /* Check if we can fit it in the stack */ - if ((TdiAddressLength <= sizeof(AddressBuffer)) && - (BindDataLength <= sizeof(AddressBuffer))) - { - /* Use the stack */ - TdiAddress = (PVOID)AddressBuffer; - BindData = (PAFD_BIND_DATA)AddressBuffer; - } - else - { - /* Allocate from the heap */ - TdiAddress = SockAllocateHeapRoutine(SockPrivateHeap, 0, TdiAddressLength); - if (!TdiAddress) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - BindData = (PAFD_BIND_DATA)TdiAddress; - } - - /* Set the Share Type */ - if (Socket->SharedData.ExclusiveAddressUse) - { - BindData->ShareType = AFD_SHARE_EXCLUSIVE; - } - else if (SocketInfo.EndpointInfo == SockaddrEndpointInfoWildcard) - { - BindData->ShareType = AFD_SHARE_WILDCARD; - } - else if (Socket->SharedData.ReuseAddresses) - { - BindData->ShareType = AFD_SHARE_REUSE; - } - else - { - BindData->ShareType = AFD_SHARE_UNIQUE; - } - - /* Build the TDI Address */ - ErrorCode = SockBuildTdiAddress(&BindData->Address, - (PSOCKADDR)SocketAddress, - SocketAddressLength); - if (ErrorCode != NO_ERROR) goto error; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_BIND, - BindData, - BindDataLength, - TdiAddress, - TdiAddressLength); - - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion outside the lock */ - LeaveCriticalSection(&Socket->Lock); - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - EnterCriticalSection(&Socket->Lock); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Save the TDI Address handle */ - Socket->TdiAddressHandle = (HANDLE)IoStatusBlock.Information; - - /* Notify the helper DLL */ - ErrorCode = SockNotifyHelperDll(Socket, WSH_NOTIFY_BIND); - if (ErrorCode != NO_ERROR) goto error; - - /* Re-create Sockaddr format */ - ErrorCode = SockBuildSockaddr(Socket->LocalAddress, - &SocketAddressLength, - &TdiAddress->Address); - if (ErrorCode != NO_ERROR) goto error; - - /* Set us as bound */ - Socket->SharedData.State = SocketBound; - - /* Send the new data to AFD */ - ErrorCode = SockSetHandleContext(Socket); - if (ErrorCode != NO_ERROR) goto error; - - /* Update the window sizes */ - ErrorCode = SockUpdateWindowSizes(Socket, FALSE); - if (ErrorCode != NO_ERROR) goto error; - -error: - /* Check if we have a socket here */ - if (Socket) - { - /* Release the lock and dereference */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - - /* Check if we should free the TDI address */ - if ((TdiAddress) && (TdiAddress != (PVOID)AddressBuffer)) - { - /* Free the Buffer */ - RtlFreeHeap(SockPrivateHeap, 0, TdiAddress); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -WSPBind(SOCKET Handle, - const SOCKADDR *SocketAddress, - INT SocketAddressLength, - LPINT lpErrno) -{ - INT ErrorCode; - IO_STATUS_BLOCK IoStatusBlock; - PAFD_BIND_DATA BindData; - PSOCKET_INFORMATION Socket; - NTSTATUS Status; - PTDI_ADDRESS_INFO TdiAddress = NULL; - SOCKADDR_INFO SocketInfo; - PWINSOCK_TEB_DATA ThreadData; - CHAR AddressBuffer[FIELD_OFFSET(TDI_ADDRESS_INFO, Address) + - MAX_TDI_ADDRESS_LENGTH]; - ULONG BindDataLength, TdiAddressLength; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* If the socket is already bound, fail */ - if (Socket->SharedData.State != SocketOpen) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Normalize address size */ - if (SocketAddressLength > Socket->HelperData->MaxWSAddressLength) - { - /* Don't go beyond the maximum */ - SocketAddressLength = Socket->HelperData->MaxWSAddressLength; - } - - /* Get Address Information */ - ErrorCode = Socket->HelperData->WSHGetSockaddrType((PSOCKADDR)SocketAddress, - SocketAddressLength, - &SocketInfo); - if (ErrorCode != NO_ERROR) goto error; - - /* Check how big the Bind and TDI Address Data will be */ - BindDataLength = Socket->HelperData->MaxTDIAddressLength + - FIELD_OFFSET(AFD_BIND_DATA, Address); - TdiAddressLength = Socket->HelperData->MaxTDIAddressLength + - FIELD_OFFSET(TDI_ADDRESS_INFO, Address); - - /* Check if we can fit it in the stack */ - if ((TdiAddressLength <= sizeof(AddressBuffer)) && - (BindDataLength <= sizeof(AddressBuffer))) - { - /* Use the stack */ - TdiAddress = (PVOID)AddressBuffer; - BindData = (PAFD_BIND_DATA)AddressBuffer; - } - else - { - /* Allocate from the heap */ - TdiAddress = SockAllocateHeapRoutine(SockPrivateHeap, 0, TdiAddressLength); - if (!TdiAddress) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - BindData = (PAFD_BIND_DATA)TdiAddress; - } - - /* Set the Share Type */ - if (Socket->SharedData.ExclusiveAddressUse) - { - BindData->ShareType = AFD_SHARE_EXCLUSIVE; - } - else if (SocketInfo.EndpointInfo == SockaddrEndpointInfoWildcard) - { - BindData->ShareType = AFD_SHARE_WILDCARD; - } - else if (Socket->SharedData.ReuseAddresses) - { - BindData->ShareType = AFD_SHARE_REUSE; - } - else - { - BindData->ShareType = AFD_SHARE_UNIQUE; - } - - /* Build the TDI Address */ - ErrorCode = SockBuildTdiAddress(&BindData->Address, - (PSOCKADDR)SocketAddress, - SocketAddressLength); - if (ErrorCode != NO_ERROR) goto error; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_BIND, - BindData, - BindDataLength, - TdiAddress, - TdiAddressLength); - - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion outside the lock */ - LeaveCriticalSection(&Socket->Lock); - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - EnterCriticalSection(&Socket->Lock); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Save the TDI Address handle */ - Socket->TdiAddressHandle = (HANDLE)IoStatusBlock.Information; - - /* Notify the helper DLL */ - ErrorCode = SockNotifyHelperDll(Socket, WSH_NOTIFY_BIND); - if (ErrorCode != NO_ERROR) goto error; - - /* Re-create Sockaddr format */ - ErrorCode = SockBuildSockaddr(Socket->LocalAddress, - &SocketAddressLength, - &TdiAddress->Address); - if (ErrorCode != NO_ERROR) goto error; - - /* Set us as bound */ - Socket->SharedData.State = SocketBound; - - /* Send the new data to AFD */ - ErrorCode = SockSetHandleContext(Socket); - if (ErrorCode != NO_ERROR) goto error; - - /* Update the window sizes */ - ErrorCode = SockUpdateWindowSizes(Socket, FALSE); - if (ErrorCode != NO_ERROR) goto error; - -error: - /* Check if we have a socket here */ - if (Socket) - { - /* Release the lock and dereference */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - - /* Check if we should free the TDI address */ - if ((TdiAddress) && (TdiAddress != (PVOID)AddressBuffer)) - { - /* Free the Buffer */ - RtlFreeHeap(SockPrivateHeap, 0, TdiAddress); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - diff --git a/dll/win32/mswsock/msafd/connect.c b/dll/win32/mswsock/msafd/connect.c index a2f0fc46750..28d0a12d9e8 100644 --- a/dll/win32/mswsock/msafd/connect.c +++ b/dll/win32/mswsock/msafd/connect.c @@ -676,2037 +676,3 @@ WSPJoinLeaf(IN SOCKET s, return (SOCKET)0; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -BOOLEAN -WSPAPI -IsSockaddrEqualToZero(IN const struct sockaddr* SocketAddress, - IN INT SocketAddressLength) -{ - INT i; - - for (i = 0; i < SocketAddressLength; i++) - { - /* Make sure it's 0 */ - if (*(PULONG)SocketAddress + i)return FALSE; - } - - /* All zeroes, succees! */ - return TRUE; -} - -INT -WSPAPI -UnconnectDatagramSocket(IN PSOCKET_INFORMATION Socket) -{ - NTSTATUS Status; - INT ErrorCode; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - AFD_DISCONNECT_INFO DisconnectInfo; - IO_STATUS_BLOCK IoStatusBlock; - - /* Set up the disconnect information */ - DisconnectInfo.Timeout = RtlConvertLongToLargeInteger(-1); - DisconnectInfo.DisconnectType = AFD_DISCONNECT_DATAGRAM; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_DISCONNECT, - &DisconnectInfo, - sizeof(DisconnectInfo), - NULL, - 0); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion outside the lock */ - LeaveCriticalSection(&Socket->Lock); - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - EnterCriticalSection(&Socket->Lock); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Convert error code */ - ErrorCode = NtStatusToSocketError(Status); - } - else - { - /* Set us as disconnected (back to bound) */ - Socket->SharedData.State = SocketBound; - ErrorCode = NO_ERROR; - } - - /* Return to caller */ - return ErrorCode; -} - -INT -WSPAPI -SockPostProcessConnect(IN PSOCKET_INFORMATION Socket) -{ - INT ErrorCode; - - /* Notify the helper DLL */ - ErrorCode = SockNotifyHelperDll(Socket, WSH_NOTIFY_CONNECT); - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Set the new state and update the context in AFD */ - Socket->SharedData.State = SocketConnected; - ErrorCode = SockSetHandleContext(Socket); - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Update the window sizes */ - ErrorCode = SockUpdateWindowSizes(Socket, FALSE); - - /* Return to caller */ - return ErrorCode; -} - -INT -WSPAPI -SockDoConnectReal(IN PSOCKET_INFORMATION Socket, - IN const struct sockaddr *SocketAddress, - IN INT SocketAddressLength, - IN LPWSABUF lpCalleeData, - IN BOOLEAN UseSan) -{ - INT ErrorCode; - NTSTATUS Status; - DWORD ConnectDataLength; - IO_STATUS_BLOCK IoStatusBlock; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - CHAR ConnectBuffer[FIELD_OFFSET(AFD_CONNECT_INFO, RemoteAddress) + - MAX_TDI_ADDRESS_LENGTH]; - PAFD_CONNECT_INFO ConnectInfo; - ULONG ConnectInfoLength; - - /* Check if someone is waiting for FD_CONNECT */ - if (Socket->SharedData.AsyncEvents & FD_CONNECT) - { - /* - * Disable FD_WRITE and FD_CONNECT - * The latter fixes a race condition where the FD_CONNECT is re-enabled - * at the end of this function right after the Async Thread disables it. - * This should only happen at the *next* WSPConnect - */ - Socket->SharedData.AsyncDisabledEvents |= FD_CONNECT | FD_WRITE; - } - - /* Calculate how much the connection structure will take */ - ConnectInfoLength = FIELD_OFFSET(AFD_CONNECT_INFO, RemoteAddress) + - Socket->HelperData->MaxTDIAddressLength; - - /* Check if our stack buffer is enough */ - if (ConnectInfoLength <= sizeof(ConnectBuffer)) - { - /* Use the stack */ - ConnectInfo = (PVOID)ConnectBuffer; - } - else - { - /* Allocate from heap */ - ConnectInfo = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - ConnectInfoLength); - if (!ConnectInfo) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - } - - /* Create the TDI Address */ - ErrorCode = SockBuildTdiAddress(&ConnectInfo->RemoteAddress, - (PSOCKADDR)SocketAddress, - SocketAddressLength); - if (ErrorCode != NO_ERROR) goto error; - - /* Set the SAN State */ - ConnectInfo->UseSAN = SockSanEnabled; - - /* Check if this is a non-blocking streaming socket */ - if ((Socket->SharedData.NonBlocking) && !(MSAFD_IS_DGRAM_SOCK(Socket))) - { - /* Create the Async Thread if Needed */ - if (!SockCheckAndReferenceAsyncThread()) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - - Status = 0; - } - else - { - /* Start the connect loop */ - do - { - /* Send IOCTL */ - IoStatusBlock.Status = STATUS_PENDING; - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_CONNECT, - ConnectInfo, - ConnectInfoLength, - NULL, - 0); - - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion outside the lock */ - LeaveCriticalSection(&Socket->Lock); - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - EnterCriticalSection(&Socket->Lock); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Make sure we're not closed */ - if (Socket->SharedData.State == SocketClosed) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Check if we failed */ - if (!NT_SUCCESS(Status)) - { - /* Tell the helper DLL */ - ErrorCode = SockNotifyHelperDll(Socket, WSH_NOTIFY_CONNECT_ERROR); - } - - /* Keep looping if the Helper DLL wants us to */ - } while (ErrorCode == WSATRY_AGAIN); - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Now do post-processing */ - ErrorCode = SockPostProcessConnect(Socket); - if (ErrorCode != NO_ERROR) goto error; - - /* Check if we had callee data */ - if ((lpCalleeData) && (lpCalleeData->buf) && (lpCalleeData->len > 0)) - { - /* Set it */ - ErrorCode = SockGetConnectData(Socket, - IOCTL_AFD_SET_CONNECT_DATA_SIZE, - lpCalleeData->buf, - ConnectDataLength, - &ConnectDataLength); - if (ErrorCode == NO_ERROR) - { - /* If we didn't get any data, then assume the buffer is empty */ - if (!lpCalleeData->len) lpCalleeData->buf = NULL; - } - else - { - /* This isn't fatal, assume we didn't get anything instead */ - lpCalleeData->len = 0; - lpCalleeData->buf = NULL; - } - - /* Assume success */ - ErrorCode = NO_ERROR; - } - -error: - - /* Check if we need to free the connect info from the heap */ - if (ConnectInfo && (ConnectInfo != (PVOID)ConnectBuffer)) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, ConnectInfo); - } - - /* Check if this the success path */ - if (ErrorCode == NO_ERROR) - { - /* Check if FD_WRITE is being select()ed */ - if (Socket->SharedData.AsyncEvents & FD_WRITE) - { - /* Re-enable it */ - SockReenableAsyncSelectEvent(Socket, FD_WRITE); - } - } - - /* Return the error */ - return ErrorCode; -} - -INT -WSPAPI -SockDoConnect(SOCKET Handle, - const struct sockaddr *SocketAddress, - INT SocketAddressLength, - LPWSABUF lpCallerData, - LPWSABUF lpCalleeData, - LPQOS lpSQOS, - LPQOS lpGQOS) -{ - PSOCKET_INFORMATION Socket; - SOCKADDR_INFO SocketInfo; - PSOCKADDR Sockaddr; - PWINSOCK_TEB_DATA ThreadData; - INT SockaddrLength; - INT ErrorCode, ReturnValue; - DWORD ConnectDataLength; - DWORD BytesReturned; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Make sure we're not already connected unless we are a datagram socket */ - if ((Socket->SharedData.State == SocketConnected) && - !(MSAFD_IS_DGRAM_SOCK(Socket))) - { - /* Fail */ - ErrorCode = WSAEISCONN; - goto error; - } - - /* Check if async connect was in progress */ - if (Socket->AsyncData) - { - /* We have to clean it up */ - SockIsSocketConnected(Socket); - - /* Check again */ - if (Socket->AsyncData) - { - /* Can't do anything but fail now */ - ErrorCode = WSAEALREADY; - goto error; - } - } - - /* Make sure we're either unbound, bound, or connected */ - if ((Socket->SharedData.State != SocketOpen) && - (Socket->SharedData.State != SocketBound) && - (Socket->SharedData.State != SocketConnected)) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Normalize the address length */ - SocketAddressLength = min(SocketAddressLength, - Socket->HelperData->MaxWSAddressLength); - - /* Also make sure it's not too small */ - if (SocketAddressLength < Socket->HelperData->MinWSAddressLength) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* - * If this is a connected socket, and the address is null (0.0.0.0), - * then do a partial disconnect if this is a datagram socket. - */ - if ((Socket->SharedData.State == SocketConnected) && - (MSAFD_IS_DGRAM_SOCK(Socket)) && - (IsSockaddrEqualToZero(SocketAddress, SocketAddressLength))) - { - /* Disconnect the socket and return */ - return UnconnectDatagramSocket(Socket); - } - - /* Make sure the Address Family is valid */ - if (Socket->SharedData.AddressFamily != SocketAddress->sa_family) - { - /* Fail */ - ErrorCode = WSAEAFNOSUPPORT; - goto error; - } - - /* If this is a non-broadcast datagram socket */ - if ((MSAFD_IS_DGRAM_SOCK(Socket) && !(Socket->SharedData.Broadcast))) - { - /* Find out what kind of address this is */ - ErrorCode = Socket->HelperData->WSHGetSockaddrType((PSOCKADDR)SocketAddress, - SocketAddressLength, - &SocketInfo); - if (ErrorCode != NO_ERROR) - { - /* Find out if this is a broadcast address */ - if (SocketInfo.AddressInfo == SockaddrAddressInfoBroadcast) - { - /* Fail: SO_BROADCAST must be set first in WinSock 2.0+ */ - ErrorCode = WSAEACCES; - } - } - - /* A failure here isn't fatal */ - ErrorCode = NO_ERROR; - } - - /* Check if this is a constrained group */ - if (Socket->SharedData.GroupType == SG_CONSTRAINED_GROUP) - { - /* Validate the address and fail if it's not consistent */ - ErrorCode = SockIsAddressConsistentWithConstrainedGroup(Socket, - Socket->SharedData.GroupID, - (PSOCKADDR)SocketAddress, - SocketAddressLength); - if (ErrorCode != NO_ERROR) goto error; - } - - /* Check if this socket isn't bound yet */ - if (Socket->SharedData.State == SocketOpen) - { - /* Check if we can request the wildcard address */ - if (Socket->HelperData->WSHGetWildcardSockaddr) - { - /* Allocate a new Sockaddr */ - SockaddrLength = Socket->HelperData->MaxWSAddressLength; - Sockaddr = SockAllocateHeapRoutine(SockPrivateHeap, 0, SockaddrLength); - if (!Sockaddr) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - - /* Get the wildcard sockaddr */ - ErrorCode = Socket->HelperData->WSHGetWildcardSockaddr(Socket->HelperContext, - Sockaddr, - &SockaddrLength); - if (ErrorCode != NO_ERROR) - { - /* Free memory and fail */ - RtlFreeHeap(SockPrivateHeap, 0, Sockaddr); - goto error; - } - - /* Bind it */ - ReturnValue = WSPBind(Handle, - Sockaddr, - SockaddrLength, - &ErrorCode); - - /* Free memory */ - RtlFreeHeap(SockPrivateHeap, 0, Sockaddr); - - /* Check if we failed */ - if (ReturnValue == SOCKET_ERROR) goto error; - } - else - { - /* Unbound socket, but can't get the wildcard. Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - } - - /* Check if we have caller data */ - if ((lpCallerData) && (lpCallerData->buf) && (lpCallerData->len > 0)) - { - /* Set it */ - ConnectDataLength = lpCallerData->len; - ErrorCode = SockGetConnectData(Socket, - IOCTL_AFD_SET_CONNECT_DATA, - lpCallerData->buf, - ConnectDataLength, - &ConnectDataLength); - if (ErrorCode != NO_ERROR) goto error; - } - - /* Now check if QOS is supported */ - if ((Socket->SharedData.ServiceFlags1 & XP1_QOS_SUPPORTED)) - { - /* Check if we have QoS data */ - if (lpSQOS) - { - /* Send the IOCTL */ - ReturnValue = WSPIoctl(Handle, - SIO_SET_QOS, - lpSQOS, - sizeof(*lpSQOS), - NULL, - 0, - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - if (ReturnValue == SOCKET_ERROR) goto error; - } - - /* Check if we have Group QoS data */ - if (lpGQOS) - { - /* Send the IOCTL */ - ReturnValue = WSPIoctl(Handle, - SIO_SET_QOS, - lpGQOS, - sizeof(*lpGQOS), - NULL, - 0, - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - if (ReturnValue == SOCKET_ERROR) goto error; - } - } - - /* Save the address */ - RtlCopyMemory(Socket->RemoteAddress, SocketAddress, SocketAddressLength); - Socket->SharedData.SizeOfRemoteAddress = SocketAddressLength; - - /* Check if we have callee data */ - if ((lpCalleeData) && (lpCalleeData->buf) && (lpCalleeData->len > 0)) - { - /* Set it */ - ConnectDataLength = lpCalleeData->len; - ErrorCode = SockGetConnectData(Socket, - IOCTL_AFD_SET_CONNECT_DATA_SIZE, - lpCalleeData->buf, - ConnectDataLength, - &ConnectDataLength); - if (ErrorCode != NO_ERROR) goto error; - } - - /* Do the actual connect operation */ - ErrorCode = SockDoConnectReal(Socket, - SocketAddress, - SocketAddressLength, - lpCalleeData, - TRUE); - -error: - - /* Check if we had a socket yet */ - if (Socket) - { - /* Release the lock and dereference the socket */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - - /* Return to caller */ - return ErrorCode; -} - -INT -WSPAPI -WSPConnect(SOCKET Handle, - const struct sockaddr * SocketAddress, - INT SocketAddressLength, - LPWSABUF lpCallerData, - LPWSABUF lpCalleeData, - LPQOS lpSQOS, - LPQOS lpGQOS, - LPINT lpErrno) -{ - INT ErrorCode; - - /* Check for caller data */ - if (lpCallerData) - { - /* Validate it */ - if ((IsBadReadPtr(lpCallerData, sizeof(WSABUF))) || - (IsBadReadPtr(lpCallerData->buf, lpCallerData->len))) - { - /* The pointers are invalid, fail */ - ErrorCode = WSAEFAULT; - goto error; - } - } - - /* Check for callee data */ - if (lpCalleeData) - { - /* Validate it */ - if ((IsBadReadPtr(lpCalleeData, sizeof(WSABUF))) || - (IsBadReadPtr(lpCalleeData->buf, lpCalleeData->len))) - { - /* The pointers are invalid, fail */ - ErrorCode = WSAEFAULT; - goto error; - } - } - - /* Check for QoS */ - if (lpSQOS) - { - /* Validate it */ - if ((IsBadReadPtr(lpSQOS, sizeof(QOS))) || - ((lpSQOS->ProviderSpecific.buf) && - (lpSQOS->ProviderSpecific.len) && - (IsBadReadPtr(lpSQOS->ProviderSpecific.buf, - lpSQOS->ProviderSpecific.len)))) - { - /* The pointers are invalid, fail */ - ErrorCode = WSAEFAULT; - goto error; - } - } - - /* Check for Group QoS */ - if (lpGQOS) - { - /* Validate it */ - if ((IsBadReadPtr(lpGQOS, sizeof(QOS))) || - ((lpGQOS->ProviderSpecific.buf) && - (lpGQOS->ProviderSpecific.len) && - (IsBadReadPtr(lpGQOS->ProviderSpecific.buf, - lpGQOS->ProviderSpecific.len)))) - { - /* The pointers are invalid, fail */ - ErrorCode = WSAEFAULT; - goto error; - } - } - - /* Do the actual connect */ - ErrorCode = SockDoConnect(Handle, - SocketAddress, - SocketAddressLength, - lpCallerData, - lpCalleeData, - lpSQOS, - lpGQOS); - -error: - /* Check if this was an error */ - if (ErrorCode != NO_ERROR) - { - /* Return error */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -SOCKET -WSPAPI -WSPJoinLeaf(IN SOCKET s, - IN CONST SOCKADDR *name, - IN INT namelen, - IN LPWSABUF lpCallerData, - OUT LPWSABUF lpCalleeData, - IN LPQOS lpSQOS, - IN LPQOS lpGQOS, - IN DWORD dwFlags, - OUT LPINT lpErrno) -{ - return (SOCKET)0; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -BOOLEAN -WSPAPI -IsSockaddrEqualToZero(IN const struct sockaddr* SocketAddress, - IN INT SocketAddressLength) -{ - INT i; - - for (i = 0; i < SocketAddressLength; i++) - { - /* Make sure it's 0 */ - if (*(PULONG)SocketAddress + i)return FALSE; - } - - /* All zeroes, succees! */ - return TRUE; -} - -INT -WSPAPI -UnconnectDatagramSocket(IN PSOCKET_INFORMATION Socket) -{ - NTSTATUS Status; - INT ErrorCode; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - AFD_DISCONNECT_INFO DisconnectInfo; - IO_STATUS_BLOCK IoStatusBlock; - - /* Set up the disconnect information */ - DisconnectInfo.Timeout = RtlConvertLongToLargeInteger(-1); - DisconnectInfo.DisconnectType = AFD_DISCONNECT_DATAGRAM; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_DISCONNECT, - &DisconnectInfo, - sizeof(DisconnectInfo), - NULL, - 0); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion outside the lock */ - LeaveCriticalSection(&Socket->Lock); - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - EnterCriticalSection(&Socket->Lock); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Convert error code */ - ErrorCode = NtStatusToSocketError(Status); - } - else - { - /* Set us as disconnected (back to bound) */ - Socket->SharedData.State = SocketBound; - ErrorCode = NO_ERROR; - } - - /* Return to caller */ - return ErrorCode; -} - -INT -WSPAPI -SockPostProcessConnect(IN PSOCKET_INFORMATION Socket) -{ - INT ErrorCode; - - /* Notify the helper DLL */ - ErrorCode = SockNotifyHelperDll(Socket, WSH_NOTIFY_CONNECT); - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Set the new state and update the context in AFD */ - Socket->SharedData.State = SocketConnected; - ErrorCode = SockSetHandleContext(Socket); - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Update the window sizes */ - ErrorCode = SockUpdateWindowSizes(Socket, FALSE); - - /* Return to caller */ - return ErrorCode; -} - -INT -WSPAPI -SockDoConnectReal(IN PSOCKET_INFORMATION Socket, - IN const struct sockaddr *SocketAddress, - IN INT SocketAddressLength, - IN LPWSABUF lpCalleeData, - IN BOOLEAN UseSan) -{ - INT ErrorCode; - NTSTATUS Status; - DWORD ConnectDataLength; - IO_STATUS_BLOCK IoStatusBlock; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - CHAR ConnectBuffer[FIELD_OFFSET(AFD_CONNECT_INFO, RemoteAddress) + - MAX_TDI_ADDRESS_LENGTH]; - PAFD_CONNECT_INFO ConnectInfo; - ULONG ConnectInfoLength; - - /* Check if someone is waiting for FD_CONNECT */ - if (Socket->SharedData.AsyncEvents & FD_CONNECT) - { - /* - * Disable FD_WRITE and FD_CONNECT - * The latter fixes a race condition where the FD_CONNECT is re-enabled - * at the end of this function right after the Async Thread disables it. - * This should only happen at the *next* WSPConnect - */ - Socket->SharedData.AsyncDisabledEvents |= FD_CONNECT | FD_WRITE; - } - - /* Calculate how much the connection structure will take */ - ConnectInfoLength = FIELD_OFFSET(AFD_CONNECT_INFO, RemoteAddress) + - Socket->HelperData->MaxTDIAddressLength; - - /* Check if our stack buffer is enough */ - if (ConnectInfoLength <= sizeof(ConnectBuffer)) - { - /* Use the stack */ - ConnectInfo = (PVOID)ConnectBuffer; - } - else - { - /* Allocate from heap */ - ConnectInfo = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - ConnectInfoLength); - if (!ConnectInfo) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - } - - /* Create the TDI Address */ - ErrorCode = SockBuildTdiAddress(&ConnectInfo->RemoteAddress, - (PSOCKADDR)SocketAddress, - SocketAddressLength); - if (ErrorCode != NO_ERROR) goto error; - - /* Set the SAN State */ - ConnectInfo->UseSAN = SockSanEnabled; - - /* Check if this is a non-blocking streaming socket */ - if ((Socket->SharedData.NonBlocking) && !(MSAFD_IS_DGRAM_SOCK(Socket))) - { - /* Create the Async Thread if Needed */ - if (!SockCheckAndReferenceAsyncThread()) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - - Status = 0; - } - else - { - /* Start the connect loop */ - do - { - /* Send IOCTL */ - IoStatusBlock.Status = STATUS_PENDING; - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_CONNECT, - ConnectInfo, - ConnectInfoLength, - NULL, - 0); - - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion outside the lock */ - LeaveCriticalSection(&Socket->Lock); - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - EnterCriticalSection(&Socket->Lock); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Make sure we're not closed */ - if (Socket->SharedData.State == SocketClosed) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Check if we failed */ - if (!NT_SUCCESS(Status)) - { - /* Tell the helper DLL */ - ErrorCode = SockNotifyHelperDll(Socket, WSH_NOTIFY_CONNECT_ERROR); - } - - /* Keep looping if the Helper DLL wants us to */ - } while (ErrorCode == WSATRY_AGAIN); - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Now do post-processing */ - ErrorCode = SockPostProcessConnect(Socket); - if (ErrorCode != NO_ERROR) goto error; - - /* Check if we had callee data */ - if ((lpCalleeData) && (lpCalleeData->buf) && (lpCalleeData->len > 0)) - { - /* Set it */ - ErrorCode = SockGetConnectData(Socket, - IOCTL_AFD_SET_CONNECT_DATA_SIZE, - lpCalleeData->buf, - ConnectDataLength, - &ConnectDataLength); - if (ErrorCode == NO_ERROR) - { - /* If we didn't get any data, then assume the buffer is empty */ - if (!lpCalleeData->len) lpCalleeData->buf = NULL; - } - else - { - /* This isn't fatal, assume we didn't get anything instead */ - lpCalleeData->len = 0; - lpCalleeData->buf = NULL; - } - - /* Assume success */ - ErrorCode = NO_ERROR; - } - -error: - - /* Check if we need to free the connect info from the heap */ - if (ConnectInfo && (ConnectInfo != (PVOID)ConnectBuffer)) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, ConnectInfo); - } - - /* Check if this the success path */ - if (ErrorCode == NO_ERROR) - { - /* Check if FD_WRITE is being select()ed */ - if (Socket->SharedData.AsyncEvents & FD_WRITE) - { - /* Re-enable it */ - SockReenableAsyncSelectEvent(Socket, FD_WRITE); - } - } - - /* Return the error */ - return ErrorCode; -} - -INT -WSPAPI -SockDoConnect(SOCKET Handle, - const struct sockaddr *SocketAddress, - INT SocketAddressLength, - LPWSABUF lpCallerData, - LPWSABUF lpCalleeData, - LPQOS lpSQOS, - LPQOS lpGQOS) -{ - PSOCKET_INFORMATION Socket; - SOCKADDR_INFO SocketInfo; - PSOCKADDR Sockaddr; - PWINSOCK_TEB_DATA ThreadData; - INT SockaddrLength; - INT ErrorCode, ReturnValue; - DWORD ConnectDataLength; - DWORD BytesReturned; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Make sure we're not already connected unless we are a datagram socket */ - if ((Socket->SharedData.State == SocketConnected) && - !(MSAFD_IS_DGRAM_SOCK(Socket))) - { - /* Fail */ - ErrorCode = WSAEISCONN; - goto error; - } - - /* Check if async connect was in progress */ - if (Socket->AsyncData) - { - /* We have to clean it up */ - SockIsSocketConnected(Socket); - - /* Check again */ - if (Socket->AsyncData) - { - /* Can't do anything but fail now */ - ErrorCode = WSAEALREADY; - goto error; - } - } - - /* Make sure we're either unbound, bound, or connected */ - if ((Socket->SharedData.State != SocketOpen) && - (Socket->SharedData.State != SocketBound) && - (Socket->SharedData.State != SocketConnected)) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Normalize the address length */ - SocketAddressLength = min(SocketAddressLength, - Socket->HelperData->MaxWSAddressLength); - - /* Also make sure it's not too small */ - if (SocketAddressLength < Socket->HelperData->MinWSAddressLength) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* - * If this is a connected socket, and the address is null (0.0.0.0), - * then do a partial disconnect if this is a datagram socket. - */ - if ((Socket->SharedData.State == SocketConnected) && - (MSAFD_IS_DGRAM_SOCK(Socket)) && - (IsSockaddrEqualToZero(SocketAddress, SocketAddressLength))) - { - /* Disconnect the socket and return */ - return UnconnectDatagramSocket(Socket); - } - - /* Make sure the Address Family is valid */ - if (Socket->SharedData.AddressFamily != SocketAddress->sa_family) - { - /* Fail */ - ErrorCode = WSAEAFNOSUPPORT; - goto error; - } - - /* If this is a non-broadcast datagram socket */ - if ((MSAFD_IS_DGRAM_SOCK(Socket) && !(Socket->SharedData.Broadcast))) - { - /* Find out what kind of address this is */ - ErrorCode = Socket->HelperData->WSHGetSockaddrType((PSOCKADDR)SocketAddress, - SocketAddressLength, - &SocketInfo); - if (ErrorCode != NO_ERROR) - { - /* Find out if this is a broadcast address */ - if (SocketInfo.AddressInfo == SockaddrAddressInfoBroadcast) - { - /* Fail: SO_BROADCAST must be set first in WinSock 2.0+ */ - ErrorCode = WSAEACCES; - } - } - - /* A failure here isn't fatal */ - ErrorCode = NO_ERROR; - } - - /* Check if this is a constrained group */ - if (Socket->SharedData.GroupType == SG_CONSTRAINED_GROUP) - { - /* Validate the address and fail if it's not consistent */ - ErrorCode = SockIsAddressConsistentWithConstrainedGroup(Socket, - Socket->SharedData.GroupID, - (PSOCKADDR)SocketAddress, - SocketAddressLength); - if (ErrorCode != NO_ERROR) goto error; - } - - /* Check if this socket isn't bound yet */ - if (Socket->SharedData.State == SocketOpen) - { - /* Check if we can request the wildcard address */ - if (Socket->HelperData->WSHGetWildcardSockaddr) - { - /* Allocate a new Sockaddr */ - SockaddrLength = Socket->HelperData->MaxWSAddressLength; - Sockaddr = SockAllocateHeapRoutine(SockPrivateHeap, 0, SockaddrLength); - if (!Sockaddr) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - - /* Get the wildcard sockaddr */ - ErrorCode = Socket->HelperData->WSHGetWildcardSockaddr(Socket->HelperContext, - Sockaddr, - &SockaddrLength); - if (ErrorCode != NO_ERROR) - { - /* Free memory and fail */ - RtlFreeHeap(SockPrivateHeap, 0, Sockaddr); - goto error; - } - - /* Bind it */ - ReturnValue = WSPBind(Handle, - Sockaddr, - SockaddrLength, - &ErrorCode); - - /* Free memory */ - RtlFreeHeap(SockPrivateHeap, 0, Sockaddr); - - /* Check if we failed */ - if (ReturnValue == SOCKET_ERROR) goto error; - } - else - { - /* Unbound socket, but can't get the wildcard. Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - } - - /* Check if we have caller data */ - if ((lpCallerData) && (lpCallerData->buf) && (lpCallerData->len > 0)) - { - /* Set it */ - ConnectDataLength = lpCallerData->len; - ErrorCode = SockGetConnectData(Socket, - IOCTL_AFD_SET_CONNECT_DATA, - lpCallerData->buf, - ConnectDataLength, - &ConnectDataLength); - if (ErrorCode != NO_ERROR) goto error; - } - - /* Now check if QOS is supported */ - if ((Socket->SharedData.ServiceFlags1 & XP1_QOS_SUPPORTED)) - { - /* Check if we have QoS data */ - if (lpSQOS) - { - /* Send the IOCTL */ - ReturnValue = WSPIoctl(Handle, - SIO_SET_QOS, - lpSQOS, - sizeof(*lpSQOS), - NULL, - 0, - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - if (ReturnValue == SOCKET_ERROR) goto error; - } - - /* Check if we have Group QoS data */ - if (lpGQOS) - { - /* Send the IOCTL */ - ReturnValue = WSPIoctl(Handle, - SIO_SET_QOS, - lpGQOS, - sizeof(*lpGQOS), - NULL, - 0, - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - if (ReturnValue == SOCKET_ERROR) goto error; - } - } - - /* Save the address */ - RtlCopyMemory(Socket->RemoteAddress, SocketAddress, SocketAddressLength); - Socket->SharedData.SizeOfRemoteAddress = SocketAddressLength; - - /* Check if we have callee data */ - if ((lpCalleeData) && (lpCalleeData->buf) && (lpCalleeData->len > 0)) - { - /* Set it */ - ConnectDataLength = lpCalleeData->len; - ErrorCode = SockGetConnectData(Socket, - IOCTL_AFD_SET_CONNECT_DATA_SIZE, - lpCalleeData->buf, - ConnectDataLength, - &ConnectDataLength); - if (ErrorCode != NO_ERROR) goto error; - } - - /* Do the actual connect operation */ - ErrorCode = SockDoConnectReal(Socket, - SocketAddress, - SocketAddressLength, - lpCalleeData, - TRUE); - -error: - - /* Check if we had a socket yet */ - if (Socket) - { - /* Release the lock and dereference the socket */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - - /* Return to caller */ - return ErrorCode; -} - -INT -WSPAPI -WSPConnect(SOCKET Handle, - const struct sockaddr * SocketAddress, - INT SocketAddressLength, - LPWSABUF lpCallerData, - LPWSABUF lpCalleeData, - LPQOS lpSQOS, - LPQOS lpGQOS, - LPINT lpErrno) -{ - INT ErrorCode; - - /* Check for caller data */ - if (lpCallerData) - { - /* Validate it */ - if ((IsBadReadPtr(lpCallerData, sizeof(WSABUF))) || - (IsBadReadPtr(lpCallerData->buf, lpCallerData->len))) - { - /* The pointers are invalid, fail */ - ErrorCode = WSAEFAULT; - goto error; - } - } - - /* Check for callee data */ - if (lpCalleeData) - { - /* Validate it */ - if ((IsBadReadPtr(lpCalleeData, sizeof(WSABUF))) || - (IsBadReadPtr(lpCalleeData->buf, lpCalleeData->len))) - { - /* The pointers are invalid, fail */ - ErrorCode = WSAEFAULT; - goto error; - } - } - - /* Check for QoS */ - if (lpSQOS) - { - /* Validate it */ - if ((IsBadReadPtr(lpSQOS, sizeof(QOS))) || - ((lpSQOS->ProviderSpecific.buf) && - (lpSQOS->ProviderSpecific.len) && - (IsBadReadPtr(lpSQOS->ProviderSpecific.buf, - lpSQOS->ProviderSpecific.len)))) - { - /* The pointers are invalid, fail */ - ErrorCode = WSAEFAULT; - goto error; - } - } - - /* Check for Group QoS */ - if (lpGQOS) - { - /* Validate it */ - if ((IsBadReadPtr(lpGQOS, sizeof(QOS))) || - ((lpGQOS->ProviderSpecific.buf) && - (lpGQOS->ProviderSpecific.len) && - (IsBadReadPtr(lpGQOS->ProviderSpecific.buf, - lpGQOS->ProviderSpecific.len)))) - { - /* The pointers are invalid, fail */ - ErrorCode = WSAEFAULT; - goto error; - } - } - - /* Do the actual connect */ - ErrorCode = SockDoConnect(Handle, - SocketAddress, - SocketAddressLength, - lpCallerData, - lpCalleeData, - lpSQOS, - lpGQOS); - -error: - /* Check if this was an error */ - if (ErrorCode != NO_ERROR) - { - /* Return error */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -SOCKET -WSPAPI -WSPJoinLeaf(IN SOCKET s, - IN CONST SOCKADDR *name, - IN INT namelen, - IN LPWSABUF lpCallerData, - OUT LPWSABUF lpCalleeData, - IN LPQOS lpSQOS, - IN LPQOS lpGQOS, - IN DWORD dwFlags, - OUT LPINT lpErrno) -{ - return (SOCKET)0; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -BOOLEAN -WSPAPI -IsSockaddrEqualToZero(IN const struct sockaddr* SocketAddress, - IN INT SocketAddressLength) -{ - INT i; - - for (i = 0; i < SocketAddressLength; i++) - { - /* Make sure it's 0 */ - if (*(PULONG)SocketAddress + i)return FALSE; - } - - /* All zeroes, succees! */ - return TRUE; -} - -INT -WSPAPI -UnconnectDatagramSocket(IN PSOCKET_INFORMATION Socket) -{ - NTSTATUS Status; - INT ErrorCode; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - AFD_DISCONNECT_INFO DisconnectInfo; - IO_STATUS_BLOCK IoStatusBlock; - - /* Set up the disconnect information */ - DisconnectInfo.Timeout = RtlConvertLongToLargeInteger(-1); - DisconnectInfo.DisconnectType = AFD_DISCONNECT_DATAGRAM; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_DISCONNECT, - &DisconnectInfo, - sizeof(DisconnectInfo), - NULL, - 0); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion outside the lock */ - LeaveCriticalSection(&Socket->Lock); - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - EnterCriticalSection(&Socket->Lock); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Convert error code */ - ErrorCode = NtStatusToSocketError(Status); - } - else - { - /* Set us as disconnected (back to bound) */ - Socket->SharedData.State = SocketBound; - ErrorCode = NO_ERROR; - } - - /* Return to caller */ - return ErrorCode; -} - -INT -WSPAPI -SockPostProcessConnect(IN PSOCKET_INFORMATION Socket) -{ - INT ErrorCode; - - /* Notify the helper DLL */ - ErrorCode = SockNotifyHelperDll(Socket, WSH_NOTIFY_CONNECT); - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Set the new state and update the context in AFD */ - Socket->SharedData.State = SocketConnected; - ErrorCode = SockSetHandleContext(Socket); - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Update the window sizes */ - ErrorCode = SockUpdateWindowSizes(Socket, FALSE); - - /* Return to caller */ - return ErrorCode; -} - -INT -WSPAPI -SockDoConnectReal(IN PSOCKET_INFORMATION Socket, - IN const struct sockaddr *SocketAddress, - IN INT SocketAddressLength, - IN LPWSABUF lpCalleeData, - IN BOOLEAN UseSan) -{ - INT ErrorCode; - NTSTATUS Status; - DWORD ConnectDataLength; - IO_STATUS_BLOCK IoStatusBlock; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - CHAR ConnectBuffer[FIELD_OFFSET(AFD_CONNECT_INFO, RemoteAddress) + - MAX_TDI_ADDRESS_LENGTH]; - PAFD_CONNECT_INFO ConnectInfo; - ULONG ConnectInfoLength; - - /* Check if someone is waiting for FD_CONNECT */ - if (Socket->SharedData.AsyncEvents & FD_CONNECT) - { - /* - * Disable FD_WRITE and FD_CONNECT - * The latter fixes a race condition where the FD_CONNECT is re-enabled - * at the end of this function right after the Async Thread disables it. - * This should only happen at the *next* WSPConnect - */ - Socket->SharedData.AsyncDisabledEvents |= FD_CONNECT | FD_WRITE; - } - - /* Calculate how much the connection structure will take */ - ConnectInfoLength = FIELD_OFFSET(AFD_CONNECT_INFO, RemoteAddress) + - Socket->HelperData->MaxTDIAddressLength; - - /* Check if our stack buffer is enough */ - if (ConnectInfoLength <= sizeof(ConnectBuffer)) - { - /* Use the stack */ - ConnectInfo = (PVOID)ConnectBuffer; - } - else - { - /* Allocate from heap */ - ConnectInfo = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - ConnectInfoLength); - if (!ConnectInfo) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - } - - /* Create the TDI Address */ - ErrorCode = SockBuildTdiAddress(&ConnectInfo->RemoteAddress, - (PSOCKADDR)SocketAddress, - SocketAddressLength); - if (ErrorCode != NO_ERROR) goto error; - - /* Set the SAN State */ - ConnectInfo->UseSAN = SockSanEnabled; - - /* Check if this is a non-blocking streaming socket */ - if ((Socket->SharedData.NonBlocking) && !(MSAFD_IS_DGRAM_SOCK(Socket))) - { - /* Create the Async Thread if Needed */ - if (!SockCheckAndReferenceAsyncThread()) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - - Status = 0; - } - else - { - /* Start the connect loop */ - do - { - /* Send IOCTL */ - IoStatusBlock.Status = STATUS_PENDING; - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_CONNECT, - ConnectInfo, - ConnectInfoLength, - NULL, - 0); - - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion outside the lock */ - LeaveCriticalSection(&Socket->Lock); - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - EnterCriticalSection(&Socket->Lock); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Make sure we're not closed */ - if (Socket->SharedData.State == SocketClosed) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Check if we failed */ - if (!NT_SUCCESS(Status)) - { - /* Tell the helper DLL */ - ErrorCode = SockNotifyHelperDll(Socket, WSH_NOTIFY_CONNECT_ERROR); - } - - /* Keep looping if the Helper DLL wants us to */ - } while (ErrorCode == WSATRY_AGAIN); - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Now do post-processing */ - ErrorCode = SockPostProcessConnect(Socket); - if (ErrorCode != NO_ERROR) goto error; - - /* Check if we had callee data */ - if ((lpCalleeData) && (lpCalleeData->buf) && (lpCalleeData->len > 0)) - { - /* Set it */ - ErrorCode = SockGetConnectData(Socket, - IOCTL_AFD_SET_CONNECT_DATA_SIZE, - lpCalleeData->buf, - ConnectDataLength, - &ConnectDataLength); - if (ErrorCode == NO_ERROR) - { - /* If we didn't get any data, then assume the buffer is empty */ - if (!lpCalleeData->len) lpCalleeData->buf = NULL; - } - else - { - /* This isn't fatal, assume we didn't get anything instead */ - lpCalleeData->len = 0; - lpCalleeData->buf = NULL; - } - - /* Assume success */ - ErrorCode = NO_ERROR; - } - -error: - - /* Check if we need to free the connect info from the heap */ - if (ConnectInfo && (ConnectInfo != (PVOID)ConnectBuffer)) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, ConnectInfo); - } - - /* Check if this the success path */ - if (ErrorCode == NO_ERROR) - { - /* Check if FD_WRITE is being select()ed */ - if (Socket->SharedData.AsyncEvents & FD_WRITE) - { - /* Re-enable it */ - SockReenableAsyncSelectEvent(Socket, FD_WRITE); - } - } - - /* Return the error */ - return ErrorCode; -} - -INT -WSPAPI -SockDoConnect(SOCKET Handle, - const struct sockaddr *SocketAddress, - INT SocketAddressLength, - LPWSABUF lpCallerData, - LPWSABUF lpCalleeData, - LPQOS lpSQOS, - LPQOS lpGQOS) -{ - PSOCKET_INFORMATION Socket; - SOCKADDR_INFO SocketInfo; - PSOCKADDR Sockaddr; - PWINSOCK_TEB_DATA ThreadData; - INT SockaddrLength; - INT ErrorCode, ReturnValue; - DWORD ConnectDataLength; - DWORD BytesReturned; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Make sure we're not already connected unless we are a datagram socket */ - if ((Socket->SharedData.State == SocketConnected) && - !(MSAFD_IS_DGRAM_SOCK(Socket))) - { - /* Fail */ - ErrorCode = WSAEISCONN; - goto error; - } - - /* Check if async connect was in progress */ - if (Socket->AsyncData) - { - /* We have to clean it up */ - SockIsSocketConnected(Socket); - - /* Check again */ - if (Socket->AsyncData) - { - /* Can't do anything but fail now */ - ErrorCode = WSAEALREADY; - goto error; - } - } - - /* Make sure we're either unbound, bound, or connected */ - if ((Socket->SharedData.State != SocketOpen) && - (Socket->SharedData.State != SocketBound) && - (Socket->SharedData.State != SocketConnected)) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Normalize the address length */ - SocketAddressLength = min(SocketAddressLength, - Socket->HelperData->MaxWSAddressLength); - - /* Also make sure it's not too small */ - if (SocketAddressLength < Socket->HelperData->MinWSAddressLength) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* - * If this is a connected socket, and the address is null (0.0.0.0), - * then do a partial disconnect if this is a datagram socket. - */ - if ((Socket->SharedData.State == SocketConnected) && - (MSAFD_IS_DGRAM_SOCK(Socket)) && - (IsSockaddrEqualToZero(SocketAddress, SocketAddressLength))) - { - /* Disconnect the socket and return */ - return UnconnectDatagramSocket(Socket); - } - - /* Make sure the Address Family is valid */ - if (Socket->SharedData.AddressFamily != SocketAddress->sa_family) - { - /* Fail */ - ErrorCode = WSAEAFNOSUPPORT; - goto error; - } - - /* If this is a non-broadcast datagram socket */ - if ((MSAFD_IS_DGRAM_SOCK(Socket) && !(Socket->SharedData.Broadcast))) - { - /* Find out what kind of address this is */ - ErrorCode = Socket->HelperData->WSHGetSockaddrType((PSOCKADDR)SocketAddress, - SocketAddressLength, - &SocketInfo); - if (ErrorCode != NO_ERROR) - { - /* Find out if this is a broadcast address */ - if (SocketInfo.AddressInfo == SockaddrAddressInfoBroadcast) - { - /* Fail: SO_BROADCAST must be set first in WinSock 2.0+ */ - ErrorCode = WSAEACCES; - } - } - - /* A failure here isn't fatal */ - ErrorCode = NO_ERROR; - } - - /* Check if this is a constrained group */ - if (Socket->SharedData.GroupType == SG_CONSTRAINED_GROUP) - { - /* Validate the address and fail if it's not consistent */ - ErrorCode = SockIsAddressConsistentWithConstrainedGroup(Socket, - Socket->SharedData.GroupID, - (PSOCKADDR)SocketAddress, - SocketAddressLength); - if (ErrorCode != NO_ERROR) goto error; - } - - /* Check if this socket isn't bound yet */ - if (Socket->SharedData.State == SocketOpen) - { - /* Check if we can request the wildcard address */ - if (Socket->HelperData->WSHGetWildcardSockaddr) - { - /* Allocate a new Sockaddr */ - SockaddrLength = Socket->HelperData->MaxWSAddressLength; - Sockaddr = SockAllocateHeapRoutine(SockPrivateHeap, 0, SockaddrLength); - if (!Sockaddr) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - - /* Get the wildcard sockaddr */ - ErrorCode = Socket->HelperData->WSHGetWildcardSockaddr(Socket->HelperContext, - Sockaddr, - &SockaddrLength); - if (ErrorCode != NO_ERROR) - { - /* Free memory and fail */ - RtlFreeHeap(SockPrivateHeap, 0, Sockaddr); - goto error; - } - - /* Bind it */ - ReturnValue = WSPBind(Handle, - Sockaddr, - SockaddrLength, - &ErrorCode); - - /* Free memory */ - RtlFreeHeap(SockPrivateHeap, 0, Sockaddr); - - /* Check if we failed */ - if (ReturnValue == SOCKET_ERROR) goto error; - } - else - { - /* Unbound socket, but can't get the wildcard. Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - } - - /* Check if we have caller data */ - if ((lpCallerData) && (lpCallerData->buf) && (lpCallerData->len > 0)) - { - /* Set it */ - ConnectDataLength = lpCallerData->len; - ErrorCode = SockGetConnectData(Socket, - IOCTL_AFD_SET_CONNECT_DATA, - lpCallerData->buf, - ConnectDataLength, - &ConnectDataLength); - if (ErrorCode != NO_ERROR) goto error; - } - - /* Now check if QOS is supported */ - if ((Socket->SharedData.ServiceFlags1 & XP1_QOS_SUPPORTED)) - { - /* Check if we have QoS data */ - if (lpSQOS) - { - /* Send the IOCTL */ - ReturnValue = WSPIoctl(Handle, - SIO_SET_QOS, - lpSQOS, - sizeof(*lpSQOS), - NULL, - 0, - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - if (ReturnValue == SOCKET_ERROR) goto error; - } - - /* Check if we have Group QoS data */ - if (lpGQOS) - { - /* Send the IOCTL */ - ReturnValue = WSPIoctl(Handle, - SIO_SET_QOS, - lpGQOS, - sizeof(*lpGQOS), - NULL, - 0, - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - if (ReturnValue == SOCKET_ERROR) goto error; - } - } - - /* Save the address */ - RtlCopyMemory(Socket->RemoteAddress, SocketAddress, SocketAddressLength); - Socket->SharedData.SizeOfRemoteAddress = SocketAddressLength; - - /* Check if we have callee data */ - if ((lpCalleeData) && (lpCalleeData->buf) && (lpCalleeData->len > 0)) - { - /* Set it */ - ConnectDataLength = lpCalleeData->len; - ErrorCode = SockGetConnectData(Socket, - IOCTL_AFD_SET_CONNECT_DATA_SIZE, - lpCalleeData->buf, - ConnectDataLength, - &ConnectDataLength); - if (ErrorCode != NO_ERROR) goto error; - } - - /* Do the actual connect operation */ - ErrorCode = SockDoConnectReal(Socket, - SocketAddress, - SocketAddressLength, - lpCalleeData, - TRUE); - -error: - - /* Check if we had a socket yet */ - if (Socket) - { - /* Release the lock and dereference the socket */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - - /* Return to caller */ - return ErrorCode; -} - -INT -WSPAPI -WSPConnect(SOCKET Handle, - const struct sockaddr * SocketAddress, - INT SocketAddressLength, - LPWSABUF lpCallerData, - LPWSABUF lpCalleeData, - LPQOS lpSQOS, - LPQOS lpGQOS, - LPINT lpErrno) -{ - INT ErrorCode; - - /* Check for caller data */ - if (lpCallerData) - { - /* Validate it */ - if ((IsBadReadPtr(lpCallerData, sizeof(WSABUF))) || - (IsBadReadPtr(lpCallerData->buf, lpCallerData->len))) - { - /* The pointers are invalid, fail */ - ErrorCode = WSAEFAULT; - goto error; - } - } - - /* Check for callee data */ - if (lpCalleeData) - { - /* Validate it */ - if ((IsBadReadPtr(lpCalleeData, sizeof(WSABUF))) || - (IsBadReadPtr(lpCalleeData->buf, lpCalleeData->len))) - { - /* The pointers are invalid, fail */ - ErrorCode = WSAEFAULT; - goto error; - } - } - - /* Check for QoS */ - if (lpSQOS) - { - /* Validate it */ - if ((IsBadReadPtr(lpSQOS, sizeof(QOS))) || - ((lpSQOS->ProviderSpecific.buf) && - (lpSQOS->ProviderSpecific.len) && - (IsBadReadPtr(lpSQOS->ProviderSpecific.buf, - lpSQOS->ProviderSpecific.len)))) - { - /* The pointers are invalid, fail */ - ErrorCode = WSAEFAULT; - goto error; - } - } - - /* Check for Group QoS */ - if (lpGQOS) - { - /* Validate it */ - if ((IsBadReadPtr(lpGQOS, sizeof(QOS))) || - ((lpGQOS->ProviderSpecific.buf) && - (lpGQOS->ProviderSpecific.len) && - (IsBadReadPtr(lpGQOS->ProviderSpecific.buf, - lpGQOS->ProviderSpecific.len)))) - { - /* The pointers are invalid, fail */ - ErrorCode = WSAEFAULT; - goto error; - } - } - - /* Do the actual connect */ - ErrorCode = SockDoConnect(Handle, - SocketAddress, - SocketAddressLength, - lpCallerData, - lpCalleeData, - lpSQOS, - lpGQOS); - -error: - /* Check if this was an error */ - if (ErrorCode != NO_ERROR) - { - /* Return error */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -SOCKET -WSPAPI -WSPJoinLeaf(IN SOCKET s, - IN CONST SOCKADDR *name, - IN INT namelen, - IN LPWSABUF lpCallerData, - OUT LPWSABUF lpCalleeData, - IN LPQOS lpSQOS, - IN LPQOS lpGQOS, - IN DWORD dwFlags, - OUT LPINT lpErrno) -{ - return (SOCKET)0; -} - diff --git a/dll/win32/mswsock/msafd/eventsel.c b/dll/win32/mswsock/msafd/eventsel.c index ff379a43460..1c6a05d6540 100644 --- a/dll/win32/mswsock/msafd/eventsel.c +++ b/dll/win32/mswsock/msafd/eventsel.c @@ -425,1284 +425,3 @@ error: return NO_ERROR; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -typedef struct _SOCK_EVENT_MAPPING -{ - ULONG AfdBit; - ULONG WinsockBit; -} SOCK_EVENT_MAPPING, *PSOCK_EVENT_MAPPING; - -SOCK_EVENT_MAPPING PollEventMapping[] = - { - {AFD_EVENT_RECEIVE_BIT, FD_READ_BIT}, - {AFD_EVENT_SEND_BIT, FD_WRITE_BIT}, - {AFD_EVENT_OOB_RECEIVE_BIT, FD_OOB_BIT}, - {AFD_EVENT_ACCEPT_BIT, FD_ACCEPT_BIT}, - {AFD_EVENT_QOS_BIT, FD_QOS_BIT}, - {AFD_EVENT_GROUP_QOS_BIT, FD_GROUP_QOS_BIT}, - {AFD_EVENT_ROUTING_INTERFACE_CHANGE_BIT, FD_ROUTING_INTERFACE_CHANGE_BIT}, - {AFD_EVENT_ADDRESS_LIST_CHANGE_BIT, FD_ADDRESS_LIST_CHANGE_BIT} -}; - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -SockEventSelectHelper(IN PSOCKET_INFORMATION Socket, - IN WSAEVENT EventObject, - IN LONG Events) -{ - IO_STATUS_BLOCK IoStatusBlock; - AFD_EVENT_SELECT_INFO PollInfo; - NTSTATUS Status; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - - /* Acquire the lock */ - EnterCriticalSection(&Socket->Lock); - - /* Set Structure Info */ - PollInfo.EventObject = EventObject; - PollInfo.Events = 0; - - /* Set receive event */ - if (Events & FD_READ) PollInfo.Events |= AFD_EVENT_RECEIVE; - - /* Set write event */ - if (Events & FD_WRITE) PollInfo.Events |= AFD_EVENT_SEND; - - /* Set out-of-band (OOB) receive event */ - if (Events & FD_OOB) PollInfo.Events |= AFD_EVENT_OOB_RECEIVE; - - /* Set accept event */ - if (Events & FD_ACCEPT) PollInfo.Events |= AFD_EVENT_ACCEPT; - - /* Send Quality-of-Service (QOS) event */ - if (Events & FD_QOS) PollInfo.Events |= AFD_EVENT_QOS; - - /* Send Group Quality-of-Service (QOS) event */ - if (Events & FD_GROUP_QOS) PollInfo.Events |= AFD_EVENT_GROUP_QOS; - - /* Send connect event. Note, this also includes connect failures */ - if (Events & FD_CONNECT) PollInfo.Events |= AFD_EVENT_CONNECT | - AFD_EVENT_CONNECT_FAIL; - - /* Send close event. Note, this includes both aborts and disconnects */ - if (Events & FD_CLOSE) PollInfo.Events |= AFD_EVENT_DISCONNECT | - AFD_EVENT_ABORT; - - /* Send PnP events related to live network hardware changes */ - if (Events & FD_ROUTING_INTERFACE_CHANGE) - { - PollInfo.Events |= AFD_EVENT_ROUTING_INTERFACE_CHANGE; - } - if (Events & FD_ADDRESS_LIST_CHANGE) - { - PollInfo.Events |= AFD_EVENT_ADDRESS_LIST_CHANGE; - } - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_EVENT_SELECT, - &PollInfo, - sizeof(PollInfo), - NULL, - 0); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - LeaveCriticalSection(&Socket->Lock); - return NtStatusToSocketError(Status); - } - - /* Set Socket Data*/ - Socket->EventObject = EventObject; - Socket->NetworkEvents = Events; - - /* Release lock and return success */ - LeaveCriticalSection(&Socket->Lock); - return NO_ERROR; -} - -INT -WSPAPI -WSPEventSelect(SOCKET Handle, - WSAEVENT hEventObject, - LONG lNetworkEvents, - LPINT lpErrno) -{ - PSOCKET_INFORMATION Socket; - PWINSOCK_TEB_DATA ThreadData; - INT ErrorCode; - BOOLEAN BlockMode; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Set Socket to Non-Blocking */ - BlockMode = TRUE; - ErrorCode = SockSetInformation(Socket, - AFD_INFO_BLOCKING_MODE, - &BlockMode, - NULL, - NULL); - if (ErrorCode != NO_ERROR) goto error; - - /* AFD was notified, set it locally as well */ - Socket->SharedData.NonBlocking = TRUE; - - /* Check if there is an async select in progress */ - if (Socket->EventObject) - { - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Erase all data */ - Socket->SharedData.hWnd = NULL; - Socket->SharedData.wMsg = 0; - Socket->SharedData.AsyncEvents = 0; - - /* Unbalance the sequence number so the request will fail */ - Socket->SharedData.SequenceNumber++; - - /* Give socket access back */ - LeaveCriticalSection(&Socket->Lock); - } - - /* Make sure the flags are valid */ - if ((lNetworkEvents & ~FD_ALL_EVENTS)) - { - /* More then the possible combination, fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Call the helper */ - ErrorCode = SockEventSelectHelper(Socket, hEventObject, lNetworkEvents); - -error: - /* Dereference the socket, if we have one here */ - if (Socket) SockDereferenceSocket(Socket); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -WSPEnumNetworkEvents(IN SOCKET Handle, - IN WSAEVENT hEventObject, - OUT LPWSANETWORKEVENTS lpNetworkEvents, - OUT LPINT lpErrno) -{ - AFD_ENUM_NETWORK_EVENTS_INFO EventInfo; - IO_STATUS_BLOCK IoStatusBlock; - PSOCKET_INFORMATION Socket; - PWINSOCK_TEB_DATA ThreadData; - INT ErrorCode; - NTSTATUS Status, EventStatus; - PSOCK_EVENT_MAPPING EventMapping; - ULONG i; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Make sure we got a pointer */ - if (!lpNetworkEvents) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Send IOCTL */ - Status = NtDeviceIoControlFile((HANDLE)Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_ENUM_NETWORK_EVENTS, - hEventObject, - 0, - &EventInfo, - sizeof(EventInfo)); - - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Set Events to wait for */ - lpNetworkEvents->lNetworkEvents = 0; - - /* Set our Event Mapping structure */ - EventMapping = PollEventMapping; - - /* Loop it */ - for (i = 0; i < (sizeof(PollEventMapping) / 2 * sizeof(ULONG)); i++) - { - /* First check if we have a match for this bit */ - if (EventInfo.PollEvents & (1 << EventMapping->AfdBit)) - { - /* Match found, write the equivalent bit */ - lpNetworkEvents->lNetworkEvents |= (1 << EventMapping->WinsockBit); - - /* Now get the status */ - EventStatus = EventInfo.EventStatus[EventMapping->AfdBit]; - - /* Check if it failed */ - if (!NT_SUCCESS(Status)) - { - /* Write the Winsock status code directly */ - lpNetworkEvents->iErrorCode[EventMapping->WinsockBit] = NtStatusToSocketError(EventStatus); - } - else - { - /* Write success */ - lpNetworkEvents->iErrorCode[EventMapping->WinsockBit] = NO_ERROR; - } - - /* Move to the next mapping array */ - EventMapping++; - } - - /* Handle the special cases with two flags. Start with connect */ - if (EventInfo.PollEvents & AFD_EVENT_CONNECT) - { - /* Set the equivalent bit */ - lpNetworkEvents->lNetworkEvents |= FD_CONNECT; - - /* Now get the status */ - EventStatus = EventInfo.EventStatus[AFD_EVENT_CONNECT_BIT]; - - /* Check if it failed */ - if (!NT_SUCCESS(Status)) - { - /* Write the Winsock status code directly */ - lpNetworkEvents->iErrorCode[FD_CONNECT_BIT] = NtStatusToSocketError(EventStatus); - } - else - { - /* Write success */ - lpNetworkEvents->iErrorCode[FD_CONNECT_BIT] = NO_ERROR; - } - } - else if (EventInfo.PollEvents & AFD_EVENT_CONNECT_FAIL) - { - /* Do the same thing, but for the failure */ - lpNetworkEvents->lNetworkEvents |= FD_CONNECT; - - /* Now get the status */ - EventStatus = EventInfo.EventStatus[AFD_EVENT_CONNECT_FAIL_BIT]; - - /* Check if it failed */ - if (!NT_SUCCESS(Status)) - { - /* Write the Winsock status code directly */ - lpNetworkEvents->iErrorCode[FD_CONNECT_BIT] = NtStatusToSocketError(EventStatus); - } - else - { - /* Write success */ - lpNetworkEvents->iErrorCode[FD_CONNECT_BIT] = NO_ERROR; - } - } - - /* Now handle Abort/Disconnect */ - if (EventInfo.PollEvents & AFD_EVENT_ABORT) - { - /* Set the equivalent bit */ - lpNetworkEvents->lNetworkEvents |= FD_CLOSE; - - /* Now get the status */ - EventStatus = EventInfo.EventStatus[AFD_EVENT_ABORT_BIT]; - - /* Check if it failed */ - if (!NT_SUCCESS(Status)) - { - /* Write the Winsock status code directly */ - lpNetworkEvents->iErrorCode[FD_CLOSE_BIT] = NtStatusToSocketError(EventStatus); - } - else - { - /* Write success */ - lpNetworkEvents->iErrorCode[FD_CLOSE_BIT] = NO_ERROR; - } - } - else if (EventInfo.PollEvents & AFD_EVENT_DISCONNECT) - { - /* Do the same thing, but for the failure */ - lpNetworkEvents->lNetworkEvents |= FD_CLOSE; - - /* Now get the status */ - EventStatus = EventInfo.EventStatus[AFD_EVENT_DISCONNECT_BIT]; - - /* Check if it failed */ - if (!NT_SUCCESS(Status)) - { - /* Write the Winsock status code directly */ - lpNetworkEvents->iErrorCode[FD_CLOSE_BIT] = NtStatusToSocketError(EventStatus); - } - else - { - /* Write success */ - lpNetworkEvents->iErrorCode[FD_CLOSE_BIT] = NO_ERROR; - } - } - } - -error: - /* Dereference the socket, if we have one here */ - if (Socket) SockDereferenceSocket(Socket); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -typedef struct _SOCK_EVENT_MAPPING -{ - ULONG AfdBit; - ULONG WinsockBit; -} SOCK_EVENT_MAPPING, *PSOCK_EVENT_MAPPING; - -SOCK_EVENT_MAPPING PollEventMapping[] = - { - {AFD_EVENT_RECEIVE_BIT, FD_READ_BIT}, - {AFD_EVENT_SEND_BIT, FD_WRITE_BIT}, - {AFD_EVENT_OOB_RECEIVE_BIT, FD_OOB_BIT}, - {AFD_EVENT_ACCEPT_BIT, FD_ACCEPT_BIT}, - {AFD_EVENT_QOS_BIT, FD_QOS_BIT}, - {AFD_EVENT_GROUP_QOS_BIT, FD_GROUP_QOS_BIT}, - {AFD_EVENT_ROUTING_INTERFACE_CHANGE_BIT, FD_ROUTING_INTERFACE_CHANGE_BIT}, - {AFD_EVENT_ADDRESS_LIST_CHANGE_BIT, FD_ADDRESS_LIST_CHANGE_BIT} -}; - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -SockEventSelectHelper(IN PSOCKET_INFORMATION Socket, - IN WSAEVENT EventObject, - IN LONG Events) -{ - IO_STATUS_BLOCK IoStatusBlock; - AFD_EVENT_SELECT_INFO PollInfo; - NTSTATUS Status; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - - /* Acquire the lock */ - EnterCriticalSection(&Socket->Lock); - - /* Set Structure Info */ - PollInfo.EventObject = EventObject; - PollInfo.Events = 0; - - /* Set receive event */ - if (Events & FD_READ) PollInfo.Events |= AFD_EVENT_RECEIVE; - - /* Set write event */ - if (Events & FD_WRITE) PollInfo.Events |= AFD_EVENT_SEND; - - /* Set out-of-band (OOB) receive event */ - if (Events & FD_OOB) PollInfo.Events |= AFD_EVENT_OOB_RECEIVE; - - /* Set accept event */ - if (Events & FD_ACCEPT) PollInfo.Events |= AFD_EVENT_ACCEPT; - - /* Send Quality-of-Service (QOS) event */ - if (Events & FD_QOS) PollInfo.Events |= AFD_EVENT_QOS; - - /* Send Group Quality-of-Service (QOS) event */ - if (Events & FD_GROUP_QOS) PollInfo.Events |= AFD_EVENT_GROUP_QOS; - - /* Send connect event. Note, this also includes connect failures */ - if (Events & FD_CONNECT) PollInfo.Events |= AFD_EVENT_CONNECT | - AFD_EVENT_CONNECT_FAIL; - - /* Send close event. Note, this includes both aborts and disconnects */ - if (Events & FD_CLOSE) PollInfo.Events |= AFD_EVENT_DISCONNECT | - AFD_EVENT_ABORT; - - /* Send PnP events related to live network hardware changes */ - if (Events & FD_ROUTING_INTERFACE_CHANGE) - { - PollInfo.Events |= AFD_EVENT_ROUTING_INTERFACE_CHANGE; - } - if (Events & FD_ADDRESS_LIST_CHANGE) - { - PollInfo.Events |= AFD_EVENT_ADDRESS_LIST_CHANGE; - } - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_EVENT_SELECT, - &PollInfo, - sizeof(PollInfo), - NULL, - 0); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - LeaveCriticalSection(&Socket->Lock); - return NtStatusToSocketError(Status); - } - - /* Set Socket Data*/ - Socket->EventObject = EventObject; - Socket->NetworkEvents = Events; - - /* Release lock and return success */ - LeaveCriticalSection(&Socket->Lock); - return NO_ERROR; -} - -INT -WSPAPI -WSPEventSelect(SOCKET Handle, - WSAEVENT hEventObject, - LONG lNetworkEvents, - LPINT lpErrno) -{ - PSOCKET_INFORMATION Socket; - PWINSOCK_TEB_DATA ThreadData; - INT ErrorCode; - BOOLEAN BlockMode; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Set Socket to Non-Blocking */ - BlockMode = TRUE; - ErrorCode = SockSetInformation(Socket, - AFD_INFO_BLOCKING_MODE, - &BlockMode, - NULL, - NULL); - if (ErrorCode != NO_ERROR) goto error; - - /* AFD was notified, set it locally as well */ - Socket->SharedData.NonBlocking = TRUE; - - /* Check if there is an async select in progress */ - if (Socket->EventObject) - { - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Erase all data */ - Socket->SharedData.hWnd = NULL; - Socket->SharedData.wMsg = 0; - Socket->SharedData.AsyncEvents = 0; - - /* Unbalance the sequence number so the request will fail */ - Socket->SharedData.SequenceNumber++; - - /* Give socket access back */ - LeaveCriticalSection(&Socket->Lock); - } - - /* Make sure the flags are valid */ - if ((lNetworkEvents & ~FD_ALL_EVENTS)) - { - /* More then the possible combination, fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Call the helper */ - ErrorCode = SockEventSelectHelper(Socket, hEventObject, lNetworkEvents); - -error: - /* Dereference the socket, if we have one here */ - if (Socket) SockDereferenceSocket(Socket); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -WSPEnumNetworkEvents(IN SOCKET Handle, - IN WSAEVENT hEventObject, - OUT LPWSANETWORKEVENTS lpNetworkEvents, - OUT LPINT lpErrno) -{ - AFD_ENUM_NETWORK_EVENTS_INFO EventInfo; - IO_STATUS_BLOCK IoStatusBlock; - PSOCKET_INFORMATION Socket; - PWINSOCK_TEB_DATA ThreadData; - INT ErrorCode; - NTSTATUS Status, EventStatus; - PSOCK_EVENT_MAPPING EventMapping; - ULONG i; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Make sure we got a pointer */ - if (!lpNetworkEvents) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Send IOCTL */ - Status = NtDeviceIoControlFile((HANDLE)Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_ENUM_NETWORK_EVENTS, - hEventObject, - 0, - &EventInfo, - sizeof(EventInfo)); - - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Set Events to wait for */ - lpNetworkEvents->lNetworkEvents = 0; - - /* Set our Event Mapping structure */ - EventMapping = PollEventMapping; - - /* Loop it */ - for (i = 0; i < (sizeof(PollEventMapping) / 2 * sizeof(ULONG)); i++) - { - /* First check if we have a match for this bit */ - if (EventInfo.PollEvents & (1 << EventMapping->AfdBit)) - { - /* Match found, write the equivalent bit */ - lpNetworkEvents->lNetworkEvents |= (1 << EventMapping->WinsockBit); - - /* Now get the status */ - EventStatus = EventInfo.EventStatus[EventMapping->AfdBit]; - - /* Check if it failed */ - if (!NT_SUCCESS(Status)) - { - /* Write the Winsock status code directly */ - lpNetworkEvents->iErrorCode[EventMapping->WinsockBit] = NtStatusToSocketError(EventStatus); - } - else - { - /* Write success */ - lpNetworkEvents->iErrorCode[EventMapping->WinsockBit] = NO_ERROR; - } - - /* Move to the next mapping array */ - EventMapping++; - } - - /* Handle the special cases with two flags. Start with connect */ - if (EventInfo.PollEvents & AFD_EVENT_CONNECT) - { - /* Set the equivalent bit */ - lpNetworkEvents->lNetworkEvents |= FD_CONNECT; - - /* Now get the status */ - EventStatus = EventInfo.EventStatus[AFD_EVENT_CONNECT_BIT]; - - /* Check if it failed */ - if (!NT_SUCCESS(Status)) - { - /* Write the Winsock status code directly */ - lpNetworkEvents->iErrorCode[FD_CONNECT_BIT] = NtStatusToSocketError(EventStatus); - } - else - { - /* Write success */ - lpNetworkEvents->iErrorCode[FD_CONNECT_BIT] = NO_ERROR; - } - } - else if (EventInfo.PollEvents & AFD_EVENT_CONNECT_FAIL) - { - /* Do the same thing, but for the failure */ - lpNetworkEvents->lNetworkEvents |= FD_CONNECT; - - /* Now get the status */ - EventStatus = EventInfo.EventStatus[AFD_EVENT_CONNECT_FAIL_BIT]; - - /* Check if it failed */ - if (!NT_SUCCESS(Status)) - { - /* Write the Winsock status code directly */ - lpNetworkEvents->iErrorCode[FD_CONNECT_BIT] = NtStatusToSocketError(EventStatus); - } - else - { - /* Write success */ - lpNetworkEvents->iErrorCode[FD_CONNECT_BIT] = NO_ERROR; - } - } - - /* Now handle Abort/Disconnect */ - if (EventInfo.PollEvents & AFD_EVENT_ABORT) - { - /* Set the equivalent bit */ - lpNetworkEvents->lNetworkEvents |= FD_CLOSE; - - /* Now get the status */ - EventStatus = EventInfo.EventStatus[AFD_EVENT_ABORT_BIT]; - - /* Check if it failed */ - if (!NT_SUCCESS(Status)) - { - /* Write the Winsock status code directly */ - lpNetworkEvents->iErrorCode[FD_CLOSE_BIT] = NtStatusToSocketError(EventStatus); - } - else - { - /* Write success */ - lpNetworkEvents->iErrorCode[FD_CLOSE_BIT] = NO_ERROR; - } - } - else if (EventInfo.PollEvents & AFD_EVENT_DISCONNECT) - { - /* Do the same thing, but for the failure */ - lpNetworkEvents->lNetworkEvents |= FD_CLOSE; - - /* Now get the status */ - EventStatus = EventInfo.EventStatus[AFD_EVENT_DISCONNECT_BIT]; - - /* Check if it failed */ - if (!NT_SUCCESS(Status)) - { - /* Write the Winsock status code directly */ - lpNetworkEvents->iErrorCode[FD_CLOSE_BIT] = NtStatusToSocketError(EventStatus); - } - else - { - /* Write success */ - lpNetworkEvents->iErrorCode[FD_CLOSE_BIT] = NO_ERROR; - } - } - } - -error: - /* Dereference the socket, if we have one here */ - if (Socket) SockDereferenceSocket(Socket); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -typedef struct _SOCK_EVENT_MAPPING -{ - ULONG AfdBit; - ULONG WinsockBit; -} SOCK_EVENT_MAPPING, *PSOCK_EVENT_MAPPING; - -SOCK_EVENT_MAPPING PollEventMapping[] = - { - {AFD_EVENT_RECEIVE_BIT, FD_READ_BIT}, - {AFD_EVENT_SEND_BIT, FD_WRITE_BIT}, - {AFD_EVENT_OOB_RECEIVE_BIT, FD_OOB_BIT}, - {AFD_EVENT_ACCEPT_BIT, FD_ACCEPT_BIT}, - {AFD_EVENT_QOS_BIT, FD_QOS_BIT}, - {AFD_EVENT_GROUP_QOS_BIT, FD_GROUP_QOS_BIT}, - {AFD_EVENT_ROUTING_INTERFACE_CHANGE_BIT, FD_ROUTING_INTERFACE_CHANGE_BIT}, - {AFD_EVENT_ADDRESS_LIST_CHANGE_BIT, FD_ADDRESS_LIST_CHANGE_BIT} -}; - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -SockEventSelectHelper(IN PSOCKET_INFORMATION Socket, - IN WSAEVENT EventObject, - IN LONG Events) -{ - IO_STATUS_BLOCK IoStatusBlock; - AFD_EVENT_SELECT_INFO PollInfo; - NTSTATUS Status; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - - /* Acquire the lock */ - EnterCriticalSection(&Socket->Lock); - - /* Set Structure Info */ - PollInfo.EventObject = EventObject; - PollInfo.Events = 0; - - /* Set receive event */ - if (Events & FD_READ) PollInfo.Events |= AFD_EVENT_RECEIVE; - - /* Set write event */ - if (Events & FD_WRITE) PollInfo.Events |= AFD_EVENT_SEND; - - /* Set out-of-band (OOB) receive event */ - if (Events & FD_OOB) PollInfo.Events |= AFD_EVENT_OOB_RECEIVE; - - /* Set accept event */ - if (Events & FD_ACCEPT) PollInfo.Events |= AFD_EVENT_ACCEPT; - - /* Send Quality-of-Service (QOS) event */ - if (Events & FD_QOS) PollInfo.Events |= AFD_EVENT_QOS; - - /* Send Group Quality-of-Service (QOS) event */ - if (Events & FD_GROUP_QOS) PollInfo.Events |= AFD_EVENT_GROUP_QOS; - - /* Send connect event. Note, this also includes connect failures */ - if (Events & FD_CONNECT) PollInfo.Events |= AFD_EVENT_CONNECT | - AFD_EVENT_CONNECT_FAIL; - - /* Send close event. Note, this includes both aborts and disconnects */ - if (Events & FD_CLOSE) PollInfo.Events |= AFD_EVENT_DISCONNECT | - AFD_EVENT_ABORT; - - /* Send PnP events related to live network hardware changes */ - if (Events & FD_ROUTING_INTERFACE_CHANGE) - { - PollInfo.Events |= AFD_EVENT_ROUTING_INTERFACE_CHANGE; - } - if (Events & FD_ADDRESS_LIST_CHANGE) - { - PollInfo.Events |= AFD_EVENT_ADDRESS_LIST_CHANGE; - } - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_EVENT_SELECT, - &PollInfo, - sizeof(PollInfo), - NULL, - 0); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - LeaveCriticalSection(&Socket->Lock); - return NtStatusToSocketError(Status); - } - - /* Set Socket Data*/ - Socket->EventObject = EventObject; - Socket->NetworkEvents = Events; - - /* Release lock and return success */ - LeaveCriticalSection(&Socket->Lock); - return NO_ERROR; -} - -INT -WSPAPI -WSPEventSelect(SOCKET Handle, - WSAEVENT hEventObject, - LONG lNetworkEvents, - LPINT lpErrno) -{ - PSOCKET_INFORMATION Socket; - PWINSOCK_TEB_DATA ThreadData; - INT ErrorCode; - BOOLEAN BlockMode; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Set Socket to Non-Blocking */ - BlockMode = TRUE; - ErrorCode = SockSetInformation(Socket, - AFD_INFO_BLOCKING_MODE, - &BlockMode, - NULL, - NULL); - if (ErrorCode != NO_ERROR) goto error; - - /* AFD was notified, set it locally as well */ - Socket->SharedData.NonBlocking = TRUE; - - /* Check if there is an async select in progress */ - if (Socket->EventObject) - { - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Erase all data */ - Socket->SharedData.hWnd = NULL; - Socket->SharedData.wMsg = 0; - Socket->SharedData.AsyncEvents = 0; - - /* Unbalance the sequence number so the request will fail */ - Socket->SharedData.SequenceNumber++; - - /* Give socket access back */ - LeaveCriticalSection(&Socket->Lock); - } - - /* Make sure the flags are valid */ - if ((lNetworkEvents & ~FD_ALL_EVENTS)) - { - /* More then the possible combination, fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Call the helper */ - ErrorCode = SockEventSelectHelper(Socket, hEventObject, lNetworkEvents); - -error: - /* Dereference the socket, if we have one here */ - if (Socket) SockDereferenceSocket(Socket); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -WSPEnumNetworkEvents(IN SOCKET Handle, - IN WSAEVENT hEventObject, - OUT LPWSANETWORKEVENTS lpNetworkEvents, - OUT LPINT lpErrno) -{ - AFD_ENUM_NETWORK_EVENTS_INFO EventInfo; - IO_STATUS_BLOCK IoStatusBlock; - PSOCKET_INFORMATION Socket; - PWINSOCK_TEB_DATA ThreadData; - INT ErrorCode; - NTSTATUS Status, EventStatus; - PSOCK_EVENT_MAPPING EventMapping; - ULONG i; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Make sure we got a pointer */ - if (!lpNetworkEvents) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Send IOCTL */ - Status = NtDeviceIoControlFile((HANDLE)Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_ENUM_NETWORK_EVENTS, - hEventObject, - 0, - &EventInfo, - sizeof(EventInfo)); - - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Set Events to wait for */ - lpNetworkEvents->lNetworkEvents = 0; - - /* Set our Event Mapping structure */ - EventMapping = PollEventMapping; - - /* Loop it */ - for (i = 0; i < (sizeof(PollEventMapping) / 2 * sizeof(ULONG)); i++) - { - /* First check if we have a match for this bit */ - if (EventInfo.PollEvents & (1 << EventMapping->AfdBit)) - { - /* Match found, write the equivalent bit */ - lpNetworkEvents->lNetworkEvents |= (1 << EventMapping->WinsockBit); - - /* Now get the status */ - EventStatus = EventInfo.EventStatus[EventMapping->AfdBit]; - - /* Check if it failed */ - if (!NT_SUCCESS(Status)) - { - /* Write the Winsock status code directly */ - lpNetworkEvents->iErrorCode[EventMapping->WinsockBit] = NtStatusToSocketError(EventStatus); - } - else - { - /* Write success */ - lpNetworkEvents->iErrorCode[EventMapping->WinsockBit] = NO_ERROR; - } - - /* Move to the next mapping array */ - EventMapping++; - } - - /* Handle the special cases with two flags. Start with connect */ - if (EventInfo.PollEvents & AFD_EVENT_CONNECT) - { - /* Set the equivalent bit */ - lpNetworkEvents->lNetworkEvents |= FD_CONNECT; - - /* Now get the status */ - EventStatus = EventInfo.EventStatus[AFD_EVENT_CONNECT_BIT]; - - /* Check if it failed */ - if (!NT_SUCCESS(Status)) - { - /* Write the Winsock status code directly */ - lpNetworkEvents->iErrorCode[FD_CONNECT_BIT] = NtStatusToSocketError(EventStatus); - } - else - { - /* Write success */ - lpNetworkEvents->iErrorCode[FD_CONNECT_BIT] = NO_ERROR; - } - } - else if (EventInfo.PollEvents & AFD_EVENT_CONNECT_FAIL) - { - /* Do the same thing, but for the failure */ - lpNetworkEvents->lNetworkEvents |= FD_CONNECT; - - /* Now get the status */ - EventStatus = EventInfo.EventStatus[AFD_EVENT_CONNECT_FAIL_BIT]; - - /* Check if it failed */ - if (!NT_SUCCESS(Status)) - { - /* Write the Winsock status code directly */ - lpNetworkEvents->iErrorCode[FD_CONNECT_BIT] = NtStatusToSocketError(EventStatus); - } - else - { - /* Write success */ - lpNetworkEvents->iErrorCode[FD_CONNECT_BIT] = NO_ERROR; - } - } - - /* Now handle Abort/Disconnect */ - if (EventInfo.PollEvents & AFD_EVENT_ABORT) - { - /* Set the equivalent bit */ - lpNetworkEvents->lNetworkEvents |= FD_CLOSE; - - /* Now get the status */ - EventStatus = EventInfo.EventStatus[AFD_EVENT_ABORT_BIT]; - - /* Check if it failed */ - if (!NT_SUCCESS(Status)) - { - /* Write the Winsock status code directly */ - lpNetworkEvents->iErrorCode[FD_CLOSE_BIT] = NtStatusToSocketError(EventStatus); - } - else - { - /* Write success */ - lpNetworkEvents->iErrorCode[FD_CLOSE_BIT] = NO_ERROR; - } - } - else if (EventInfo.PollEvents & AFD_EVENT_DISCONNECT) - { - /* Do the same thing, but for the failure */ - lpNetworkEvents->lNetworkEvents |= FD_CLOSE; - - /* Now get the status */ - EventStatus = EventInfo.EventStatus[AFD_EVENT_DISCONNECT_BIT]; - - /* Check if it failed */ - if (!NT_SUCCESS(Status)) - { - /* Write the Winsock status code directly */ - lpNetworkEvents->iErrorCode[FD_CLOSE_BIT] = NtStatusToSocketError(EventStatus); - } - else - { - /* Write success */ - lpNetworkEvents->iErrorCode[FD_CLOSE_BIT] = NO_ERROR; - } - } - } - -error: - /* Dereference the socket, if we have one here */ - if (Socket) SockDereferenceSocket(Socket); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - diff --git a/dll/win32/mswsock/msafd/getname.c b/dll/win32/mswsock/msafd/getname.c index 8cbaed96e5d..873b396f0a2 100644 --- a/dll/win32/mswsock/msafd/getname.c +++ b/dll/win32/mswsock/msafd/getname.c @@ -243,738 +243,3 @@ error: return NO_ERROR; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -WSPGetSockName(IN SOCKET Handle, - OUT LPSOCKADDR Name, - IN OUT LPINT NameLength, - OUT LPINT lpErrno) -{ - IO_STATUS_BLOCK IoStatusBlock; - ULONG TdiAddressSize; - INT ErrorCode; - PTDI_ADDRESS_INFO TdiAddress = NULL; - PSOCKET_INFORMATION Socket; - NTSTATUS Status; - PWINSOCK_TEB_DATA ThreadData; - CHAR AddressBuffer[FIELD_OFFSET(TDI_ADDRESS_INFO, Address) + - MAX_TDI_ADDRESS_LENGTH]; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* If the socket isn't bound, fail */ - if (Socket->SharedData.State == SocketOpen) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Check how long the TDI Address is */ - TdiAddressSize = FIELD_OFFSET(TDI_ADDRESS_INFO, Address) + - Socket->HelperData->MaxTDIAddressLength; - - /* See if it can fit in the stack */ - if (TdiAddressSize <= sizeof(AddressBuffer)) - { - /* Use the stack */ - TdiAddress = (PVOID)AddressBuffer; - } - else - { - /* Allocate from heap */ - TdiAddress = SockAllocateHeapRoutine(SockPrivateHeap, 0, TdiAddressSize); - if (!TdiAddress) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - } - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_GET_SOCK_NAME, - NULL, - 0, - TdiAddress, - TdiAddressSize); - - /* Check if it's pending */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - LeaveCriticalSection(&Socket->Lock); - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - EnterCriticalSection(&Socket->Lock); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Convert to Sockaddr format */ - SockBuildSockaddr(Socket->LocalAddress, - &Socket->SharedData.SizeOfLocalAddress, - &TdiAddress->Address); - - /* Check for valid length */ - if (Socket->SharedData.SizeOfLocalAddress > *NameLength) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Write the Address */ - RtlCopyMemory(Name, - Socket->LocalAddress, - Socket->SharedData.SizeOfLocalAddress); - - /* Return the Name Length */ - *NameLength = Socket->SharedData.SizeOfLocalAddress; - -error: - - /* Check if we have a socket here */ - if (Socket) - { - /* Release the lock and dereference */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - - /* Check if we should free the TDI address */ - if ((TdiAddress) && (TdiAddress != (PVOID)AddressBuffer)) - { - /* Free the Buffer */ - RtlFreeHeap(SockPrivateHeap, 0, TdiAddress); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -WSPGetPeerName(IN SOCKET Handle, - OUT LPSOCKADDR Name, - IN OUT LPINT NameLength, - OUT LPINT lpErrno) -{ - INT ErrorCode; - PSOCKET_INFORMATION Socket; - PWINSOCK_TEB_DATA ThreadData; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* If the socket isn't connected, then fail */ - if (!(SockIsSocketConnected(Socket)) && !(Socket->AsyncData)) - { - /* Fail */ - ErrorCode = WSAENOTCONN; - goto error; - } - - /* Check for valid length */ - if (Socket->SharedData.SizeOfRemoteAddress > *NameLength) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Write the Address */ - RtlCopyMemory(Name, - Socket->RemoteAddress, - Socket->SharedData.SizeOfRemoteAddress); - - /* Return the Name Length */ - *NameLength = Socket->SharedData.SizeOfRemoteAddress; - -error: - - /* Check if we have a socket here */ - if (Socket) - { - /* Release the lock and dereference */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -WSPGetSockName(IN SOCKET Handle, - OUT LPSOCKADDR Name, - IN OUT LPINT NameLength, - OUT LPINT lpErrno) -{ - IO_STATUS_BLOCK IoStatusBlock; - ULONG TdiAddressSize; - INT ErrorCode; - PTDI_ADDRESS_INFO TdiAddress = NULL; - PSOCKET_INFORMATION Socket; - NTSTATUS Status; - PWINSOCK_TEB_DATA ThreadData; - CHAR AddressBuffer[FIELD_OFFSET(TDI_ADDRESS_INFO, Address) + - MAX_TDI_ADDRESS_LENGTH]; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* If the socket isn't bound, fail */ - if (Socket->SharedData.State == SocketOpen) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Check how long the TDI Address is */ - TdiAddressSize = FIELD_OFFSET(TDI_ADDRESS_INFO, Address) + - Socket->HelperData->MaxTDIAddressLength; - - /* See if it can fit in the stack */ - if (TdiAddressSize <= sizeof(AddressBuffer)) - { - /* Use the stack */ - TdiAddress = (PVOID)AddressBuffer; - } - else - { - /* Allocate from heap */ - TdiAddress = SockAllocateHeapRoutine(SockPrivateHeap, 0, TdiAddressSize); - if (!TdiAddress) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - } - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_GET_SOCK_NAME, - NULL, - 0, - TdiAddress, - TdiAddressSize); - - /* Check if it's pending */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - LeaveCriticalSection(&Socket->Lock); - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - EnterCriticalSection(&Socket->Lock); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Convert to Sockaddr format */ - SockBuildSockaddr(Socket->LocalAddress, - &Socket->SharedData.SizeOfLocalAddress, - &TdiAddress->Address); - - /* Check for valid length */ - if (Socket->SharedData.SizeOfLocalAddress > *NameLength) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Write the Address */ - RtlCopyMemory(Name, - Socket->LocalAddress, - Socket->SharedData.SizeOfLocalAddress); - - /* Return the Name Length */ - *NameLength = Socket->SharedData.SizeOfLocalAddress; - -error: - - /* Check if we have a socket here */ - if (Socket) - { - /* Release the lock and dereference */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - - /* Check if we should free the TDI address */ - if ((TdiAddress) && (TdiAddress != (PVOID)AddressBuffer)) - { - /* Free the Buffer */ - RtlFreeHeap(SockPrivateHeap, 0, TdiAddress); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -WSPGetPeerName(IN SOCKET Handle, - OUT LPSOCKADDR Name, - IN OUT LPINT NameLength, - OUT LPINT lpErrno) -{ - INT ErrorCode; - PSOCKET_INFORMATION Socket; - PWINSOCK_TEB_DATA ThreadData; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* If the socket isn't connected, then fail */ - if (!(SockIsSocketConnected(Socket)) && !(Socket->AsyncData)) - { - /* Fail */ - ErrorCode = WSAENOTCONN; - goto error; - } - - /* Check for valid length */ - if (Socket->SharedData.SizeOfRemoteAddress > *NameLength) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Write the Address */ - RtlCopyMemory(Name, - Socket->RemoteAddress, - Socket->SharedData.SizeOfRemoteAddress); - - /* Return the Name Length */ - *NameLength = Socket->SharedData.SizeOfRemoteAddress; - -error: - - /* Check if we have a socket here */ - if (Socket) - { - /* Release the lock and dereference */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -WSPGetSockName(IN SOCKET Handle, - OUT LPSOCKADDR Name, - IN OUT LPINT NameLength, - OUT LPINT lpErrno) -{ - IO_STATUS_BLOCK IoStatusBlock; - ULONG TdiAddressSize; - INT ErrorCode; - PTDI_ADDRESS_INFO TdiAddress = NULL; - PSOCKET_INFORMATION Socket; - NTSTATUS Status; - PWINSOCK_TEB_DATA ThreadData; - CHAR AddressBuffer[FIELD_OFFSET(TDI_ADDRESS_INFO, Address) + - MAX_TDI_ADDRESS_LENGTH]; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* If the socket isn't bound, fail */ - if (Socket->SharedData.State == SocketOpen) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Check how long the TDI Address is */ - TdiAddressSize = FIELD_OFFSET(TDI_ADDRESS_INFO, Address) + - Socket->HelperData->MaxTDIAddressLength; - - /* See if it can fit in the stack */ - if (TdiAddressSize <= sizeof(AddressBuffer)) - { - /* Use the stack */ - TdiAddress = (PVOID)AddressBuffer; - } - else - { - /* Allocate from heap */ - TdiAddress = SockAllocateHeapRoutine(SockPrivateHeap, 0, TdiAddressSize); - if (!TdiAddress) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - } - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_GET_SOCK_NAME, - NULL, - 0, - TdiAddress, - TdiAddressSize); - - /* Check if it's pending */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - LeaveCriticalSection(&Socket->Lock); - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - EnterCriticalSection(&Socket->Lock); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Convert to Sockaddr format */ - SockBuildSockaddr(Socket->LocalAddress, - &Socket->SharedData.SizeOfLocalAddress, - &TdiAddress->Address); - - /* Check for valid length */ - if (Socket->SharedData.SizeOfLocalAddress > *NameLength) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Write the Address */ - RtlCopyMemory(Name, - Socket->LocalAddress, - Socket->SharedData.SizeOfLocalAddress); - - /* Return the Name Length */ - *NameLength = Socket->SharedData.SizeOfLocalAddress; - -error: - - /* Check if we have a socket here */ - if (Socket) - { - /* Release the lock and dereference */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - - /* Check if we should free the TDI address */ - if ((TdiAddress) && (TdiAddress != (PVOID)AddressBuffer)) - { - /* Free the Buffer */ - RtlFreeHeap(SockPrivateHeap, 0, TdiAddress); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -WSPGetPeerName(IN SOCKET Handle, - OUT LPSOCKADDR Name, - IN OUT LPINT NameLength, - OUT LPINT lpErrno) -{ - INT ErrorCode; - PSOCKET_INFORMATION Socket; - PWINSOCK_TEB_DATA ThreadData; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* If the socket isn't connected, then fail */ - if (!(SockIsSocketConnected(Socket)) && !(Socket->AsyncData)) - { - /* Fail */ - ErrorCode = WSAENOTCONN; - goto error; - } - - /* Check for valid length */ - if (Socket->SharedData.SizeOfRemoteAddress > *NameLength) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Write the Address */ - RtlCopyMemory(Name, - Socket->RemoteAddress, - Socket->SharedData.SizeOfRemoteAddress); - - /* Return the Name Length */ - *NameLength = Socket->SharedData.SizeOfRemoteAddress; - -error: - - /* Check if we have a socket here */ - if (Socket) - { - /* Release the lock and dereference */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - diff --git a/dll/win32/mswsock/msafd/helper.c b/dll/win32/mswsock/msafd/helper.c index e506d24937f..de166b4a806 100644 --- a/dll/win32/mswsock/msafd/helper.c +++ b/dll/win32/mswsock/msafd/helper.c @@ -693,2088 +693,3 @@ SockNotifyHelperDll(IN PSOCKET_INFORMATION Socket, Event); } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -LIST_ENTRY SockHelperDllListHead; - -/* FUNCTIONS *****************************************************************/ - -VOID -WSPAPI -SockFreeHelperDll(IN PHELPER_DATA Helper) -{ - /* Free the DLL */ - FreeLibrary(Helper->hInstance); - - /* Free the mapping */ - RtlFreeHeap(SockPrivateHeap, 0, Helper->Mapping); - - /* Free the DLL Structure itself */ - RtlFreeHeap(SockPrivateHeap, 0, Helper); -} - -INT -WSPAPI -SockGetTdiName(PINT AddressFamily, - PINT SocketType, - PINT Protocol, - LPGUID ProviderId, - GROUP Group, - DWORD Flags, - PUNICODE_STRING TransportName, - PVOID *HelperDllContext, - PHELPER_DATA *HelperDllData, - PDWORD Events) -{ - PHELPER_DATA HelperData; - PWSTR Transports; - PWSTR Transport; - PWINSOCK_MAPPING Mapping; - PLIST_ENTRY Helpers; - BOOLEAN SharedLock = TRUE; - INT ErrorCode; - BOOLEAN AfMatch = FALSE, ProtoMatch = FALSE, SocketMatch = FALSE; - - /* Acquire global lock */ - SockAcquireRwLockShared(&SocketGlobalLock); - -TryAgain: - /* Check in our Current Loaded Helpers */ - for (Helpers = SockHelperDllListHead.Flink; - Helpers != &SockHelperDllListHead; - Helpers = Helpers->Flink) - { - /* Get the current helper */ - HelperData = CONTAINING_RECORD(Helpers, HELPER_DATA, Helpers); - - /* See if this Mapping works for us */ - if (SockIsTripleInMapping(HelperData->Mapping, - *AddressFamily, - &AfMatch, - *SocketType, - &SocketMatch, - *Protocol, - &ProtoMatch)) - { - /* Call the Helper Dll function get the Transport Name */ - if (!HelperData->WSHOpenSocket2) - { - if (!(Flags & WSA_FLAG_MULTIPOINT_ALL)) - { - /* DLL Doesn't support WSHOpenSocket2, call the old one */ - ErrorCode = HelperData->WSHOpenSocket(AddressFamily, - SocketType, - Protocol, - TransportName, - HelperDllContext, - Events); - } - else - { - /* Invalid flag */ - ErrorCode = WSAEINVAL; - } - } - else - { - /* Call the new WSHOpenSocket */ - ErrorCode = HelperData->WSHOpenSocket2(AddressFamily, - SocketType, - Protocol, - Group, - Flags, - TransportName, - HelperDllContext, - Events); - } - - /* Check for success */ - if (ErrorCode == NO_ERROR) - { - /* Reference the helper */ - InterlockedIncrement(&HelperData->RefCount); - - /* Check which lock we acquired */ - if (SharedLock) - { - /* Release the shared lock */ - SockReleaseRwLockShared(&SocketGlobalLock); - } - else - { - /* Release the acquired lock */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - } - - /* Return the Helper Pointers */ - *HelperDllData = HelperData; - return NO_ERROR; - } - - /* Check if we don't need a transport name */ - if ((*SocketType == SOCK_RAW) && (TransportName->Buffer)) - { - /* Free it */ - RtlFreeHeap(RtlGetProcessHeap(), 0, TransportName->Buffer); - TransportName->Buffer = NULL; - } - } - } - - /* We didn't find a match: try again with RW access */ - if (SharedLock) - { - /* Switch locks */ - SockReleaseRwLockShared(&SocketGlobalLock); - SockAcquireRwLockExclusive(&SocketGlobalLock); - - /* Parse the list again */ - SharedLock = FALSE; - goto TryAgain; - } - - /* Get the Transports available */ - ErrorCode = SockLoadTransportList(&Transports); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - return ErrorCode; - } - - /* Loop through each transport until we find one that can satisfy us */ - for (Transport = Transports; *Transport; Transport += wcslen(Transport) + 1) - { - /* See what mapping this Transport supports */ - ErrorCode = SockLoadTransportMapping(Transport, &Mapping); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Try the next one */ - continue; - } - - /* See if this Mapping works for us */ - if (SockIsTripleInMapping(Mapping, - *AddressFamily, - &AfMatch, - *SocketType, - &SocketMatch, - *Protocol, - &ProtoMatch)) - { - /* It does, so load the DLL associated with it */ - ErrorCode = SockLoadHelperDll(Transport, Mapping, &HelperData); - - /* Check for success */ - if (ErrorCode == NO_ERROR) - { - /* Call the Helper Dll function get the Transport Name */ - if (!HelperData->WSHOpenSocket2) - { - /* Check for invalid flag combo */ - if (!(Flags & WSA_FLAG_MULTIPOINT_ALL)) - { - /* DLL Doesn't support WSHOpenSocket2, call the old one */ - ErrorCode = HelperData->WSHOpenSocket(AddressFamily, - SocketType, - Protocol, - TransportName, - HelperDllContext, - Events); - } - else - { - /* Fail */ - ErrorCode = WSAEINVAL; - } - } - else - { - /* Call the newer function */ - ErrorCode = HelperData->WSHOpenSocket2(AddressFamily, - SocketType, - Protocol, - Group, - Flags, - TransportName, - HelperDllContext, - Events); - } - - /* Check for success */ - if (ErrorCode == NO_ERROR) - { - /* Reference the helper */ - InterlockedIncrement(&HelperData->RefCount); - - /* Release the lock and free the transports */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - RtlFreeHeap(SockPrivateHeap, 0, Transports); - - /* Return the Helper Pointer */ - *HelperDllData = HelperData; - return NO_ERROR; - } - - /* Check if we don't need a transport name */ - if ((*SocketType == SOCK_RAW) && (TransportName->Buffer)) - { - /* Free it */ - RtlFreeHeap(RtlGetProcessHeap(), 0, TransportName->Buffer); - TransportName->Buffer = NULL; - } - - /* Try again */ - continue; - } - } - - /* Free the mapping and continue */ - RtlFreeHeap(SockPrivateHeap, 0, Mapping); - } - - /* Release the lock and free the transport list */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - RtlFreeHeap(SockPrivateHeap, 0, Transports); - - /* Check why we didn't find a match */ - if (!AfMatch) return WSAEAFNOSUPPORT; - if (!ProtoMatch) return WSAEPROTONOSUPPORT; - if (!SocketMatch) return WSAESOCKTNOSUPPORT; - - /* The comination itself was invalid */ - return WSAEINVAL; -} - -INT -WSPAPI -SockLoadTransportMapping(IN PWSTR TransportName, - OUT PWINSOCK_MAPPING *Mapping) -{ - PWSTR TransportKey; - HKEY KeyHandle; - INT ErrorCode; - ULONG MappingSize = 0; - - /* Allocate a Buffer */ - TransportKey = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - MAX_PATH * sizeof(WCHAR)); - /* Check for error */ - if (!TransportKey) return ERROR_NOT_ENOUGH_MEMORY; - - /* Generate the right key name */ - wcscpy(TransportKey, L"System\\CurrentControlSet\\Services\\"); - wcscat(TransportKey, TransportName); - wcscat(TransportKey, L"\\Parameters\\Winsock"); - - /* Open the Key */ - ErrorCode = RegOpenKeyExW(HKEY_LOCAL_MACHINE, - TransportKey, - 0, - KEY_READ, - &KeyHandle); - - /* We don't need the Transport Key anymore */ - RtlFreeHeap(SockPrivateHeap, 0, TransportKey); - - /* Check for error */ - if ((ErrorCode != ERROR_MORE_DATA) && (ErrorCode != NO_ERROR)) - { - /* Close key and fail */ - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Find out how much space we need for the Mapping */ - ErrorCode = RegQueryValueExW(KeyHandle, - L"Mapping", - NULL, - NULL, - NULL, - &MappingSize); - - /* Check for error */ - if ((ErrorCode != ERROR_MORE_DATA) && (ErrorCode != NO_ERROR)) - { - /* Close key and fail */ - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Allocate Memory for the Mapping */ - *Mapping = SockAllocateHeapRoutine(SockPrivateHeap, 0, MappingSize); - - /* Check for error */ - if (!(*Mapping)) - { - /* Close key and fail */ - RegCloseKey(KeyHandle); - return ERROR_NOT_ENOUGH_MEMORY; - } - - /* Read the Mapping */ - ErrorCode = RegQueryValueExW(KeyHandle, - L"Mapping", - NULL, - NULL, - (LPBYTE)*Mapping, - &MappingSize); - - /* Check for error */ - if ((ErrorCode != ERROR_MORE_DATA) && (ErrorCode != NO_ERROR)) - { - /* Close key and fail */ - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Close key and return */ - RegCloseKey(KeyHandle); - return NO_ERROR; -} - -INT -WSPAPI -SockLoadHelperDll(PWSTR TransportName, - PWINSOCK_MAPPING Mapping, - PHELPER_DATA *HelperDllData) -{ - PHELPER_DATA HelperData; - PWSTR HelperDllName; - PWSTR FullHelperDllName; - ULONG HelperDllNameSize; - PWSTR HelperKey; - HKEY KeyHandle; - ULONG DataSize; - INT ErrorCode; - PLIST_ENTRY Entry; - - /* Allocate space for the Helper Structure and TransportName */ - HelperData = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - sizeof(*HelperData) + - (DWORD)(wcslen(TransportName) + 1) * - sizeof(WCHAR)); - - /* Check for error */ - if (!HelperData) return ERROR_NOT_ENOUGH_MEMORY; - - /* Allocate Space for the Helper DLL Key */ - HelperKey = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - MAX_PATH * sizeof(WCHAR)); - - /* Check for error */ - if (!HelperKey) - { - RtlFreeHeap(SockPrivateHeap, 0, HelperData); - return ERROR_NOT_ENOUGH_MEMORY; - } - - /* Generate the right key name */ - wcscpy(HelperKey, L"System\\CurrentControlSet\\Services\\"); - wcscat(HelperKey, TransportName); - wcscat(HelperKey, L"\\Parameters\\Winsock"); - - /* Open the Key */ - ErrorCode = RegOpenKeyExW(HKEY_LOCAL_MACHINE, - HelperKey, - 0, - KEY_READ, - &KeyHandle); - - /* Free Buffer */ - RtlFreeHeap(SockPrivateHeap, 0, HelperKey); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Free the helper data and fail */ - RtlFreeHeap(SockPrivateHeap, 0, HelperData); - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Read Minimum size of Sockaddr Structures */ - DataSize = sizeof(HelperData->MinWSAddressLength); - RegQueryValueExW(KeyHandle, - L"MinSockaddrLength", - NULL, - NULL, - (LPBYTE)&HelperData->MinWSAddressLength, - &DataSize); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Free the helper data and fail */ - RtlFreeHeap(SockPrivateHeap, 0, HelperData); - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Read Maximum size of Sockaddr Structures */ - DataSize = sizeof(HelperData->MinWSAddressLength); - RegQueryValueExW(KeyHandle, - L"MaxSockaddrLength", - NULL, - NULL, - (LPBYTE)&HelperData->MaxWSAddressLength, - &DataSize); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Free the helper data and fail */ - RtlFreeHeap(SockPrivateHeap, 0, HelperData); - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Size of TDI Structures */ - HelperData->MinTDIAddressLength = HelperData->MinWSAddressLength + 6; - HelperData->MaxTDIAddressLength = HelperData->MaxWSAddressLength + 6; - - /* Read Delayed Acceptance Setting */ - DataSize = sizeof(DWORD); - ErrorCode = RegQueryValueExW(KeyHandle, - L"UseDelayedAcceptance", - NULL, - NULL, - (LPBYTE)&HelperData->UseDelayedAcceptance, - &DataSize); - - /* Use defalt if we failed */ - if (ErrorCode != NO_ERROR) HelperData->UseDelayedAcceptance = -1; - - /* Allocate Space for the Helper DLL Names */ - HelperDllName = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - MAX_PATH * sizeof(WCHAR)); - - /* Check for error */ - if (!HelperDllName) - { - /* Free the helper data and fail */ - RtlFreeHeap(SockPrivateHeap, 0, HelperData); - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Allocate space for the expanded version */ - FullHelperDllName = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - MAX_PATH * sizeof(WCHAR)); - - /* Check for error */ - if (!FullHelperDllName) - { - /* Free the helper data and fail */ - RtlFreeHeap(SockPrivateHeap, 0, HelperData); - RtlFreeHeap(SockPrivateHeap, 0, HelperDllName); - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Get the name of the Helper DLL*/ - DataSize = 512; - ErrorCode = RegQueryValueExW(KeyHandle, - L"HelperDllName", - NULL, - NULL, - (LPBYTE)HelperDllName, - &DataSize); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Free the helper data and fail */ - RtlFreeHeap(SockPrivateHeap, 0, HelperData); - RtlFreeHeap(SockPrivateHeap, 0, HelperDllName); - RtlFreeHeap(SockPrivateHeap, 0, FullHelperDllName); - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Get the Full name, expanding Environment Strings */ - HelperDllNameSize = ExpandEnvironmentStringsW(HelperDllName, - FullHelperDllName, - MAX_PATH); - - /* Load the DLL */ - HelperData->hInstance = LoadLibraryW(FullHelperDllName); - - /* Free Buffers */ - RtlFreeHeap(SockPrivateHeap, 0, HelperDllName); - RtlFreeHeap(SockPrivateHeap, 0, FullHelperDllName); - - /* Return if we didn't Load it Properly */ - if (!HelperData->hInstance) - { - /* Free memory and fail */ - RtlFreeHeap(SockPrivateHeap, 0, HelperData); - RegCloseKey(KeyHandle); - return GetLastError(); - } - - /* Close Key */ - RegCloseKey(KeyHandle); - - /* Get the Pointers to the Helper Routines */ - HelperData->WSHOpenSocket = (PWSH_OPEN_SOCKET) - GetProcAddress(HelperData->hInstance, - "WSHOpenSocket"); - HelperData->WSHOpenSocket2 = (PWSH_OPEN_SOCKET2) - GetProcAddress(HelperData->hInstance, - "WSHOpenSocket2"); - HelperData->WSHJoinLeaf = (PWSH_JOIN_LEAF) - GetProcAddress(HelperData->hInstance, - "WSHJoinLeaf"); - HelperData->WSHNotify = (PWSH_NOTIFY) - GetProcAddress(HelperData->hInstance, "WSHNotify"); - HelperData->WSHGetSocketInformation = (PWSH_GET_SOCKET_INFORMATION) - GetProcAddress(HelperData->hInstance, - "WSHGetSocketInformation"); - HelperData->WSHSetSocketInformation = (PWSH_SET_SOCKET_INFORMATION) - GetProcAddress(HelperData->hInstance, - "WSHSetSocketInformation"); - HelperData->WSHGetSockaddrType = (PWSH_GET_SOCKADDR_TYPE) - GetProcAddress(HelperData->hInstance, - "WSHGetSockaddrType"); - HelperData->WSHGetWildcardSockaddr = (PWSH_GET_WILDCARD_SOCKADDR) - GetProcAddress(HelperData->hInstance, - "WSHGetWildcardSockaddr"); - HelperData->WSHGetBroadcastSockaddr = (PWSH_GET_BROADCAST_SOCKADDR) - GetProcAddress(HelperData->hInstance, - "WSHGetBroadcastSockaddr"); - HelperData->WSHAddressToString = (PWSH_ADDRESS_TO_STRING) - GetProcAddress(HelperData->hInstance, - "WSHAddressToString"); - HelperData->WSHStringToAddress = (PWSH_STRING_TO_ADDRESS) - GetProcAddress(HelperData->hInstance, - "WSHStringToAddress"); - HelperData->WSHIoctl = (PWSH_IOCTL) - GetProcAddress(HelperData->hInstance, "WSHIoctl"); - - /* Save the Mapping Structure and transport name */ - HelperData->Mapping = Mapping; - wcscpy(HelperData->TransportName, TransportName); - - /* Increment Reference Count */ - HelperData->RefCount = 1; - - /* Add it to our list */ - InsertHeadList(&SockHelperDllListHead, &HelperData->Helpers); - - /* Return Pointers */ - *HelperDllData = HelperData; - - /* Check if this one was already load it */ - Entry = HelperData->Helpers.Flink; - while (Entry != &SockHelperDllListHead) - { - /* Get the entry */ - HelperData = CONTAINING_RECORD(Entry, HELPER_DATA, Helpers); - - /* Move to the next one */ - Entry = Entry->Flink; - - /* Check if the names match */ - if (!wcscmp(HelperData->TransportName, (*HelperDllData)->TransportName)) - { - /* Remove this one */ - RemoveEntryList(&HelperData->Helpers); - SockDereferenceHelperDll(HelperData); - } - } - - /* Return success */ - return NO_ERROR; -} - -BOOL -WSPAPI -SockIsTripleInMapping(IN PWINSOCK_MAPPING Mapping, - IN INT AddressFamily, - OUT PBOOLEAN AfMatch, - IN INT SocketType, - OUT PBOOLEAN SockMatch, - IN INT Protocol, - OUT PBOOLEAN ProtoMatch) -{ - ULONG Row; - BOOLEAN FoundAf = FALSE, FoundProto = FALSE, FoundSocket = FALSE; - - /* Loop through Mapping to Find a matching one */ - for (Row = 0; Row < Mapping->Rows; Row++) - { - /* Check Address Family */ - if ((INT)Mapping->Mapping[Row].AddressFamily == AddressFamily) - { - /* Remember that we found it */ - FoundAf = TRUE; - } - - /* Check Socket Type */ - if ((INT)Mapping->Mapping[Row].SocketType == SocketType) - { - /* Remember that we found it */ - FoundSocket = TRUE; - } - - /* Check Protocol (SOCK_RAW and AF_NETBIOS can skip this check) */ - if (((INT)Mapping->Mapping[Row].SocketType == SocketType) || - (AddressFamily == AF_NETBIOS) || (SocketType == SOCK_RAW)) - { - /* Remember that we found it */ - FoundProto = TRUE; - } - - /* Check of all three values Match */ - if (FoundProto && FoundSocket && FoundAf) - { - /* Return success */ - *AfMatch = *SockMatch = *ProtoMatch = TRUE; - return TRUE; - } - } - - /* Return whatever we found */ - if (FoundAf) *AfMatch = TRUE; - if (FoundSocket) *SockMatch = TRUE; - if (FoundProto) *ProtoMatch = TRUE; - - /* Fail */ - return FALSE; -} - -INT -WSPAPI -SockNotifyHelperDll(IN PSOCKET_INFORMATION Socket, - IN DWORD Event) -{ - INT ErrorCode; - - /* See if this event matters */ - if (!(Socket->HelperEvents & Event)) return NO_ERROR; - - /* See if we have a helper... */ - if (!(Socket->HelperData)) return NO_ERROR; - - /* Get TDI handles */ - ErrorCode = SockGetTdiHandles(Socket); - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Call the notification */ - return Socket->HelperData->WSHNotify(Socket->HelperContext, - Socket->Handle, - Socket->TdiAddressHandle, - Socket->TdiConnectionHandle, - Event); -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -LIST_ENTRY SockHelperDllListHead; - -/* FUNCTIONS *****************************************************************/ - -VOID -WSPAPI -SockFreeHelperDll(IN PHELPER_DATA Helper) -{ - /* Free the DLL */ - FreeLibrary(Helper->hInstance); - - /* Free the mapping */ - RtlFreeHeap(SockPrivateHeap, 0, Helper->Mapping); - - /* Free the DLL Structure itself */ - RtlFreeHeap(SockPrivateHeap, 0, Helper); -} - -INT -WSPAPI -SockGetTdiName(PINT AddressFamily, - PINT SocketType, - PINT Protocol, - LPGUID ProviderId, - GROUP Group, - DWORD Flags, - PUNICODE_STRING TransportName, - PVOID *HelperDllContext, - PHELPER_DATA *HelperDllData, - PDWORD Events) -{ - PHELPER_DATA HelperData; - PWSTR Transports; - PWSTR Transport; - PWINSOCK_MAPPING Mapping; - PLIST_ENTRY Helpers; - BOOLEAN SharedLock = TRUE; - INT ErrorCode; - BOOLEAN AfMatch = FALSE, ProtoMatch = FALSE, SocketMatch = FALSE; - - /* Acquire global lock */ - SockAcquireRwLockShared(&SocketGlobalLock); - -TryAgain: - /* Check in our Current Loaded Helpers */ - for (Helpers = SockHelperDllListHead.Flink; - Helpers != &SockHelperDllListHead; - Helpers = Helpers->Flink) - { - /* Get the current helper */ - HelperData = CONTAINING_RECORD(Helpers, HELPER_DATA, Helpers); - - /* See if this Mapping works for us */ - if (SockIsTripleInMapping(HelperData->Mapping, - *AddressFamily, - &AfMatch, - *SocketType, - &SocketMatch, - *Protocol, - &ProtoMatch)) - { - /* Call the Helper Dll function get the Transport Name */ - if (!HelperData->WSHOpenSocket2) - { - if (!(Flags & WSA_FLAG_MULTIPOINT_ALL)) - { - /* DLL Doesn't support WSHOpenSocket2, call the old one */ - ErrorCode = HelperData->WSHOpenSocket(AddressFamily, - SocketType, - Protocol, - TransportName, - HelperDllContext, - Events); - } - else - { - /* Invalid flag */ - ErrorCode = WSAEINVAL; - } - } - else - { - /* Call the new WSHOpenSocket */ - ErrorCode = HelperData->WSHOpenSocket2(AddressFamily, - SocketType, - Protocol, - Group, - Flags, - TransportName, - HelperDllContext, - Events); - } - - /* Check for success */ - if (ErrorCode == NO_ERROR) - { - /* Reference the helper */ - InterlockedIncrement(&HelperData->RefCount); - - /* Check which lock we acquired */ - if (SharedLock) - { - /* Release the shared lock */ - SockReleaseRwLockShared(&SocketGlobalLock); - } - else - { - /* Release the acquired lock */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - } - - /* Return the Helper Pointers */ - *HelperDllData = HelperData; - return NO_ERROR; - } - - /* Check if we don't need a transport name */ - if ((*SocketType == SOCK_RAW) && (TransportName->Buffer)) - { - /* Free it */ - RtlFreeHeap(RtlGetProcessHeap(), 0, TransportName->Buffer); - TransportName->Buffer = NULL; - } - } - } - - /* We didn't find a match: try again with RW access */ - if (SharedLock) - { - /* Switch locks */ - SockReleaseRwLockShared(&SocketGlobalLock); - SockAcquireRwLockExclusive(&SocketGlobalLock); - - /* Parse the list again */ - SharedLock = FALSE; - goto TryAgain; - } - - /* Get the Transports available */ - ErrorCode = SockLoadTransportList(&Transports); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - return ErrorCode; - } - - /* Loop through each transport until we find one that can satisfy us */ - for (Transport = Transports; *Transport; Transport += wcslen(Transport) + 1) - { - /* See what mapping this Transport supports */ - ErrorCode = SockLoadTransportMapping(Transport, &Mapping); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Try the next one */ - continue; - } - - /* See if this Mapping works for us */ - if (SockIsTripleInMapping(Mapping, - *AddressFamily, - &AfMatch, - *SocketType, - &SocketMatch, - *Protocol, - &ProtoMatch)) - { - /* It does, so load the DLL associated with it */ - ErrorCode = SockLoadHelperDll(Transport, Mapping, &HelperData); - - /* Check for success */ - if (ErrorCode == NO_ERROR) - { - /* Call the Helper Dll function get the Transport Name */ - if (!HelperData->WSHOpenSocket2) - { - /* Check for invalid flag combo */ - if (!(Flags & WSA_FLAG_MULTIPOINT_ALL)) - { - /* DLL Doesn't support WSHOpenSocket2, call the old one */ - ErrorCode = HelperData->WSHOpenSocket(AddressFamily, - SocketType, - Protocol, - TransportName, - HelperDllContext, - Events); - } - else - { - /* Fail */ - ErrorCode = WSAEINVAL; - } - } - else - { - /* Call the newer function */ - ErrorCode = HelperData->WSHOpenSocket2(AddressFamily, - SocketType, - Protocol, - Group, - Flags, - TransportName, - HelperDllContext, - Events); - } - - /* Check for success */ - if (ErrorCode == NO_ERROR) - { - /* Reference the helper */ - InterlockedIncrement(&HelperData->RefCount); - - /* Release the lock and free the transports */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - RtlFreeHeap(SockPrivateHeap, 0, Transports); - - /* Return the Helper Pointer */ - *HelperDllData = HelperData; - return NO_ERROR; - } - - /* Check if we don't need a transport name */ - if ((*SocketType == SOCK_RAW) && (TransportName->Buffer)) - { - /* Free it */ - RtlFreeHeap(RtlGetProcessHeap(), 0, TransportName->Buffer); - TransportName->Buffer = NULL; - } - - /* Try again */ - continue; - } - } - - /* Free the mapping and continue */ - RtlFreeHeap(SockPrivateHeap, 0, Mapping); - } - - /* Release the lock and free the transport list */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - RtlFreeHeap(SockPrivateHeap, 0, Transports); - - /* Check why we didn't find a match */ - if (!AfMatch) return WSAEAFNOSUPPORT; - if (!ProtoMatch) return WSAEPROTONOSUPPORT; - if (!SocketMatch) return WSAESOCKTNOSUPPORT; - - /* The comination itself was invalid */ - return WSAEINVAL; -} - -INT -WSPAPI -SockLoadTransportMapping(IN PWSTR TransportName, - OUT PWINSOCK_MAPPING *Mapping) -{ - PWSTR TransportKey; - HKEY KeyHandle; - INT ErrorCode; - ULONG MappingSize = 0; - - /* Allocate a Buffer */ - TransportKey = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - MAX_PATH * sizeof(WCHAR)); - /* Check for error */ - if (!TransportKey) return ERROR_NOT_ENOUGH_MEMORY; - - /* Generate the right key name */ - wcscpy(TransportKey, L"System\\CurrentControlSet\\Services\\"); - wcscat(TransportKey, TransportName); - wcscat(TransportKey, L"\\Parameters\\Winsock"); - - /* Open the Key */ - ErrorCode = RegOpenKeyExW(HKEY_LOCAL_MACHINE, - TransportKey, - 0, - KEY_READ, - &KeyHandle); - - /* We don't need the Transport Key anymore */ - RtlFreeHeap(SockPrivateHeap, 0, TransportKey); - - /* Check for error */ - if ((ErrorCode != ERROR_MORE_DATA) && (ErrorCode != NO_ERROR)) - { - /* Close key and fail */ - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Find out how much space we need for the Mapping */ - ErrorCode = RegQueryValueExW(KeyHandle, - L"Mapping", - NULL, - NULL, - NULL, - &MappingSize); - - /* Check for error */ - if ((ErrorCode != ERROR_MORE_DATA) && (ErrorCode != NO_ERROR)) - { - /* Close key and fail */ - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Allocate Memory for the Mapping */ - *Mapping = SockAllocateHeapRoutine(SockPrivateHeap, 0, MappingSize); - - /* Check for error */ - if (!(*Mapping)) - { - /* Close key and fail */ - RegCloseKey(KeyHandle); - return ERROR_NOT_ENOUGH_MEMORY; - } - - /* Read the Mapping */ - ErrorCode = RegQueryValueExW(KeyHandle, - L"Mapping", - NULL, - NULL, - (LPBYTE)*Mapping, - &MappingSize); - - /* Check for error */ - if ((ErrorCode != ERROR_MORE_DATA) && (ErrorCode != NO_ERROR)) - { - /* Close key and fail */ - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Close key and return */ - RegCloseKey(KeyHandle); - return NO_ERROR; -} - -INT -WSPAPI -SockLoadHelperDll(PWSTR TransportName, - PWINSOCK_MAPPING Mapping, - PHELPER_DATA *HelperDllData) -{ - PHELPER_DATA HelperData; - PWSTR HelperDllName; - PWSTR FullHelperDllName; - ULONG HelperDllNameSize; - PWSTR HelperKey; - HKEY KeyHandle; - ULONG DataSize; - INT ErrorCode; - PLIST_ENTRY Entry; - - /* Allocate space for the Helper Structure and TransportName */ - HelperData = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - sizeof(*HelperData) + - (DWORD)(wcslen(TransportName) + 1) * - sizeof(WCHAR)); - - /* Check for error */ - if (!HelperData) return ERROR_NOT_ENOUGH_MEMORY; - - /* Allocate Space for the Helper DLL Key */ - HelperKey = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - MAX_PATH * sizeof(WCHAR)); - - /* Check for error */ - if (!HelperKey) - { - RtlFreeHeap(SockPrivateHeap, 0, HelperData); - return ERROR_NOT_ENOUGH_MEMORY; - } - - /* Generate the right key name */ - wcscpy(HelperKey, L"System\\CurrentControlSet\\Services\\"); - wcscat(HelperKey, TransportName); - wcscat(HelperKey, L"\\Parameters\\Winsock"); - - /* Open the Key */ - ErrorCode = RegOpenKeyExW(HKEY_LOCAL_MACHINE, - HelperKey, - 0, - KEY_READ, - &KeyHandle); - - /* Free Buffer */ - RtlFreeHeap(SockPrivateHeap, 0, HelperKey); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Free the helper data and fail */ - RtlFreeHeap(SockPrivateHeap, 0, HelperData); - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Read Minimum size of Sockaddr Structures */ - DataSize = sizeof(HelperData->MinWSAddressLength); - RegQueryValueExW(KeyHandle, - L"MinSockaddrLength", - NULL, - NULL, - (LPBYTE)&HelperData->MinWSAddressLength, - &DataSize); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Free the helper data and fail */ - RtlFreeHeap(SockPrivateHeap, 0, HelperData); - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Read Maximum size of Sockaddr Structures */ - DataSize = sizeof(HelperData->MinWSAddressLength); - RegQueryValueExW(KeyHandle, - L"MaxSockaddrLength", - NULL, - NULL, - (LPBYTE)&HelperData->MaxWSAddressLength, - &DataSize); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Free the helper data and fail */ - RtlFreeHeap(SockPrivateHeap, 0, HelperData); - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Size of TDI Structures */ - HelperData->MinTDIAddressLength = HelperData->MinWSAddressLength + 6; - HelperData->MaxTDIAddressLength = HelperData->MaxWSAddressLength + 6; - - /* Read Delayed Acceptance Setting */ - DataSize = sizeof(DWORD); - ErrorCode = RegQueryValueExW(KeyHandle, - L"UseDelayedAcceptance", - NULL, - NULL, - (LPBYTE)&HelperData->UseDelayedAcceptance, - &DataSize); - - /* Use defalt if we failed */ - if (ErrorCode != NO_ERROR) HelperData->UseDelayedAcceptance = -1; - - /* Allocate Space for the Helper DLL Names */ - HelperDllName = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - MAX_PATH * sizeof(WCHAR)); - - /* Check for error */ - if (!HelperDllName) - { - /* Free the helper data and fail */ - RtlFreeHeap(SockPrivateHeap, 0, HelperData); - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Allocate space for the expanded version */ - FullHelperDllName = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - MAX_PATH * sizeof(WCHAR)); - - /* Check for error */ - if (!FullHelperDllName) - { - /* Free the helper data and fail */ - RtlFreeHeap(SockPrivateHeap, 0, HelperData); - RtlFreeHeap(SockPrivateHeap, 0, HelperDllName); - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Get the name of the Helper DLL*/ - DataSize = 512; - ErrorCode = RegQueryValueExW(KeyHandle, - L"HelperDllName", - NULL, - NULL, - (LPBYTE)HelperDllName, - &DataSize); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Free the helper data and fail */ - RtlFreeHeap(SockPrivateHeap, 0, HelperData); - RtlFreeHeap(SockPrivateHeap, 0, HelperDllName); - RtlFreeHeap(SockPrivateHeap, 0, FullHelperDllName); - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Get the Full name, expanding Environment Strings */ - HelperDllNameSize = ExpandEnvironmentStringsW(HelperDllName, - FullHelperDllName, - MAX_PATH); - - /* Load the DLL */ - HelperData->hInstance = LoadLibraryW(FullHelperDllName); - - /* Free Buffers */ - RtlFreeHeap(SockPrivateHeap, 0, HelperDllName); - RtlFreeHeap(SockPrivateHeap, 0, FullHelperDllName); - - /* Return if we didn't Load it Properly */ - if (!HelperData->hInstance) - { - /* Free memory and fail */ - RtlFreeHeap(SockPrivateHeap, 0, HelperData); - RegCloseKey(KeyHandle); - return GetLastError(); - } - - /* Close Key */ - RegCloseKey(KeyHandle); - - /* Get the Pointers to the Helper Routines */ - HelperData->WSHOpenSocket = (PWSH_OPEN_SOCKET) - GetProcAddress(HelperData->hInstance, - "WSHOpenSocket"); - HelperData->WSHOpenSocket2 = (PWSH_OPEN_SOCKET2) - GetProcAddress(HelperData->hInstance, - "WSHOpenSocket2"); - HelperData->WSHJoinLeaf = (PWSH_JOIN_LEAF) - GetProcAddress(HelperData->hInstance, - "WSHJoinLeaf"); - HelperData->WSHNotify = (PWSH_NOTIFY) - GetProcAddress(HelperData->hInstance, "WSHNotify"); - HelperData->WSHGetSocketInformation = (PWSH_GET_SOCKET_INFORMATION) - GetProcAddress(HelperData->hInstance, - "WSHGetSocketInformation"); - HelperData->WSHSetSocketInformation = (PWSH_SET_SOCKET_INFORMATION) - GetProcAddress(HelperData->hInstance, - "WSHSetSocketInformation"); - HelperData->WSHGetSockaddrType = (PWSH_GET_SOCKADDR_TYPE) - GetProcAddress(HelperData->hInstance, - "WSHGetSockaddrType"); - HelperData->WSHGetWildcardSockaddr = (PWSH_GET_WILDCARD_SOCKADDR) - GetProcAddress(HelperData->hInstance, - "WSHGetWildcardSockaddr"); - HelperData->WSHGetBroadcastSockaddr = (PWSH_GET_BROADCAST_SOCKADDR) - GetProcAddress(HelperData->hInstance, - "WSHGetBroadcastSockaddr"); - HelperData->WSHAddressToString = (PWSH_ADDRESS_TO_STRING) - GetProcAddress(HelperData->hInstance, - "WSHAddressToString"); - HelperData->WSHStringToAddress = (PWSH_STRING_TO_ADDRESS) - GetProcAddress(HelperData->hInstance, - "WSHStringToAddress"); - HelperData->WSHIoctl = (PWSH_IOCTL) - GetProcAddress(HelperData->hInstance, "WSHIoctl"); - - /* Save the Mapping Structure and transport name */ - HelperData->Mapping = Mapping; - wcscpy(HelperData->TransportName, TransportName); - - /* Increment Reference Count */ - HelperData->RefCount = 1; - - /* Add it to our list */ - InsertHeadList(&SockHelperDllListHead, &HelperData->Helpers); - - /* Return Pointers */ - *HelperDllData = HelperData; - - /* Check if this one was already load it */ - Entry = HelperData->Helpers.Flink; - while (Entry != &SockHelperDllListHead) - { - /* Get the entry */ - HelperData = CONTAINING_RECORD(Entry, HELPER_DATA, Helpers); - - /* Move to the next one */ - Entry = Entry->Flink; - - /* Check if the names match */ - if (!wcscmp(HelperData->TransportName, (*HelperDllData)->TransportName)) - { - /* Remove this one */ - RemoveEntryList(&HelperData->Helpers); - SockDereferenceHelperDll(HelperData); - } - } - - /* Return success */ - return NO_ERROR; -} - -BOOL -WSPAPI -SockIsTripleInMapping(IN PWINSOCK_MAPPING Mapping, - IN INT AddressFamily, - OUT PBOOLEAN AfMatch, - IN INT SocketType, - OUT PBOOLEAN SockMatch, - IN INT Protocol, - OUT PBOOLEAN ProtoMatch) -{ - ULONG Row; - BOOLEAN FoundAf = FALSE, FoundProto = FALSE, FoundSocket = FALSE; - - /* Loop through Mapping to Find a matching one */ - for (Row = 0; Row < Mapping->Rows; Row++) - { - /* Check Address Family */ - if ((INT)Mapping->Mapping[Row].AddressFamily == AddressFamily) - { - /* Remember that we found it */ - FoundAf = TRUE; - } - - /* Check Socket Type */ - if ((INT)Mapping->Mapping[Row].SocketType == SocketType) - { - /* Remember that we found it */ - FoundSocket = TRUE; - } - - /* Check Protocol (SOCK_RAW and AF_NETBIOS can skip this check) */ - if (((INT)Mapping->Mapping[Row].SocketType == SocketType) || - (AddressFamily == AF_NETBIOS) || (SocketType == SOCK_RAW)) - { - /* Remember that we found it */ - FoundProto = TRUE; - } - - /* Check of all three values Match */ - if (FoundProto && FoundSocket && FoundAf) - { - /* Return success */ - *AfMatch = *SockMatch = *ProtoMatch = TRUE; - return TRUE; - } - } - - /* Return whatever we found */ - if (FoundAf) *AfMatch = TRUE; - if (FoundSocket) *SockMatch = TRUE; - if (FoundProto) *ProtoMatch = TRUE; - - /* Fail */ - return FALSE; -} - -INT -WSPAPI -SockNotifyHelperDll(IN PSOCKET_INFORMATION Socket, - IN DWORD Event) -{ - INT ErrorCode; - - /* See if this event matters */ - if (!(Socket->HelperEvents & Event)) return NO_ERROR; - - /* See if we have a helper... */ - if (!(Socket->HelperData)) return NO_ERROR; - - /* Get TDI handles */ - ErrorCode = SockGetTdiHandles(Socket); - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Call the notification */ - return Socket->HelperData->WSHNotify(Socket->HelperContext, - Socket->Handle, - Socket->TdiAddressHandle, - Socket->TdiConnectionHandle, - Event); -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -LIST_ENTRY SockHelperDllListHead; - -/* FUNCTIONS *****************************************************************/ - -VOID -WSPAPI -SockFreeHelperDll(IN PHELPER_DATA Helper) -{ - /* Free the DLL */ - FreeLibrary(Helper->hInstance); - - /* Free the mapping */ - RtlFreeHeap(SockPrivateHeap, 0, Helper->Mapping); - - /* Free the DLL Structure itself */ - RtlFreeHeap(SockPrivateHeap, 0, Helper); -} - -INT -WSPAPI -SockGetTdiName(PINT AddressFamily, - PINT SocketType, - PINT Protocol, - LPGUID ProviderId, - GROUP Group, - DWORD Flags, - PUNICODE_STRING TransportName, - PVOID *HelperDllContext, - PHELPER_DATA *HelperDllData, - PDWORD Events) -{ - PHELPER_DATA HelperData; - PWSTR Transports; - PWSTR Transport; - PWINSOCK_MAPPING Mapping; - PLIST_ENTRY Helpers; - BOOLEAN SharedLock = TRUE; - INT ErrorCode; - BOOLEAN AfMatch = FALSE, ProtoMatch = FALSE, SocketMatch = FALSE; - - /* Acquire global lock */ - SockAcquireRwLockShared(&SocketGlobalLock); - -TryAgain: - /* Check in our Current Loaded Helpers */ - for (Helpers = SockHelperDllListHead.Flink; - Helpers != &SockHelperDllListHead; - Helpers = Helpers->Flink) - { - /* Get the current helper */ - HelperData = CONTAINING_RECORD(Helpers, HELPER_DATA, Helpers); - - /* See if this Mapping works for us */ - if (SockIsTripleInMapping(HelperData->Mapping, - *AddressFamily, - &AfMatch, - *SocketType, - &SocketMatch, - *Protocol, - &ProtoMatch)) - { - /* Call the Helper Dll function get the Transport Name */ - if (!HelperData->WSHOpenSocket2) - { - if (!(Flags & WSA_FLAG_MULTIPOINT_ALL)) - { - /* DLL Doesn't support WSHOpenSocket2, call the old one */ - ErrorCode = HelperData->WSHOpenSocket(AddressFamily, - SocketType, - Protocol, - TransportName, - HelperDllContext, - Events); - } - else - { - /* Invalid flag */ - ErrorCode = WSAEINVAL; - } - } - else - { - /* Call the new WSHOpenSocket */ - ErrorCode = HelperData->WSHOpenSocket2(AddressFamily, - SocketType, - Protocol, - Group, - Flags, - TransportName, - HelperDllContext, - Events); - } - - /* Check for success */ - if (ErrorCode == NO_ERROR) - { - /* Reference the helper */ - InterlockedIncrement(&HelperData->RefCount); - - /* Check which lock we acquired */ - if (SharedLock) - { - /* Release the shared lock */ - SockReleaseRwLockShared(&SocketGlobalLock); - } - else - { - /* Release the acquired lock */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - } - - /* Return the Helper Pointers */ - *HelperDllData = HelperData; - return NO_ERROR; - } - - /* Check if we don't need a transport name */ - if ((*SocketType == SOCK_RAW) && (TransportName->Buffer)) - { - /* Free it */ - RtlFreeHeap(RtlGetProcessHeap(), 0, TransportName->Buffer); - TransportName->Buffer = NULL; - } - } - } - - /* We didn't find a match: try again with RW access */ - if (SharedLock) - { - /* Switch locks */ - SockReleaseRwLockShared(&SocketGlobalLock); - SockAcquireRwLockExclusive(&SocketGlobalLock); - - /* Parse the list again */ - SharedLock = FALSE; - goto TryAgain; - } - - /* Get the Transports available */ - ErrorCode = SockLoadTransportList(&Transports); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - return ErrorCode; - } - - /* Loop through each transport until we find one that can satisfy us */ - for (Transport = Transports; *Transport; Transport += wcslen(Transport) + 1) - { - /* See what mapping this Transport supports */ - ErrorCode = SockLoadTransportMapping(Transport, &Mapping); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Try the next one */ - continue; - } - - /* See if this Mapping works for us */ - if (SockIsTripleInMapping(Mapping, - *AddressFamily, - &AfMatch, - *SocketType, - &SocketMatch, - *Protocol, - &ProtoMatch)) - { - /* It does, so load the DLL associated with it */ - ErrorCode = SockLoadHelperDll(Transport, Mapping, &HelperData); - - /* Check for success */ - if (ErrorCode == NO_ERROR) - { - /* Call the Helper Dll function get the Transport Name */ - if (!HelperData->WSHOpenSocket2) - { - /* Check for invalid flag combo */ - if (!(Flags & WSA_FLAG_MULTIPOINT_ALL)) - { - /* DLL Doesn't support WSHOpenSocket2, call the old one */ - ErrorCode = HelperData->WSHOpenSocket(AddressFamily, - SocketType, - Protocol, - TransportName, - HelperDllContext, - Events); - } - else - { - /* Fail */ - ErrorCode = WSAEINVAL; - } - } - else - { - /* Call the newer function */ - ErrorCode = HelperData->WSHOpenSocket2(AddressFamily, - SocketType, - Protocol, - Group, - Flags, - TransportName, - HelperDllContext, - Events); - } - - /* Check for success */ - if (ErrorCode == NO_ERROR) - { - /* Reference the helper */ - InterlockedIncrement(&HelperData->RefCount); - - /* Release the lock and free the transports */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - RtlFreeHeap(SockPrivateHeap, 0, Transports); - - /* Return the Helper Pointer */ - *HelperDllData = HelperData; - return NO_ERROR; - } - - /* Check if we don't need a transport name */ - if ((*SocketType == SOCK_RAW) && (TransportName->Buffer)) - { - /* Free it */ - RtlFreeHeap(RtlGetProcessHeap(), 0, TransportName->Buffer); - TransportName->Buffer = NULL; - } - - /* Try again */ - continue; - } - } - - /* Free the mapping and continue */ - RtlFreeHeap(SockPrivateHeap, 0, Mapping); - } - - /* Release the lock and free the transport list */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - RtlFreeHeap(SockPrivateHeap, 0, Transports); - - /* Check why we didn't find a match */ - if (!AfMatch) return WSAEAFNOSUPPORT; - if (!ProtoMatch) return WSAEPROTONOSUPPORT; - if (!SocketMatch) return WSAESOCKTNOSUPPORT; - - /* The comination itself was invalid */ - return WSAEINVAL; -} - -INT -WSPAPI -SockLoadTransportMapping(IN PWSTR TransportName, - OUT PWINSOCK_MAPPING *Mapping) -{ - PWSTR TransportKey; - HKEY KeyHandle; - INT ErrorCode; - ULONG MappingSize = 0; - - /* Allocate a Buffer */ - TransportKey = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - MAX_PATH * sizeof(WCHAR)); - /* Check for error */ - if (!TransportKey) return ERROR_NOT_ENOUGH_MEMORY; - - /* Generate the right key name */ - wcscpy(TransportKey, L"System\\CurrentControlSet\\Services\\"); - wcscat(TransportKey, TransportName); - wcscat(TransportKey, L"\\Parameters\\Winsock"); - - /* Open the Key */ - ErrorCode = RegOpenKeyExW(HKEY_LOCAL_MACHINE, - TransportKey, - 0, - KEY_READ, - &KeyHandle); - - /* We don't need the Transport Key anymore */ - RtlFreeHeap(SockPrivateHeap, 0, TransportKey); - - /* Check for error */ - if ((ErrorCode != ERROR_MORE_DATA) && (ErrorCode != NO_ERROR)) - { - /* Close key and fail */ - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Find out how much space we need for the Mapping */ - ErrorCode = RegQueryValueExW(KeyHandle, - L"Mapping", - NULL, - NULL, - NULL, - &MappingSize); - - /* Check for error */ - if ((ErrorCode != ERROR_MORE_DATA) && (ErrorCode != NO_ERROR)) - { - /* Close key and fail */ - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Allocate Memory for the Mapping */ - *Mapping = SockAllocateHeapRoutine(SockPrivateHeap, 0, MappingSize); - - /* Check for error */ - if (!(*Mapping)) - { - /* Close key and fail */ - RegCloseKey(KeyHandle); - return ERROR_NOT_ENOUGH_MEMORY; - } - - /* Read the Mapping */ - ErrorCode = RegQueryValueExW(KeyHandle, - L"Mapping", - NULL, - NULL, - (LPBYTE)*Mapping, - &MappingSize); - - /* Check for error */ - if ((ErrorCode != ERROR_MORE_DATA) && (ErrorCode != NO_ERROR)) - { - /* Close key and fail */ - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Close key and return */ - RegCloseKey(KeyHandle); - return NO_ERROR; -} - -INT -WSPAPI -SockLoadHelperDll(PWSTR TransportName, - PWINSOCK_MAPPING Mapping, - PHELPER_DATA *HelperDllData) -{ - PHELPER_DATA HelperData; - PWSTR HelperDllName; - PWSTR FullHelperDllName; - ULONG HelperDllNameSize; - PWSTR HelperKey; - HKEY KeyHandle; - ULONG DataSize; - INT ErrorCode; - PLIST_ENTRY Entry; - - /* Allocate space for the Helper Structure and TransportName */ - HelperData = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - sizeof(*HelperData) + - (DWORD)(wcslen(TransportName) + 1) * - sizeof(WCHAR)); - - /* Check for error */ - if (!HelperData) return ERROR_NOT_ENOUGH_MEMORY; - - /* Allocate Space for the Helper DLL Key */ - HelperKey = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - MAX_PATH * sizeof(WCHAR)); - - /* Check for error */ - if (!HelperKey) - { - RtlFreeHeap(SockPrivateHeap, 0, HelperData); - return ERROR_NOT_ENOUGH_MEMORY; - } - - /* Generate the right key name */ - wcscpy(HelperKey, L"System\\CurrentControlSet\\Services\\"); - wcscat(HelperKey, TransportName); - wcscat(HelperKey, L"\\Parameters\\Winsock"); - - /* Open the Key */ - ErrorCode = RegOpenKeyExW(HKEY_LOCAL_MACHINE, - HelperKey, - 0, - KEY_READ, - &KeyHandle); - - /* Free Buffer */ - RtlFreeHeap(SockPrivateHeap, 0, HelperKey); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Free the helper data and fail */ - RtlFreeHeap(SockPrivateHeap, 0, HelperData); - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Read Minimum size of Sockaddr Structures */ - DataSize = sizeof(HelperData->MinWSAddressLength); - RegQueryValueExW(KeyHandle, - L"MinSockaddrLength", - NULL, - NULL, - (LPBYTE)&HelperData->MinWSAddressLength, - &DataSize); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Free the helper data and fail */ - RtlFreeHeap(SockPrivateHeap, 0, HelperData); - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Read Maximum size of Sockaddr Structures */ - DataSize = sizeof(HelperData->MinWSAddressLength); - RegQueryValueExW(KeyHandle, - L"MaxSockaddrLength", - NULL, - NULL, - (LPBYTE)&HelperData->MaxWSAddressLength, - &DataSize); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Free the helper data and fail */ - RtlFreeHeap(SockPrivateHeap, 0, HelperData); - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Size of TDI Structures */ - HelperData->MinTDIAddressLength = HelperData->MinWSAddressLength + 6; - HelperData->MaxTDIAddressLength = HelperData->MaxWSAddressLength + 6; - - /* Read Delayed Acceptance Setting */ - DataSize = sizeof(DWORD); - ErrorCode = RegQueryValueExW(KeyHandle, - L"UseDelayedAcceptance", - NULL, - NULL, - (LPBYTE)&HelperData->UseDelayedAcceptance, - &DataSize); - - /* Use defalt if we failed */ - if (ErrorCode != NO_ERROR) HelperData->UseDelayedAcceptance = -1; - - /* Allocate Space for the Helper DLL Names */ - HelperDllName = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - MAX_PATH * sizeof(WCHAR)); - - /* Check for error */ - if (!HelperDllName) - { - /* Free the helper data and fail */ - RtlFreeHeap(SockPrivateHeap, 0, HelperData); - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Allocate space for the expanded version */ - FullHelperDllName = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - MAX_PATH * sizeof(WCHAR)); - - /* Check for error */ - if (!FullHelperDllName) - { - /* Free the helper data and fail */ - RtlFreeHeap(SockPrivateHeap, 0, HelperData); - RtlFreeHeap(SockPrivateHeap, 0, HelperDllName); - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Get the name of the Helper DLL*/ - DataSize = 512; - ErrorCode = RegQueryValueExW(KeyHandle, - L"HelperDllName", - NULL, - NULL, - (LPBYTE)HelperDllName, - &DataSize); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Free the helper data and fail */ - RtlFreeHeap(SockPrivateHeap, 0, HelperData); - RtlFreeHeap(SockPrivateHeap, 0, HelperDllName); - RtlFreeHeap(SockPrivateHeap, 0, FullHelperDllName); - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Get the Full name, expanding Environment Strings */ - HelperDllNameSize = ExpandEnvironmentStringsW(HelperDllName, - FullHelperDllName, - MAX_PATH); - - /* Load the DLL */ - HelperData->hInstance = LoadLibraryW(FullHelperDllName); - - /* Free Buffers */ - RtlFreeHeap(SockPrivateHeap, 0, HelperDllName); - RtlFreeHeap(SockPrivateHeap, 0, FullHelperDllName); - - /* Return if we didn't Load it Properly */ - if (!HelperData->hInstance) - { - /* Free memory and fail */ - RtlFreeHeap(SockPrivateHeap, 0, HelperData); - RegCloseKey(KeyHandle); - return GetLastError(); - } - - /* Close Key */ - RegCloseKey(KeyHandle); - - /* Get the Pointers to the Helper Routines */ - HelperData->WSHOpenSocket = (PWSH_OPEN_SOCKET) - GetProcAddress(HelperData->hInstance, - "WSHOpenSocket"); - HelperData->WSHOpenSocket2 = (PWSH_OPEN_SOCKET2) - GetProcAddress(HelperData->hInstance, - "WSHOpenSocket2"); - HelperData->WSHJoinLeaf = (PWSH_JOIN_LEAF) - GetProcAddress(HelperData->hInstance, - "WSHJoinLeaf"); - HelperData->WSHNotify = (PWSH_NOTIFY) - GetProcAddress(HelperData->hInstance, "WSHNotify"); - HelperData->WSHGetSocketInformation = (PWSH_GET_SOCKET_INFORMATION) - GetProcAddress(HelperData->hInstance, - "WSHGetSocketInformation"); - HelperData->WSHSetSocketInformation = (PWSH_SET_SOCKET_INFORMATION) - GetProcAddress(HelperData->hInstance, - "WSHSetSocketInformation"); - HelperData->WSHGetSockaddrType = (PWSH_GET_SOCKADDR_TYPE) - GetProcAddress(HelperData->hInstance, - "WSHGetSockaddrType"); - HelperData->WSHGetWildcardSockaddr = (PWSH_GET_WILDCARD_SOCKADDR) - GetProcAddress(HelperData->hInstance, - "WSHGetWildcardSockaddr"); - HelperData->WSHGetBroadcastSockaddr = (PWSH_GET_BROADCAST_SOCKADDR) - GetProcAddress(HelperData->hInstance, - "WSHGetBroadcastSockaddr"); - HelperData->WSHAddressToString = (PWSH_ADDRESS_TO_STRING) - GetProcAddress(HelperData->hInstance, - "WSHAddressToString"); - HelperData->WSHStringToAddress = (PWSH_STRING_TO_ADDRESS) - GetProcAddress(HelperData->hInstance, - "WSHStringToAddress"); - HelperData->WSHIoctl = (PWSH_IOCTL) - GetProcAddress(HelperData->hInstance, "WSHIoctl"); - - /* Save the Mapping Structure and transport name */ - HelperData->Mapping = Mapping; - wcscpy(HelperData->TransportName, TransportName); - - /* Increment Reference Count */ - HelperData->RefCount = 1; - - /* Add it to our list */ - InsertHeadList(&SockHelperDllListHead, &HelperData->Helpers); - - /* Return Pointers */ - *HelperDllData = HelperData; - - /* Check if this one was already load it */ - Entry = HelperData->Helpers.Flink; - while (Entry != &SockHelperDllListHead) - { - /* Get the entry */ - HelperData = CONTAINING_RECORD(Entry, HELPER_DATA, Helpers); - - /* Move to the next one */ - Entry = Entry->Flink; - - /* Check if the names match */ - if (!wcscmp(HelperData->TransportName, (*HelperDllData)->TransportName)) - { - /* Remove this one */ - RemoveEntryList(&HelperData->Helpers); - SockDereferenceHelperDll(HelperData); - } - } - - /* Return success */ - return NO_ERROR; -} - -BOOL -WSPAPI -SockIsTripleInMapping(IN PWINSOCK_MAPPING Mapping, - IN INT AddressFamily, - OUT PBOOLEAN AfMatch, - IN INT SocketType, - OUT PBOOLEAN SockMatch, - IN INT Protocol, - OUT PBOOLEAN ProtoMatch) -{ - ULONG Row; - BOOLEAN FoundAf = FALSE, FoundProto = FALSE, FoundSocket = FALSE; - - /* Loop through Mapping to Find a matching one */ - for (Row = 0; Row < Mapping->Rows; Row++) - { - /* Check Address Family */ - if ((INT)Mapping->Mapping[Row].AddressFamily == AddressFamily) - { - /* Remember that we found it */ - FoundAf = TRUE; - } - - /* Check Socket Type */ - if ((INT)Mapping->Mapping[Row].SocketType == SocketType) - { - /* Remember that we found it */ - FoundSocket = TRUE; - } - - /* Check Protocol (SOCK_RAW and AF_NETBIOS can skip this check) */ - if (((INT)Mapping->Mapping[Row].SocketType == SocketType) || - (AddressFamily == AF_NETBIOS) || (SocketType == SOCK_RAW)) - { - /* Remember that we found it */ - FoundProto = TRUE; - } - - /* Check of all three values Match */ - if (FoundProto && FoundSocket && FoundAf) - { - /* Return success */ - *AfMatch = *SockMatch = *ProtoMatch = TRUE; - return TRUE; - } - } - - /* Return whatever we found */ - if (FoundAf) *AfMatch = TRUE; - if (FoundSocket) *SockMatch = TRUE; - if (FoundProto) *ProtoMatch = TRUE; - - /* Fail */ - return FALSE; -} - -INT -WSPAPI -SockNotifyHelperDll(IN PSOCKET_INFORMATION Socket, - IN DWORD Event) -{ - INT ErrorCode; - - /* See if this event matters */ - if (!(Socket->HelperEvents & Event)) return NO_ERROR; - - /* See if we have a helper... */ - if (!(Socket->HelperData)) return NO_ERROR; - - /* Get TDI handles */ - ErrorCode = SockGetTdiHandles(Socket); - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Call the notification */ - return Socket->HelperData->WSHNotify(Socket->HelperContext, - Socket->Handle, - Socket->TdiAddressHandle, - Socket->TdiConnectionHandle, - Event); -} - diff --git a/dll/win32/mswsock/msafd/listen.c b/dll/win32/mswsock/msafd/listen.c index ec37ae80613..831f683cdd5 100644 --- a/dll/win32/mswsock/msafd/listen.c +++ b/dll/win32/mswsock/msafd/listen.c @@ -139,426 +139,3 @@ error: return NO_ERROR; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -WSPListen(SOCKET Handle, - INT Backlog, - LPINT lpErrno) -{ - IO_STATUS_BLOCK IoStatusBlock; - AFD_LISTEN_DATA ListenData; - PSOCKET_INFORMATION Socket; - PWINSOCK_TEB_DATA ThreadData; - INT ErrorCode; - NTSTATUS Status; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* If the socket is connection-less, fail */ - if (MSAFD_IS_DGRAM_SOCK(Socket)); - { - /* Fail */ - ErrorCode = WSAEOPNOTSUPP; - goto error; - } - - /* If the socket is already listening, do nothing */ - if (Socket->SharedData.Listening) - { - /* Return happily */ - ErrorCode = NO_ERROR; - goto error; - } - else if (Socket->SharedData.State != SocketConnected) - { - /* If we're not connected, fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Set Up Listen Structure */ - ListenData.UseSAN = SockSanEnabled; - ListenData.UseDelayedAcceptance = Socket->SharedData.UseDelayedAcceptance; - ListenData.Backlog = Backlog; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_START_LISTEN, - &ListenData, - sizeof(ListenData), - NULL, - 0); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion outside the lock */ - LeaveCriticalSection(&Socket->Lock); - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - EnterCriticalSection(&Socket->Lock); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Notify helper DLL */ - ErrorCode = SockNotifyHelperDll(Socket, WSH_NOTIFY_LISTEN); - if (ErrorCode != NO_ERROR) goto error; - - /* Set to Listening */ - Socket->SharedData.Listening = TRUE; - - /* Update context with AFD */ - ErrorCode = SockSetHandleContext(Socket); - if (ErrorCode != NO_ERROR) goto error; - -error: - /* Check if we have a socket here */ - if (Socket) - { - /* Release the lock and dereference */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -WSPListen(SOCKET Handle, - INT Backlog, - LPINT lpErrno) -{ - IO_STATUS_BLOCK IoStatusBlock; - AFD_LISTEN_DATA ListenData; - PSOCKET_INFORMATION Socket; - PWINSOCK_TEB_DATA ThreadData; - INT ErrorCode; - NTSTATUS Status; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* If the socket is connection-less, fail */ - if (MSAFD_IS_DGRAM_SOCK(Socket)); - { - /* Fail */ - ErrorCode = WSAEOPNOTSUPP; - goto error; - } - - /* If the socket is already listening, do nothing */ - if (Socket->SharedData.Listening) - { - /* Return happily */ - ErrorCode = NO_ERROR; - goto error; - } - else if (Socket->SharedData.State != SocketConnected) - { - /* If we're not connected, fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Set Up Listen Structure */ - ListenData.UseSAN = SockSanEnabled; - ListenData.UseDelayedAcceptance = Socket->SharedData.UseDelayedAcceptance; - ListenData.Backlog = Backlog; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_START_LISTEN, - &ListenData, - sizeof(ListenData), - NULL, - 0); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion outside the lock */ - LeaveCriticalSection(&Socket->Lock); - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - EnterCriticalSection(&Socket->Lock); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Notify helper DLL */ - ErrorCode = SockNotifyHelperDll(Socket, WSH_NOTIFY_LISTEN); - if (ErrorCode != NO_ERROR) goto error; - - /* Set to Listening */ - Socket->SharedData.Listening = TRUE; - - /* Update context with AFD */ - ErrorCode = SockSetHandleContext(Socket); - if (ErrorCode != NO_ERROR) goto error; - -error: - /* Check if we have a socket here */ - if (Socket) - { - /* Release the lock and dereference */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -WSPListen(SOCKET Handle, - INT Backlog, - LPINT lpErrno) -{ - IO_STATUS_BLOCK IoStatusBlock; - AFD_LISTEN_DATA ListenData; - PSOCKET_INFORMATION Socket; - PWINSOCK_TEB_DATA ThreadData; - INT ErrorCode; - NTSTATUS Status; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* If the socket is connection-less, fail */ - if (MSAFD_IS_DGRAM_SOCK(Socket)); - { - /* Fail */ - ErrorCode = WSAEOPNOTSUPP; - goto error; - } - - /* If the socket is already listening, do nothing */ - if (Socket->SharedData.Listening) - { - /* Return happily */ - ErrorCode = NO_ERROR; - goto error; - } - else if (Socket->SharedData.State != SocketConnected) - { - /* If we're not connected, fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Set Up Listen Structure */ - ListenData.UseSAN = SockSanEnabled; - ListenData.UseDelayedAcceptance = Socket->SharedData.UseDelayedAcceptance; - ListenData.Backlog = Backlog; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_START_LISTEN, - &ListenData, - sizeof(ListenData), - NULL, - 0); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion outside the lock */ - LeaveCriticalSection(&Socket->Lock); - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - EnterCriticalSection(&Socket->Lock); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Notify helper DLL */ - ErrorCode = SockNotifyHelperDll(Socket, WSH_NOTIFY_LISTEN); - if (ErrorCode != NO_ERROR) goto error; - - /* Set to Listening */ - Socket->SharedData.Listening = TRUE; - - /* Update context with AFD */ - ErrorCode = SockSetHandleContext(Socket); - if (ErrorCode != NO_ERROR) goto error; - -error: - /* Check if we have a socket here */ - if (Socket) - { - /* Release the lock and dereference */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - diff --git a/dll/win32/mswsock/msafd/nspeprot.c b/dll/win32/mswsock/msafd/nspeprot.c index 77b3205c368..a1d368ea76d 100644 --- a/dll/win32/mswsock/msafd/nspeprot.c +++ b/dll/win32/mswsock/msafd/nspeprot.c @@ -80,249 +80,3 @@ SockLoadTransportList(PWSTR *TransportList) return NO_ERROR; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -SockLoadTransportList(PWSTR *TransportList) -{ - ULONG TransportListSize = 0; - HKEY KeyHandle; - INT ErrorCode; - - /* Open the Transports Key */ - ErrorCode = RegOpenKeyExW(HKEY_LOCAL_MACHINE, - L"SYSTEM\\CurrentControlSet\\Services\\Winsock\\Parameters", - 0, - KEY_READ, - &KeyHandle); - - /* Check for error */ - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Get the Transport List Size */ - ErrorCode = RegQueryValueExW(KeyHandle, - L"Transports", - NULL, - NULL, - NULL, - &TransportListSize); - - /* Check for error */ - if ((ErrorCode != ERROR_MORE_DATA) && (ErrorCode != NO_ERROR)) - { - /* Close key and fail */ - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Allocate Memory for the Transport List */ - *TransportList = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - TransportListSize); - - /* Check for error */ - if (!(*TransportList)) - { - /* Close key and fail */ - RegCloseKey(KeyHandle); - return ERROR_NOT_ENOUGH_MEMORY; - } - - /* Get the Transports */ - ErrorCode = RegQueryValueExW(KeyHandle, - L"Transports", - NULL, - NULL, - (LPBYTE)*TransportList, - &TransportListSize); - - /* Check for error */ - if ((ErrorCode != ERROR_MORE_DATA) && (ErrorCode != NO_ERROR)) - { - /* Close key and fail */ - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Close key and return */ - RegCloseKey(KeyHandle); - return NO_ERROR; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -SockLoadTransportList(PWSTR *TransportList) -{ - ULONG TransportListSize = 0; - HKEY KeyHandle; - INT ErrorCode; - - /* Open the Transports Key */ - ErrorCode = RegOpenKeyExW(HKEY_LOCAL_MACHINE, - L"SYSTEM\\CurrentControlSet\\Services\\Winsock\\Parameters", - 0, - KEY_READ, - &KeyHandle); - - /* Check for error */ - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Get the Transport List Size */ - ErrorCode = RegQueryValueExW(KeyHandle, - L"Transports", - NULL, - NULL, - NULL, - &TransportListSize); - - /* Check for error */ - if ((ErrorCode != ERROR_MORE_DATA) && (ErrorCode != NO_ERROR)) - { - /* Close key and fail */ - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Allocate Memory for the Transport List */ - *TransportList = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - TransportListSize); - - /* Check for error */ - if (!(*TransportList)) - { - /* Close key and fail */ - RegCloseKey(KeyHandle); - return ERROR_NOT_ENOUGH_MEMORY; - } - - /* Get the Transports */ - ErrorCode = RegQueryValueExW(KeyHandle, - L"Transports", - NULL, - NULL, - (LPBYTE)*TransportList, - &TransportListSize); - - /* Check for error */ - if ((ErrorCode != ERROR_MORE_DATA) && (ErrorCode != NO_ERROR)) - { - /* Close key and fail */ - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Close key and return */ - RegCloseKey(KeyHandle); - return NO_ERROR; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -SockLoadTransportList(PWSTR *TransportList) -{ - ULONG TransportListSize = 0; - HKEY KeyHandle; - INT ErrorCode; - - /* Open the Transports Key */ - ErrorCode = RegOpenKeyExW(HKEY_LOCAL_MACHINE, - L"SYSTEM\\CurrentControlSet\\Services\\Winsock\\Parameters", - 0, - KEY_READ, - &KeyHandle); - - /* Check for error */ - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Get the Transport List Size */ - ErrorCode = RegQueryValueExW(KeyHandle, - L"Transports", - NULL, - NULL, - NULL, - &TransportListSize); - - /* Check for error */ - if ((ErrorCode != ERROR_MORE_DATA) && (ErrorCode != NO_ERROR)) - { - /* Close key and fail */ - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Allocate Memory for the Transport List */ - *TransportList = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - TransportListSize); - - /* Check for error */ - if (!(*TransportList)) - { - /* Close key and fail */ - RegCloseKey(KeyHandle); - return ERROR_NOT_ENOUGH_MEMORY; - } - - /* Get the Transports */ - ErrorCode = RegQueryValueExW(KeyHandle, - L"Transports", - NULL, - NULL, - (LPBYTE)*TransportList, - &TransportListSize); - - /* Check for error */ - if ((ErrorCode != ERROR_MORE_DATA) && (ErrorCode != NO_ERROR)) - { - /* Close key and fail */ - RegCloseKey(KeyHandle); - return ErrorCode; - } - - /* Close key and return */ - RegCloseKey(KeyHandle); - return NO_ERROR; -} - diff --git a/dll/win32/mswsock/msafd/proc.c b/dll/win32/mswsock/msafd/proc.c index 3621f195071..4e7ba97efeb 100644 --- a/dll/win32/mswsock/msafd/proc.c +++ b/dll/win32/mswsock/msafd/proc.c @@ -1156,3477 +1156,3 @@ SockDeleteRwLock(IN PSOCK_RW_LOCK Lock) return RtlDeleteCriticalSection(&Lock->Lock); } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -SOCK_RW_LOCK SocketGlobalLock; - -/* FUNCTIONS *****************************************************************/ - -VOID -WSPAPI -SockDestroySocket(PSOCKET_INFORMATION Socket) -{ - /* Dereference its helper DLL */ - SockDereferenceHelperDll(Socket->HelperData); - - /* Delete the lock */ - DeleteCriticalSection(&Socket->Lock); - - /* Free the socket */ - RtlFreeHeap(SockPrivateHeap, 0, Socket); -} - -VOID -__inline -WSPAPI -SockDereferenceSocket(IN PSOCKET_INFORMATION Socket) -{ - /* Dereference and see if it's the last count */ - if (!InterlockedDecrement(&Socket->WshContext.RefCount)) - { - /* Destroy the socket */ - SockDestroySocket(Socket); - } -} - -PSOCKET_INFORMATION -WSPAPI -SockImportHandle(IN SOCKET Handle) -{ - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - PWAH_HANDLE WahHandle; - NTSTATUS Status; - ULONG ContextSize; - IO_STATUS_BLOCK IoStatusBlock; - PSOCKET_INFORMATION ImportedSocket = NULL; - UNICODE_STRING TransportName; - - /* Acquire the global lock */ - SockAcquireRwLockExclusive(&SocketGlobalLock); - - /* Make sure that the handle is still invalid */ - WahHandle = WahReferenceContextByHandle(SockContextTable, (HANDLE)Handle); - if (WahHandle) - { - /* Some other thread imported it by now, release the lock and return */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - return (PSOCKET_INFORMATION)WahHandle; - } - - /* Setup the NULL name for possible cleanup later */ - RtlInitUnicodeString(&TransportName, NULL); - - /* Call AFD to get the context size */ - Status = NtDeviceIoControlFile((HANDLE)Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_GET_CONTEXT_SIZE, - NULL, - 0, - &ContextSize, - sizeof(ContextSize)); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Make sure we didn't fail, and that this is a valid context */ - if (!NT_SUCCESS(Status) || (ContextSize < sizeof(SOCK_SHARED_INFO))) - { - /* Fail (the error handler will convert to Win32 Status) */ - goto error; - } - -error: - /* Release the lock */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - - return ImportedSocket; -} - -INT -WSPAPI -SockSetInformation(IN PSOCKET_INFORMATION Socket, - IN ULONG AfdInformationClass, - IN PBOOLEAN Boolean OPTIONAL, - IN PULONG Ulong OPTIONAL, - IN PLARGE_INTEGER LargeInteger OPTIONAL) -{ - IO_STATUS_BLOCK IoStatusBlock; - AFD_INFO AfdInfo; - NTSTATUS Status; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - - /* Set Info Class */ - AfdInfo.InformationClass = AfdInformationClass; - - /* Set Information */ - if (Boolean) - { - AfdInfo.Information.Boolean = *Boolean; - } - else if (Ulong) - { - AfdInfo.Information.Ulong = *Ulong; - } - else - { - AfdInfo.Information.LargeInteger = *LargeInteger; - } - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_GET_INFO, - &AfdInfo, - sizeof(AfdInfo), - NULL, - 0); - /* Check if we have to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for the operation to finish */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Handle failure */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - return NtStatusToSocketError(Status); - } - - /* Return to caller */ - return NO_ERROR; -} - -INT -WSPAPI -SockGetInformation(IN PSOCKET_INFORMATION Socket, - IN ULONG AfdInformationClass, - IN PVOID ExtraData OPTIONAL, - IN ULONG ExtraDataSize, - IN OUT PBOOLEAN Boolean OPTIONAL, - IN OUT PULONG Ulong OPTIONAL, - IN OUT PLARGE_INTEGER LargeInteger OPTIONAL) -{ - ULONG InfoLength; - IO_STATUS_BLOCK IoStatusBlock; - PAFD_INFO AfdInfo; - AFD_INFO InfoData; - NTSTATUS Status; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - - /* Check if extra data is there */ - if (ExtraData && ExtraDataSize) - { - /* Allocate space for it */ - InfoLength = sizeof(InfoData) + ExtraDataSize; - AfdInfo = (PAFD_INFO)SockAllocateHeapRoutine(SockPrivateHeap, - 0, - InfoLength); - if (!AfdInfo) return WSAENOBUFS; - - /* Copy the extra data */ - RtlCopyMemory(AfdInfo + 1, ExtraData, ExtraDataSize); - } - else - { - /* Use local buffer */ - AfdInfo = &InfoData; - InfoLength = sizeof(InfoData); - } - - /* Set Info Class */ - AfdInfo->InformationClass = AfdInformationClass; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_GET_INFO, - &InfoData, - InfoLength, - &InfoData, - sizeof(InfoData)); - /* Check if we have to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for the operation to finish */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Handle failure */ - if (!NT_SUCCESS(Status)) - { - /* Check if we have to free the data */ - if (AfdInfo != &InfoData) RtlFreeHeap(SockPrivateHeap, 0, AfdInfo); - - /* Fail */ - return NtStatusToSocketError(Status); - } - - /* Return Information */ - if (Boolean) - { - *Boolean = AfdInfo->Information.Boolean; - } - else if (Ulong) - { - *Ulong = AfdInfo->Information.Ulong; - } - else - { - *LargeInteger = AfdInfo->Information.LargeInteger; - } - - /* Check if we have to free the data */ - if (AfdInfo != &InfoData) RtlFreeHeap(SockPrivateHeap, 0, AfdInfo); - - /* Return to caller */ - return NO_ERROR; -} - -INT -WSPAPI -SockSetHandleContext(IN PSOCKET_INFORMATION Socket) -{ - IO_STATUS_BLOCK IoStatusBlock; - CHAR ContextData[256]; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - PVOID Context; - ULONG_PTR ContextPos; - ULONG ContextLength; - INT HelperContextLength; - INT ErrorCode; - NTSTATUS Status; - - /* Find out how big the helper DLL context is */ - ErrorCode = Socket->HelperData->WSHGetSocketInformation(Socket->HelperContext, - Socket->Handle, - Socket->TdiAddressHandle, - Socket->TdiConnectionHandle, - SOL_INTERNAL, - SO_CONTEXT, - NULL, - &HelperContextLength); - - /* Calculate the total space needed */ - ContextLength = sizeof(SOCK_SHARED_INFO) + - 2 * Socket->HelperData->MaxWSAddressLength + - sizeof(ULONG) + HelperContextLength; - - /* See if our stack can hold it */ - if (ContextLength <= sizeof(ContextData)) - { - /* Use our stack */ - Context = ContextData; - } - else - { - /* Allocate from heap */ - Context = SockAllocateHeapRoutine(SockPrivateHeap, 0, ContextLength); - if (!Context) return WSAENOBUFS; - } - - /* - * Create Context, this includes: - * Shared Socket Data, Helper Context Length, Local and Remote Addresses - * and finally the actual helper context. - */ - ContextPos = (ULONG_PTR)Context; - RtlCopyMemory((PVOID)ContextPos, - &Socket->SharedData, - sizeof(SOCK_SHARED_INFO)); - ContextPos += sizeof(SOCK_SHARED_INFO); - *(PULONG)ContextPos = HelperContextLength; - ContextPos += sizeof(ULONG); - RtlCopyMemory((PVOID)ContextPos, - Socket->LocalAddress, - Socket->HelperData->MaxWSAddressLength); - ContextPos += Socket->HelperData->MaxWSAddressLength; - RtlCopyMemory((PVOID)ContextPos, - Socket->RemoteAddress, - Socket->HelperData->MaxWSAddressLength); - ContextPos += Socket->HelperData->MaxWSAddressLength; - - /* Now get the helper context */ - ErrorCode = Socket->HelperData->WSHGetSocketInformation(Socket->HelperContext, - Socket->Handle, - Socket->TdiAddressHandle, - Socket->TdiConnectionHandle, - SOL_INTERNAL, - SO_CONTEXT, - (PVOID)ContextPos, - &HelperContextLength); - /* Now give it to AFD */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_SET_CONTEXT, - Context, - ContextLength, - NULL, - 0); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check if we need to free from heap */ - if (Context != ContextData) RtlFreeHeap(SockPrivateHeap, 0, Context); - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Convert and return error code */ - ErrorCode = NtStatusToSocketError(Status); - return ErrorCode; - } - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -SockIsAddressConsistentWithConstrainedGroup(IN PSOCKET_INFORMATION Socket, - IN GROUP Group, - IN PSOCKADDR SocketAddress, - IN INT SocketAddressLength) -{ - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - INT ErrorCode; - PAFD_VALIDATE_GROUP_DATA ValidateGroupData; - NTSTATUS Status; - IO_STATUS_BLOCK IoStatusBlock; - ULONG ValidateGroupSize; - CHAR ValidateBuffer[sizeof(AFD_VALIDATE_GROUP_DATA) + MAX_TDI_ADDRESS_LENGTH]; - - /* Calculate the length of the buffer */ - ValidateGroupSize = sizeof(AFD_VALIDATE_GROUP_DATA) + - sizeof(TRANSPORT_ADDRESS) + - Socket->HelperData->MaxTDIAddressLength; - - /* Check if our stack buffer is large enough */ - if (ValidateGroupSize <= sizeof(ValidateBuffer)) - { - /* Use the stack */ - ValidateGroupData = (PVOID)ValidateBuffer; - } - else - { - /* Allocate from heap */ - ValidateGroupData = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - ValidateGroupSize); - if (!ValidateGroupData) return WSAENOBUFS; - } - - /* Convert the address to TDI format */ - ErrorCode = SockBuildTdiAddress(&ValidateGroupData->Address, - SocketAddress, - SocketAddressLength); - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Tell AFD which group to check, and let AFD validate it */ - ValidateGroupData->GroupId = Group; - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_VALIDATE_GROUP, - ValidateGroupData, - ValidateGroupSize, - NULL, - 0); - - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check if we need to free the data from heap */ - if (ValidateGroupData != (PVOID)ValidateBuffer) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, ValidateGroupData); - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - return NtStatusToSocketError(Status); - } - - /* Return success */ - return NO_ERROR; -} - - -INT -WSPAPI -SockGetTdiHandles(IN PSOCKET_INFORMATION Socket) -{ - AFD_TDI_HANDLE_DATA TdiHandleInfo; - NTSTATUS Status; - IO_STATUS_BLOCK IoStatusBlock; - ULONG InfoType = 0; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - - /* See which handle(s) we need */ - if (!Socket->TdiAddressHandle) InfoType |= AFD_ADDRESS_HANDLE; - if (!Socket->TdiConnectionHandle) InfoType |= AFD_CONNECTION_HANDLE; - - /* Make sure we need one */ - if (!InfoType) return NO_ERROR; - - /* Call AFD */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_GET_TDI_HANDLES, - &InfoType, - sizeof(InfoType), - &TdiHandleInfo, - sizeof(TdiHandleInfo)); - /* Check if we shoudl wait */ - if (Status == STATUS_PENDING) - { - /* Wait on it */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Update status */ - Status = IoStatusBlock.Status; - } - - /* Check for success */ - if (!NT_SUCCESS(Status)) return NtStatusToSocketError(Status); - - /* Return handles */ - if (!Socket->TdiAddressHandle) - { - Socket->TdiAddressHandle = TdiHandleInfo.TdiAddressHandle; - } - if (!Socket->TdiConnectionHandle) - { - Socket->TdiConnectionHandle = TdiHandleInfo.TdiConnectionHandle; - } - - /* Return */ - return NO_ERROR; -} - -BOOL -WSPAPI -SockWaitForSingleObject(IN HANDLE Handle, - IN SOCKET SocketHandle, - IN DWORD BlockingFlags, - IN DWORD TimeoutFlags) -{ - LARGE_INTEGER Timeout, CurrentTime, DueTime; - NTSTATUS Status; - PSOCKET_INFORMATION Socket = NULL; - BOOLEAN CallHook, UseTimeout; - LPBLOCKINGCALLBACK BlockingHook; - DWORD_PTR Context; - INT ErrorCode; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - - /* Start with a simple 0.5 second wait */ - Timeout.QuadPart = Int32x32To64(-10000, 500); - Status = NtWaitForSingleObject(Handle, TRUE, &Timeout); - if (Status == STATUS_SUCCESS) return TRUE; - - /* Check if our flags require the socket structure */ - if ((BlockingFlags == MAYBE_BLOCKING_HOOK) || - (BlockingFlags == ALWAYS_BLOCKING_HOOK) || - (TimeoutFlags == SEND_TIMEOUT) || - (TimeoutFlags == RECV_TIMEOUT)) - { - /* Get the socket */ - Socket = SockFindAndReferenceSocket(SocketHandle, FALSE); - if (!Socket) - { - /* We must be waiting on a non-socket for some reason? */ - NtWaitForSingleObject(Handle, TRUE, NULL); - return TRUE; - } - } - - /* Check the blocking flags */ - if (BlockingFlags == ALWAYS_BLOCKING_HOOK) - { - /* Always call it */ - CallHook = TRUE; - } - else if (BlockingFlags == MAYBE_BLOCKING_HOOK) - { - /* Check if we have to call it */ - CallHook = !Socket->SharedData.NonBlocking; - } - else if (BlockingFlags == NO_BLOCKING_HOOK) - { - /* Never call it*/ - CallHook = FALSE; - } - else - { - if (Socket) SockDereferenceSocket(Socket); - return FALSE; - } - - /* Check if we call it */ - if (CallHook) - { - /* Check if it actually exists */ - SockUpcallTable->lpWPUQueryBlockingCallback(Socket->SharedData.CatalogEntryId, - &BlockingHook, - &Context, - &ErrorCode); - - /* See if we'll call it */ - CallHook = (BlockingHook != NULL); - } - - /* Now check the timeout flags */ - if (TimeoutFlags == NO_TIMEOUT) - { - /* None at all */ - UseTimeout = FALSE; - } - else if (TimeoutFlags == SEND_TIMEOUT) - { - /* See if there's a Send Timeout */ - if (Socket->SharedData.SendTimeout) - { - /* Use it */ - UseTimeout = TRUE; - Timeout = RtlEnlargedIntegerMultiply(Socket->SharedData.SendTimeout, - 10 * 1000); - } - else - { - /* There isn't any */ - UseTimeout = FALSE; - } - } - else if (TimeoutFlags == RECV_TIMEOUT) - { - /* See if there's a Receive Timeout */ - if (Socket->SharedData.RecvTimeout) - { - /* Use it */ - UseTimeout = TRUE; - Timeout = RtlEnlargedIntegerMultiply(Socket->SharedData.RecvTimeout, - 10 * 1000); - } - else - { - /* There isn't any */ - UseTimeout = FALSE; - } - } - else - { - if (Socket) SockDereferenceSocket(Socket); - return FALSE; - } - - /* We don't need the socket anymore */ - if (Socket) SockDereferenceSocket(Socket); - - /* Check for timeout */ - if (UseTimeout) - { - /* Calculate the absolute time when the wait ends */ - Status = NtQuerySystemTime(&CurrentTime); - DueTime.QuadPart = CurrentTime.QuadPart + Timeout.QuadPart; - } - else - { - /* Infinite wait */ - DueTime.LowPart = -1; - DueTime.HighPart = 0x7FFFFFFF; - } - - /* Check for blocking hook call */ - if (CallHook) - { - /* We're calling it, so we won't actually be waiting */ - Timeout.LowPart = -1; - Timeout.HighPart = -1; - } - else - { - /* We'll be waiting till the Due Time */ - Timeout = DueTime; - } - - /* Now write data to the TEB so we'll know what's going on */ - ThreadData->CancelIo = FALSE; - ThreadData->SocketHandle = SocketHandle; - - /* Start wait loop */ - do - { - /* Call the hook */ - if (CallHook) (BlockingHook(Context)); - - /* Check if we were cancelled */ - if (ThreadData->CancelIo) - { - /* Infinite timeout and wait for official cancel */ - Timeout.LowPart = -1; - Timeout.HighPart = 0x7FFFFFFF; - } - else - { - /* Check if we're due */ - Status = NtQuerySystemTime(&CurrentTime); - if (CurrentTime.QuadPart > DueTime.QuadPart) - { - /* We're out */ - Status = STATUS_TIMEOUT; - break; - } - } - - /* Do the actual wait */ - Status = NtWaitForSingleObject(Handle, TRUE, &Timeout); - } while ((Status == STATUS_USER_APC) || - (Status == STATUS_ALERTED) || - (Status == STATUS_TIMEOUT)); - - /* Reset thread data */ - ThreadData->SocketHandle = INVALID_SOCKET; - - /* Return to caller */ - if (Status == STATUS_SUCCESS) return TRUE; - return FALSE; -} - -PSOCKET_INFORMATION -WSPAPI -SockFindAndReferenceSocket(IN SOCKET Handle, - IN BOOLEAN Import) -{ - PWAH_HANDLE WahHandle; - - /* Get it from our table and return it */ - WahHandle = WahReferenceContextByHandle(SockContextTable, (HANDLE)Handle); - if (WahHandle) return (PSOCKET_INFORMATION)WahHandle; - - /* Couldn't find it, shoudl we import it? */ - if (Import) return SockImportHandle(Handle); - - /* Nothing found */ - return NULL; -} - -INT -WSPAPI -SockBuildTdiAddress(OUT PTRANSPORT_ADDRESS TdiAddress, - IN PSOCKADDR Sockaddr, - IN INT SockaddrLength) -{ - /* Setup the TDI Address */ - TdiAddress->TAAddressCount = 1; - TdiAddress->Address[0].AddressLength = (USHORT)SockaddrLength - - sizeof(Sockaddr->sa_family); - - /* Copy it */ - RtlCopyMemory(&TdiAddress->Address[0].AddressType, Sockaddr, SockaddrLength); - - /* Return */ - return NO_ERROR; -} - -INT -WSPAPI -SockBuildSockaddr(OUT PSOCKADDR Sockaddr, - OUT PINT SockaddrLength, - IN PTRANSPORT_ADDRESS TdiAddress) -{ - /* Calculate the length it will take */ - *SockaddrLength = TdiAddress->Address[0].AddressLength + - sizeof(Sockaddr->sa_family); - - /* Copy it */ - RtlCopyMemory(Sockaddr, &TdiAddress->Address[0].AddressType, *SockaddrLength); - - /* Return */ - return NO_ERROR; -} - -BOOLEAN -WSPAPI -SockIsSocketConnected(IN PSOCKET_INFORMATION Socket) -{ - LARGE_INTEGER Timeout; - PVOID Context; - PVOID AsyncCallback; - IO_STATUS_BLOCK IoStatusBlock; - NTSTATUS Status; - - /* Check if there is an async connect in progress, but still unprocessed */ - while ((Socket->AsyncData) && - (Socket->AsyncData->IoStatusBlock.Status != STATUS_PENDING)) - { - /* The socket will be locked, release it */ - LeaveCriticalSection(&Socket->Lock); - - /* Setup the timeout and wait on completion */ - Timeout.QuadPart = 0; - Status = NtRemoveIoCompletion(SockAsyncQueuePort, - &AsyncCallback, - &Context, - &IoStatusBlock, - &Timeout); - - /* Check for success */ - if (Status == STATUS_SUCCESS) - { - /* Check if we're supposed to terminate */ - if (AsyncCallback != (PVOID)-1) - { - /* Handle the Async */ - SockHandleAsyncIndication(AsyncCallback, Context, &IoStatusBlock); - } - else - { - /* Terminate it */ - Status = NtSetIoCompletion(SockAsyncQueuePort, - (PVOID)-1, - (PVOID)-1, - 0, - 0); - - /* Acquire the lock and break out */ - EnterCriticalSection(&Socket->Lock); - break; - } - } - - /* Acquire the socket lock again */ - EnterCriticalSection(&Socket->Lock); - } - - /* Check if it's already connected */ - if (Socket->SharedData.State == SocketConnected) return TRUE; - return FALSE; -} - -VOID -WSPAPI -SockCancelIo(IN SOCKET Handle) -{ - IO_STATUS_BLOCK IoStatusBlock; - NTSTATUS Status; - - /* Cancel the I/O */ - Status = NtCancelIoFile((HANDLE)Handle, &IoStatusBlock); -} - -VOID -WSPAPI -SockIoCompletion(IN PVOID ApcContext, - IN PIO_STATUS_BLOCK IoStatusBlock, - DWORD Reserved) -{ - LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine = ApcContext; - INT ErrorCode; - DWORD BytesSent; - DWORD Flags = 0; - LPWSAOVERLAPPED lpOverlapped; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - - /* Check if this was an error */ - if (NT_ERROR(IoStatusBlock->Status)) - { - /* Check if it was anything but a simple cancel */ - if (IoStatusBlock->Status != STATUS_CANCELLED) - { - /* Convert it */ - ErrorCode = NtStatusToSocketError(IoStatusBlock->Status); - } - else - { - /* Use the right error */ - ErrorCode = WSA_OPERATION_ABORTED; - } - - /* Either ways, nothing was done */ - BytesSent = 0; - } - else - { - /* No error and check how many bytes were sent */ - ErrorCode = NO_ERROR; - BytesSent = PtrToUlong(IoStatusBlock->Information); - - /* Check the status */ - if (IoStatusBlock->Status == STATUS_BUFFER_OVERFLOW) - { - /* This was an error */ - ErrorCode = WSAEMSGSIZE; - } - else if (IoStatusBlock->Status == STATUS_RECEIVE_PARTIAL) - { - /* Partial receive */ - Flags = MSG_PARTIAL; - } - else if (IoStatusBlock->Status == STATUS_RECEIVE_EXPEDITED) - { - /* OOB receive */ - Flags = MSG_OOB; - } - else if (IoStatusBlock->Status == STATUS_RECEIVE_PARTIAL_EXPEDITED) - { - /* Partial OOB receive */ - Flags = MSG_OOB | MSG_PARTIAL; - } - } - - /* Get the overlapped structure */ - lpOverlapped = CONTAINING_RECORD(IoStatusBlock, WSAOVERLAPPED, Internal); - - /* Call it */ - CompletionRoutine(ErrorCode, BytesSent, lpOverlapped, Flags); - - /* Decrease pending APCs */ - ThreadData->PendingAPCs--; - InterlockedDecrement(&SockProcessPendingAPCCount); -} - -VOID -WSPAPI -SockpWaitForReaderCount(IN PSOCK_RW_LOCK Lock) -{ - NTSTATUS Status; - LARGE_INTEGER Timeout; - - /* Switch threads to see if the lock gets released that way */ - Timeout.QuadPart = 0; - NtDelayExecution(FALSE, &Timeout); - if (Lock->ReaderCount == -2) return; - - /* Either the thread isn't executing (priority inversion) or it's a hog */ - if (!Lock->WriterWaitEvent) - { - /* We don't have an event to wait on yet, allocate it */ - Status = NtCreateEvent(&Lock->WriterWaitEvent, - EVENT_ALL_ACCESS, - NULL, - SynchronizationEvent, - FALSE); - if (!NT_SUCCESS(Status)) - { - /* We can't get an event, do a manual loop */ - Timeout.QuadPart = Int32x32To64(1000, -100); - while (Lock->ReaderCount != -2) NtDelayExecution(FALSE, &Timeout); - } - } - - /* We have en event, now increment the reader count to signal them */ - if (InterlockedIncrement(&Lock->ReaderCount) != -1) - { - /* Wait for them to signal us */ - NtWaitForSingleObject(&Lock->WriterWaitEvent, FALSE, NULL); - } - - /* Finally it's free */ - Lock->ReaderCount = -2; -} - -NTSTATUS -WSPAPI -SockInitializeRwLockAndSpinCount(IN PSOCK_RW_LOCK Lock, - IN ULONG SpinCount) -{ - NTSTATUS Status; - - /* check if this is a special event create request */ - if (SpinCount & 0x80000000) - { - /* Create the event */ - Status = NtCreateEvent(&Lock->WriterWaitEvent, - EVENT_ALL_ACCESS, - NULL, - SynchronizationEvent, - FALSE); - if (!NT_SUCCESS(Status)) return Status; - } - - /* Initialize the lock */ - Status = RtlInitializeCriticalSectionAndSpinCount(&Lock->Lock, SpinCount); - if (NT_SUCCESS(Status)) - { - /* Initialize our structure */ - Lock->ReaderCount = 0; - } - else if (Lock->WriterWaitEvent) - { - /* We failed, close the event if we had one */ - NtClose(Lock->WriterWaitEvent); - Lock->WriterWaitEvent = NULL; - } - - /* Return status */ - return Status; -} - -VOID -WSPAPI -SockAcquireRwLockExclusive(IN PSOCK_RW_LOCK Lock) -{ - LONG Count, NewCount; - ULONG_PTR SpinCount; - - /* Acquire the lock */ - RtlEnterCriticalSection(&Lock->Lock); - - /* Check for ReaderCount */ - if (Lock->ReaderCount >= 0) - { - /* Loop while trying to change the count */ - do - { - /* Get the reader count */ - Count = Lock->ReaderCount; - - /* Modify the count so ReaderCount know that a writer is waiting */ - NewCount = -Count - 2; - } while (InterlockedCompareExchange(&Lock->ReaderCount, - NewCount, - Count) != Count); - - /* Check if some ReaderCount are still active */ - if (NewCount != -2) - { - /* Get the spincount of the CS */ - SpinCount = Lock->Lock.SpinCount; - - /* Loop until they are done */ - while (Lock->ReaderCount != -2) - { - /* Check if the CS has a spin count */ - if (SpinCount) - { - /* Spin on it */ - SpinCount--; - } - else - { - /* Do a full wait for ReaderCount */ - SockpWaitForReaderCount(Lock); - break; - } - } - } - } - else - { - /* Acquiring it again, decrement the count to handle this */ - Lock->ReaderCount--; - } -} - -VOID -WSPAPI -SockAcquireRwLockShared(IN PSOCK_RW_LOCK Lock) -{ - BOOL GotLock = FALSE; - LONG Count, NewCount; - - /* Start acquire loop */ - do - { - /* Get the current count */ - Count = Lock->ReaderCount; - - /* Check if a writer is active */ - if (Count < 0) - { - /* Acquire the lock (this will wait for the writer) */ - RtlEnterCriticalSection(&Lock->Lock); - GotLock = TRUE; - - /* Get the counter again */ - Count = Lock->ReaderCount; - if (Count < 0) - { - /* It's still below 0, so this is a recursive acquire */ - NewCount = Count - 1; - } - else - { - /* Increase the count since the writer has finished */ - NewCount = Count + 1; - } - } - else - { - /* No writers are active, increase count */ - NewCount = Count + 1; - } - - /* Update the count */ - NewCount = InterlockedCompareExchange(&Lock->ReaderCount, - NewCount, - Count); - - /* Check if we got the lock */ - if (GotLock) - { - /* Release it */ - RtlLeaveCriticalSection(&Lock->Lock); - GotLock = FALSE; - } - } while (NewCount != Count); -} - -VOID -WSPAPI -SockReleaseRwLockExclusive(IN PSOCK_RW_LOCK Lock) -{ - /* Increase the reader count and check if it's a recursive acquire */ - if (++Lock->ReaderCount == -1) - { - /* This release is the final one, so unhack the reader count */ - Lock->ReaderCount = 0; - } - - /* Leave the RTL CS */ - RtlLeaveCriticalSection(&Lock->Lock); -} - -VOID -WSPAPI -SockReleaseRwLockShared(IN PSOCK_RW_LOCK Lock) -{ - LONG NewCount, Count = Lock->ReaderCount; - - /* Start release loop */ - while (TRUE) - { - /* Check if writers are using the lock */ - if (Count > 0) - { - /* Lock is free, decrement the count */ - NewCount = Count - 1; - } - else - { - /* Lock is busy, increment the count */ - NewCount = Count + 1; - } - - /* Update the count */ - if (InterlockedCompareExchange(&Lock->ReaderCount, NewCount, Count) == Count) - { - /* Count changed sucesfully, was this the last reader? */ - if (NewCount == -1) - { - /* It was, we need to tell the writer about it */ - NtSetEvent(Lock->WriterWaitEvent, NULL); - } - break; - } - } -} - -NTSTATUS -WSPAPI -SockDeleteRwLock(IN PSOCK_RW_LOCK Lock) -{ - /* Check if there's an event */ - if (Lock->WriterWaitEvent) - { - /* Close it */ - NtClose(Lock->WriterWaitEvent); - Lock->WriterWaitEvent = NULL; - } - - /* Free the Crtitical Section */ - return RtlDeleteCriticalSection(&Lock->Lock); -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -SOCK_RW_LOCK SocketGlobalLock; - -/* FUNCTIONS *****************************************************************/ - -VOID -WSPAPI -SockDestroySocket(PSOCKET_INFORMATION Socket) -{ - /* Dereference its helper DLL */ - SockDereferenceHelperDll(Socket->HelperData); - - /* Delete the lock */ - DeleteCriticalSection(&Socket->Lock); - - /* Free the socket */ - RtlFreeHeap(SockPrivateHeap, 0, Socket); -} - -VOID -__inline -WSPAPI -SockDereferenceSocket(IN PSOCKET_INFORMATION Socket) -{ - /* Dereference and see if it's the last count */ - if (!InterlockedDecrement(&Socket->WshContext.RefCount)) - { - /* Destroy the socket */ - SockDestroySocket(Socket); - } -} - -PSOCKET_INFORMATION -WSPAPI -SockImportHandle(IN SOCKET Handle) -{ - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - PWAH_HANDLE WahHandle; - NTSTATUS Status; - ULONG ContextSize; - IO_STATUS_BLOCK IoStatusBlock; - PSOCKET_INFORMATION ImportedSocket = NULL; - UNICODE_STRING TransportName; - - /* Acquire the global lock */ - SockAcquireRwLockExclusive(&SocketGlobalLock); - - /* Make sure that the handle is still invalid */ - WahHandle = WahReferenceContextByHandle(SockContextTable, (HANDLE)Handle); - if (WahHandle) - { - /* Some other thread imported it by now, release the lock and return */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - return (PSOCKET_INFORMATION)WahHandle; - } - - /* Setup the NULL name for possible cleanup later */ - RtlInitUnicodeString(&TransportName, NULL); - - /* Call AFD to get the context size */ - Status = NtDeviceIoControlFile((HANDLE)Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_GET_CONTEXT_SIZE, - NULL, - 0, - &ContextSize, - sizeof(ContextSize)); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Make sure we didn't fail, and that this is a valid context */ - if (!NT_SUCCESS(Status) || (ContextSize < sizeof(SOCK_SHARED_INFO))) - { - /* Fail (the error handler will convert to Win32 Status) */ - goto error; - } - -error: - /* Release the lock */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - - return ImportedSocket; -} - -INT -WSPAPI -SockSetInformation(IN PSOCKET_INFORMATION Socket, - IN ULONG AfdInformationClass, - IN PBOOLEAN Boolean OPTIONAL, - IN PULONG Ulong OPTIONAL, - IN PLARGE_INTEGER LargeInteger OPTIONAL) -{ - IO_STATUS_BLOCK IoStatusBlock; - AFD_INFO AfdInfo; - NTSTATUS Status; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - - /* Set Info Class */ - AfdInfo.InformationClass = AfdInformationClass; - - /* Set Information */ - if (Boolean) - { - AfdInfo.Information.Boolean = *Boolean; - } - else if (Ulong) - { - AfdInfo.Information.Ulong = *Ulong; - } - else - { - AfdInfo.Information.LargeInteger = *LargeInteger; - } - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_GET_INFO, - &AfdInfo, - sizeof(AfdInfo), - NULL, - 0); - /* Check if we have to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for the operation to finish */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Handle failure */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - return NtStatusToSocketError(Status); - } - - /* Return to caller */ - return NO_ERROR; -} - -INT -WSPAPI -SockGetInformation(IN PSOCKET_INFORMATION Socket, - IN ULONG AfdInformationClass, - IN PVOID ExtraData OPTIONAL, - IN ULONG ExtraDataSize, - IN OUT PBOOLEAN Boolean OPTIONAL, - IN OUT PULONG Ulong OPTIONAL, - IN OUT PLARGE_INTEGER LargeInteger OPTIONAL) -{ - ULONG InfoLength; - IO_STATUS_BLOCK IoStatusBlock; - PAFD_INFO AfdInfo; - AFD_INFO InfoData; - NTSTATUS Status; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - - /* Check if extra data is there */ - if (ExtraData && ExtraDataSize) - { - /* Allocate space for it */ - InfoLength = sizeof(InfoData) + ExtraDataSize; - AfdInfo = (PAFD_INFO)SockAllocateHeapRoutine(SockPrivateHeap, - 0, - InfoLength); - if (!AfdInfo) return WSAENOBUFS; - - /* Copy the extra data */ - RtlCopyMemory(AfdInfo + 1, ExtraData, ExtraDataSize); - } - else - { - /* Use local buffer */ - AfdInfo = &InfoData; - InfoLength = sizeof(InfoData); - } - - /* Set Info Class */ - AfdInfo->InformationClass = AfdInformationClass; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_GET_INFO, - &InfoData, - InfoLength, - &InfoData, - sizeof(InfoData)); - /* Check if we have to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for the operation to finish */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Handle failure */ - if (!NT_SUCCESS(Status)) - { - /* Check if we have to free the data */ - if (AfdInfo != &InfoData) RtlFreeHeap(SockPrivateHeap, 0, AfdInfo); - - /* Fail */ - return NtStatusToSocketError(Status); - } - - /* Return Information */ - if (Boolean) - { - *Boolean = AfdInfo->Information.Boolean; - } - else if (Ulong) - { - *Ulong = AfdInfo->Information.Ulong; - } - else - { - *LargeInteger = AfdInfo->Information.LargeInteger; - } - - /* Check if we have to free the data */ - if (AfdInfo != &InfoData) RtlFreeHeap(SockPrivateHeap, 0, AfdInfo); - - /* Return to caller */ - return NO_ERROR; -} - -INT -WSPAPI -SockSetHandleContext(IN PSOCKET_INFORMATION Socket) -{ - IO_STATUS_BLOCK IoStatusBlock; - CHAR ContextData[256]; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - PVOID Context; - ULONG_PTR ContextPos; - ULONG ContextLength; - INT HelperContextLength; - INT ErrorCode; - NTSTATUS Status; - - /* Find out how big the helper DLL context is */ - ErrorCode = Socket->HelperData->WSHGetSocketInformation(Socket->HelperContext, - Socket->Handle, - Socket->TdiAddressHandle, - Socket->TdiConnectionHandle, - SOL_INTERNAL, - SO_CONTEXT, - NULL, - &HelperContextLength); - - /* Calculate the total space needed */ - ContextLength = sizeof(SOCK_SHARED_INFO) + - 2 * Socket->HelperData->MaxWSAddressLength + - sizeof(ULONG) + HelperContextLength; - - /* See if our stack can hold it */ - if (ContextLength <= sizeof(ContextData)) - { - /* Use our stack */ - Context = ContextData; - } - else - { - /* Allocate from heap */ - Context = SockAllocateHeapRoutine(SockPrivateHeap, 0, ContextLength); - if (!Context) return WSAENOBUFS; - } - - /* - * Create Context, this includes: - * Shared Socket Data, Helper Context Length, Local and Remote Addresses - * and finally the actual helper context. - */ - ContextPos = (ULONG_PTR)Context; - RtlCopyMemory((PVOID)ContextPos, - &Socket->SharedData, - sizeof(SOCK_SHARED_INFO)); - ContextPos += sizeof(SOCK_SHARED_INFO); - *(PULONG)ContextPos = HelperContextLength; - ContextPos += sizeof(ULONG); - RtlCopyMemory((PVOID)ContextPos, - Socket->LocalAddress, - Socket->HelperData->MaxWSAddressLength); - ContextPos += Socket->HelperData->MaxWSAddressLength; - RtlCopyMemory((PVOID)ContextPos, - Socket->RemoteAddress, - Socket->HelperData->MaxWSAddressLength); - ContextPos += Socket->HelperData->MaxWSAddressLength; - - /* Now get the helper context */ - ErrorCode = Socket->HelperData->WSHGetSocketInformation(Socket->HelperContext, - Socket->Handle, - Socket->TdiAddressHandle, - Socket->TdiConnectionHandle, - SOL_INTERNAL, - SO_CONTEXT, - (PVOID)ContextPos, - &HelperContextLength); - /* Now give it to AFD */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_SET_CONTEXT, - Context, - ContextLength, - NULL, - 0); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check if we need to free from heap */ - if (Context != ContextData) RtlFreeHeap(SockPrivateHeap, 0, Context); - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Convert and return error code */ - ErrorCode = NtStatusToSocketError(Status); - return ErrorCode; - } - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -SockIsAddressConsistentWithConstrainedGroup(IN PSOCKET_INFORMATION Socket, - IN GROUP Group, - IN PSOCKADDR SocketAddress, - IN INT SocketAddressLength) -{ - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - INT ErrorCode; - PAFD_VALIDATE_GROUP_DATA ValidateGroupData; - NTSTATUS Status; - IO_STATUS_BLOCK IoStatusBlock; - ULONG ValidateGroupSize; - CHAR ValidateBuffer[sizeof(AFD_VALIDATE_GROUP_DATA) + MAX_TDI_ADDRESS_LENGTH]; - - /* Calculate the length of the buffer */ - ValidateGroupSize = sizeof(AFD_VALIDATE_GROUP_DATA) + - sizeof(TRANSPORT_ADDRESS) + - Socket->HelperData->MaxTDIAddressLength; - - /* Check if our stack buffer is large enough */ - if (ValidateGroupSize <= sizeof(ValidateBuffer)) - { - /* Use the stack */ - ValidateGroupData = (PVOID)ValidateBuffer; - } - else - { - /* Allocate from heap */ - ValidateGroupData = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - ValidateGroupSize); - if (!ValidateGroupData) return WSAENOBUFS; - } - - /* Convert the address to TDI format */ - ErrorCode = SockBuildTdiAddress(&ValidateGroupData->Address, - SocketAddress, - SocketAddressLength); - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Tell AFD which group to check, and let AFD validate it */ - ValidateGroupData->GroupId = Group; - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_VALIDATE_GROUP, - ValidateGroupData, - ValidateGroupSize, - NULL, - 0); - - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check if we need to free the data from heap */ - if (ValidateGroupData != (PVOID)ValidateBuffer) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, ValidateGroupData); - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - return NtStatusToSocketError(Status); - } - - /* Return success */ - return NO_ERROR; -} - - -INT -WSPAPI -SockGetTdiHandles(IN PSOCKET_INFORMATION Socket) -{ - AFD_TDI_HANDLE_DATA TdiHandleInfo; - NTSTATUS Status; - IO_STATUS_BLOCK IoStatusBlock; - ULONG InfoType = 0; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - - /* See which handle(s) we need */ - if (!Socket->TdiAddressHandle) InfoType |= AFD_ADDRESS_HANDLE; - if (!Socket->TdiConnectionHandle) InfoType |= AFD_CONNECTION_HANDLE; - - /* Make sure we need one */ - if (!InfoType) return NO_ERROR; - - /* Call AFD */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_GET_TDI_HANDLES, - &InfoType, - sizeof(InfoType), - &TdiHandleInfo, - sizeof(TdiHandleInfo)); - /* Check if we shoudl wait */ - if (Status == STATUS_PENDING) - { - /* Wait on it */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Update status */ - Status = IoStatusBlock.Status; - } - - /* Check for success */ - if (!NT_SUCCESS(Status)) return NtStatusToSocketError(Status); - - /* Return handles */ - if (!Socket->TdiAddressHandle) - { - Socket->TdiAddressHandle = TdiHandleInfo.TdiAddressHandle; - } - if (!Socket->TdiConnectionHandle) - { - Socket->TdiConnectionHandle = TdiHandleInfo.TdiConnectionHandle; - } - - /* Return */ - return NO_ERROR; -} - -BOOL -WSPAPI -SockWaitForSingleObject(IN HANDLE Handle, - IN SOCKET SocketHandle, - IN DWORD BlockingFlags, - IN DWORD TimeoutFlags) -{ - LARGE_INTEGER Timeout, CurrentTime, DueTime; - NTSTATUS Status; - PSOCKET_INFORMATION Socket = NULL; - BOOLEAN CallHook, UseTimeout; - LPBLOCKINGCALLBACK BlockingHook; - DWORD_PTR Context; - INT ErrorCode; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - - /* Start with a simple 0.5 second wait */ - Timeout.QuadPart = Int32x32To64(-10000, 500); - Status = NtWaitForSingleObject(Handle, TRUE, &Timeout); - if (Status == STATUS_SUCCESS) return TRUE; - - /* Check if our flags require the socket structure */ - if ((BlockingFlags == MAYBE_BLOCKING_HOOK) || - (BlockingFlags == ALWAYS_BLOCKING_HOOK) || - (TimeoutFlags == SEND_TIMEOUT) || - (TimeoutFlags == RECV_TIMEOUT)) - { - /* Get the socket */ - Socket = SockFindAndReferenceSocket(SocketHandle, FALSE); - if (!Socket) - { - /* We must be waiting on a non-socket for some reason? */ - NtWaitForSingleObject(Handle, TRUE, NULL); - return TRUE; - } - } - - /* Check the blocking flags */ - if (BlockingFlags == ALWAYS_BLOCKING_HOOK) - { - /* Always call it */ - CallHook = TRUE; - } - else if (BlockingFlags == MAYBE_BLOCKING_HOOK) - { - /* Check if we have to call it */ - CallHook = !Socket->SharedData.NonBlocking; - } - else if (BlockingFlags == NO_BLOCKING_HOOK) - { - /* Never call it*/ - CallHook = FALSE; - } - else - { - if (Socket) SockDereferenceSocket(Socket); - return FALSE; - } - - /* Check if we call it */ - if (CallHook) - { - /* Check if it actually exists */ - SockUpcallTable->lpWPUQueryBlockingCallback(Socket->SharedData.CatalogEntryId, - &BlockingHook, - &Context, - &ErrorCode); - - /* See if we'll call it */ - CallHook = (BlockingHook != NULL); - } - - /* Now check the timeout flags */ - if (TimeoutFlags == NO_TIMEOUT) - { - /* None at all */ - UseTimeout = FALSE; - } - else if (TimeoutFlags == SEND_TIMEOUT) - { - /* See if there's a Send Timeout */ - if (Socket->SharedData.SendTimeout) - { - /* Use it */ - UseTimeout = TRUE; - Timeout = RtlEnlargedIntegerMultiply(Socket->SharedData.SendTimeout, - 10 * 1000); - } - else - { - /* There isn't any */ - UseTimeout = FALSE; - } - } - else if (TimeoutFlags == RECV_TIMEOUT) - { - /* See if there's a Receive Timeout */ - if (Socket->SharedData.RecvTimeout) - { - /* Use it */ - UseTimeout = TRUE; - Timeout = RtlEnlargedIntegerMultiply(Socket->SharedData.RecvTimeout, - 10 * 1000); - } - else - { - /* There isn't any */ - UseTimeout = FALSE; - } - } - else - { - if (Socket) SockDereferenceSocket(Socket); - return FALSE; - } - - /* We don't need the socket anymore */ - if (Socket) SockDereferenceSocket(Socket); - - /* Check for timeout */ - if (UseTimeout) - { - /* Calculate the absolute time when the wait ends */ - Status = NtQuerySystemTime(&CurrentTime); - DueTime.QuadPart = CurrentTime.QuadPart + Timeout.QuadPart; - } - else - { - /* Infinite wait */ - DueTime.LowPart = -1; - DueTime.HighPart = 0x7FFFFFFF; - } - - /* Check for blocking hook call */ - if (CallHook) - { - /* We're calling it, so we won't actually be waiting */ - Timeout.LowPart = -1; - Timeout.HighPart = -1; - } - else - { - /* We'll be waiting till the Due Time */ - Timeout = DueTime; - } - - /* Now write data to the TEB so we'll know what's going on */ - ThreadData->CancelIo = FALSE; - ThreadData->SocketHandle = SocketHandle; - - /* Start wait loop */ - do - { - /* Call the hook */ - if (CallHook) (BlockingHook(Context)); - - /* Check if we were cancelled */ - if (ThreadData->CancelIo) - { - /* Infinite timeout and wait for official cancel */ - Timeout.LowPart = -1; - Timeout.HighPart = 0x7FFFFFFF; - } - else - { - /* Check if we're due */ - Status = NtQuerySystemTime(&CurrentTime); - if (CurrentTime.QuadPart > DueTime.QuadPart) - { - /* We're out */ - Status = STATUS_TIMEOUT; - break; - } - } - - /* Do the actual wait */ - Status = NtWaitForSingleObject(Handle, TRUE, &Timeout); - } while ((Status == STATUS_USER_APC) || - (Status == STATUS_ALERTED) || - (Status == STATUS_TIMEOUT)); - - /* Reset thread data */ - ThreadData->SocketHandle = INVALID_SOCKET; - - /* Return to caller */ - if (Status == STATUS_SUCCESS) return TRUE; - return FALSE; -} - -PSOCKET_INFORMATION -WSPAPI -SockFindAndReferenceSocket(IN SOCKET Handle, - IN BOOLEAN Import) -{ - PWAH_HANDLE WahHandle; - - /* Get it from our table and return it */ - WahHandle = WahReferenceContextByHandle(SockContextTable, (HANDLE)Handle); - if (WahHandle) return (PSOCKET_INFORMATION)WahHandle; - - /* Couldn't find it, shoudl we import it? */ - if (Import) return SockImportHandle(Handle); - - /* Nothing found */ - return NULL; -} - -INT -WSPAPI -SockBuildTdiAddress(OUT PTRANSPORT_ADDRESS TdiAddress, - IN PSOCKADDR Sockaddr, - IN INT SockaddrLength) -{ - /* Setup the TDI Address */ - TdiAddress->TAAddressCount = 1; - TdiAddress->Address[0].AddressLength = (USHORT)SockaddrLength - - sizeof(Sockaddr->sa_family); - - /* Copy it */ - RtlCopyMemory(&TdiAddress->Address[0].AddressType, Sockaddr, SockaddrLength); - - /* Return */ - return NO_ERROR; -} - -INT -WSPAPI -SockBuildSockaddr(OUT PSOCKADDR Sockaddr, - OUT PINT SockaddrLength, - IN PTRANSPORT_ADDRESS TdiAddress) -{ - /* Calculate the length it will take */ - *SockaddrLength = TdiAddress->Address[0].AddressLength + - sizeof(Sockaddr->sa_family); - - /* Copy it */ - RtlCopyMemory(Sockaddr, &TdiAddress->Address[0].AddressType, *SockaddrLength); - - /* Return */ - return NO_ERROR; -} - -BOOLEAN -WSPAPI -SockIsSocketConnected(IN PSOCKET_INFORMATION Socket) -{ - LARGE_INTEGER Timeout; - PVOID Context; - PVOID AsyncCallback; - IO_STATUS_BLOCK IoStatusBlock; - NTSTATUS Status; - - /* Check if there is an async connect in progress, but still unprocessed */ - while ((Socket->AsyncData) && - (Socket->AsyncData->IoStatusBlock.Status != STATUS_PENDING)) - { - /* The socket will be locked, release it */ - LeaveCriticalSection(&Socket->Lock); - - /* Setup the timeout and wait on completion */ - Timeout.QuadPart = 0; - Status = NtRemoveIoCompletion(SockAsyncQueuePort, - &AsyncCallback, - &Context, - &IoStatusBlock, - &Timeout); - - /* Check for success */ - if (Status == STATUS_SUCCESS) - { - /* Check if we're supposed to terminate */ - if (AsyncCallback != (PVOID)-1) - { - /* Handle the Async */ - SockHandleAsyncIndication(AsyncCallback, Context, &IoStatusBlock); - } - else - { - /* Terminate it */ - Status = NtSetIoCompletion(SockAsyncQueuePort, - (PVOID)-1, - (PVOID)-1, - 0, - 0); - - /* Acquire the lock and break out */ - EnterCriticalSection(&Socket->Lock); - break; - } - } - - /* Acquire the socket lock again */ - EnterCriticalSection(&Socket->Lock); - } - - /* Check if it's already connected */ - if (Socket->SharedData.State == SocketConnected) return TRUE; - return FALSE; -} - -VOID -WSPAPI -SockCancelIo(IN SOCKET Handle) -{ - IO_STATUS_BLOCK IoStatusBlock; - NTSTATUS Status; - - /* Cancel the I/O */ - Status = NtCancelIoFile((HANDLE)Handle, &IoStatusBlock); -} - -VOID -WSPAPI -SockIoCompletion(IN PVOID ApcContext, - IN PIO_STATUS_BLOCK IoStatusBlock, - DWORD Reserved) -{ - LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine = ApcContext; - INT ErrorCode; - DWORD BytesSent; - DWORD Flags = 0; - LPWSAOVERLAPPED lpOverlapped; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - - /* Check if this was an error */ - if (NT_ERROR(IoStatusBlock->Status)) - { - /* Check if it was anything but a simple cancel */ - if (IoStatusBlock->Status != STATUS_CANCELLED) - { - /* Convert it */ - ErrorCode = NtStatusToSocketError(IoStatusBlock->Status); - } - else - { - /* Use the right error */ - ErrorCode = WSA_OPERATION_ABORTED; - } - - /* Either ways, nothing was done */ - BytesSent = 0; - } - else - { - /* No error and check how many bytes were sent */ - ErrorCode = NO_ERROR; - BytesSent = PtrToUlong(IoStatusBlock->Information); - - /* Check the status */ - if (IoStatusBlock->Status == STATUS_BUFFER_OVERFLOW) - { - /* This was an error */ - ErrorCode = WSAEMSGSIZE; - } - else if (IoStatusBlock->Status == STATUS_RECEIVE_PARTIAL) - { - /* Partial receive */ - Flags = MSG_PARTIAL; - } - else if (IoStatusBlock->Status == STATUS_RECEIVE_EXPEDITED) - { - /* OOB receive */ - Flags = MSG_OOB; - } - else if (IoStatusBlock->Status == STATUS_RECEIVE_PARTIAL_EXPEDITED) - { - /* Partial OOB receive */ - Flags = MSG_OOB | MSG_PARTIAL; - } - } - - /* Get the overlapped structure */ - lpOverlapped = CONTAINING_RECORD(IoStatusBlock, WSAOVERLAPPED, Internal); - - /* Call it */ - CompletionRoutine(ErrorCode, BytesSent, lpOverlapped, Flags); - - /* Decrease pending APCs */ - ThreadData->PendingAPCs--; - InterlockedDecrement(&SockProcessPendingAPCCount); -} - -VOID -WSPAPI -SockpWaitForReaderCount(IN PSOCK_RW_LOCK Lock) -{ - NTSTATUS Status; - LARGE_INTEGER Timeout; - - /* Switch threads to see if the lock gets released that way */ - Timeout.QuadPart = 0; - NtDelayExecution(FALSE, &Timeout); - if (Lock->ReaderCount == -2) return; - - /* Either the thread isn't executing (priority inversion) or it's a hog */ - if (!Lock->WriterWaitEvent) - { - /* We don't have an event to wait on yet, allocate it */ - Status = NtCreateEvent(&Lock->WriterWaitEvent, - EVENT_ALL_ACCESS, - NULL, - SynchronizationEvent, - FALSE); - if (!NT_SUCCESS(Status)) - { - /* We can't get an event, do a manual loop */ - Timeout.QuadPart = Int32x32To64(1000, -100); - while (Lock->ReaderCount != -2) NtDelayExecution(FALSE, &Timeout); - } - } - - /* We have en event, now increment the reader count to signal them */ - if (InterlockedIncrement(&Lock->ReaderCount) != -1) - { - /* Wait for them to signal us */ - NtWaitForSingleObject(&Lock->WriterWaitEvent, FALSE, NULL); - } - - /* Finally it's free */ - Lock->ReaderCount = -2; -} - -NTSTATUS -WSPAPI -SockInitializeRwLockAndSpinCount(IN PSOCK_RW_LOCK Lock, - IN ULONG SpinCount) -{ - NTSTATUS Status; - - /* check if this is a special event create request */ - if (SpinCount & 0x80000000) - { - /* Create the event */ - Status = NtCreateEvent(&Lock->WriterWaitEvent, - EVENT_ALL_ACCESS, - NULL, - SynchronizationEvent, - FALSE); - if (!NT_SUCCESS(Status)) return Status; - } - - /* Initialize the lock */ - Status = RtlInitializeCriticalSectionAndSpinCount(&Lock->Lock, SpinCount); - if (NT_SUCCESS(Status)) - { - /* Initialize our structure */ - Lock->ReaderCount = 0; - } - else if (Lock->WriterWaitEvent) - { - /* We failed, close the event if we had one */ - NtClose(Lock->WriterWaitEvent); - Lock->WriterWaitEvent = NULL; - } - - /* Return status */ - return Status; -} - -VOID -WSPAPI -SockAcquireRwLockExclusive(IN PSOCK_RW_LOCK Lock) -{ - LONG Count, NewCount; - ULONG_PTR SpinCount; - - /* Acquire the lock */ - RtlEnterCriticalSection(&Lock->Lock); - - /* Check for ReaderCount */ - if (Lock->ReaderCount >= 0) - { - /* Loop while trying to change the count */ - do - { - /* Get the reader count */ - Count = Lock->ReaderCount; - - /* Modify the count so ReaderCount know that a writer is waiting */ - NewCount = -Count - 2; - } while (InterlockedCompareExchange(&Lock->ReaderCount, - NewCount, - Count) != Count); - - /* Check if some ReaderCount are still active */ - if (NewCount != -2) - { - /* Get the spincount of the CS */ - SpinCount = Lock->Lock.SpinCount; - - /* Loop until they are done */ - while (Lock->ReaderCount != -2) - { - /* Check if the CS has a spin count */ - if (SpinCount) - { - /* Spin on it */ - SpinCount--; - } - else - { - /* Do a full wait for ReaderCount */ - SockpWaitForReaderCount(Lock); - break; - } - } - } - } - else - { - /* Acquiring it again, decrement the count to handle this */ - Lock->ReaderCount--; - } -} - -VOID -WSPAPI -SockAcquireRwLockShared(IN PSOCK_RW_LOCK Lock) -{ - BOOL GotLock = FALSE; - LONG Count, NewCount; - - /* Start acquire loop */ - do - { - /* Get the current count */ - Count = Lock->ReaderCount; - - /* Check if a writer is active */ - if (Count < 0) - { - /* Acquire the lock (this will wait for the writer) */ - RtlEnterCriticalSection(&Lock->Lock); - GotLock = TRUE; - - /* Get the counter again */ - Count = Lock->ReaderCount; - if (Count < 0) - { - /* It's still below 0, so this is a recursive acquire */ - NewCount = Count - 1; - } - else - { - /* Increase the count since the writer has finished */ - NewCount = Count + 1; - } - } - else - { - /* No writers are active, increase count */ - NewCount = Count + 1; - } - - /* Update the count */ - NewCount = InterlockedCompareExchange(&Lock->ReaderCount, - NewCount, - Count); - - /* Check if we got the lock */ - if (GotLock) - { - /* Release it */ - RtlLeaveCriticalSection(&Lock->Lock); - GotLock = FALSE; - } - } while (NewCount != Count); -} - -VOID -WSPAPI -SockReleaseRwLockExclusive(IN PSOCK_RW_LOCK Lock) -{ - /* Increase the reader count and check if it's a recursive acquire */ - if (++Lock->ReaderCount == -1) - { - /* This release is the final one, so unhack the reader count */ - Lock->ReaderCount = 0; - } - - /* Leave the RTL CS */ - RtlLeaveCriticalSection(&Lock->Lock); -} - -VOID -WSPAPI -SockReleaseRwLockShared(IN PSOCK_RW_LOCK Lock) -{ - LONG NewCount, Count = Lock->ReaderCount; - - /* Start release loop */ - while (TRUE) - { - /* Check if writers are using the lock */ - if (Count > 0) - { - /* Lock is free, decrement the count */ - NewCount = Count - 1; - } - else - { - /* Lock is busy, increment the count */ - NewCount = Count + 1; - } - - /* Update the count */ - if (InterlockedCompareExchange(&Lock->ReaderCount, NewCount, Count) == Count) - { - /* Count changed sucesfully, was this the last reader? */ - if (NewCount == -1) - { - /* It was, we need to tell the writer about it */ - NtSetEvent(Lock->WriterWaitEvent, NULL); - } - break; - } - } -} - -NTSTATUS -WSPAPI -SockDeleteRwLock(IN PSOCK_RW_LOCK Lock) -{ - /* Check if there's an event */ - if (Lock->WriterWaitEvent) - { - /* Close it */ - NtClose(Lock->WriterWaitEvent); - Lock->WriterWaitEvent = NULL; - } - - /* Free the Crtitical Section */ - return RtlDeleteCriticalSection(&Lock->Lock); -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -SOCK_RW_LOCK SocketGlobalLock; - -/* FUNCTIONS *****************************************************************/ - -VOID -WSPAPI -SockDestroySocket(PSOCKET_INFORMATION Socket) -{ - /* Dereference its helper DLL */ - SockDereferenceHelperDll(Socket->HelperData); - - /* Delete the lock */ - DeleteCriticalSection(&Socket->Lock); - - /* Free the socket */ - RtlFreeHeap(SockPrivateHeap, 0, Socket); -} - -VOID -__inline -WSPAPI -SockDereferenceSocket(IN PSOCKET_INFORMATION Socket) -{ - /* Dereference and see if it's the last count */ - if (!InterlockedDecrement(&Socket->WshContext.RefCount)) - { - /* Destroy the socket */ - SockDestroySocket(Socket); - } -} - -PSOCKET_INFORMATION -WSPAPI -SockImportHandle(IN SOCKET Handle) -{ - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - PWAH_HANDLE WahHandle; - NTSTATUS Status; - ULONG ContextSize; - IO_STATUS_BLOCK IoStatusBlock; - PSOCKET_INFORMATION ImportedSocket = NULL; - UNICODE_STRING TransportName; - - /* Acquire the global lock */ - SockAcquireRwLockExclusive(&SocketGlobalLock); - - /* Make sure that the handle is still invalid */ - WahHandle = WahReferenceContextByHandle(SockContextTable, (HANDLE)Handle); - if (WahHandle) - { - /* Some other thread imported it by now, release the lock and return */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - return (PSOCKET_INFORMATION)WahHandle; - } - - /* Setup the NULL name for possible cleanup later */ - RtlInitUnicodeString(&TransportName, NULL); - - /* Call AFD to get the context size */ - Status = NtDeviceIoControlFile((HANDLE)Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_GET_CONTEXT_SIZE, - NULL, - 0, - &ContextSize, - sizeof(ContextSize)); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Make sure we didn't fail, and that this is a valid context */ - if (!NT_SUCCESS(Status) || (ContextSize < sizeof(SOCK_SHARED_INFO))) - { - /* Fail (the error handler will convert to Win32 Status) */ - goto error; - } - -error: - /* Release the lock */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - - return ImportedSocket; -} - -INT -WSPAPI -SockSetInformation(IN PSOCKET_INFORMATION Socket, - IN ULONG AfdInformationClass, - IN PBOOLEAN Boolean OPTIONAL, - IN PULONG Ulong OPTIONAL, - IN PLARGE_INTEGER LargeInteger OPTIONAL) -{ - IO_STATUS_BLOCK IoStatusBlock; - AFD_INFO AfdInfo; - NTSTATUS Status; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - - /* Set Info Class */ - AfdInfo.InformationClass = AfdInformationClass; - - /* Set Information */ - if (Boolean) - { - AfdInfo.Information.Boolean = *Boolean; - } - else if (Ulong) - { - AfdInfo.Information.Ulong = *Ulong; - } - else - { - AfdInfo.Information.LargeInteger = *LargeInteger; - } - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_GET_INFO, - &AfdInfo, - sizeof(AfdInfo), - NULL, - 0); - /* Check if we have to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for the operation to finish */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Handle failure */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - return NtStatusToSocketError(Status); - } - - /* Return to caller */ - return NO_ERROR; -} - -INT -WSPAPI -SockGetInformation(IN PSOCKET_INFORMATION Socket, - IN ULONG AfdInformationClass, - IN PVOID ExtraData OPTIONAL, - IN ULONG ExtraDataSize, - IN OUT PBOOLEAN Boolean OPTIONAL, - IN OUT PULONG Ulong OPTIONAL, - IN OUT PLARGE_INTEGER LargeInteger OPTIONAL) -{ - ULONG InfoLength; - IO_STATUS_BLOCK IoStatusBlock; - PAFD_INFO AfdInfo; - AFD_INFO InfoData; - NTSTATUS Status; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - - /* Check if extra data is there */ - if (ExtraData && ExtraDataSize) - { - /* Allocate space for it */ - InfoLength = sizeof(InfoData) + ExtraDataSize; - AfdInfo = (PAFD_INFO)SockAllocateHeapRoutine(SockPrivateHeap, - 0, - InfoLength); - if (!AfdInfo) return WSAENOBUFS; - - /* Copy the extra data */ - RtlCopyMemory(AfdInfo + 1, ExtraData, ExtraDataSize); - } - else - { - /* Use local buffer */ - AfdInfo = &InfoData; - InfoLength = sizeof(InfoData); - } - - /* Set Info Class */ - AfdInfo->InformationClass = AfdInformationClass; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_GET_INFO, - &InfoData, - InfoLength, - &InfoData, - sizeof(InfoData)); - /* Check if we have to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for the operation to finish */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Handle failure */ - if (!NT_SUCCESS(Status)) - { - /* Check if we have to free the data */ - if (AfdInfo != &InfoData) RtlFreeHeap(SockPrivateHeap, 0, AfdInfo); - - /* Fail */ - return NtStatusToSocketError(Status); - } - - /* Return Information */ - if (Boolean) - { - *Boolean = AfdInfo->Information.Boolean; - } - else if (Ulong) - { - *Ulong = AfdInfo->Information.Ulong; - } - else - { - *LargeInteger = AfdInfo->Information.LargeInteger; - } - - /* Check if we have to free the data */ - if (AfdInfo != &InfoData) RtlFreeHeap(SockPrivateHeap, 0, AfdInfo); - - /* Return to caller */ - return NO_ERROR; -} - -INT -WSPAPI -SockSetHandleContext(IN PSOCKET_INFORMATION Socket) -{ - IO_STATUS_BLOCK IoStatusBlock; - CHAR ContextData[256]; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - PVOID Context; - ULONG_PTR ContextPos; - ULONG ContextLength; - INT HelperContextLength; - INT ErrorCode; - NTSTATUS Status; - - /* Find out how big the helper DLL context is */ - ErrorCode = Socket->HelperData->WSHGetSocketInformation(Socket->HelperContext, - Socket->Handle, - Socket->TdiAddressHandle, - Socket->TdiConnectionHandle, - SOL_INTERNAL, - SO_CONTEXT, - NULL, - &HelperContextLength); - - /* Calculate the total space needed */ - ContextLength = sizeof(SOCK_SHARED_INFO) + - 2 * Socket->HelperData->MaxWSAddressLength + - sizeof(ULONG) + HelperContextLength; - - /* See if our stack can hold it */ - if (ContextLength <= sizeof(ContextData)) - { - /* Use our stack */ - Context = ContextData; - } - else - { - /* Allocate from heap */ - Context = SockAllocateHeapRoutine(SockPrivateHeap, 0, ContextLength); - if (!Context) return WSAENOBUFS; - } - - /* - * Create Context, this includes: - * Shared Socket Data, Helper Context Length, Local and Remote Addresses - * and finally the actual helper context. - */ - ContextPos = (ULONG_PTR)Context; - RtlCopyMemory((PVOID)ContextPos, - &Socket->SharedData, - sizeof(SOCK_SHARED_INFO)); - ContextPos += sizeof(SOCK_SHARED_INFO); - *(PULONG)ContextPos = HelperContextLength; - ContextPos += sizeof(ULONG); - RtlCopyMemory((PVOID)ContextPos, - Socket->LocalAddress, - Socket->HelperData->MaxWSAddressLength); - ContextPos += Socket->HelperData->MaxWSAddressLength; - RtlCopyMemory((PVOID)ContextPos, - Socket->RemoteAddress, - Socket->HelperData->MaxWSAddressLength); - ContextPos += Socket->HelperData->MaxWSAddressLength; - - /* Now get the helper context */ - ErrorCode = Socket->HelperData->WSHGetSocketInformation(Socket->HelperContext, - Socket->Handle, - Socket->TdiAddressHandle, - Socket->TdiConnectionHandle, - SOL_INTERNAL, - SO_CONTEXT, - (PVOID)ContextPos, - &HelperContextLength); - /* Now give it to AFD */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_SET_CONTEXT, - Context, - ContextLength, - NULL, - 0); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check if we need to free from heap */ - if (Context != ContextData) RtlFreeHeap(SockPrivateHeap, 0, Context); - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Convert and return error code */ - ErrorCode = NtStatusToSocketError(Status); - return ErrorCode; - } - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -SockIsAddressConsistentWithConstrainedGroup(IN PSOCKET_INFORMATION Socket, - IN GROUP Group, - IN PSOCKADDR SocketAddress, - IN INT SocketAddressLength) -{ - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - INT ErrorCode; - PAFD_VALIDATE_GROUP_DATA ValidateGroupData; - NTSTATUS Status; - IO_STATUS_BLOCK IoStatusBlock; - ULONG ValidateGroupSize; - CHAR ValidateBuffer[sizeof(AFD_VALIDATE_GROUP_DATA) + MAX_TDI_ADDRESS_LENGTH]; - - /* Calculate the length of the buffer */ - ValidateGroupSize = sizeof(AFD_VALIDATE_GROUP_DATA) + - sizeof(TRANSPORT_ADDRESS) + - Socket->HelperData->MaxTDIAddressLength; - - /* Check if our stack buffer is large enough */ - if (ValidateGroupSize <= sizeof(ValidateBuffer)) - { - /* Use the stack */ - ValidateGroupData = (PVOID)ValidateBuffer; - } - else - { - /* Allocate from heap */ - ValidateGroupData = SockAllocateHeapRoutine(SockPrivateHeap, - 0, - ValidateGroupSize); - if (!ValidateGroupData) return WSAENOBUFS; - } - - /* Convert the address to TDI format */ - ErrorCode = SockBuildTdiAddress(&ValidateGroupData->Address, - SocketAddress, - SocketAddressLength); - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Tell AFD which group to check, and let AFD validate it */ - ValidateGroupData->GroupId = Group; - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_VALIDATE_GROUP, - ValidateGroupData, - ValidateGroupSize, - NULL, - 0); - - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check if we need to free the data from heap */ - if (ValidateGroupData != (PVOID)ValidateBuffer) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, ValidateGroupData); - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - return NtStatusToSocketError(Status); - } - - /* Return success */ - return NO_ERROR; -} - - -INT -WSPAPI -SockGetTdiHandles(IN PSOCKET_INFORMATION Socket) -{ - AFD_TDI_HANDLE_DATA TdiHandleInfo; - NTSTATUS Status; - IO_STATUS_BLOCK IoStatusBlock; - ULONG InfoType = 0; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - - /* See which handle(s) we need */ - if (!Socket->TdiAddressHandle) InfoType |= AFD_ADDRESS_HANDLE; - if (!Socket->TdiConnectionHandle) InfoType |= AFD_CONNECTION_HANDLE; - - /* Make sure we need one */ - if (!InfoType) return NO_ERROR; - - /* Call AFD */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_GET_TDI_HANDLES, - &InfoType, - sizeof(InfoType), - &TdiHandleInfo, - sizeof(TdiHandleInfo)); - /* Check if we shoudl wait */ - if (Status == STATUS_PENDING) - { - /* Wait on it */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Update status */ - Status = IoStatusBlock.Status; - } - - /* Check for success */ - if (!NT_SUCCESS(Status)) return NtStatusToSocketError(Status); - - /* Return handles */ - if (!Socket->TdiAddressHandle) - { - Socket->TdiAddressHandle = TdiHandleInfo.TdiAddressHandle; - } - if (!Socket->TdiConnectionHandle) - { - Socket->TdiConnectionHandle = TdiHandleInfo.TdiConnectionHandle; - } - - /* Return */ - return NO_ERROR; -} - -BOOL -WSPAPI -SockWaitForSingleObject(IN HANDLE Handle, - IN SOCKET SocketHandle, - IN DWORD BlockingFlags, - IN DWORD TimeoutFlags) -{ - LARGE_INTEGER Timeout, CurrentTime, DueTime; - NTSTATUS Status; - PSOCKET_INFORMATION Socket = NULL; - BOOLEAN CallHook, UseTimeout; - LPBLOCKINGCALLBACK BlockingHook; - DWORD_PTR Context; - INT ErrorCode; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - - /* Start with a simple 0.5 second wait */ - Timeout.QuadPart = Int32x32To64(-10000, 500); - Status = NtWaitForSingleObject(Handle, TRUE, &Timeout); - if (Status == STATUS_SUCCESS) return TRUE; - - /* Check if our flags require the socket structure */ - if ((BlockingFlags == MAYBE_BLOCKING_HOOK) || - (BlockingFlags == ALWAYS_BLOCKING_HOOK) || - (TimeoutFlags == SEND_TIMEOUT) || - (TimeoutFlags == RECV_TIMEOUT)) - { - /* Get the socket */ - Socket = SockFindAndReferenceSocket(SocketHandle, FALSE); - if (!Socket) - { - /* We must be waiting on a non-socket for some reason? */ - NtWaitForSingleObject(Handle, TRUE, NULL); - return TRUE; - } - } - - /* Check the blocking flags */ - if (BlockingFlags == ALWAYS_BLOCKING_HOOK) - { - /* Always call it */ - CallHook = TRUE; - } - else if (BlockingFlags == MAYBE_BLOCKING_HOOK) - { - /* Check if we have to call it */ - CallHook = !Socket->SharedData.NonBlocking; - } - else if (BlockingFlags == NO_BLOCKING_HOOK) - { - /* Never call it*/ - CallHook = FALSE; - } - else - { - if (Socket) SockDereferenceSocket(Socket); - return FALSE; - } - - /* Check if we call it */ - if (CallHook) - { - /* Check if it actually exists */ - SockUpcallTable->lpWPUQueryBlockingCallback(Socket->SharedData.CatalogEntryId, - &BlockingHook, - &Context, - &ErrorCode); - - /* See if we'll call it */ - CallHook = (BlockingHook != NULL); - } - - /* Now check the timeout flags */ - if (TimeoutFlags == NO_TIMEOUT) - { - /* None at all */ - UseTimeout = FALSE; - } - else if (TimeoutFlags == SEND_TIMEOUT) - { - /* See if there's a Send Timeout */ - if (Socket->SharedData.SendTimeout) - { - /* Use it */ - UseTimeout = TRUE; - Timeout = RtlEnlargedIntegerMultiply(Socket->SharedData.SendTimeout, - 10 * 1000); - } - else - { - /* There isn't any */ - UseTimeout = FALSE; - } - } - else if (TimeoutFlags == RECV_TIMEOUT) - { - /* See if there's a Receive Timeout */ - if (Socket->SharedData.RecvTimeout) - { - /* Use it */ - UseTimeout = TRUE; - Timeout = RtlEnlargedIntegerMultiply(Socket->SharedData.RecvTimeout, - 10 * 1000); - } - else - { - /* There isn't any */ - UseTimeout = FALSE; - } - } - else - { - if (Socket) SockDereferenceSocket(Socket); - return FALSE; - } - - /* We don't need the socket anymore */ - if (Socket) SockDereferenceSocket(Socket); - - /* Check for timeout */ - if (UseTimeout) - { - /* Calculate the absolute time when the wait ends */ - Status = NtQuerySystemTime(&CurrentTime); - DueTime.QuadPart = CurrentTime.QuadPart + Timeout.QuadPart; - } - else - { - /* Infinite wait */ - DueTime.LowPart = -1; - DueTime.HighPart = 0x7FFFFFFF; - } - - /* Check for blocking hook call */ - if (CallHook) - { - /* We're calling it, so we won't actually be waiting */ - Timeout.LowPart = -1; - Timeout.HighPart = -1; - } - else - { - /* We'll be waiting till the Due Time */ - Timeout = DueTime; - } - - /* Now write data to the TEB so we'll know what's going on */ - ThreadData->CancelIo = FALSE; - ThreadData->SocketHandle = SocketHandle; - - /* Start wait loop */ - do - { - /* Call the hook */ - if (CallHook) (BlockingHook(Context)); - - /* Check if we were cancelled */ - if (ThreadData->CancelIo) - { - /* Infinite timeout and wait for official cancel */ - Timeout.LowPart = -1; - Timeout.HighPart = 0x7FFFFFFF; - } - else - { - /* Check if we're due */ - Status = NtQuerySystemTime(&CurrentTime); - if (CurrentTime.QuadPart > DueTime.QuadPart) - { - /* We're out */ - Status = STATUS_TIMEOUT; - break; - } - } - - /* Do the actual wait */ - Status = NtWaitForSingleObject(Handle, TRUE, &Timeout); - } while ((Status == STATUS_USER_APC) || - (Status == STATUS_ALERTED) || - (Status == STATUS_TIMEOUT)); - - /* Reset thread data */ - ThreadData->SocketHandle = INVALID_SOCKET; - - /* Return to caller */ - if (Status == STATUS_SUCCESS) return TRUE; - return FALSE; -} - -PSOCKET_INFORMATION -WSPAPI -SockFindAndReferenceSocket(IN SOCKET Handle, - IN BOOLEAN Import) -{ - PWAH_HANDLE WahHandle; - - /* Get it from our table and return it */ - WahHandle = WahReferenceContextByHandle(SockContextTable, (HANDLE)Handle); - if (WahHandle) return (PSOCKET_INFORMATION)WahHandle; - - /* Couldn't find it, shoudl we import it? */ - if (Import) return SockImportHandle(Handle); - - /* Nothing found */ - return NULL; -} - -INT -WSPAPI -SockBuildTdiAddress(OUT PTRANSPORT_ADDRESS TdiAddress, - IN PSOCKADDR Sockaddr, - IN INT SockaddrLength) -{ - /* Setup the TDI Address */ - TdiAddress->TAAddressCount = 1; - TdiAddress->Address[0].AddressLength = (USHORT)SockaddrLength - - sizeof(Sockaddr->sa_family); - - /* Copy it */ - RtlCopyMemory(&TdiAddress->Address[0].AddressType, Sockaddr, SockaddrLength); - - /* Return */ - return NO_ERROR; -} - -INT -WSPAPI -SockBuildSockaddr(OUT PSOCKADDR Sockaddr, - OUT PINT SockaddrLength, - IN PTRANSPORT_ADDRESS TdiAddress) -{ - /* Calculate the length it will take */ - *SockaddrLength = TdiAddress->Address[0].AddressLength + - sizeof(Sockaddr->sa_family); - - /* Copy it */ - RtlCopyMemory(Sockaddr, &TdiAddress->Address[0].AddressType, *SockaddrLength); - - /* Return */ - return NO_ERROR; -} - -BOOLEAN -WSPAPI -SockIsSocketConnected(IN PSOCKET_INFORMATION Socket) -{ - LARGE_INTEGER Timeout; - PVOID Context; - PVOID AsyncCallback; - IO_STATUS_BLOCK IoStatusBlock; - NTSTATUS Status; - - /* Check if there is an async connect in progress, but still unprocessed */ - while ((Socket->AsyncData) && - (Socket->AsyncData->IoStatusBlock.Status != STATUS_PENDING)) - { - /* The socket will be locked, release it */ - LeaveCriticalSection(&Socket->Lock); - - /* Setup the timeout and wait on completion */ - Timeout.QuadPart = 0; - Status = NtRemoveIoCompletion(SockAsyncQueuePort, - &AsyncCallback, - &Context, - &IoStatusBlock, - &Timeout); - - /* Check for success */ - if (Status == STATUS_SUCCESS) - { - /* Check if we're supposed to terminate */ - if (AsyncCallback != (PVOID)-1) - { - /* Handle the Async */ - SockHandleAsyncIndication(AsyncCallback, Context, &IoStatusBlock); - } - else - { - /* Terminate it */ - Status = NtSetIoCompletion(SockAsyncQueuePort, - (PVOID)-1, - (PVOID)-1, - 0, - 0); - - /* Acquire the lock and break out */ - EnterCriticalSection(&Socket->Lock); - break; - } - } - - /* Acquire the socket lock again */ - EnterCriticalSection(&Socket->Lock); - } - - /* Check if it's already connected */ - if (Socket->SharedData.State == SocketConnected) return TRUE; - return FALSE; -} - -VOID -WSPAPI -SockCancelIo(IN SOCKET Handle) -{ - IO_STATUS_BLOCK IoStatusBlock; - NTSTATUS Status; - - /* Cancel the I/O */ - Status = NtCancelIoFile((HANDLE)Handle, &IoStatusBlock); -} - -VOID -WSPAPI -SockIoCompletion(IN PVOID ApcContext, - IN PIO_STATUS_BLOCK IoStatusBlock, - DWORD Reserved) -{ - LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine = ApcContext; - INT ErrorCode; - DWORD BytesSent; - DWORD Flags = 0; - LPWSAOVERLAPPED lpOverlapped; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - - /* Check if this was an error */ - if (NT_ERROR(IoStatusBlock->Status)) - { - /* Check if it was anything but a simple cancel */ - if (IoStatusBlock->Status != STATUS_CANCELLED) - { - /* Convert it */ - ErrorCode = NtStatusToSocketError(IoStatusBlock->Status); - } - else - { - /* Use the right error */ - ErrorCode = WSA_OPERATION_ABORTED; - } - - /* Either ways, nothing was done */ - BytesSent = 0; - } - else - { - /* No error and check how many bytes were sent */ - ErrorCode = NO_ERROR; - BytesSent = PtrToUlong(IoStatusBlock->Information); - - /* Check the status */ - if (IoStatusBlock->Status == STATUS_BUFFER_OVERFLOW) - { - /* This was an error */ - ErrorCode = WSAEMSGSIZE; - } - else if (IoStatusBlock->Status == STATUS_RECEIVE_PARTIAL) - { - /* Partial receive */ - Flags = MSG_PARTIAL; - } - else if (IoStatusBlock->Status == STATUS_RECEIVE_EXPEDITED) - { - /* OOB receive */ - Flags = MSG_OOB; - } - else if (IoStatusBlock->Status == STATUS_RECEIVE_PARTIAL_EXPEDITED) - { - /* Partial OOB receive */ - Flags = MSG_OOB | MSG_PARTIAL; - } - } - - /* Get the overlapped structure */ - lpOverlapped = CONTAINING_RECORD(IoStatusBlock, WSAOVERLAPPED, Internal); - - /* Call it */ - CompletionRoutine(ErrorCode, BytesSent, lpOverlapped, Flags); - - /* Decrease pending APCs */ - ThreadData->PendingAPCs--; - InterlockedDecrement(&SockProcessPendingAPCCount); -} - -VOID -WSPAPI -SockpWaitForReaderCount(IN PSOCK_RW_LOCK Lock) -{ - NTSTATUS Status; - LARGE_INTEGER Timeout; - - /* Switch threads to see if the lock gets released that way */ - Timeout.QuadPart = 0; - NtDelayExecution(FALSE, &Timeout); - if (Lock->ReaderCount == -2) return; - - /* Either the thread isn't executing (priority inversion) or it's a hog */ - if (!Lock->WriterWaitEvent) - { - /* We don't have an event to wait on yet, allocate it */ - Status = NtCreateEvent(&Lock->WriterWaitEvent, - EVENT_ALL_ACCESS, - NULL, - SynchronizationEvent, - FALSE); - if (!NT_SUCCESS(Status)) - { - /* We can't get an event, do a manual loop */ - Timeout.QuadPart = Int32x32To64(1000, -100); - while (Lock->ReaderCount != -2) NtDelayExecution(FALSE, &Timeout); - } - } - - /* We have en event, now increment the reader count to signal them */ - if (InterlockedIncrement(&Lock->ReaderCount) != -1) - { - /* Wait for them to signal us */ - NtWaitForSingleObject(&Lock->WriterWaitEvent, FALSE, NULL); - } - - /* Finally it's free */ - Lock->ReaderCount = -2; -} - -NTSTATUS -WSPAPI -SockInitializeRwLockAndSpinCount(IN PSOCK_RW_LOCK Lock, - IN ULONG SpinCount) -{ - NTSTATUS Status; - - /* check if this is a special event create request */ - if (SpinCount & 0x80000000) - { - /* Create the event */ - Status = NtCreateEvent(&Lock->WriterWaitEvent, - EVENT_ALL_ACCESS, - NULL, - SynchronizationEvent, - FALSE); - if (!NT_SUCCESS(Status)) return Status; - } - - /* Initialize the lock */ - Status = RtlInitializeCriticalSectionAndSpinCount(&Lock->Lock, SpinCount); - if (NT_SUCCESS(Status)) - { - /* Initialize our structure */ - Lock->ReaderCount = 0; - } - else if (Lock->WriterWaitEvent) - { - /* We failed, close the event if we had one */ - NtClose(Lock->WriterWaitEvent); - Lock->WriterWaitEvent = NULL; - } - - /* Return status */ - return Status; -} - -VOID -WSPAPI -SockAcquireRwLockExclusive(IN PSOCK_RW_LOCK Lock) -{ - LONG Count, NewCount; - ULONG_PTR SpinCount; - - /* Acquire the lock */ - RtlEnterCriticalSection(&Lock->Lock); - - /* Check for ReaderCount */ - if (Lock->ReaderCount >= 0) - { - /* Loop while trying to change the count */ - do - { - /* Get the reader count */ - Count = Lock->ReaderCount; - - /* Modify the count so ReaderCount know that a writer is waiting */ - NewCount = -Count - 2; - } while (InterlockedCompareExchange(&Lock->ReaderCount, - NewCount, - Count) != Count); - - /* Check if some ReaderCount are still active */ - if (NewCount != -2) - { - /* Get the spincount of the CS */ - SpinCount = Lock->Lock.SpinCount; - - /* Loop until they are done */ - while (Lock->ReaderCount != -2) - { - /* Check if the CS has a spin count */ - if (SpinCount) - { - /* Spin on it */ - SpinCount--; - } - else - { - /* Do a full wait for ReaderCount */ - SockpWaitForReaderCount(Lock); - break; - } - } - } - } - else - { - /* Acquiring it again, decrement the count to handle this */ - Lock->ReaderCount--; - } -} - -VOID -WSPAPI -SockAcquireRwLockShared(IN PSOCK_RW_LOCK Lock) -{ - BOOL GotLock = FALSE; - LONG Count, NewCount; - - /* Start acquire loop */ - do - { - /* Get the current count */ - Count = Lock->ReaderCount; - - /* Check if a writer is active */ - if (Count < 0) - { - /* Acquire the lock (this will wait for the writer) */ - RtlEnterCriticalSection(&Lock->Lock); - GotLock = TRUE; - - /* Get the counter again */ - Count = Lock->ReaderCount; - if (Count < 0) - { - /* It's still below 0, so this is a recursive acquire */ - NewCount = Count - 1; - } - else - { - /* Increase the count since the writer has finished */ - NewCount = Count + 1; - } - } - else - { - /* No writers are active, increase count */ - NewCount = Count + 1; - } - - /* Update the count */ - NewCount = InterlockedCompareExchange(&Lock->ReaderCount, - NewCount, - Count); - - /* Check if we got the lock */ - if (GotLock) - { - /* Release it */ - RtlLeaveCriticalSection(&Lock->Lock); - GotLock = FALSE; - } - } while (NewCount != Count); -} - -VOID -WSPAPI -SockReleaseRwLockExclusive(IN PSOCK_RW_LOCK Lock) -{ - /* Increase the reader count and check if it's a recursive acquire */ - if (++Lock->ReaderCount == -1) - { - /* This release is the final one, so unhack the reader count */ - Lock->ReaderCount = 0; - } - - /* Leave the RTL CS */ - RtlLeaveCriticalSection(&Lock->Lock); -} - -VOID -WSPAPI -SockReleaseRwLockShared(IN PSOCK_RW_LOCK Lock) -{ - LONG NewCount, Count = Lock->ReaderCount; - - /* Start release loop */ - while (TRUE) - { - /* Check if writers are using the lock */ - if (Count > 0) - { - /* Lock is free, decrement the count */ - NewCount = Count - 1; - } - else - { - /* Lock is busy, increment the count */ - NewCount = Count + 1; - } - - /* Update the count */ - if (InterlockedCompareExchange(&Lock->ReaderCount, NewCount, Count) == Count) - { - /* Count changed sucesfully, was this the last reader? */ - if (NewCount == -1) - { - /* It was, we need to tell the writer about it */ - NtSetEvent(Lock->WriterWaitEvent, NULL); - } - break; - } - } -} - -NTSTATUS -WSPAPI -SockDeleteRwLock(IN PSOCK_RW_LOCK Lock) -{ - /* Check if there's an event */ - if (Lock->WriterWaitEvent) - { - /* Close it */ - NtClose(Lock->WriterWaitEvent); - Lock->WriterWaitEvent = NULL; - } - - /* Free the Crtitical Section */ - return RtlDeleteCriticalSection(&Lock->Lock); -} - diff --git a/dll/win32/mswsock/msafd/recv.c b/dll/win32/mswsock/msafd/recv.c index f85d7dfa42c..4eabcc75d75 100644 --- a/dll/win32/mswsock/msafd/recv.c +++ b/dll/win32/mswsock/msafd/recv.c @@ -560,1689 +560,3 @@ error: return NO_ERROR; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -WSPRecv(SOCKET Handle, - LPWSABUF lpBuffers, - DWORD dwBufferCount, - LPDWORD lpNumberOfBytesRead, - LPDWORD ReceiveFlags, - LPWSAOVERLAPPED lpOverlapped, - LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, - LPWSATHREADID lpThreadId, - LPINT lpErrno) -{ - PIO_STATUS_BLOCK IoStatusBlock; - IO_STATUS_BLOCK DummyIoStatusBlock; - AFD_RECV_INFO RecvInfo; - NTSTATUS Status; - PVOID APCContext; - PVOID ApcFunction; - HANDLE Event; - PWINSOCK_TEB_DATA ThreadData; - PSOCKET_INFORMATION Socket; - INT ErrorCode; - BOOLEAN ReturnValue; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Set up the Receive Structure */ - RecvInfo.BufferArray = (PAFD_WSABUF)lpBuffers; - RecvInfo.BufferCount = dwBufferCount; - RecvInfo.TdiFlags = 0; - RecvInfo.AfdFlags = 0; - - /* Set the TDI Flags */ - if (!(*ReceiveFlags)) - { - /* Use normal TDI Receive */ - RecvInfo.TdiFlags |= TDI_RECEIVE_NORMAL; - } - else - { - /* Check for valid flags */ - if ((*ReceiveFlags & ~(MSG_OOB | MSG_PEEK | MSG_PARTIAL))) - { - /* Fail */ - ErrorCode = WSAEOPNOTSUPP; - goto error; - } - - /* Check if OOB is being used */ - if (*ReceiveFlags & MSG_OOB) - { - /* Use Expedited Receive for OOB */ - RecvInfo.TdiFlags |= TDI_RECEIVE_EXPEDITED; - } - else - { - /* Use normal receive */ - RecvInfo.TdiFlags |= TDI_RECEIVE_NORMAL; - } - - /* Use Peek Receive if enabled */ - if (*ReceiveFlags & MSG_PEEK) RecvInfo.TdiFlags |= TDI_RECEIVE_PEEK; - - /* Use Partial Receive if enabled */ - if (*ReceiveFlags & MSG_PARTIAL) RecvInfo.TdiFlags |= TDI_RECEIVE_PARTIAL; - } - - /* Verifiy if we should use APC */ - if (!lpOverlapped) - { - /* Not using Overlapped structure, so use normal blocking on event */ - APCContext = NULL; - ApcFunction = NULL; - Event = ThreadData->EventHandle; - IoStatusBlock = &DummyIoStatusBlock; - } - else - { - /* Using apc, check if we have a completion routine */ - if (!lpCompletionRoutine) - { - /* No need for APC */ - APCContext = lpOverlapped; - ApcFunction = NULL; - Event = lpOverlapped->hEvent; - } - else - { - /* Use APC */ - ApcFunction = SockIoCompletion; - APCContext = lpCompletionRoutine; - Event = NULL; - - /* Skip Fast I/O */ - RecvInfo.AfdFlags = AFD_SKIP_FIO; - } - - /* Use the overlapped's structure buffer for the I/O Status Block */ - IoStatusBlock = (PIO_STATUS_BLOCK)&lpOverlapped->Internal; - - /* Make this an overlapped I/O in AFD */ - RecvInfo.AfdFlags |= AFD_OVERLAPPED; - } - - /* Set is as Pending for now */ - IoStatusBlock->Status = STATUS_PENDING; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile((HANDLE)Handle, - Event, - ApcFunction, - APCContext, - IoStatusBlock, - IOCTL_AFD_RECV, - &RecvInfo, - sizeof(RecvInfo), - NULL, - 0); - - /* Increase the pending APC Count if we're using an APC */ - if (!NT_ERROR(Status) && ApcFunction) - { - ThreadData->PendingAPCs++; - InterlockedIncrement(&SockProcessPendingAPCCount); - } - - /* Wait for completition if not overlapped */ - if ((Status == STATUS_PENDING) && !(lpOverlapped)) - { - /* Wait for completion */ - ReturnValue = SockWaitForSingleObject(Event, - Handle, - MAYBE_BLOCKING_HOOK, - RECV_TIMEOUT); - - /* Check if the wait was successful */ - if (ReturnValue) - { - /* Get new status */ - Status = IoStatusBlock->Status; - } - else - { - /* Cancel the I/O */ - SockCancelIo(Handle); - - /* Get new status and normalize */ - Status = IoStatusBlock->Status; - if (Status == STATUS_CANCELLED) Status = STATUS_IO_TIMEOUT; - } - } - - /* Return the Flags */ - *ReceiveFlags = 0; - switch (Status) - { - /* Success */ - case STATUS_SUCCESS: - break; - - /* Pending I/O */ - case STATUS_PENDING: - ErrorCode = WSA_IO_PENDING; - goto error; - - /* Buffer Overflow */ - case STATUS_BUFFER_OVERFLOW: - /* Check if this was overlapped */ - if (lpOverlapped) - { - /* Return without bytes read */ - ErrorCode = WSA_IO_PENDING; - goto error; - } - - /* Return failure with bytes read */ - ErrorCode = WSAEMSGSIZE; - break; - - /* OOB Receive */ - case STATUS_RECEIVE_EXPEDITED: - *ReceiveFlags = MSG_OOB; - break; - - /* Partial OOB Receive */ - case STATUS_RECEIVE_PARTIAL_EXPEDITED: - *ReceiveFlags = MSG_PARTIAL | MSG_OOB; - break; - - /* Parial Receive */ - case STATUS_RECEIVE_PARTIAL: - *ReceiveFlags = MSG_PARTIAL; - break; - - /* Other NT Error */ - default: - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - break; - } - - /* Return the number of bytes read */ - *lpNumberOfBytesRead = PtrToUlong(IoStatusBlock->Information); - -error: - - /* Check if async select was active */ - if (SockAsyncSelectCalled) - { - /* Get the socket */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (Socket) - { - /* Lock it */ - EnterCriticalSection(&Socket->Lock); - - /* Check which event to re-enable */ - if (RecvInfo.TdiFlags & TDI_RECEIVE_EXPEDITED) - { - /* Re-enable the OOB event */ - SockReenableAsyncSelectEvent(Socket, FD_OOB); - } - else - { - /* Re-enable the regular read event */ - SockReenableAsyncSelectEvent(Socket, FD_READ); - } - - /* Unlock and dereference socket */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -WSPRecvFrom(SOCKET Handle, - LPWSABUF lpBuffers, - DWORD dwBufferCount, - LPDWORD lpNumberOfBytesRead, - LPDWORD ReceiveFlags, - PSOCKADDR SocketAddress, - PINT SocketAddressLength, - LPWSAOVERLAPPED lpOverlapped, - LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, - LPWSATHREADID lpThreadId, - LPINT lpErrno) -{ - PIO_STATUS_BLOCK IoStatusBlock; - IO_STATUS_BLOCK DummyIoStatusBlock; - AFD_RECV_INFO_UDP RecvInfo; - NTSTATUS Status; - PVOID APCContext; - PVOID ApcFunction; - HANDLE Event; - PWINSOCK_TEB_DATA ThreadData; - PSOCKET_INFORMATION Socket; - INT ErrorCode; - BOOLEAN ReturnValue; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Fail if the socket isn't bound */ - if (Socket->SharedData.State == SocketOpen) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* If this is an unconnected or non datagram socket */ - if (!(MSAFD_IS_DGRAM_SOCK(Socket)) || - (!SocketAddress && !SocketAddressLength)) - { - /* Call WSP Recv */ - SockDereferenceSocket(Socket); - return WSPRecv(Handle, - lpBuffers, - dwBufferCount, - lpNumberOfBytesRead, - ReceiveFlags, - lpOverlapped, - lpCompletionRoutine, - lpThreadId, - lpErrno); - } - - /* If receive shutdown is enabled, fail */ - if (Socket->SharedData.ReceiveShutdown) - { - /* Fail */ - ErrorCode = WSAESHUTDOWN; - goto error; - } - - /* Check for valid Socket Address (Length) flags */ - if (!(SocketAddress) ^ (!SocketAddressLength || !(*SocketAddressLength))) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Check for valid flags */ - if ((*ReceiveFlags & ~(MSG_PEEK | MSG_PARTIAL))) - { - /* Fail */ - ErrorCode = WSAEOPNOTSUPP; - goto error; - } - - /* Check that the length is respected */ - if (SocketAddressLength && - (*SocketAddressLength < Socket->HelperData->MinWSAddressLength)) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Set up the Receive Structure */ - RecvInfo.BufferArray = (PAFD_WSABUF)lpBuffers; - RecvInfo.BufferCount = dwBufferCount; - RecvInfo.TdiFlags = TDI_RECEIVE_NORMAL; - RecvInfo.AfdFlags = 0; - RecvInfo.Address = SocketAddress; - RecvInfo.AddressLength = SocketAddressLength; - - /* Use Peek Receive if enabled */ - if (*ReceiveFlags & MSG_PEEK) RecvInfo.TdiFlags |= TDI_RECEIVE_PEEK; - - /* Use Partial Receive if enabled */ - if (*ReceiveFlags & MSG_PARTIAL) RecvInfo.TdiFlags |= TDI_RECEIVE_PARTIAL; - - /* Verifiy if we should use APC */ - if (!lpOverlapped) - { - /* Not using Overlapped structure, so use normal blocking on event */ - APCContext = NULL; - ApcFunction = NULL; - Event = ThreadData->EventHandle; - IoStatusBlock = &DummyIoStatusBlock; - } - else - { - /* Using apc, check if we have a completion routine */ - if (!lpCompletionRoutine) - { - /* No need for APC */ - APCContext = lpOverlapped; - ApcFunction = NULL; - Event = lpOverlapped->hEvent; - } - else - { - /* Use APC */ - ApcFunction = SockIoCompletion; - APCContext = lpCompletionRoutine; - Event = NULL; - - /* Skip Fast I/O */ - RecvInfo.AfdFlags = AFD_SKIP_FIO; - } - - /* Use the overlapped's structure buffer for the I/O Status Block */ - IoStatusBlock = (PIO_STATUS_BLOCK)&lpOverlapped->Internal; - - /* Make this an overlapped I/O in AFD */ - RecvInfo.AfdFlags |= AFD_OVERLAPPED; - } - - /* Set is as Pending for now */ - IoStatusBlock->Status = STATUS_PENDING; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - Event, - ApcFunction, - APCContext, - IoStatusBlock, - IOCTL_AFD_RECV_DATAGRAM, - &RecvInfo, - sizeof(RecvInfo), - NULL, - 0); - - /* Increase the pending APC Count if we're using an APC */ - if (!NT_ERROR(Status) && ApcFunction) - { - ThreadData->PendingAPCs++; - InterlockedIncrement(&SockProcessPendingAPCCount); - } - - /* Wait for completition if not overlapped */ - if ((Status == STATUS_PENDING) && !(lpOverlapped)) - { - /* Wait for completion */ - ReturnValue = SockWaitForSingleObject(Event, - Handle, - MAYBE_BLOCKING_HOOK, - RECV_TIMEOUT); - - /* Check if the wait was successful */ - if (ReturnValue) - { - /* Get new status */ - Status = IoStatusBlock->Status; - } - else - { - /* Cancel the I/O */ - SockCancelIo(Handle); - - /* Get new status and normalize */ - Status = IoStatusBlock->Status; - if (Status == STATUS_CANCELLED) Status = STATUS_IO_TIMEOUT; - } - } - - /* Return the Flags */ - *ReceiveFlags = 0; - switch (Status) - { - /* Success */ - case STATUS_SUCCESS: - break; - - /* Pending I/O */ - case STATUS_PENDING: - ErrorCode = WSA_IO_PENDING; - goto error; - - /* Buffer Overflow */ - case STATUS_BUFFER_OVERFLOW: - /* Check if this was overlapped */ - if (lpOverlapped) - { - /* Return without bytes read */ - ErrorCode = WSA_IO_PENDING; - goto error; - } - - /* Return failure with bytes read */ - ErrorCode = WSAEMSGSIZE; - break; - - /* OOB Receive */ - case STATUS_RECEIVE_EXPEDITED: - *ReceiveFlags = MSG_OOB; - break; - - /* Partial OOB Receive */ - case STATUS_RECEIVE_PARTIAL_EXPEDITED: - *ReceiveFlags = MSG_PARTIAL | MSG_OOB; - break; - - /* Parial Receive */ - case STATUS_RECEIVE_PARTIAL: - *ReceiveFlags = MSG_PARTIAL; - break; - - /* Other NT Error */ - default: - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - break; - } - - /* Return the number of bytes read */ - *lpNumberOfBytesRead = PtrToUlong(IoStatusBlock->Information); - -error: - - /* Check if we have a socket here */ - if (Socket) - { - /* Check if async select was active */ - if (SockAsyncSelectCalled) - { - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Re-enable the regular read event */ - SockReenableAsyncSelectEvent(Socket, FD_READ); - - /* Unlock socket */ - LeaveCriticalSection(&Socket->Lock); - } - - /* Dereference it */ - SockDereferenceSocket(Socket); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -WSPRecv(SOCKET Handle, - LPWSABUF lpBuffers, - DWORD dwBufferCount, - LPDWORD lpNumberOfBytesRead, - LPDWORD ReceiveFlags, - LPWSAOVERLAPPED lpOverlapped, - LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, - LPWSATHREADID lpThreadId, - LPINT lpErrno) -{ - PIO_STATUS_BLOCK IoStatusBlock; - IO_STATUS_BLOCK DummyIoStatusBlock; - AFD_RECV_INFO RecvInfo; - NTSTATUS Status; - PVOID APCContext; - PVOID ApcFunction; - HANDLE Event; - PWINSOCK_TEB_DATA ThreadData; - PSOCKET_INFORMATION Socket; - INT ErrorCode; - BOOLEAN ReturnValue; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Set up the Receive Structure */ - RecvInfo.BufferArray = (PAFD_WSABUF)lpBuffers; - RecvInfo.BufferCount = dwBufferCount; - RecvInfo.TdiFlags = 0; - RecvInfo.AfdFlags = 0; - - /* Set the TDI Flags */ - if (!(*ReceiveFlags)) - { - /* Use normal TDI Receive */ - RecvInfo.TdiFlags |= TDI_RECEIVE_NORMAL; - } - else - { - /* Check for valid flags */ - if ((*ReceiveFlags & ~(MSG_OOB | MSG_PEEK | MSG_PARTIAL))) - { - /* Fail */ - ErrorCode = WSAEOPNOTSUPP; - goto error; - } - - /* Check if OOB is being used */ - if (*ReceiveFlags & MSG_OOB) - { - /* Use Expedited Receive for OOB */ - RecvInfo.TdiFlags |= TDI_RECEIVE_EXPEDITED; - } - else - { - /* Use normal receive */ - RecvInfo.TdiFlags |= TDI_RECEIVE_NORMAL; - } - - /* Use Peek Receive if enabled */ - if (*ReceiveFlags & MSG_PEEK) RecvInfo.TdiFlags |= TDI_RECEIVE_PEEK; - - /* Use Partial Receive if enabled */ - if (*ReceiveFlags & MSG_PARTIAL) RecvInfo.TdiFlags |= TDI_RECEIVE_PARTIAL; - } - - /* Verifiy if we should use APC */ - if (!lpOverlapped) - { - /* Not using Overlapped structure, so use normal blocking on event */ - APCContext = NULL; - ApcFunction = NULL; - Event = ThreadData->EventHandle; - IoStatusBlock = &DummyIoStatusBlock; - } - else - { - /* Using apc, check if we have a completion routine */ - if (!lpCompletionRoutine) - { - /* No need for APC */ - APCContext = lpOverlapped; - ApcFunction = NULL; - Event = lpOverlapped->hEvent; - } - else - { - /* Use APC */ - ApcFunction = SockIoCompletion; - APCContext = lpCompletionRoutine; - Event = NULL; - - /* Skip Fast I/O */ - RecvInfo.AfdFlags = AFD_SKIP_FIO; - } - - /* Use the overlapped's structure buffer for the I/O Status Block */ - IoStatusBlock = (PIO_STATUS_BLOCK)&lpOverlapped->Internal; - - /* Make this an overlapped I/O in AFD */ - RecvInfo.AfdFlags |= AFD_OVERLAPPED; - } - - /* Set is as Pending for now */ - IoStatusBlock->Status = STATUS_PENDING; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile((HANDLE)Handle, - Event, - ApcFunction, - APCContext, - IoStatusBlock, - IOCTL_AFD_RECV, - &RecvInfo, - sizeof(RecvInfo), - NULL, - 0); - - /* Increase the pending APC Count if we're using an APC */ - if (!NT_ERROR(Status) && ApcFunction) - { - ThreadData->PendingAPCs++; - InterlockedIncrement(&SockProcessPendingAPCCount); - } - - /* Wait for completition if not overlapped */ - if ((Status == STATUS_PENDING) && !(lpOverlapped)) - { - /* Wait for completion */ - ReturnValue = SockWaitForSingleObject(Event, - Handle, - MAYBE_BLOCKING_HOOK, - RECV_TIMEOUT); - - /* Check if the wait was successful */ - if (ReturnValue) - { - /* Get new status */ - Status = IoStatusBlock->Status; - } - else - { - /* Cancel the I/O */ - SockCancelIo(Handle); - - /* Get new status and normalize */ - Status = IoStatusBlock->Status; - if (Status == STATUS_CANCELLED) Status = STATUS_IO_TIMEOUT; - } - } - - /* Return the Flags */ - *ReceiveFlags = 0; - switch (Status) - { - /* Success */ - case STATUS_SUCCESS: - break; - - /* Pending I/O */ - case STATUS_PENDING: - ErrorCode = WSA_IO_PENDING; - goto error; - - /* Buffer Overflow */ - case STATUS_BUFFER_OVERFLOW: - /* Check if this was overlapped */ - if (lpOverlapped) - { - /* Return without bytes read */ - ErrorCode = WSA_IO_PENDING; - goto error; - } - - /* Return failure with bytes read */ - ErrorCode = WSAEMSGSIZE; - break; - - /* OOB Receive */ - case STATUS_RECEIVE_EXPEDITED: - *ReceiveFlags = MSG_OOB; - break; - - /* Partial OOB Receive */ - case STATUS_RECEIVE_PARTIAL_EXPEDITED: - *ReceiveFlags = MSG_PARTIAL | MSG_OOB; - break; - - /* Parial Receive */ - case STATUS_RECEIVE_PARTIAL: - *ReceiveFlags = MSG_PARTIAL; - break; - - /* Other NT Error */ - default: - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - break; - } - - /* Return the number of bytes read */ - *lpNumberOfBytesRead = PtrToUlong(IoStatusBlock->Information); - -error: - - /* Check if async select was active */ - if (SockAsyncSelectCalled) - { - /* Get the socket */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (Socket) - { - /* Lock it */ - EnterCriticalSection(&Socket->Lock); - - /* Check which event to re-enable */ - if (RecvInfo.TdiFlags & TDI_RECEIVE_EXPEDITED) - { - /* Re-enable the OOB event */ - SockReenableAsyncSelectEvent(Socket, FD_OOB); - } - else - { - /* Re-enable the regular read event */ - SockReenableAsyncSelectEvent(Socket, FD_READ); - } - - /* Unlock and dereference socket */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -WSPRecvFrom(SOCKET Handle, - LPWSABUF lpBuffers, - DWORD dwBufferCount, - LPDWORD lpNumberOfBytesRead, - LPDWORD ReceiveFlags, - PSOCKADDR SocketAddress, - PINT SocketAddressLength, - LPWSAOVERLAPPED lpOverlapped, - LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, - LPWSATHREADID lpThreadId, - LPINT lpErrno) -{ - PIO_STATUS_BLOCK IoStatusBlock; - IO_STATUS_BLOCK DummyIoStatusBlock; - AFD_RECV_INFO_UDP RecvInfo; - NTSTATUS Status; - PVOID APCContext; - PVOID ApcFunction; - HANDLE Event; - PWINSOCK_TEB_DATA ThreadData; - PSOCKET_INFORMATION Socket; - INT ErrorCode; - BOOLEAN ReturnValue; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Fail if the socket isn't bound */ - if (Socket->SharedData.State == SocketOpen) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* If this is an unconnected or non datagram socket */ - if (!(MSAFD_IS_DGRAM_SOCK(Socket)) || - (!SocketAddress && !SocketAddressLength)) - { - /* Call WSP Recv */ - SockDereferenceSocket(Socket); - return WSPRecv(Handle, - lpBuffers, - dwBufferCount, - lpNumberOfBytesRead, - ReceiveFlags, - lpOverlapped, - lpCompletionRoutine, - lpThreadId, - lpErrno); - } - - /* If receive shutdown is enabled, fail */ - if (Socket->SharedData.ReceiveShutdown) - { - /* Fail */ - ErrorCode = WSAESHUTDOWN; - goto error; - } - - /* Check for valid Socket Address (Length) flags */ - if (!(SocketAddress) ^ (!SocketAddressLength || !(*SocketAddressLength))) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Check for valid flags */ - if ((*ReceiveFlags & ~(MSG_PEEK | MSG_PARTIAL))) - { - /* Fail */ - ErrorCode = WSAEOPNOTSUPP; - goto error; - } - - /* Check that the length is respected */ - if (SocketAddressLength && - (*SocketAddressLength < Socket->HelperData->MinWSAddressLength)) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Set up the Receive Structure */ - RecvInfo.BufferArray = (PAFD_WSABUF)lpBuffers; - RecvInfo.BufferCount = dwBufferCount; - RecvInfo.TdiFlags = TDI_RECEIVE_NORMAL; - RecvInfo.AfdFlags = 0; - RecvInfo.Address = SocketAddress; - RecvInfo.AddressLength = SocketAddressLength; - - /* Use Peek Receive if enabled */ - if (*ReceiveFlags & MSG_PEEK) RecvInfo.TdiFlags |= TDI_RECEIVE_PEEK; - - /* Use Partial Receive if enabled */ - if (*ReceiveFlags & MSG_PARTIAL) RecvInfo.TdiFlags |= TDI_RECEIVE_PARTIAL; - - /* Verifiy if we should use APC */ - if (!lpOverlapped) - { - /* Not using Overlapped structure, so use normal blocking on event */ - APCContext = NULL; - ApcFunction = NULL; - Event = ThreadData->EventHandle; - IoStatusBlock = &DummyIoStatusBlock; - } - else - { - /* Using apc, check if we have a completion routine */ - if (!lpCompletionRoutine) - { - /* No need for APC */ - APCContext = lpOverlapped; - ApcFunction = NULL; - Event = lpOverlapped->hEvent; - } - else - { - /* Use APC */ - ApcFunction = SockIoCompletion; - APCContext = lpCompletionRoutine; - Event = NULL; - - /* Skip Fast I/O */ - RecvInfo.AfdFlags = AFD_SKIP_FIO; - } - - /* Use the overlapped's structure buffer for the I/O Status Block */ - IoStatusBlock = (PIO_STATUS_BLOCK)&lpOverlapped->Internal; - - /* Make this an overlapped I/O in AFD */ - RecvInfo.AfdFlags |= AFD_OVERLAPPED; - } - - /* Set is as Pending for now */ - IoStatusBlock->Status = STATUS_PENDING; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - Event, - ApcFunction, - APCContext, - IoStatusBlock, - IOCTL_AFD_RECV_DATAGRAM, - &RecvInfo, - sizeof(RecvInfo), - NULL, - 0); - - /* Increase the pending APC Count if we're using an APC */ - if (!NT_ERROR(Status) && ApcFunction) - { - ThreadData->PendingAPCs++; - InterlockedIncrement(&SockProcessPendingAPCCount); - } - - /* Wait for completition if not overlapped */ - if ((Status == STATUS_PENDING) && !(lpOverlapped)) - { - /* Wait for completion */ - ReturnValue = SockWaitForSingleObject(Event, - Handle, - MAYBE_BLOCKING_HOOK, - RECV_TIMEOUT); - - /* Check if the wait was successful */ - if (ReturnValue) - { - /* Get new status */ - Status = IoStatusBlock->Status; - } - else - { - /* Cancel the I/O */ - SockCancelIo(Handle); - - /* Get new status and normalize */ - Status = IoStatusBlock->Status; - if (Status == STATUS_CANCELLED) Status = STATUS_IO_TIMEOUT; - } - } - - /* Return the Flags */ - *ReceiveFlags = 0; - switch (Status) - { - /* Success */ - case STATUS_SUCCESS: - break; - - /* Pending I/O */ - case STATUS_PENDING: - ErrorCode = WSA_IO_PENDING; - goto error; - - /* Buffer Overflow */ - case STATUS_BUFFER_OVERFLOW: - /* Check if this was overlapped */ - if (lpOverlapped) - { - /* Return without bytes read */ - ErrorCode = WSA_IO_PENDING; - goto error; - } - - /* Return failure with bytes read */ - ErrorCode = WSAEMSGSIZE; - break; - - /* OOB Receive */ - case STATUS_RECEIVE_EXPEDITED: - *ReceiveFlags = MSG_OOB; - break; - - /* Partial OOB Receive */ - case STATUS_RECEIVE_PARTIAL_EXPEDITED: - *ReceiveFlags = MSG_PARTIAL | MSG_OOB; - break; - - /* Parial Receive */ - case STATUS_RECEIVE_PARTIAL: - *ReceiveFlags = MSG_PARTIAL; - break; - - /* Other NT Error */ - default: - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - break; - } - - /* Return the number of bytes read */ - *lpNumberOfBytesRead = PtrToUlong(IoStatusBlock->Information); - -error: - - /* Check if we have a socket here */ - if (Socket) - { - /* Check if async select was active */ - if (SockAsyncSelectCalled) - { - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Re-enable the regular read event */ - SockReenableAsyncSelectEvent(Socket, FD_READ); - - /* Unlock socket */ - LeaveCriticalSection(&Socket->Lock); - } - - /* Dereference it */ - SockDereferenceSocket(Socket); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -WSPRecv(SOCKET Handle, - LPWSABUF lpBuffers, - DWORD dwBufferCount, - LPDWORD lpNumberOfBytesRead, - LPDWORD ReceiveFlags, - LPWSAOVERLAPPED lpOverlapped, - LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, - LPWSATHREADID lpThreadId, - LPINT lpErrno) -{ - PIO_STATUS_BLOCK IoStatusBlock; - IO_STATUS_BLOCK DummyIoStatusBlock; - AFD_RECV_INFO RecvInfo; - NTSTATUS Status; - PVOID APCContext; - PVOID ApcFunction; - HANDLE Event; - PWINSOCK_TEB_DATA ThreadData; - PSOCKET_INFORMATION Socket; - INT ErrorCode; - BOOLEAN ReturnValue; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Set up the Receive Structure */ - RecvInfo.BufferArray = (PAFD_WSABUF)lpBuffers; - RecvInfo.BufferCount = dwBufferCount; - RecvInfo.TdiFlags = 0; - RecvInfo.AfdFlags = 0; - - /* Set the TDI Flags */ - if (!(*ReceiveFlags)) - { - /* Use normal TDI Receive */ - RecvInfo.TdiFlags |= TDI_RECEIVE_NORMAL; - } - else - { - /* Check for valid flags */ - if ((*ReceiveFlags & ~(MSG_OOB | MSG_PEEK | MSG_PARTIAL))) - { - /* Fail */ - ErrorCode = WSAEOPNOTSUPP; - goto error; - } - - /* Check if OOB is being used */ - if (*ReceiveFlags & MSG_OOB) - { - /* Use Expedited Receive for OOB */ - RecvInfo.TdiFlags |= TDI_RECEIVE_EXPEDITED; - } - else - { - /* Use normal receive */ - RecvInfo.TdiFlags |= TDI_RECEIVE_NORMAL; - } - - /* Use Peek Receive if enabled */ - if (*ReceiveFlags & MSG_PEEK) RecvInfo.TdiFlags |= TDI_RECEIVE_PEEK; - - /* Use Partial Receive if enabled */ - if (*ReceiveFlags & MSG_PARTIAL) RecvInfo.TdiFlags |= TDI_RECEIVE_PARTIAL; - } - - /* Verifiy if we should use APC */ - if (!lpOverlapped) - { - /* Not using Overlapped structure, so use normal blocking on event */ - APCContext = NULL; - ApcFunction = NULL; - Event = ThreadData->EventHandle; - IoStatusBlock = &DummyIoStatusBlock; - } - else - { - /* Using apc, check if we have a completion routine */ - if (!lpCompletionRoutine) - { - /* No need for APC */ - APCContext = lpOverlapped; - ApcFunction = NULL; - Event = lpOverlapped->hEvent; - } - else - { - /* Use APC */ - ApcFunction = SockIoCompletion; - APCContext = lpCompletionRoutine; - Event = NULL; - - /* Skip Fast I/O */ - RecvInfo.AfdFlags = AFD_SKIP_FIO; - } - - /* Use the overlapped's structure buffer for the I/O Status Block */ - IoStatusBlock = (PIO_STATUS_BLOCK)&lpOverlapped->Internal; - - /* Make this an overlapped I/O in AFD */ - RecvInfo.AfdFlags |= AFD_OVERLAPPED; - } - - /* Set is as Pending for now */ - IoStatusBlock->Status = STATUS_PENDING; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile((HANDLE)Handle, - Event, - ApcFunction, - APCContext, - IoStatusBlock, - IOCTL_AFD_RECV, - &RecvInfo, - sizeof(RecvInfo), - NULL, - 0); - - /* Increase the pending APC Count if we're using an APC */ - if (!NT_ERROR(Status) && ApcFunction) - { - ThreadData->PendingAPCs++; - InterlockedIncrement(&SockProcessPendingAPCCount); - } - - /* Wait for completition if not overlapped */ - if ((Status == STATUS_PENDING) && !(lpOverlapped)) - { - /* Wait for completion */ - ReturnValue = SockWaitForSingleObject(Event, - Handle, - MAYBE_BLOCKING_HOOK, - RECV_TIMEOUT); - - /* Check if the wait was successful */ - if (ReturnValue) - { - /* Get new status */ - Status = IoStatusBlock->Status; - } - else - { - /* Cancel the I/O */ - SockCancelIo(Handle); - - /* Get new status and normalize */ - Status = IoStatusBlock->Status; - if (Status == STATUS_CANCELLED) Status = STATUS_IO_TIMEOUT; - } - } - - /* Return the Flags */ - *ReceiveFlags = 0; - switch (Status) - { - /* Success */ - case STATUS_SUCCESS: - break; - - /* Pending I/O */ - case STATUS_PENDING: - ErrorCode = WSA_IO_PENDING; - goto error; - - /* Buffer Overflow */ - case STATUS_BUFFER_OVERFLOW: - /* Check if this was overlapped */ - if (lpOverlapped) - { - /* Return without bytes read */ - ErrorCode = WSA_IO_PENDING; - goto error; - } - - /* Return failure with bytes read */ - ErrorCode = WSAEMSGSIZE; - break; - - /* OOB Receive */ - case STATUS_RECEIVE_EXPEDITED: - *ReceiveFlags = MSG_OOB; - break; - - /* Partial OOB Receive */ - case STATUS_RECEIVE_PARTIAL_EXPEDITED: - *ReceiveFlags = MSG_PARTIAL | MSG_OOB; - break; - - /* Parial Receive */ - case STATUS_RECEIVE_PARTIAL: - *ReceiveFlags = MSG_PARTIAL; - break; - - /* Other NT Error */ - default: - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - break; - } - - /* Return the number of bytes read */ - *lpNumberOfBytesRead = PtrToUlong(IoStatusBlock->Information); - -error: - - /* Check if async select was active */ - if (SockAsyncSelectCalled) - { - /* Get the socket */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (Socket) - { - /* Lock it */ - EnterCriticalSection(&Socket->Lock); - - /* Check which event to re-enable */ - if (RecvInfo.TdiFlags & TDI_RECEIVE_EXPEDITED) - { - /* Re-enable the OOB event */ - SockReenableAsyncSelectEvent(Socket, FD_OOB); - } - else - { - /* Re-enable the regular read event */ - SockReenableAsyncSelectEvent(Socket, FD_READ); - } - - /* Unlock and dereference socket */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -WSPRecvFrom(SOCKET Handle, - LPWSABUF lpBuffers, - DWORD dwBufferCount, - LPDWORD lpNumberOfBytesRead, - LPDWORD ReceiveFlags, - PSOCKADDR SocketAddress, - PINT SocketAddressLength, - LPWSAOVERLAPPED lpOverlapped, - LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, - LPWSATHREADID lpThreadId, - LPINT lpErrno) -{ - PIO_STATUS_BLOCK IoStatusBlock; - IO_STATUS_BLOCK DummyIoStatusBlock; - AFD_RECV_INFO_UDP RecvInfo; - NTSTATUS Status; - PVOID APCContext; - PVOID ApcFunction; - HANDLE Event; - PWINSOCK_TEB_DATA ThreadData; - PSOCKET_INFORMATION Socket; - INT ErrorCode; - BOOLEAN ReturnValue; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Fail if the socket isn't bound */ - if (Socket->SharedData.State == SocketOpen) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* If this is an unconnected or non datagram socket */ - if (!(MSAFD_IS_DGRAM_SOCK(Socket)) || - (!SocketAddress && !SocketAddressLength)) - { - /* Call WSP Recv */ - SockDereferenceSocket(Socket); - return WSPRecv(Handle, - lpBuffers, - dwBufferCount, - lpNumberOfBytesRead, - ReceiveFlags, - lpOverlapped, - lpCompletionRoutine, - lpThreadId, - lpErrno); - } - - /* If receive shutdown is enabled, fail */ - if (Socket->SharedData.ReceiveShutdown) - { - /* Fail */ - ErrorCode = WSAESHUTDOWN; - goto error; - } - - /* Check for valid Socket Address (Length) flags */ - if (!(SocketAddress) ^ (!SocketAddressLength || !(*SocketAddressLength))) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Check for valid flags */ - if ((*ReceiveFlags & ~(MSG_PEEK | MSG_PARTIAL))) - { - /* Fail */ - ErrorCode = WSAEOPNOTSUPP; - goto error; - } - - /* Check that the length is respected */ - if (SocketAddressLength && - (*SocketAddressLength < Socket->HelperData->MinWSAddressLength)) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Set up the Receive Structure */ - RecvInfo.BufferArray = (PAFD_WSABUF)lpBuffers; - RecvInfo.BufferCount = dwBufferCount; - RecvInfo.TdiFlags = TDI_RECEIVE_NORMAL; - RecvInfo.AfdFlags = 0; - RecvInfo.Address = SocketAddress; - RecvInfo.AddressLength = SocketAddressLength; - - /* Use Peek Receive if enabled */ - if (*ReceiveFlags & MSG_PEEK) RecvInfo.TdiFlags |= TDI_RECEIVE_PEEK; - - /* Use Partial Receive if enabled */ - if (*ReceiveFlags & MSG_PARTIAL) RecvInfo.TdiFlags |= TDI_RECEIVE_PARTIAL; - - /* Verifiy if we should use APC */ - if (!lpOverlapped) - { - /* Not using Overlapped structure, so use normal blocking on event */ - APCContext = NULL; - ApcFunction = NULL; - Event = ThreadData->EventHandle; - IoStatusBlock = &DummyIoStatusBlock; - } - else - { - /* Using apc, check if we have a completion routine */ - if (!lpCompletionRoutine) - { - /* No need for APC */ - APCContext = lpOverlapped; - ApcFunction = NULL; - Event = lpOverlapped->hEvent; - } - else - { - /* Use APC */ - ApcFunction = SockIoCompletion; - APCContext = lpCompletionRoutine; - Event = NULL; - - /* Skip Fast I/O */ - RecvInfo.AfdFlags = AFD_SKIP_FIO; - } - - /* Use the overlapped's structure buffer for the I/O Status Block */ - IoStatusBlock = (PIO_STATUS_BLOCK)&lpOverlapped->Internal; - - /* Make this an overlapped I/O in AFD */ - RecvInfo.AfdFlags |= AFD_OVERLAPPED; - } - - /* Set is as Pending for now */ - IoStatusBlock->Status = STATUS_PENDING; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - Event, - ApcFunction, - APCContext, - IoStatusBlock, - IOCTL_AFD_RECV_DATAGRAM, - &RecvInfo, - sizeof(RecvInfo), - NULL, - 0); - - /* Increase the pending APC Count if we're using an APC */ - if (!NT_ERROR(Status) && ApcFunction) - { - ThreadData->PendingAPCs++; - InterlockedIncrement(&SockProcessPendingAPCCount); - } - - /* Wait for completition if not overlapped */ - if ((Status == STATUS_PENDING) && !(lpOverlapped)) - { - /* Wait for completion */ - ReturnValue = SockWaitForSingleObject(Event, - Handle, - MAYBE_BLOCKING_HOOK, - RECV_TIMEOUT); - - /* Check if the wait was successful */ - if (ReturnValue) - { - /* Get new status */ - Status = IoStatusBlock->Status; - } - else - { - /* Cancel the I/O */ - SockCancelIo(Handle); - - /* Get new status and normalize */ - Status = IoStatusBlock->Status; - if (Status == STATUS_CANCELLED) Status = STATUS_IO_TIMEOUT; - } - } - - /* Return the Flags */ - *ReceiveFlags = 0; - switch (Status) - { - /* Success */ - case STATUS_SUCCESS: - break; - - /* Pending I/O */ - case STATUS_PENDING: - ErrorCode = WSA_IO_PENDING; - goto error; - - /* Buffer Overflow */ - case STATUS_BUFFER_OVERFLOW: - /* Check if this was overlapped */ - if (lpOverlapped) - { - /* Return without bytes read */ - ErrorCode = WSA_IO_PENDING; - goto error; - } - - /* Return failure with bytes read */ - ErrorCode = WSAEMSGSIZE; - break; - - /* OOB Receive */ - case STATUS_RECEIVE_EXPEDITED: - *ReceiveFlags = MSG_OOB; - break; - - /* Partial OOB Receive */ - case STATUS_RECEIVE_PARTIAL_EXPEDITED: - *ReceiveFlags = MSG_PARTIAL | MSG_OOB; - break; - - /* Parial Receive */ - case STATUS_RECEIVE_PARTIAL: - *ReceiveFlags = MSG_PARTIAL; - break; - - /* Other NT Error */ - default: - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - break; - } - - /* Return the number of bytes read */ - *lpNumberOfBytesRead = PtrToUlong(IoStatusBlock->Information); - -error: - - /* Check if we have a socket here */ - if (Socket) - { - /* Check if async select was active */ - if (SockAsyncSelectCalled) - { - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Re-enable the regular read event */ - SockReenableAsyncSelectEvent(Socket, FD_READ); - - /* Unlock socket */ - LeaveCriticalSection(&Socket->Lock); - } - - /* Dereference it */ - SockDereferenceSocket(Socket); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - diff --git a/dll/win32/mswsock/msafd/sanaccpt.c b/dll/win32/mswsock/msafd/sanaccpt.c index 3e062e90d63..bd1ad2806dc 100644 --- a/dll/win32/mswsock/msafd/sanaccpt.c +++ b/dll/win32/mswsock/msafd/sanaccpt.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/msafd/sanconn.c b/dll/win32/mswsock/msafd/sanconn.c index 3e062e90d63..bd1ad2806dc 100644 --- a/dll/win32/mswsock/msafd/sanconn.c +++ b/dll/win32/mswsock/msafd/sanconn.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/msafd/sanflow.c b/dll/win32/mswsock/msafd/sanflow.c index 3e062e90d63..bd1ad2806dc 100644 --- a/dll/win32/mswsock/msafd/sanflow.c +++ b/dll/win32/mswsock/msafd/sanflow.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/msafd/sanlistn.c b/dll/win32/mswsock/msafd/sanlistn.c index 3e062e90d63..bd1ad2806dc 100644 --- a/dll/win32/mswsock/msafd/sanlistn.c +++ b/dll/win32/mswsock/msafd/sanlistn.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/msafd/sanprov.c b/dll/win32/mswsock/msafd/sanprov.c index ed15fb9f046..802bf6fe43e 100644 --- a/dll/win32/mswsock/msafd/sanprov.c +++ b/dll/win32/mswsock/msafd/sanprov.c @@ -58,183 +58,3 @@ SockSanInitialize(VOID) } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -HANDLE SockSanCleanUpCompleteEvent; -BOOLEAN SockSanEnabled; - -WSAPROTOCOL_INFOW SockTcpProviderInfo = -{ - XP1_GUARANTEED_DELIVERY | - XP1_GUARANTEED_ORDER | - XP1_GRACEFUL_CLOSE | - XP1_EXPEDITED_DATA | - XP1_IFS_HANDLES, - 0, - 0, - 0, - PFL_MATCHES_PROTOCOL_ZERO, - { - 0xe70f1aa0, - 0xab8b, - 0x11cf, - {0x8c, 0xa3, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92} - }, - 0, - { - BASE_PROTOCOL, - { 0, 0, 0, 0, 0, 0, 0 } - }, - 2, - AF_INET, - sizeof(SOCKADDR_IN), - sizeof(SOCKADDR_IN), - SOCK_STREAM, - IPPROTO_TCP, - 0, - BIGENDIAN, - SECURITY_PROTOCOL_NONE, - 0, - 0, - L"MSAFD Tcpip [TCP/IP]" -}; - -/* FUNCTIONS *****************************************************************/ - -VOID -WSPAPI -SockSanInitialize(VOID) -{ - -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -HANDLE SockSanCleanUpCompleteEvent; -BOOLEAN SockSanEnabled; - -WSAPROTOCOL_INFOW SockTcpProviderInfo = -{ - XP1_GUARANTEED_DELIVERY | - XP1_GUARANTEED_ORDER | - XP1_GRACEFUL_CLOSE | - XP1_EXPEDITED_DATA | - XP1_IFS_HANDLES, - 0, - 0, - 0, - PFL_MATCHES_PROTOCOL_ZERO, - { - 0xe70f1aa0, - 0xab8b, - 0x11cf, - {0x8c, 0xa3, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92} - }, - 0, - { - BASE_PROTOCOL, - { 0, 0, 0, 0, 0, 0, 0 } - }, - 2, - AF_INET, - sizeof(SOCKADDR_IN), - sizeof(SOCKADDR_IN), - SOCK_STREAM, - IPPROTO_TCP, - 0, - BIGENDIAN, - SECURITY_PROTOCOL_NONE, - 0, - 0, - L"MSAFD Tcpip [TCP/IP]" -}; - -/* FUNCTIONS *****************************************************************/ - -VOID -WSPAPI -SockSanInitialize(VOID) -{ - -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -HANDLE SockSanCleanUpCompleteEvent; -BOOLEAN SockSanEnabled; - -WSAPROTOCOL_INFOW SockTcpProviderInfo = -{ - XP1_GUARANTEED_DELIVERY | - XP1_GUARANTEED_ORDER | - XP1_GRACEFUL_CLOSE | - XP1_EXPEDITED_DATA | - XP1_IFS_HANDLES, - 0, - 0, - 0, - PFL_MATCHES_PROTOCOL_ZERO, - { - 0xe70f1aa0, - 0xab8b, - 0x11cf, - {0x8c, 0xa3, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92} - }, - 0, - { - BASE_PROTOCOL, - { 0, 0, 0, 0, 0, 0, 0 } - }, - 2, - AF_INET, - sizeof(SOCKADDR_IN), - sizeof(SOCKADDR_IN), - SOCK_STREAM, - IPPROTO_TCP, - 0, - BIGENDIAN, - SECURITY_PROTOCOL_NONE, - 0, - 0, - L"MSAFD Tcpip [TCP/IP]" -}; - -/* FUNCTIONS *****************************************************************/ - -VOID -WSPAPI -SockSanInitialize(VOID) -{ - -} - diff --git a/dll/win32/mswsock/msafd/sanrdma.c b/dll/win32/mswsock/msafd/sanrdma.c index 3e062e90d63..bd1ad2806dc 100644 --- a/dll/win32/mswsock/msafd/sanrdma.c +++ b/dll/win32/mswsock/msafd/sanrdma.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/msafd/sanrecv.c b/dll/win32/mswsock/msafd/sanrecv.c index 3e062e90d63..bd1ad2806dc 100644 --- a/dll/win32/mswsock/msafd/sanrecv.c +++ b/dll/win32/mswsock/msafd/sanrecv.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/msafd/sansend.c b/dll/win32/mswsock/msafd/sansend.c index 3e062e90d63..bd1ad2806dc 100644 --- a/dll/win32/mswsock/msafd/sansend.c +++ b/dll/win32/mswsock/msafd/sansend.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/msafd/sanshutd.c b/dll/win32/mswsock/msafd/sanshutd.c index 3e062e90d63..bd1ad2806dc 100644 --- a/dll/win32/mswsock/msafd/sanshutd.c +++ b/dll/win32/mswsock/msafd/sanshutd.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/msafd/sansock.c b/dll/win32/mswsock/msafd/sansock.c index 3e062e90d63..bd1ad2806dc 100644 --- a/dll/win32/mswsock/msafd/sansock.c +++ b/dll/win32/mswsock/msafd/sansock.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/msafd/santf.c b/dll/win32/mswsock/msafd/santf.c index 3e062e90d63..bd1ad2806dc 100644 --- a/dll/win32/mswsock/msafd/santf.c +++ b/dll/win32/mswsock/msafd/santf.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/msafd/sanutil.c b/dll/win32/mswsock/msafd/sanutil.c index 3e062e90d63..bd1ad2806dc 100644 --- a/dll/win32/mswsock/msafd/sanutil.c +++ b/dll/win32/mswsock/msafd/sanutil.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/msafd/select.c b/dll/win32/mswsock/msafd/select.c index 39f4d505c85..914ac6ec6ff 100644 --- a/dll/win32/mswsock/msafd/select.c +++ b/dll/win32/mswsock/msafd/select.c @@ -986,2967 +986,3 @@ error: return OutCount; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -#define MSAFD_CHECK_EVENT(e, s) \ - (!(s->SharedData.AsyncDisabledEvents & e) && \ - (s->SharedData.AsyncEvents & e)) - -#define HANDLES_IN_SET(s) \ - s == NULL ? 0 : (s->fd_count & 0xFFFF) - -/* DATA **********************************************************************/ - -HANDLE SockAsyncSelectHelperHandle; -BOOLEAN SockAsyncSelectCalled; - -/* FUNCTIONS *****************************************************************/ - -BOOLEAN -WSPAPI -SockCheckAndInitAsyncSelectHelper(VOID) -{ - UNICODE_STRING AfdHelper; - OBJECT_ATTRIBUTES ObjectAttributes; - IO_STATUS_BLOCK IoStatusBlock; - NTSTATUS Status; - FILE_COMPLETION_INFORMATION CompletionInfo; - OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleFlags; - - /* First, make sure we're not already intialized */ - if (SockAsyncSelectHelperHandle) return TRUE; - - /* Acquire the global lock */ - SockAcquireRwLockExclusive(&SocketGlobalLock); - - /* Check again, under the lock */ - if (SockAsyncSelectHelperHandle) - { - /* Return without lock */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - return TRUE; - } - - /* Set up Handle Name and Object */ - RtlInitUnicodeString(&AfdHelper, L"\\Device\\Afd\\AsyncSelectHlp" ); - InitializeObjectAttributes(&ObjectAttributes, - &AfdHelper, - OBJ_INHERIT | OBJ_CASE_INSENSITIVE, - NULL, - NULL); - - /* Open the Handle to AFD */ - Status = NtCreateFile(&SockAsyncSelectHelperHandle, - GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, - &ObjectAttributes, - &IoStatusBlock, - NULL, - 0, - FILE_SHARE_READ | FILE_SHARE_WRITE, - FILE_OPEN_IF, - 0, - NULL, - 0); - if (!NT_SUCCESS(Status)) - { - /* Return without lock */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - return TRUE; - } - - /* Check if the port exists, and if not, create it */ - if (SockAsyncQueuePort) SockCreateAsyncQueuePort(); - - /* - * Now Set up the Completion Port Information - * This means that whenever a Poll is finished, the routine will be executed - */ - CompletionInfo.Port = SockAsyncQueuePort; - CompletionInfo.Key = SockAsyncSelectCompletion; - Status = NtSetInformationFile(SockAsyncSelectHelperHandle, - &IoStatusBlock, - &CompletionInfo, - sizeof(CompletionInfo), - FileCompletionInformation); - - /* Protect the Handle */ - HandleFlags.ProtectFromClose = TRUE; - HandleFlags.Inherit = FALSE; - Status = NtSetInformationObject(SockAsyncQueuePort, - ObjectHandleFlagInformation, - &HandleFlags, - sizeof(HandleFlags)); - - /* - * Set this variable to true so that Send/Recv/Accept will know whether - * to renable disabled events - */ - SockAsyncSelectCalled = TRUE; - - /* Release lock and return */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - return TRUE; -} - -VOID -WSPAPI -SockAsyncSelectCompletion(PVOID Context, - PIO_STATUS_BLOCK IoStatusBlock) -{ - PASYNC_DATA AsyncData = Context; - PSOCKET_INFORMATION Socket = AsyncData->ParentSocket; - ULONG Events; - INT ErrorCode; - - /* Acquire the socket lock */ - EnterCriticalSection(&Socket->Lock); - - /* Check if the socket was closed or the I/O cancelled */ - if ((Socket->SharedData.State == SocketClosed) || - (IoStatusBlock->Status == STATUS_CANCELLED)) - { - /* Return */ - LeaveCriticalSection(&Socket->Lock); - goto error; - } - - /* Check if the Sequence Number Changed behind our back */ - if (AsyncData->SequenceNumber != Socket->SharedData.SequenceNumber) - { - /* Return */ - LeaveCriticalSection(&Socket->Lock); - goto error; - } - - /* Check we were manually called b/c of a failure */ - if (!NT_SUCCESS(IoStatusBlock->Status)) - { - /* Get the error and tell WPU about it */ - ErrorCode = NtStatusToSocketError(IoStatusBlock->Status); - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(0, ErrorCode)); - - /* Return */ - LeaveCriticalSection(&Socket->Lock); - goto error; - } - - /* Select the event bits */ - Events = AsyncData->AsyncSelectInfo.Handles[0].Events; - - /* Check for receive event */ - if (MSAFD_CHECK_EVENT(FD_READ, Socket) && (Events & AFD_EVENT_RECEIVE)) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_READ, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_READ; - } - - /* Check for oob receive event */ - if (MSAFD_CHECK_EVENT(FD_OOB, Socket) && (Events & AFD_EVENT_OOB_RECEIVE)) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_OOB, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_OOB; - } - - /* Check for write event */ - if (MSAFD_CHECK_EVENT(FD_WRITE, Socket) && (Events & AFD_EVENT_SEND)) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_WRITE, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_WRITE; - } - - /* Check for accept event */ - if (MSAFD_CHECK_EVENT(FD_ACCEPT, Socket) && (Events & AFD_EVENT_ACCEPT)) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_ACCEPT, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_ACCEPT; - } - - /* Check for close events */ - if (MSAFD_CHECK_EVENT(FD_CLOSE, Socket) && ((Events & AFD_EVENT_ACCEPT) || - (Events & AFD_EVENT_ABORT) || - (Events & AFD_EVENT_CLOSE))) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_CLOSE, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_CLOSE; - } - - /* Check for QOS event */ - if (MSAFD_CHECK_EVENT(FD_QOS, Socket) && (Events & AFD_EVENT_QOS)) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_QOS, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_QOS; - } - - /* Check for Group QOS event */ - if (MSAFD_CHECK_EVENT(FD_GROUP_QOS, Socket) && (Events & AFD_EVENT_GROUP_QOS)) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_GROUP_QOS, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_GROUP_QOS; - } - - /* Check for Routing Interface Change event */ - if (MSAFD_CHECK_EVENT(FD_ROUTING_INTERFACE_CHANGE, Socket) && - (Events & AFD_EVENT_ROUTING_INTERFACE_CHANGE)) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_ROUTING_INTERFACE_CHANGE, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_ROUTING_INTERFACE_CHANGE; - } - - /* Check for Address List Change event */ - if (MSAFD_CHECK_EVENT(FD_ADDRESS_LIST_CHANGE, Socket) && - (Events & AFD_EVENT_ADDRESS_LIST_CHANGE)) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_ADDRESS_LIST_CHANGE, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_ADDRESS_LIST_CHANGE; - } - - /* Check if there are any events left for us to check */ - if (!((Socket->SharedData.AsyncEvents) & - (~Socket->SharedData.AsyncDisabledEvents))) - { - /* Nothing left, release lock and return */ - LeaveCriticalSection(&Socket->Lock); - goto error; - } - - /* Keep Polling */ - SockProcessAsyncSelect(Socket, AsyncData); - - /* Leave lock and return */ - LeaveCriticalSection(&Socket->Lock); - return; - -error: - /* Dereference the socket and free the Async Data */ - SockDereferenceSocket(Socket); - RtlFreeHeap(SockPrivateHeap, 0, AsyncData); - - /* Dereference this thread and return */ - InterlockedDecrement(&SockAsyncThreadReferenceCount); - return; -} - -VOID -WSPAPI -SockProcessAsyncSelect(PSOCKET_INFORMATION Socket, - PASYNC_DATA AsyncData) -{ - ULONG lNetworkEvents; - NTSTATUS Status; - - /* Set up the Async Data Event Info */ - AsyncData->AsyncSelectInfo.Timeout.HighPart = 0x7FFFFFFF; - AsyncData->AsyncSelectInfo.Timeout.LowPart = 0xFFFFFFFF; - AsyncData->AsyncSelectInfo.HandleCount = 1; - AsyncData->AsyncSelectInfo.Exclusive = TRUE; - AsyncData->AsyncSelectInfo.Handles[0].Handle = (SOCKET)Socket->WshContext.Handle; - AsyncData->AsyncSelectInfo.Handles[0].Events = 0; - - /* Remove unwanted events */ - lNetworkEvents = Socket->SharedData.AsyncEvents & - (~Socket->SharedData.AsyncDisabledEvents); - - /* Set Events to wait for */ - if (lNetworkEvents & FD_READ) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_RECEIVE; - } - if (lNetworkEvents & FD_WRITE) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_SEND; - } - if (lNetworkEvents & FD_OOB) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_OOB_RECEIVE; - } - if (lNetworkEvents & FD_ACCEPT) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_ACCEPT; - } - if (lNetworkEvents & FD_CLOSE) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_DISCONNECT | - AFD_EVENT_ABORT | - AFD_EVENT_CLOSE; - } - if (lNetworkEvents & FD_QOS) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_QOS; - } - if (lNetworkEvents & FD_GROUP_QOS) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_GROUP_QOS; - } - if (lNetworkEvents & FD_ROUTING_INTERFACE_CHANGE) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_ROUTING_INTERFACE_CHANGE; - } - if (lNetworkEvents & FD_ADDRESS_LIST_CHANGE) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_ADDRESS_LIST_CHANGE; - } - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(SockAsyncSelectHelperHandle, - NULL, - NULL, - AsyncData, - &AsyncData->IoStatusBlock, - IOCTL_AFD_SELECT, - &AsyncData->AsyncSelectInfo, - sizeof(AsyncData->AsyncSelectInfo), - &AsyncData->AsyncSelectInfo, - sizeof(AsyncData->AsyncSelectInfo)); - /* Check for failure */ - if (NT_ERROR(Status)) - { - /* I/O Manager Won't call the completion routine; do it manually */ - AsyncData->IoStatusBlock.Status = Status; - SockAsyncSelectCompletion(AsyncData, &AsyncData->IoStatusBlock); - } -} - -VOID -WSPAPI -SockProcessQueuedAsyncSelect(PVOID Context, - PIO_STATUS_BLOCK IoStatusBlock) -{ - PASYNC_DATA AsyncData = Context; - PSOCKET_INFORMATION Socket = AsyncData->ParentSocket; - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Make sure it's not closed */ - if (Socket->SharedData.State == SocketClosed) - { - /* Return */ - LeaveCriticalSection(&Socket->Lock); - goto error; - } - - /* Check if the Sequence Number changed by now */ - if (AsyncData->SequenceNumber != Socket->SharedData.SequenceNumber) - { - /* Return */ - LeaveCriticalSection(&Socket->Lock); - goto error; - } - - /* Check if select is needed */ - if (!((Socket->SharedData.AsyncEvents & - ~Socket->SharedData.AsyncDisabledEvents))) - { - /* Return */ - LeaveCriticalSection(&Socket->Lock); - goto error; - } - - /* Do the actual select */ - SockProcessAsyncSelect(Socket, AsyncData); - - /* Return */ - LeaveCriticalSection(&Socket->Lock); - return; - -error: - /* Dereference the socket and free the async data */ - SockDereferenceSocket(Socket); - RtlFreeHeap(SockPrivateHeap, 0, AsyncData); - - /* Dereference this thread */ - InterlockedDecrement(&SockAsyncThreadReferenceCount); -} - -INT -WSPAPI -SockReenableAsyncSelectEvent(IN PSOCKET_INFORMATION Socket, - IN ULONG Event) -{ - PASYNC_DATA AsyncData; - NTSTATUS Status; - - /* Make sure the event is actually disabled */ - if (!(Socket->SharedData.AsyncDisabledEvents & Event)) return NO_ERROR; - - /* Make sure we're not closed */ - if (Socket->SharedData.State == SocketClosed) return NO_ERROR; - - /* Re-enable it */ - Socket->SharedData.AsyncDisabledEvents &= ~Event; - - /* Return if no more events are being polled */ - if (!((Socket->SharedData.AsyncEvents & - ~Socket->SharedData.AsyncDisabledEvents))) - { - return NO_ERROR; - } - - /* Allocate Async Data */ - AsyncData = SockAllocateHeapRoutine(SockPrivateHeap, 0, sizeof(ASYNC_DATA)); - - /* Increase the sequence number to stop anything else */ - Socket->SharedData.SequenceNumber++; - - /* Set up the Async Data */ - AsyncData->ParentSocket = Socket; - AsyncData->SequenceNumber = Socket->SharedData.SequenceNumber; - - /* Begin Async Select by using I/O Completion */ - Status = NtSetIoCompletion(SockAsyncQueuePort, - (PVOID)&SockProcessQueuedAsyncSelect, - AsyncData, - 0, - 0); - if (!NT_SUCCESS(Status)) - { - /* Dereference the socket and fail */ - SockDereferenceSocket(Socket); - RtlFreeHeap(SockPrivateHeap, 0, AsyncData); - return NtStatusToSocketError(Status); - } - - /* All done */ - return NO_ERROR; -} - -INT -WSPAPI -SockAsyncSelectHelper(IN PSOCKET_INFORMATION Socket, - IN HWND hWnd, - IN UINT wMsg, - IN LONG lEvent) -{ - PASYNC_DATA AsyncData = NULL; - BOOLEAN BlockMode; - NTSTATUS Status; - INT ErrorCode; - - /* Allocate the Async Data Structure to pass on to the Thread later */ - AsyncData = SockAllocateHeapRoutine(SockPrivateHeap, 0, sizeof(*AsyncData)); - if (!AsyncData) return WSAENOBUFS; - - /* Acquire socket lock */ - EnterCriticalSection(&Socket->Lock); - - /* Is there an active WSPEventSelect? */ - if (Socket->SharedData.AsyncEvents) - { - /* Call the helper to process it */ - ErrorCode = SockEventSelectHelper(Socket, NULL, 0); - if (ErrorCode != NO_ERROR) goto error; - } - - /* Set Socket to Non-Blocking */ - BlockMode = TRUE; - ErrorCode = SockSetInformation(Socket, - AFD_INFO_BLOCKING_MODE, - &BlockMode, - NULL, - NULL); - if (ErrorCode != NO_ERROR) goto error; - - /* AFD was notified, set it locally as well */ - Socket->SharedData.NonBlocking = TRUE; - - /* Store Socket Data */ - Socket->SharedData.hWnd = hWnd; - Socket->SharedData.wMsg = wMsg; - Socket->SharedData.AsyncEvents = lEvent; - Socket->SharedData.AsyncDisabledEvents = 0; - - /* Check if the socket is not connected and not a datagram socket */ - if ((!SockIsSocketConnected(Socket)) && !MSAFD_IS_DGRAM_SOCK(Socket)) - { - /* Disable FD_WRITE for now, so we don't get it before FD_CONNECT */ - Socket->SharedData.AsyncDisabledEvents |= FD_WRITE; - } - - /* Increase the sequence number */ - Socket->SharedData.SequenceNumber++; - - /* Return if there are no more Events */ - if (!(Socket->SharedData.AsyncEvents & - (~Socket->SharedData.AsyncDisabledEvents))) - { - /* Release the lock, dereference the async thread and the socket */ - LeaveCriticalSection(&Socket->Lock); - InterlockedDecrement(&SockAsyncThreadReferenceCount); - SockDereferenceSocket(Socket); - - /* Free the Async Data */ - RtlFreeHeap(SockPrivateHeap, 0, AsyncData); - return NO_ERROR; - } - - /* Set up the Async Data */ - AsyncData->ParentSocket = Socket; - AsyncData->SequenceNumber = Socket->SharedData.SequenceNumber; - - /* Release the lock now */ - LeaveCriticalSection(&Socket->Lock); - - /* Begin Async Select by using I/O Completion */ - Status = NtSetIoCompletion(SockAsyncQueuePort, - (PVOID)&SockProcessQueuedAsyncSelect, - AsyncData, - 0, - 0); - if (!NT_SUCCESS(Status)) - { - /* Dereference the async thread and fail */ - InterlockedDecrement(&SockAsyncThreadReferenceCount); - ErrorCode = NtStatusToSocketError(Status); - } - -error: - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Free the async data */ - RtlFreeHeap(SockPrivateHeap, 0, AsyncData); - - /* Fail */ - return SOCKET_ERROR; - } - - /* Increment the socket reference */ - InterlockedIncrement(&Socket->RefCount); - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -WSPAsyncSelect(IN SOCKET Handle, - IN HWND hWnd, - IN UINT wMsg, - IN LONG lEvent, - OUT LPINT lpErrno) -{ - PSOCKET_INFORMATION Socket; - INT ErrorCode; - PWINSOCK_TEB_DATA ThreadData; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Check for valid events */ - if (lEvent & ~FD_ALL_EVENTS) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Check for valid window handle */ - if (!IsWindow(hWnd)) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Create the Asynch Thread if Needed */ - if (!SockCheckAndReferenceAsyncThread()) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - - /* Open a Handle to AFD's Async Helper */ - if (!SockCheckAndInitAsyncSelectHelper()) - { - /* Dereference async thread and fail */ - InterlockedDecrement(&SockAsyncThreadReferenceCount); - ErrorCode = WSAENOBUFS; - goto error; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Call the helper to do the work */ - ErrorCode = SockAsyncSelectHelper(Socket, - hWnd, - wMsg, - lEvent); - - /* Dereference the socket */ - SockDereferenceSocket(Socket); - -error: - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -WSPSelect(INT nfds, - PFD_SET readfds, - PFD_SET writefds, - PFD_SET exceptfds, - CONST LPTIMEVAL timeout, - LPINT lpErrno) -{ - IO_STATUS_BLOCK IoStatusBlock; - PAFD_POLL_INFO PollInfo = NULL; - NTSTATUS Status; - CHAR PollBuffer[sizeof(AFD_POLL_INFO) + 3 * sizeof(AFD_HANDLE)]; - PAFD_HANDLE HandleArray; - ULONG HandleCount, OutCount = 0; - ULONG PollBufferSize; - ULONG i; - PWINSOCK_TEB_DATA ThreadData; - LARGE_INTEGER uSec; - ULONG BlockType; - INT ErrorCode; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* How many sockets will we check? */ - HandleCount = HANDLES_IN_SET(readfds) + - HANDLES_IN_SET(writefds) + - HANDLES_IN_SET(exceptfds); - - /* Leave if none are */ - if (!HandleCount) return NO_ERROR; - - /* How much space will they require? */ - PollBufferSize = sizeof(*PollInfo) + (HandleCount * sizeof(AFD_HANDLE)); - - /* Check if our stack is big enough to hold it */ - if (PollBufferSize <= sizeof(PollBuffer)) - { - /* Use the stack */ - PollInfo = (PVOID)PollBuffer; - } - else - { - /* Allocate from heap instead */ - PollInfo = SockAllocateHeapRoutine(SockPrivateHeap, 0, PollBufferSize); - if (!PollInfo) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - } - - /* Number of handles for AFD to Check */ - PollInfo->HandleCount = HandleCount; - PollInfo->Exclusive = FALSE; - HandleArray = PollInfo->Handles; - - /* Select the Read Events */ - for (i = 0; readfds && i < (readfds->fd_count & 0xFFFF); i++) - { - /* Fill out handle info */ - HandleArray->Handle = (SOCKET)readfds->fd_array[i]; - HandleArray->Events = AFD_EVENT_RECEIVE | - AFD_EVENT_DISCONNECT | - AFD_EVENT_ABORT; - - /* Move to the next one */ - HandleArray++; - } - for (i = 0; writefds && i < (writefds->fd_count & 0xFFFF); i++) - { - /* Fill out handle info */ - HandleArray->Handle = (SOCKET)writefds->fd_array[i]; - HandleArray->Events = AFD_EVENT_SEND; - - /* Move to the next one */ - HandleArray++; - } - for (i = 0; exceptfds && i < (exceptfds->fd_count & 0xFFFF); i++) - { - /* Fill out handle info */ - HandleArray->Handle = (SOCKET)exceptfds->fd_array[i]; - HandleArray->Events = AFD_EVENT_OOB_RECEIVE | AFD_EVENT_CONNECT_FAIL; - - /* Move to the next one */ - HandleArray++; - } - - /* Check if a timeout was given */ - if (timeout) - { - /* Inifinte Timeout */ - PollInfo->Timeout.u.LowPart = -1; - PollInfo->Timeout.u.HighPart = 0x7FFFFFFF; - } - else - { - /* Calculate microseconds */ - uSec = RtlEnlargedIntegerMultiply(timeout->tv_usec, -10); - - /* Calculate seconds */ - PollInfo->Timeout = RtlEnlargedIntegerMultiply(timeout->tv_sec, - -1 * 1000 * 1000 * 10); - - /* Add microseconds */ - PollInfo->Timeout.QuadPart += uSec.QuadPart; - } - - /* Send IOCTL */ - Status = NtDeviceIoControlFile((HANDLE)PollInfo->Handles[0].Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_SELECT, - PollInfo, - PollBufferSize, - PollInfo, - PollBufferSize); - - /* Check if we have to wait */ - if (Status == STATUS_PENDING) - { - /* Check if we'll call the blocking hook */ - if (!PollInfo->Timeout.QuadPart) BlockType = NO_BLOCKING_HOOK; - - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - (SOCKET)PollInfo->Handles[0].Handle, - BlockType, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for failure */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Clear the Structures */ - if(readfds) FD_ZERO(readfds); - if(writefds) FD_ZERO(writefds); - if(exceptfds) FD_ZERO(exceptfds); - - /* Get the handle info again */ - HandleCount = PollInfo->HandleCount; - HandleArray = PollInfo->Handles; - - /* Loop the Handles that got an event */ - for (i = 0; i < HandleCount; i++) - { - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_RECEIVE) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, readfds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, readfds); - } - } - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_SEND) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, writefds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, writefds); - } - } - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_OOB_RECEIVE) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, exceptfds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, exceptfds); - } - } - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_ACCEPT) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, readfds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, readfds); - } - } - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_CONNECT) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, writefds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, writefds); - } - } - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_CONNECT_FAIL) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, exceptfds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, exceptfds); - } - } - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_DISCONNECT) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, readfds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, readfds); - } - } - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_ABORT) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, readfds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, readfds); - } - } - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_CLOSE) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, readfds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, readfds); - } - } - - /* Move to next entry */ - HandleArray++; - } - -error: - - /* Check if we should free the buffer */ - if (PollInfo && (PollInfo != (PVOID)PollBuffer)) - { - /* Free it from the heap */ - RtlFreeHeap(SockPrivateHeap, 0, PollInfo); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Return error */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return the number of handles */ - return OutCount; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -#define MSAFD_CHECK_EVENT(e, s) \ - (!(s->SharedData.AsyncDisabledEvents & e) && \ - (s->SharedData.AsyncEvents & e)) - -#define HANDLES_IN_SET(s) \ - s == NULL ? 0 : (s->fd_count & 0xFFFF) - -/* DATA **********************************************************************/ - -HANDLE SockAsyncSelectHelperHandle; -BOOLEAN SockAsyncSelectCalled; - -/* FUNCTIONS *****************************************************************/ - -BOOLEAN -WSPAPI -SockCheckAndInitAsyncSelectHelper(VOID) -{ - UNICODE_STRING AfdHelper; - OBJECT_ATTRIBUTES ObjectAttributes; - IO_STATUS_BLOCK IoStatusBlock; - NTSTATUS Status; - FILE_COMPLETION_INFORMATION CompletionInfo; - OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleFlags; - - /* First, make sure we're not already intialized */ - if (SockAsyncSelectHelperHandle) return TRUE; - - /* Acquire the global lock */ - SockAcquireRwLockExclusive(&SocketGlobalLock); - - /* Check again, under the lock */ - if (SockAsyncSelectHelperHandle) - { - /* Return without lock */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - return TRUE; - } - - /* Set up Handle Name and Object */ - RtlInitUnicodeString(&AfdHelper, L"\\Device\\Afd\\AsyncSelectHlp" ); - InitializeObjectAttributes(&ObjectAttributes, - &AfdHelper, - OBJ_INHERIT | OBJ_CASE_INSENSITIVE, - NULL, - NULL); - - /* Open the Handle to AFD */ - Status = NtCreateFile(&SockAsyncSelectHelperHandle, - GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, - &ObjectAttributes, - &IoStatusBlock, - NULL, - 0, - FILE_SHARE_READ | FILE_SHARE_WRITE, - FILE_OPEN_IF, - 0, - NULL, - 0); - if (!NT_SUCCESS(Status)) - { - /* Return without lock */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - return TRUE; - } - - /* Check if the port exists, and if not, create it */ - if (SockAsyncQueuePort) SockCreateAsyncQueuePort(); - - /* - * Now Set up the Completion Port Information - * This means that whenever a Poll is finished, the routine will be executed - */ - CompletionInfo.Port = SockAsyncQueuePort; - CompletionInfo.Key = SockAsyncSelectCompletion; - Status = NtSetInformationFile(SockAsyncSelectHelperHandle, - &IoStatusBlock, - &CompletionInfo, - sizeof(CompletionInfo), - FileCompletionInformation); - - /* Protect the Handle */ - HandleFlags.ProtectFromClose = TRUE; - HandleFlags.Inherit = FALSE; - Status = NtSetInformationObject(SockAsyncQueuePort, - ObjectHandleFlagInformation, - &HandleFlags, - sizeof(HandleFlags)); - - /* - * Set this variable to true so that Send/Recv/Accept will know whether - * to renable disabled events - */ - SockAsyncSelectCalled = TRUE; - - /* Release lock and return */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - return TRUE; -} - -VOID -WSPAPI -SockAsyncSelectCompletion(PVOID Context, - PIO_STATUS_BLOCK IoStatusBlock) -{ - PASYNC_DATA AsyncData = Context; - PSOCKET_INFORMATION Socket = AsyncData->ParentSocket; - ULONG Events; - INT ErrorCode; - - /* Acquire the socket lock */ - EnterCriticalSection(&Socket->Lock); - - /* Check if the socket was closed or the I/O cancelled */ - if ((Socket->SharedData.State == SocketClosed) || - (IoStatusBlock->Status == STATUS_CANCELLED)) - { - /* Return */ - LeaveCriticalSection(&Socket->Lock); - goto error; - } - - /* Check if the Sequence Number Changed behind our back */ - if (AsyncData->SequenceNumber != Socket->SharedData.SequenceNumber) - { - /* Return */ - LeaveCriticalSection(&Socket->Lock); - goto error; - } - - /* Check we were manually called b/c of a failure */ - if (!NT_SUCCESS(IoStatusBlock->Status)) - { - /* Get the error and tell WPU about it */ - ErrorCode = NtStatusToSocketError(IoStatusBlock->Status); - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(0, ErrorCode)); - - /* Return */ - LeaveCriticalSection(&Socket->Lock); - goto error; - } - - /* Select the event bits */ - Events = AsyncData->AsyncSelectInfo.Handles[0].Events; - - /* Check for receive event */ - if (MSAFD_CHECK_EVENT(FD_READ, Socket) && (Events & AFD_EVENT_RECEIVE)) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_READ, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_READ; - } - - /* Check for oob receive event */ - if (MSAFD_CHECK_EVENT(FD_OOB, Socket) && (Events & AFD_EVENT_OOB_RECEIVE)) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_OOB, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_OOB; - } - - /* Check for write event */ - if (MSAFD_CHECK_EVENT(FD_WRITE, Socket) && (Events & AFD_EVENT_SEND)) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_WRITE, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_WRITE; - } - - /* Check for accept event */ - if (MSAFD_CHECK_EVENT(FD_ACCEPT, Socket) && (Events & AFD_EVENT_ACCEPT)) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_ACCEPT, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_ACCEPT; - } - - /* Check for close events */ - if (MSAFD_CHECK_EVENT(FD_CLOSE, Socket) && ((Events & AFD_EVENT_ACCEPT) || - (Events & AFD_EVENT_ABORT) || - (Events & AFD_EVENT_CLOSE))) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_CLOSE, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_CLOSE; - } - - /* Check for QOS event */ - if (MSAFD_CHECK_EVENT(FD_QOS, Socket) && (Events & AFD_EVENT_QOS)) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_QOS, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_QOS; - } - - /* Check for Group QOS event */ - if (MSAFD_CHECK_EVENT(FD_GROUP_QOS, Socket) && (Events & AFD_EVENT_GROUP_QOS)) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_GROUP_QOS, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_GROUP_QOS; - } - - /* Check for Routing Interface Change event */ - if (MSAFD_CHECK_EVENT(FD_ROUTING_INTERFACE_CHANGE, Socket) && - (Events & AFD_EVENT_ROUTING_INTERFACE_CHANGE)) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_ROUTING_INTERFACE_CHANGE, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_ROUTING_INTERFACE_CHANGE; - } - - /* Check for Address List Change event */ - if (MSAFD_CHECK_EVENT(FD_ADDRESS_LIST_CHANGE, Socket) && - (Events & AFD_EVENT_ADDRESS_LIST_CHANGE)) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_ADDRESS_LIST_CHANGE, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_ADDRESS_LIST_CHANGE; - } - - /* Check if there are any events left for us to check */ - if (!((Socket->SharedData.AsyncEvents) & - (~Socket->SharedData.AsyncDisabledEvents))) - { - /* Nothing left, release lock and return */ - LeaveCriticalSection(&Socket->Lock); - goto error; - } - - /* Keep Polling */ - SockProcessAsyncSelect(Socket, AsyncData); - - /* Leave lock and return */ - LeaveCriticalSection(&Socket->Lock); - return; - -error: - /* Dereference the socket and free the Async Data */ - SockDereferenceSocket(Socket); - RtlFreeHeap(SockPrivateHeap, 0, AsyncData); - - /* Dereference this thread and return */ - InterlockedDecrement(&SockAsyncThreadReferenceCount); - return; -} - -VOID -WSPAPI -SockProcessAsyncSelect(PSOCKET_INFORMATION Socket, - PASYNC_DATA AsyncData) -{ - ULONG lNetworkEvents; - NTSTATUS Status; - - /* Set up the Async Data Event Info */ - AsyncData->AsyncSelectInfo.Timeout.HighPart = 0x7FFFFFFF; - AsyncData->AsyncSelectInfo.Timeout.LowPart = 0xFFFFFFFF; - AsyncData->AsyncSelectInfo.HandleCount = 1; - AsyncData->AsyncSelectInfo.Exclusive = TRUE; - AsyncData->AsyncSelectInfo.Handles[0].Handle = (SOCKET)Socket->WshContext.Handle; - AsyncData->AsyncSelectInfo.Handles[0].Events = 0; - - /* Remove unwanted events */ - lNetworkEvents = Socket->SharedData.AsyncEvents & - (~Socket->SharedData.AsyncDisabledEvents); - - /* Set Events to wait for */ - if (lNetworkEvents & FD_READ) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_RECEIVE; - } - if (lNetworkEvents & FD_WRITE) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_SEND; - } - if (lNetworkEvents & FD_OOB) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_OOB_RECEIVE; - } - if (lNetworkEvents & FD_ACCEPT) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_ACCEPT; - } - if (lNetworkEvents & FD_CLOSE) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_DISCONNECT | - AFD_EVENT_ABORT | - AFD_EVENT_CLOSE; - } - if (lNetworkEvents & FD_QOS) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_QOS; - } - if (lNetworkEvents & FD_GROUP_QOS) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_GROUP_QOS; - } - if (lNetworkEvents & FD_ROUTING_INTERFACE_CHANGE) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_ROUTING_INTERFACE_CHANGE; - } - if (lNetworkEvents & FD_ADDRESS_LIST_CHANGE) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_ADDRESS_LIST_CHANGE; - } - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(SockAsyncSelectHelperHandle, - NULL, - NULL, - AsyncData, - &AsyncData->IoStatusBlock, - IOCTL_AFD_SELECT, - &AsyncData->AsyncSelectInfo, - sizeof(AsyncData->AsyncSelectInfo), - &AsyncData->AsyncSelectInfo, - sizeof(AsyncData->AsyncSelectInfo)); - /* Check for failure */ - if (NT_ERROR(Status)) - { - /* I/O Manager Won't call the completion routine; do it manually */ - AsyncData->IoStatusBlock.Status = Status; - SockAsyncSelectCompletion(AsyncData, &AsyncData->IoStatusBlock); - } -} - -VOID -WSPAPI -SockProcessQueuedAsyncSelect(PVOID Context, - PIO_STATUS_BLOCK IoStatusBlock) -{ - PASYNC_DATA AsyncData = Context; - PSOCKET_INFORMATION Socket = AsyncData->ParentSocket; - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Make sure it's not closed */ - if (Socket->SharedData.State == SocketClosed) - { - /* Return */ - LeaveCriticalSection(&Socket->Lock); - goto error; - } - - /* Check if the Sequence Number changed by now */ - if (AsyncData->SequenceNumber != Socket->SharedData.SequenceNumber) - { - /* Return */ - LeaveCriticalSection(&Socket->Lock); - goto error; - } - - /* Check if select is needed */ - if (!((Socket->SharedData.AsyncEvents & - ~Socket->SharedData.AsyncDisabledEvents))) - { - /* Return */ - LeaveCriticalSection(&Socket->Lock); - goto error; - } - - /* Do the actual select */ - SockProcessAsyncSelect(Socket, AsyncData); - - /* Return */ - LeaveCriticalSection(&Socket->Lock); - return; - -error: - /* Dereference the socket and free the async data */ - SockDereferenceSocket(Socket); - RtlFreeHeap(SockPrivateHeap, 0, AsyncData); - - /* Dereference this thread */ - InterlockedDecrement(&SockAsyncThreadReferenceCount); -} - -INT -WSPAPI -SockReenableAsyncSelectEvent(IN PSOCKET_INFORMATION Socket, - IN ULONG Event) -{ - PASYNC_DATA AsyncData; - NTSTATUS Status; - - /* Make sure the event is actually disabled */ - if (!(Socket->SharedData.AsyncDisabledEvents & Event)) return NO_ERROR; - - /* Make sure we're not closed */ - if (Socket->SharedData.State == SocketClosed) return NO_ERROR; - - /* Re-enable it */ - Socket->SharedData.AsyncDisabledEvents &= ~Event; - - /* Return if no more events are being polled */ - if (!((Socket->SharedData.AsyncEvents & - ~Socket->SharedData.AsyncDisabledEvents))) - { - return NO_ERROR; - } - - /* Allocate Async Data */ - AsyncData = SockAllocateHeapRoutine(SockPrivateHeap, 0, sizeof(ASYNC_DATA)); - - /* Increase the sequence number to stop anything else */ - Socket->SharedData.SequenceNumber++; - - /* Set up the Async Data */ - AsyncData->ParentSocket = Socket; - AsyncData->SequenceNumber = Socket->SharedData.SequenceNumber; - - /* Begin Async Select by using I/O Completion */ - Status = NtSetIoCompletion(SockAsyncQueuePort, - (PVOID)&SockProcessQueuedAsyncSelect, - AsyncData, - 0, - 0); - if (!NT_SUCCESS(Status)) - { - /* Dereference the socket and fail */ - SockDereferenceSocket(Socket); - RtlFreeHeap(SockPrivateHeap, 0, AsyncData); - return NtStatusToSocketError(Status); - } - - /* All done */ - return NO_ERROR; -} - -INT -WSPAPI -SockAsyncSelectHelper(IN PSOCKET_INFORMATION Socket, - IN HWND hWnd, - IN UINT wMsg, - IN LONG lEvent) -{ - PASYNC_DATA AsyncData = NULL; - BOOLEAN BlockMode; - NTSTATUS Status; - INT ErrorCode; - - /* Allocate the Async Data Structure to pass on to the Thread later */ - AsyncData = SockAllocateHeapRoutine(SockPrivateHeap, 0, sizeof(*AsyncData)); - if (!AsyncData) return WSAENOBUFS; - - /* Acquire socket lock */ - EnterCriticalSection(&Socket->Lock); - - /* Is there an active WSPEventSelect? */ - if (Socket->SharedData.AsyncEvents) - { - /* Call the helper to process it */ - ErrorCode = SockEventSelectHelper(Socket, NULL, 0); - if (ErrorCode != NO_ERROR) goto error; - } - - /* Set Socket to Non-Blocking */ - BlockMode = TRUE; - ErrorCode = SockSetInformation(Socket, - AFD_INFO_BLOCKING_MODE, - &BlockMode, - NULL, - NULL); - if (ErrorCode != NO_ERROR) goto error; - - /* AFD was notified, set it locally as well */ - Socket->SharedData.NonBlocking = TRUE; - - /* Store Socket Data */ - Socket->SharedData.hWnd = hWnd; - Socket->SharedData.wMsg = wMsg; - Socket->SharedData.AsyncEvents = lEvent; - Socket->SharedData.AsyncDisabledEvents = 0; - - /* Check if the socket is not connected and not a datagram socket */ - if ((!SockIsSocketConnected(Socket)) && !MSAFD_IS_DGRAM_SOCK(Socket)) - { - /* Disable FD_WRITE for now, so we don't get it before FD_CONNECT */ - Socket->SharedData.AsyncDisabledEvents |= FD_WRITE; - } - - /* Increase the sequence number */ - Socket->SharedData.SequenceNumber++; - - /* Return if there are no more Events */ - if (!(Socket->SharedData.AsyncEvents & - (~Socket->SharedData.AsyncDisabledEvents))) - { - /* Release the lock, dereference the async thread and the socket */ - LeaveCriticalSection(&Socket->Lock); - InterlockedDecrement(&SockAsyncThreadReferenceCount); - SockDereferenceSocket(Socket); - - /* Free the Async Data */ - RtlFreeHeap(SockPrivateHeap, 0, AsyncData); - return NO_ERROR; - } - - /* Set up the Async Data */ - AsyncData->ParentSocket = Socket; - AsyncData->SequenceNumber = Socket->SharedData.SequenceNumber; - - /* Release the lock now */ - LeaveCriticalSection(&Socket->Lock); - - /* Begin Async Select by using I/O Completion */ - Status = NtSetIoCompletion(SockAsyncQueuePort, - (PVOID)&SockProcessQueuedAsyncSelect, - AsyncData, - 0, - 0); - if (!NT_SUCCESS(Status)) - { - /* Dereference the async thread and fail */ - InterlockedDecrement(&SockAsyncThreadReferenceCount); - ErrorCode = NtStatusToSocketError(Status); - } - -error: - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Free the async data */ - RtlFreeHeap(SockPrivateHeap, 0, AsyncData); - - /* Fail */ - return SOCKET_ERROR; - } - - /* Increment the socket reference */ - InterlockedIncrement(&Socket->RefCount); - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -WSPAsyncSelect(IN SOCKET Handle, - IN HWND hWnd, - IN UINT wMsg, - IN LONG lEvent, - OUT LPINT lpErrno) -{ - PSOCKET_INFORMATION Socket; - INT ErrorCode; - PWINSOCK_TEB_DATA ThreadData; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Check for valid events */ - if (lEvent & ~FD_ALL_EVENTS) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Check for valid window handle */ - if (!IsWindow(hWnd)) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Create the Asynch Thread if Needed */ - if (!SockCheckAndReferenceAsyncThread()) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - - /* Open a Handle to AFD's Async Helper */ - if (!SockCheckAndInitAsyncSelectHelper()) - { - /* Dereference async thread and fail */ - InterlockedDecrement(&SockAsyncThreadReferenceCount); - ErrorCode = WSAENOBUFS; - goto error; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Call the helper to do the work */ - ErrorCode = SockAsyncSelectHelper(Socket, - hWnd, - wMsg, - lEvent); - - /* Dereference the socket */ - SockDereferenceSocket(Socket); - -error: - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -WSPSelect(INT nfds, - PFD_SET readfds, - PFD_SET writefds, - PFD_SET exceptfds, - CONST LPTIMEVAL timeout, - LPINT lpErrno) -{ - IO_STATUS_BLOCK IoStatusBlock; - PAFD_POLL_INFO PollInfo = NULL; - NTSTATUS Status; - CHAR PollBuffer[sizeof(AFD_POLL_INFO) + 3 * sizeof(AFD_HANDLE)]; - PAFD_HANDLE HandleArray; - ULONG HandleCount, OutCount = 0; - ULONG PollBufferSize; - ULONG i; - PWINSOCK_TEB_DATA ThreadData; - LARGE_INTEGER uSec; - ULONG BlockType; - INT ErrorCode; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* How many sockets will we check? */ - HandleCount = HANDLES_IN_SET(readfds) + - HANDLES_IN_SET(writefds) + - HANDLES_IN_SET(exceptfds); - - /* Leave if none are */ - if (!HandleCount) return NO_ERROR; - - /* How much space will they require? */ - PollBufferSize = sizeof(*PollInfo) + (HandleCount * sizeof(AFD_HANDLE)); - - /* Check if our stack is big enough to hold it */ - if (PollBufferSize <= sizeof(PollBuffer)) - { - /* Use the stack */ - PollInfo = (PVOID)PollBuffer; - } - else - { - /* Allocate from heap instead */ - PollInfo = SockAllocateHeapRoutine(SockPrivateHeap, 0, PollBufferSize); - if (!PollInfo) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - } - - /* Number of handles for AFD to Check */ - PollInfo->HandleCount = HandleCount; - PollInfo->Exclusive = FALSE; - HandleArray = PollInfo->Handles; - - /* Select the Read Events */ - for (i = 0; readfds && i < (readfds->fd_count & 0xFFFF); i++) - { - /* Fill out handle info */ - HandleArray->Handle = (SOCKET)readfds->fd_array[i]; - HandleArray->Events = AFD_EVENT_RECEIVE | - AFD_EVENT_DISCONNECT | - AFD_EVENT_ABORT; - - /* Move to the next one */ - HandleArray++; - } - for (i = 0; writefds && i < (writefds->fd_count & 0xFFFF); i++) - { - /* Fill out handle info */ - HandleArray->Handle = (SOCKET)writefds->fd_array[i]; - HandleArray->Events = AFD_EVENT_SEND; - - /* Move to the next one */ - HandleArray++; - } - for (i = 0; exceptfds && i < (exceptfds->fd_count & 0xFFFF); i++) - { - /* Fill out handle info */ - HandleArray->Handle = (SOCKET)exceptfds->fd_array[i]; - HandleArray->Events = AFD_EVENT_OOB_RECEIVE | AFD_EVENT_CONNECT_FAIL; - - /* Move to the next one */ - HandleArray++; - } - - /* Check if a timeout was given */ - if (timeout) - { - /* Inifinte Timeout */ - PollInfo->Timeout.u.LowPart = -1; - PollInfo->Timeout.u.HighPart = 0x7FFFFFFF; - } - else - { - /* Calculate microseconds */ - uSec = RtlEnlargedIntegerMultiply(timeout->tv_usec, -10); - - /* Calculate seconds */ - PollInfo->Timeout = RtlEnlargedIntegerMultiply(timeout->tv_sec, - -1 * 1000 * 1000 * 10); - - /* Add microseconds */ - PollInfo->Timeout.QuadPart += uSec.QuadPart; - } - - /* Send IOCTL */ - Status = NtDeviceIoControlFile((HANDLE)PollInfo->Handles[0].Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_SELECT, - PollInfo, - PollBufferSize, - PollInfo, - PollBufferSize); - - /* Check if we have to wait */ - if (Status == STATUS_PENDING) - { - /* Check if we'll call the blocking hook */ - if (!PollInfo->Timeout.QuadPart) BlockType = NO_BLOCKING_HOOK; - - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - (SOCKET)PollInfo->Handles[0].Handle, - BlockType, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for failure */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Clear the Structures */ - if(readfds) FD_ZERO(readfds); - if(writefds) FD_ZERO(writefds); - if(exceptfds) FD_ZERO(exceptfds); - - /* Get the handle info again */ - HandleCount = PollInfo->HandleCount; - HandleArray = PollInfo->Handles; - - /* Loop the Handles that got an event */ - for (i = 0; i < HandleCount; i++) - { - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_RECEIVE) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, readfds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, readfds); - } - } - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_SEND) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, writefds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, writefds); - } - } - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_OOB_RECEIVE) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, exceptfds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, exceptfds); - } - } - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_ACCEPT) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, readfds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, readfds); - } - } - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_CONNECT) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, writefds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, writefds); - } - } - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_CONNECT_FAIL) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, exceptfds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, exceptfds); - } - } - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_DISCONNECT) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, readfds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, readfds); - } - } - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_ABORT) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, readfds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, readfds); - } - } - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_CLOSE) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, readfds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, readfds); - } - } - - /* Move to next entry */ - HandleArray++; - } - -error: - - /* Check if we should free the buffer */ - if (PollInfo && (PollInfo != (PVOID)PollBuffer)) - { - /* Free it from the heap */ - RtlFreeHeap(SockPrivateHeap, 0, PollInfo); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Return error */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return the number of handles */ - return OutCount; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -#define MSAFD_CHECK_EVENT(e, s) \ - (!(s->SharedData.AsyncDisabledEvents & e) && \ - (s->SharedData.AsyncEvents & e)) - -#define HANDLES_IN_SET(s) \ - s == NULL ? 0 : (s->fd_count & 0xFFFF) - -/* DATA **********************************************************************/ - -HANDLE SockAsyncSelectHelperHandle; -BOOLEAN SockAsyncSelectCalled; - -/* FUNCTIONS *****************************************************************/ - -BOOLEAN -WSPAPI -SockCheckAndInitAsyncSelectHelper(VOID) -{ - UNICODE_STRING AfdHelper; - OBJECT_ATTRIBUTES ObjectAttributes; - IO_STATUS_BLOCK IoStatusBlock; - NTSTATUS Status; - FILE_COMPLETION_INFORMATION CompletionInfo; - OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleFlags; - - /* First, make sure we're not already intialized */ - if (SockAsyncSelectHelperHandle) return TRUE; - - /* Acquire the global lock */ - SockAcquireRwLockExclusive(&SocketGlobalLock); - - /* Check again, under the lock */ - if (SockAsyncSelectHelperHandle) - { - /* Return without lock */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - return TRUE; - } - - /* Set up Handle Name and Object */ - RtlInitUnicodeString(&AfdHelper, L"\\Device\\Afd\\AsyncSelectHlp" ); - InitializeObjectAttributes(&ObjectAttributes, - &AfdHelper, - OBJ_INHERIT | OBJ_CASE_INSENSITIVE, - NULL, - NULL); - - /* Open the Handle to AFD */ - Status = NtCreateFile(&SockAsyncSelectHelperHandle, - GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, - &ObjectAttributes, - &IoStatusBlock, - NULL, - 0, - FILE_SHARE_READ | FILE_SHARE_WRITE, - FILE_OPEN_IF, - 0, - NULL, - 0); - if (!NT_SUCCESS(Status)) - { - /* Return without lock */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - return TRUE; - } - - /* Check if the port exists, and if not, create it */ - if (SockAsyncQueuePort) SockCreateAsyncQueuePort(); - - /* - * Now Set up the Completion Port Information - * This means that whenever a Poll is finished, the routine will be executed - */ - CompletionInfo.Port = SockAsyncQueuePort; - CompletionInfo.Key = SockAsyncSelectCompletion; - Status = NtSetInformationFile(SockAsyncSelectHelperHandle, - &IoStatusBlock, - &CompletionInfo, - sizeof(CompletionInfo), - FileCompletionInformation); - - /* Protect the Handle */ - HandleFlags.ProtectFromClose = TRUE; - HandleFlags.Inherit = FALSE; - Status = NtSetInformationObject(SockAsyncQueuePort, - ObjectHandleFlagInformation, - &HandleFlags, - sizeof(HandleFlags)); - - /* - * Set this variable to true so that Send/Recv/Accept will know whether - * to renable disabled events - */ - SockAsyncSelectCalled = TRUE; - - /* Release lock and return */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - return TRUE; -} - -VOID -WSPAPI -SockAsyncSelectCompletion(PVOID Context, - PIO_STATUS_BLOCK IoStatusBlock) -{ - PASYNC_DATA AsyncData = Context; - PSOCKET_INFORMATION Socket = AsyncData->ParentSocket; - ULONG Events; - INT ErrorCode; - - /* Acquire the socket lock */ - EnterCriticalSection(&Socket->Lock); - - /* Check if the socket was closed or the I/O cancelled */ - if ((Socket->SharedData.State == SocketClosed) || - (IoStatusBlock->Status == STATUS_CANCELLED)) - { - /* Return */ - LeaveCriticalSection(&Socket->Lock); - goto error; - } - - /* Check if the Sequence Number Changed behind our back */ - if (AsyncData->SequenceNumber != Socket->SharedData.SequenceNumber) - { - /* Return */ - LeaveCriticalSection(&Socket->Lock); - goto error; - } - - /* Check we were manually called b/c of a failure */ - if (!NT_SUCCESS(IoStatusBlock->Status)) - { - /* Get the error and tell WPU about it */ - ErrorCode = NtStatusToSocketError(IoStatusBlock->Status); - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(0, ErrorCode)); - - /* Return */ - LeaveCriticalSection(&Socket->Lock); - goto error; - } - - /* Select the event bits */ - Events = AsyncData->AsyncSelectInfo.Handles[0].Events; - - /* Check for receive event */ - if (MSAFD_CHECK_EVENT(FD_READ, Socket) && (Events & AFD_EVENT_RECEIVE)) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_READ, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_READ; - } - - /* Check for oob receive event */ - if (MSAFD_CHECK_EVENT(FD_OOB, Socket) && (Events & AFD_EVENT_OOB_RECEIVE)) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_OOB, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_OOB; - } - - /* Check for write event */ - if (MSAFD_CHECK_EVENT(FD_WRITE, Socket) && (Events & AFD_EVENT_SEND)) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_WRITE, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_WRITE; - } - - /* Check for accept event */ - if (MSAFD_CHECK_EVENT(FD_ACCEPT, Socket) && (Events & AFD_EVENT_ACCEPT)) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_ACCEPT, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_ACCEPT; - } - - /* Check for close events */ - if (MSAFD_CHECK_EVENT(FD_CLOSE, Socket) && ((Events & AFD_EVENT_ACCEPT) || - (Events & AFD_EVENT_ABORT) || - (Events & AFD_EVENT_CLOSE))) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_CLOSE, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_CLOSE; - } - - /* Check for QOS event */ - if (MSAFD_CHECK_EVENT(FD_QOS, Socket) && (Events & AFD_EVENT_QOS)) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_QOS, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_QOS; - } - - /* Check for Group QOS event */ - if (MSAFD_CHECK_EVENT(FD_GROUP_QOS, Socket) && (Events & AFD_EVENT_GROUP_QOS)) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_GROUP_QOS, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_GROUP_QOS; - } - - /* Check for Routing Interface Change event */ - if (MSAFD_CHECK_EVENT(FD_ROUTING_INTERFACE_CHANGE, Socket) && - (Events & AFD_EVENT_ROUTING_INTERFACE_CHANGE)) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_ROUTING_INTERFACE_CHANGE, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_ROUTING_INTERFACE_CHANGE; - } - - /* Check for Address List Change event */ - if (MSAFD_CHECK_EVENT(FD_ADDRESS_LIST_CHANGE, Socket) && - (Events & AFD_EVENT_ADDRESS_LIST_CHANGE)) - { - /* Make the Notifcation */ - SockUpcallTable->lpWPUPostMessage(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, - Socket->Handle, - WSAMAKESELECTREPLY(FD_ADDRESS_LIST_CHANGE, 0)); - - /* Disable this event until the next read(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_ADDRESS_LIST_CHANGE; - } - - /* Check if there are any events left for us to check */ - if (!((Socket->SharedData.AsyncEvents) & - (~Socket->SharedData.AsyncDisabledEvents))) - { - /* Nothing left, release lock and return */ - LeaveCriticalSection(&Socket->Lock); - goto error; - } - - /* Keep Polling */ - SockProcessAsyncSelect(Socket, AsyncData); - - /* Leave lock and return */ - LeaveCriticalSection(&Socket->Lock); - return; - -error: - /* Dereference the socket and free the Async Data */ - SockDereferenceSocket(Socket); - RtlFreeHeap(SockPrivateHeap, 0, AsyncData); - - /* Dereference this thread and return */ - InterlockedDecrement(&SockAsyncThreadReferenceCount); - return; -} - -VOID -WSPAPI -SockProcessAsyncSelect(PSOCKET_INFORMATION Socket, - PASYNC_DATA AsyncData) -{ - ULONG lNetworkEvents; - NTSTATUS Status; - - /* Set up the Async Data Event Info */ - AsyncData->AsyncSelectInfo.Timeout.HighPart = 0x7FFFFFFF; - AsyncData->AsyncSelectInfo.Timeout.LowPart = 0xFFFFFFFF; - AsyncData->AsyncSelectInfo.HandleCount = 1; - AsyncData->AsyncSelectInfo.Exclusive = TRUE; - AsyncData->AsyncSelectInfo.Handles[0].Handle = (SOCKET)Socket->WshContext.Handle; - AsyncData->AsyncSelectInfo.Handles[0].Events = 0; - - /* Remove unwanted events */ - lNetworkEvents = Socket->SharedData.AsyncEvents & - (~Socket->SharedData.AsyncDisabledEvents); - - /* Set Events to wait for */ - if (lNetworkEvents & FD_READ) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_RECEIVE; - } - if (lNetworkEvents & FD_WRITE) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_SEND; - } - if (lNetworkEvents & FD_OOB) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_OOB_RECEIVE; - } - if (lNetworkEvents & FD_ACCEPT) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_ACCEPT; - } - if (lNetworkEvents & FD_CLOSE) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_DISCONNECT | - AFD_EVENT_ABORT | - AFD_EVENT_CLOSE; - } - if (lNetworkEvents & FD_QOS) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_QOS; - } - if (lNetworkEvents & FD_GROUP_QOS) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_GROUP_QOS; - } - if (lNetworkEvents & FD_ROUTING_INTERFACE_CHANGE) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_ROUTING_INTERFACE_CHANGE; - } - if (lNetworkEvents & FD_ADDRESS_LIST_CHANGE) - { - AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_ADDRESS_LIST_CHANGE; - } - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(SockAsyncSelectHelperHandle, - NULL, - NULL, - AsyncData, - &AsyncData->IoStatusBlock, - IOCTL_AFD_SELECT, - &AsyncData->AsyncSelectInfo, - sizeof(AsyncData->AsyncSelectInfo), - &AsyncData->AsyncSelectInfo, - sizeof(AsyncData->AsyncSelectInfo)); - /* Check for failure */ - if (NT_ERROR(Status)) - { - /* I/O Manager Won't call the completion routine; do it manually */ - AsyncData->IoStatusBlock.Status = Status; - SockAsyncSelectCompletion(AsyncData, &AsyncData->IoStatusBlock); - } -} - -VOID -WSPAPI -SockProcessQueuedAsyncSelect(PVOID Context, - PIO_STATUS_BLOCK IoStatusBlock) -{ - PASYNC_DATA AsyncData = Context; - PSOCKET_INFORMATION Socket = AsyncData->ParentSocket; - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Make sure it's not closed */ - if (Socket->SharedData.State == SocketClosed) - { - /* Return */ - LeaveCriticalSection(&Socket->Lock); - goto error; - } - - /* Check if the Sequence Number changed by now */ - if (AsyncData->SequenceNumber != Socket->SharedData.SequenceNumber) - { - /* Return */ - LeaveCriticalSection(&Socket->Lock); - goto error; - } - - /* Check if select is needed */ - if (!((Socket->SharedData.AsyncEvents & - ~Socket->SharedData.AsyncDisabledEvents))) - { - /* Return */ - LeaveCriticalSection(&Socket->Lock); - goto error; - } - - /* Do the actual select */ - SockProcessAsyncSelect(Socket, AsyncData); - - /* Return */ - LeaveCriticalSection(&Socket->Lock); - return; - -error: - /* Dereference the socket and free the async data */ - SockDereferenceSocket(Socket); - RtlFreeHeap(SockPrivateHeap, 0, AsyncData); - - /* Dereference this thread */ - InterlockedDecrement(&SockAsyncThreadReferenceCount); -} - -INT -WSPAPI -SockReenableAsyncSelectEvent(IN PSOCKET_INFORMATION Socket, - IN ULONG Event) -{ - PASYNC_DATA AsyncData; - NTSTATUS Status; - - /* Make sure the event is actually disabled */ - if (!(Socket->SharedData.AsyncDisabledEvents & Event)) return NO_ERROR; - - /* Make sure we're not closed */ - if (Socket->SharedData.State == SocketClosed) return NO_ERROR; - - /* Re-enable it */ - Socket->SharedData.AsyncDisabledEvents &= ~Event; - - /* Return if no more events are being polled */ - if (!((Socket->SharedData.AsyncEvents & - ~Socket->SharedData.AsyncDisabledEvents))) - { - return NO_ERROR; - } - - /* Allocate Async Data */ - AsyncData = SockAllocateHeapRoutine(SockPrivateHeap, 0, sizeof(ASYNC_DATA)); - - /* Increase the sequence number to stop anything else */ - Socket->SharedData.SequenceNumber++; - - /* Set up the Async Data */ - AsyncData->ParentSocket = Socket; - AsyncData->SequenceNumber = Socket->SharedData.SequenceNumber; - - /* Begin Async Select by using I/O Completion */ - Status = NtSetIoCompletion(SockAsyncQueuePort, - (PVOID)&SockProcessQueuedAsyncSelect, - AsyncData, - 0, - 0); - if (!NT_SUCCESS(Status)) - { - /* Dereference the socket and fail */ - SockDereferenceSocket(Socket); - RtlFreeHeap(SockPrivateHeap, 0, AsyncData); - return NtStatusToSocketError(Status); - } - - /* All done */ - return NO_ERROR; -} - -INT -WSPAPI -SockAsyncSelectHelper(IN PSOCKET_INFORMATION Socket, - IN HWND hWnd, - IN UINT wMsg, - IN LONG lEvent) -{ - PASYNC_DATA AsyncData = NULL; - BOOLEAN BlockMode; - NTSTATUS Status; - INT ErrorCode; - - /* Allocate the Async Data Structure to pass on to the Thread later */ - AsyncData = SockAllocateHeapRoutine(SockPrivateHeap, 0, sizeof(*AsyncData)); - if (!AsyncData) return WSAENOBUFS; - - /* Acquire socket lock */ - EnterCriticalSection(&Socket->Lock); - - /* Is there an active WSPEventSelect? */ - if (Socket->SharedData.AsyncEvents) - { - /* Call the helper to process it */ - ErrorCode = SockEventSelectHelper(Socket, NULL, 0); - if (ErrorCode != NO_ERROR) goto error; - } - - /* Set Socket to Non-Blocking */ - BlockMode = TRUE; - ErrorCode = SockSetInformation(Socket, - AFD_INFO_BLOCKING_MODE, - &BlockMode, - NULL, - NULL); - if (ErrorCode != NO_ERROR) goto error; - - /* AFD was notified, set it locally as well */ - Socket->SharedData.NonBlocking = TRUE; - - /* Store Socket Data */ - Socket->SharedData.hWnd = hWnd; - Socket->SharedData.wMsg = wMsg; - Socket->SharedData.AsyncEvents = lEvent; - Socket->SharedData.AsyncDisabledEvents = 0; - - /* Check if the socket is not connected and not a datagram socket */ - if ((!SockIsSocketConnected(Socket)) && !MSAFD_IS_DGRAM_SOCK(Socket)) - { - /* Disable FD_WRITE for now, so we don't get it before FD_CONNECT */ - Socket->SharedData.AsyncDisabledEvents |= FD_WRITE; - } - - /* Increase the sequence number */ - Socket->SharedData.SequenceNumber++; - - /* Return if there are no more Events */ - if (!(Socket->SharedData.AsyncEvents & - (~Socket->SharedData.AsyncDisabledEvents))) - { - /* Release the lock, dereference the async thread and the socket */ - LeaveCriticalSection(&Socket->Lock); - InterlockedDecrement(&SockAsyncThreadReferenceCount); - SockDereferenceSocket(Socket); - - /* Free the Async Data */ - RtlFreeHeap(SockPrivateHeap, 0, AsyncData); - return NO_ERROR; - } - - /* Set up the Async Data */ - AsyncData->ParentSocket = Socket; - AsyncData->SequenceNumber = Socket->SharedData.SequenceNumber; - - /* Release the lock now */ - LeaveCriticalSection(&Socket->Lock); - - /* Begin Async Select by using I/O Completion */ - Status = NtSetIoCompletion(SockAsyncQueuePort, - (PVOID)&SockProcessQueuedAsyncSelect, - AsyncData, - 0, - 0); - if (!NT_SUCCESS(Status)) - { - /* Dereference the async thread and fail */ - InterlockedDecrement(&SockAsyncThreadReferenceCount); - ErrorCode = NtStatusToSocketError(Status); - } - -error: - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Free the async data */ - RtlFreeHeap(SockPrivateHeap, 0, AsyncData); - - /* Fail */ - return SOCKET_ERROR; - } - - /* Increment the socket reference */ - InterlockedIncrement(&Socket->RefCount); - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -WSPAsyncSelect(IN SOCKET Handle, - IN HWND hWnd, - IN UINT wMsg, - IN LONG lEvent, - OUT LPINT lpErrno) -{ - PSOCKET_INFORMATION Socket; - INT ErrorCode; - PWINSOCK_TEB_DATA ThreadData; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Check for valid events */ - if (lEvent & ~FD_ALL_EVENTS) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Check for valid window handle */ - if (!IsWindow(hWnd)) - { - /* Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Create the Asynch Thread if Needed */ - if (!SockCheckAndReferenceAsyncThread()) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - - /* Open a Handle to AFD's Async Helper */ - if (!SockCheckAndInitAsyncSelectHelper()) - { - /* Dereference async thread and fail */ - InterlockedDecrement(&SockAsyncThreadReferenceCount); - ErrorCode = WSAENOBUFS; - goto error; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Call the helper to do the work */ - ErrorCode = SockAsyncSelectHelper(Socket, - hWnd, - wMsg, - lEvent); - - /* Dereference the socket */ - SockDereferenceSocket(Socket); - -error: - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -WSPSelect(INT nfds, - PFD_SET readfds, - PFD_SET writefds, - PFD_SET exceptfds, - CONST LPTIMEVAL timeout, - LPINT lpErrno) -{ - IO_STATUS_BLOCK IoStatusBlock; - PAFD_POLL_INFO PollInfo = NULL; - NTSTATUS Status; - CHAR PollBuffer[sizeof(AFD_POLL_INFO) + 3 * sizeof(AFD_HANDLE)]; - PAFD_HANDLE HandleArray; - ULONG HandleCount, OutCount = 0; - ULONG PollBufferSize; - ULONG i; - PWINSOCK_TEB_DATA ThreadData; - LARGE_INTEGER uSec; - ULONG BlockType; - INT ErrorCode; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* How many sockets will we check? */ - HandleCount = HANDLES_IN_SET(readfds) + - HANDLES_IN_SET(writefds) + - HANDLES_IN_SET(exceptfds); - - /* Leave if none are */ - if (!HandleCount) return NO_ERROR; - - /* How much space will they require? */ - PollBufferSize = sizeof(*PollInfo) + (HandleCount * sizeof(AFD_HANDLE)); - - /* Check if our stack is big enough to hold it */ - if (PollBufferSize <= sizeof(PollBuffer)) - { - /* Use the stack */ - PollInfo = (PVOID)PollBuffer; - } - else - { - /* Allocate from heap instead */ - PollInfo = SockAllocateHeapRoutine(SockPrivateHeap, 0, PollBufferSize); - if (!PollInfo) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - } - - /* Number of handles for AFD to Check */ - PollInfo->HandleCount = HandleCount; - PollInfo->Exclusive = FALSE; - HandleArray = PollInfo->Handles; - - /* Select the Read Events */ - for (i = 0; readfds && i < (readfds->fd_count & 0xFFFF); i++) - { - /* Fill out handle info */ - HandleArray->Handle = (SOCKET)readfds->fd_array[i]; - HandleArray->Events = AFD_EVENT_RECEIVE | - AFD_EVENT_DISCONNECT | - AFD_EVENT_ABORT; - - /* Move to the next one */ - HandleArray++; - } - for (i = 0; writefds && i < (writefds->fd_count & 0xFFFF); i++) - { - /* Fill out handle info */ - HandleArray->Handle = (SOCKET)writefds->fd_array[i]; - HandleArray->Events = AFD_EVENT_SEND; - - /* Move to the next one */ - HandleArray++; - } - for (i = 0; exceptfds && i < (exceptfds->fd_count & 0xFFFF); i++) - { - /* Fill out handle info */ - HandleArray->Handle = (SOCKET)exceptfds->fd_array[i]; - HandleArray->Events = AFD_EVENT_OOB_RECEIVE | AFD_EVENT_CONNECT_FAIL; - - /* Move to the next one */ - HandleArray++; - } - - /* Check if a timeout was given */ - if (timeout) - { - /* Inifinte Timeout */ - PollInfo->Timeout.u.LowPart = -1; - PollInfo->Timeout.u.HighPart = 0x7FFFFFFF; - } - else - { - /* Calculate microseconds */ - uSec = RtlEnlargedIntegerMultiply(timeout->tv_usec, -10); - - /* Calculate seconds */ - PollInfo->Timeout = RtlEnlargedIntegerMultiply(timeout->tv_sec, - -1 * 1000 * 1000 * 10); - - /* Add microseconds */ - PollInfo->Timeout.QuadPart += uSec.QuadPart; - } - - /* Send IOCTL */ - Status = NtDeviceIoControlFile((HANDLE)PollInfo->Handles[0].Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_SELECT, - PollInfo, - PollBufferSize, - PollInfo, - PollBufferSize); - - /* Check if we have to wait */ - if (Status == STATUS_PENDING) - { - /* Check if we'll call the blocking hook */ - if (!PollInfo->Timeout.QuadPart) BlockType = NO_BLOCKING_HOOK; - - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - (SOCKET)PollInfo->Handles[0].Handle, - BlockType, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for failure */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Clear the Structures */ - if(readfds) FD_ZERO(readfds); - if(writefds) FD_ZERO(writefds); - if(exceptfds) FD_ZERO(exceptfds); - - /* Get the handle info again */ - HandleCount = PollInfo->HandleCount; - HandleArray = PollInfo->Handles; - - /* Loop the Handles that got an event */ - for (i = 0; i < HandleCount; i++) - { - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_RECEIVE) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, readfds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, readfds); - } - } - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_SEND) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, writefds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, writefds); - } - } - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_OOB_RECEIVE) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, exceptfds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, exceptfds); - } - } - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_ACCEPT) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, readfds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, readfds); - } - } - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_CONNECT) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, writefds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, writefds); - } - } - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_CONNECT_FAIL) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, exceptfds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, exceptfds); - } - } - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_DISCONNECT) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, readfds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, readfds); - } - } - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_ABORT) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, readfds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, readfds); - } - } - /* Check for a match */ - if (HandleArray->Events & AFD_EVENT_CLOSE) - { - /* Check if it's not already set */ - if (!FD_ISSET((SOCKET)HandleArray->Handle, readfds)) - { - /* Increase Handles with an Event */ - OutCount++; - - /* Set this handle */ - FD_SET((SOCKET)HandleArray->Handle, readfds); - } - } - - /* Move to next entry */ - HandleArray++; - } - -error: - - /* Check if we should free the buffer */ - if (PollInfo && (PollInfo != (PVOID)PollBuffer)) - { - /* Free it from the heap */ - RtlFreeHeap(SockPrivateHeap, 0, PollInfo); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Return error */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return the number of handles */ - return OutCount; -} - diff --git a/dll/win32/mswsock/msafd/send.c b/dll/win32/mswsock/msafd/send.c index 60f377998be..b7840864227 100644 --- a/dll/win32/mswsock/msafd/send.c +++ b/dll/win32/mswsock/msafd/send.c @@ -583,1758 +583,3 @@ error: return NO_ERROR; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -WSPSend(SOCKET Handle, - LPWSABUF lpBuffers, - DWORD dwBufferCount, - LPDWORD lpNumberOfBytesSent, - DWORD iFlags, - LPWSAOVERLAPPED lpOverlapped, - LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, - LPWSATHREADID lpThreadId, - LPINT lpErrno) -{ - PIO_STATUS_BLOCK IoStatusBlock; - IO_STATUS_BLOCK DummyIoStatusBlock; - AFD_SEND_INFO SendInfo; - NTSTATUS Status; - PVOID APCContext; - PVOID ApcFunction; - HANDLE Event; - PWINSOCK_TEB_DATA ThreadData; - PSOCKET_INFORMATION Socket; - INT ErrorCode; - BOOLEAN ReturnValue; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Set up the Receive Structure */ - SendInfo.BufferArray = (PAFD_WSABUF)lpBuffers; - SendInfo.BufferCount = dwBufferCount; - SendInfo.TdiFlags = 0; - SendInfo.AfdFlags = 0; - - /* Set the TDI Flags */ - if (iFlags) - { - /* Check for valid flags */ - if ((iFlags & ~(MSG_OOB | MSG_DONTROUTE | MSG_PARTIAL))) - { - /* Fail */ - ErrorCode = WSAEOPNOTSUPP; - goto error; - } - - /* Check if OOB is being used */ - if (iFlags & MSG_OOB) - { - /* Use Expedited Send for OOB */ - SendInfo.TdiFlags |= TDI_SEND_EXPEDITED; - } - - /* Use Partial Send if enabled */ - if (iFlags & MSG_PARTIAL) SendInfo.TdiFlags |= TDI_SEND_PARTIAL; - } - - /* Verifiy if we should use APC */ - if (!lpOverlapped) - { - /* Not using Overlapped structure, so use normal blocking on event */ - APCContext = NULL; - ApcFunction = NULL; - Event = ThreadData->EventHandle; - IoStatusBlock = &DummyIoStatusBlock; - } - else - { - /* Using apc, check if we have a completion routine */ - if (!lpCompletionRoutine) - { - /* No need for APC */ - APCContext = lpOverlapped; - ApcFunction = NULL; - Event = lpOverlapped->hEvent; - } - else - { - /* Use APC */ - ApcFunction = SockIoCompletion; - APCContext = lpCompletionRoutine; - Event = NULL; - - /* Skip Fast I/O */ - SendInfo.AfdFlags = AFD_SKIP_FIO; - } - - /* Use the overlapped's structure buffer for the I/O Status Block */ - IoStatusBlock = (PIO_STATUS_BLOCK)&lpOverlapped->Internal; - - /* Make this an overlapped I/O in AFD */ - SendInfo.AfdFlags |= AFD_OVERLAPPED; - } - - /* Set is as Pending for now */ - IoStatusBlock->Status = STATUS_PENDING; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile((HANDLE)Handle, - Event, - ApcFunction, - APCContext, - IoStatusBlock, - IOCTL_AFD_SEND, - &SendInfo, - sizeof(SendInfo), - NULL, - 0); - - /* Increase the pending APC Count if we're using an APC */ - if (!NT_ERROR(Status) && ApcFunction) - { - ThreadData->PendingAPCs++; - InterlockedIncrement(&SockProcessPendingAPCCount); - } - - /* Wait for completition if not overlapped */ - if ((Status == STATUS_PENDING) && !(lpOverlapped)) - { - /* Wait for completion */ - ReturnValue = SockWaitForSingleObject(Event, - Handle, - MAYBE_BLOCKING_HOOK, - SEND_TIMEOUT); - - /* Check if the wait was successful */ - if (ReturnValue) - { - /* Get new status */ - Status = IoStatusBlock->Status; - } - else - { - /* Cancel the I/O */ - SockCancelIo(Handle); - Status = STATUS_IO_TIMEOUT; - } - } - - /* Check status */ - switch (Status) - { - /* Success */ - case STATUS_SUCCESS: - break; - - /* Pending I/O */ - case STATUS_PENDING: - ErrorCode = WSA_IO_PENDING; - goto error; - - /* Other NT Error */ - default: - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - break; - } - - /* Return the number of bytes sent */ - *lpNumberOfBytesSent = PtrToUlong(IoStatusBlock->Information); - -error: - - /* Check if async select was active and this blocked */ - if (SockAsyncSelectCalled && (ErrorCode == WSAEWOULDBLOCK)) - { - /* Get the socket */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (Socket) - { - /* Lock it */ - EnterCriticalSection(&Socket->Lock); - - /* Re-enable the regular write event */ - SockReenableAsyncSelectEvent(Socket, FD_WRITE); - - /* Unlock and dereference socket */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -WSPSendTo(SOCKET Handle, - LPWSABUF lpBuffers, - DWORD dwBufferCount, - LPDWORD lpNumberOfBytesSent, - DWORD iFlags, - const struct sockaddr *SocketAddress, - INT SocketAddressLength, - LPWSAOVERLAPPED lpOverlapped, - LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, - LPWSATHREADID lpThreadId, - LPINT lpErrno) -{ - PIO_STATUS_BLOCK IoStatusBlock; - IO_STATUS_BLOCK DummyIoStatusBlock; - AFD_SEND_INFO_UDP SendInfo; - NTSTATUS Status; - PVOID APCContext; - PVOID ApcFunction; - HANDLE Event; - PWINSOCK_TEB_DATA ThreadData; - PSOCKET_INFORMATION Socket; - INT ErrorCode; - INT ReturnValue; - CHAR AddressBuffer[FIELD_OFFSET(TDI_ADDRESS_INFO, Address) + - MAX_TDI_ADDRESS_LENGTH]; - PTRANSPORT_ADDRESS TdiAddress = (PTRANSPORT_ADDRESS)AddressBuffer; - ULONG TdiAddressSize; - INT SockaddrLength; - PSOCKADDR Sockaddr; - SOCKADDR_INFO SocketInfo; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* - * Check if this isn't a datagram socket or if it's a connected socket - * without an address - */ - if (!MSAFD_IS_DGRAM_SOCK(Socket) || - ((Socket->SharedData.State == SocketConnected) && - (!SocketAddress || !SocketAddressLength))) - { - /* Call WSPSend instead */ - SockDereferenceSocket(Socket); - return WSPSend(Handle, - lpBuffers, - dwBufferCount, - lpNumberOfBytesSent, - iFlags, - lpOverlapped, - lpCompletionRoutine, - lpThreadId, - lpErrno); - } - - /* If the socket isn't connected, we need an address*/ - if ((Socket->SharedData.State != SocketConnected) && (!SocketAddress)) - { - /* Fail */ - ErrorCode = WSAENOTCONN; - goto error; - } - - /* Validate length */ - if (SocketAddressLength < Socket->HelperData->MaxWSAddressLength) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Verify flags */ - if (iFlags & ~MSG_DONTROUTE) - { - /* Fail */ - ErrorCode = WSAEOPNOTSUPP; - goto error; - } - - /* Make sure send shutdown isn't active */ - if (Socket->SharedData.SendShutdown) - { - /* Fail */ - ErrorCode = WSAESHUTDOWN; - goto error; - } - - /* Make sure address families match */ - if (Socket->SharedData.AddressFamily != SocketAddress->sa_family) - { - /* Fail */ - ErrorCode = WSAEOPNOTSUPP; - goto error; - } - - /* Check if broadcast is enabled */ - if (!Socket->SharedData.Broadcast) - { - /* The caller might want to enable it; get the Sockaddr type */ - ErrorCode = Socket->HelperData->WSHGetSockaddrType((PSOCKADDR)SocketAddress, - SocketAddressLength, - &SocketInfo); - if (ErrorCode != NO_ERROR) goto error; - - /* Check if this is a broadcast attempt */ - if (SocketInfo.AddressInfo == SockaddrAddressInfoBroadcast) - { - /* The socket won't allow it */ - ErrorCode = WSAEACCES; - goto error; - } - } - - /* Check if this socket isn't bound yet */ - if (Socket->SharedData.State == SocketOpen) - { - /* Check if we can request the wildcard address */ - if (Socket->HelperData->WSHGetWildcardSockaddr) - { - /* Allocate a new Sockaddr */ - SockaddrLength = Socket->HelperData->MaxWSAddressLength; - Sockaddr = SockAllocateHeapRoutine(SockPrivateHeap, 0, SockaddrLength); - if (!Sockaddr) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - - /* Get the wildcard sockaddr */ - ErrorCode = Socket->HelperData->WSHGetWildcardSockaddr(Socket->HelperContext, - Sockaddr, - &SockaddrLength); - if (ErrorCode != NO_ERROR) - { - /* Free memory and fail */ - RtlFreeHeap(SockPrivateHeap, 0, Sockaddr); - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Make sure it's still unbound */ - if (Socket->SharedData.State == SocketOpen) - { - /* Bind it */ - ReturnValue = WSPBind(Handle, - Sockaddr, - SockaddrLength, - &ErrorCode); - } - else - { - /* It's bound now, fake success */ - ReturnValue = NO_ERROR; - } - - /* Release the lock and free memory */ - LeaveCriticalSection(&Socket->Lock); - RtlFreeHeap(SockPrivateHeap, 0, Sockaddr); - - /* Check if we failed */ - if (ReturnValue == SOCKET_ERROR) goto error; - } - else - { - /* Unbound socket, but can't get the wildcard. Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - } - - /* Check how long the TDI Address is */ - TdiAddressSize = Socket->HelperData->MaxTDIAddressLength; - - /* See if it can fit in the stack */ - if (TdiAddressSize > sizeof(AddressBuffer)) - { - /* Allocate from heap */ - TdiAddress = SockAllocateHeapRoutine(SockPrivateHeap, 0, TdiAddressSize); - if (!TdiAddress) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - } - - /* Build the TDI Address */ - ErrorCode = SockBuildTdiAddress(TdiAddress, - (PSOCKADDR)SocketAddress, - min(SocketAddressLength, - Socket->HelperData->MaxWSAddressLength)); - if (ErrorCode != NO_ERROR) goto error; - - /* Set up the Send Structure */ - SendInfo.BufferArray = (PAFD_WSABUF)lpBuffers; - SendInfo.BufferCount = dwBufferCount; - SendInfo.AfdFlags = 0; - SendInfo.TdiConnection.RemoteAddress = TdiAddress; - SendInfo.TdiConnection.RemoteAddressLength = TdiAddressSize; - - /* Verifiy if we should use APC */ - if (!lpOverlapped) - { - /* Not using Overlapped structure, so use normal blocking on event */ - APCContext = NULL; - ApcFunction = NULL; - Event = ThreadData->EventHandle; - IoStatusBlock = &DummyIoStatusBlock; - } - else - { - /* Using apc, check if we have a completion routine */ - if (!lpCompletionRoutine) - { - /* No need for APC */ - APCContext = lpOverlapped; - ApcFunction = NULL; - Event = lpOverlapped->hEvent; - } - else - { - /* Use APC */ - ApcFunction = SockIoCompletion; - APCContext = lpCompletionRoutine; - Event = NULL; - - /* Skip Fast I/O */ - SendInfo.AfdFlags = AFD_SKIP_FIO; - } - - /* Use the overlapped's structure buffer for the I/O Status Block */ - IoStatusBlock = (PIO_STATUS_BLOCK)&lpOverlapped->Internal; - - /* Make this an overlapped I/O in AFD */ - SendInfo.AfdFlags |= AFD_OVERLAPPED; - } - - /* Set is as Pending for now */ - IoStatusBlock->Status = STATUS_PENDING; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - Event, - ApcFunction, - APCContext, - IoStatusBlock, - IOCTL_AFD_SEND_DATAGRAM, - &SendInfo, - sizeof(SendInfo), - NULL, - 0); - - /* Increase the pending APC Count if we're using an APC */ - if (!NT_ERROR(Status) && ApcFunction) - { - ThreadData->PendingAPCs++; - InterlockedIncrement(&SockProcessPendingAPCCount); - } - - /* Wait for completition if not overlapped */ - if ((Status == STATUS_PENDING) && !(lpOverlapped)) - { - /* Wait for completion */ - ReturnValue = SockWaitForSingleObject(Event, - Handle, - MAYBE_BLOCKING_HOOK, - SEND_TIMEOUT); - - /* Check if the wait was successful */ - if (ReturnValue) - { - /* Get new status */ - Status = IoStatusBlock->Status; - } - else - { - /* Cancel the I/O */ - SockCancelIo(Handle); - Status = STATUS_IO_TIMEOUT; - } - } - - /* Check status */ - switch (Status) - { - /* Success */ - case STATUS_SUCCESS: - break; - - /* Pending I/O */ - case STATUS_PENDING: - ErrorCode = WSA_IO_PENDING; - goto error; - - /* Other NT Error */ - default: - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - break; - } - - /* Return the number of bytes sent */ - *lpNumberOfBytesSent = PtrToUlong(IoStatusBlock->Information); - -error: - - /* Check if we have a socket */ - if (Socket) - { - /* Check if async select was active and this blocked */ - if (SockAsyncSelectCalled && (ErrorCode == WSAEWOULDBLOCK)) - { - /* Lock it */ - EnterCriticalSection(&Socket->Lock); - - /* Re-enable the regular write event */ - SockReenableAsyncSelectEvent(Socket, FD_WRITE); - - /* Unlock socket */ - LeaveCriticalSection(&Socket->Lock); - } - - /* Dereference socket */ - SockDereferenceSocket(Socket); - } - - /* Check if we should free the TDI Address */ - if (TdiAddress && (TdiAddress != (PVOID)AddressBuffer)) - { - /* Free it from the heap */ - RtlFreeHeap(SockPrivateHeap, 0, TdiAddress); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -WSPSend(SOCKET Handle, - LPWSABUF lpBuffers, - DWORD dwBufferCount, - LPDWORD lpNumberOfBytesSent, - DWORD iFlags, - LPWSAOVERLAPPED lpOverlapped, - LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, - LPWSATHREADID lpThreadId, - LPINT lpErrno) -{ - PIO_STATUS_BLOCK IoStatusBlock; - IO_STATUS_BLOCK DummyIoStatusBlock; - AFD_SEND_INFO SendInfo; - NTSTATUS Status; - PVOID APCContext; - PVOID ApcFunction; - HANDLE Event; - PWINSOCK_TEB_DATA ThreadData; - PSOCKET_INFORMATION Socket; - INT ErrorCode; - BOOLEAN ReturnValue; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Set up the Receive Structure */ - SendInfo.BufferArray = (PAFD_WSABUF)lpBuffers; - SendInfo.BufferCount = dwBufferCount; - SendInfo.TdiFlags = 0; - SendInfo.AfdFlags = 0; - - /* Set the TDI Flags */ - if (iFlags) - { - /* Check for valid flags */ - if ((iFlags & ~(MSG_OOB | MSG_DONTROUTE | MSG_PARTIAL))) - { - /* Fail */ - ErrorCode = WSAEOPNOTSUPP; - goto error; - } - - /* Check if OOB is being used */ - if (iFlags & MSG_OOB) - { - /* Use Expedited Send for OOB */ - SendInfo.TdiFlags |= TDI_SEND_EXPEDITED; - } - - /* Use Partial Send if enabled */ - if (iFlags & MSG_PARTIAL) SendInfo.TdiFlags |= TDI_SEND_PARTIAL; - } - - /* Verifiy if we should use APC */ - if (!lpOverlapped) - { - /* Not using Overlapped structure, so use normal blocking on event */ - APCContext = NULL; - ApcFunction = NULL; - Event = ThreadData->EventHandle; - IoStatusBlock = &DummyIoStatusBlock; - } - else - { - /* Using apc, check if we have a completion routine */ - if (!lpCompletionRoutine) - { - /* No need for APC */ - APCContext = lpOverlapped; - ApcFunction = NULL; - Event = lpOverlapped->hEvent; - } - else - { - /* Use APC */ - ApcFunction = SockIoCompletion; - APCContext = lpCompletionRoutine; - Event = NULL; - - /* Skip Fast I/O */ - SendInfo.AfdFlags = AFD_SKIP_FIO; - } - - /* Use the overlapped's structure buffer for the I/O Status Block */ - IoStatusBlock = (PIO_STATUS_BLOCK)&lpOverlapped->Internal; - - /* Make this an overlapped I/O in AFD */ - SendInfo.AfdFlags |= AFD_OVERLAPPED; - } - - /* Set is as Pending for now */ - IoStatusBlock->Status = STATUS_PENDING; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile((HANDLE)Handle, - Event, - ApcFunction, - APCContext, - IoStatusBlock, - IOCTL_AFD_SEND, - &SendInfo, - sizeof(SendInfo), - NULL, - 0); - - /* Increase the pending APC Count if we're using an APC */ - if (!NT_ERROR(Status) && ApcFunction) - { - ThreadData->PendingAPCs++; - InterlockedIncrement(&SockProcessPendingAPCCount); - } - - /* Wait for completition if not overlapped */ - if ((Status == STATUS_PENDING) && !(lpOverlapped)) - { - /* Wait for completion */ - ReturnValue = SockWaitForSingleObject(Event, - Handle, - MAYBE_BLOCKING_HOOK, - SEND_TIMEOUT); - - /* Check if the wait was successful */ - if (ReturnValue) - { - /* Get new status */ - Status = IoStatusBlock->Status; - } - else - { - /* Cancel the I/O */ - SockCancelIo(Handle); - Status = STATUS_IO_TIMEOUT; - } - } - - /* Check status */ - switch (Status) - { - /* Success */ - case STATUS_SUCCESS: - break; - - /* Pending I/O */ - case STATUS_PENDING: - ErrorCode = WSA_IO_PENDING; - goto error; - - /* Other NT Error */ - default: - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - break; - } - - /* Return the number of bytes sent */ - *lpNumberOfBytesSent = PtrToUlong(IoStatusBlock->Information); - -error: - - /* Check if async select was active and this blocked */ - if (SockAsyncSelectCalled && (ErrorCode == WSAEWOULDBLOCK)) - { - /* Get the socket */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (Socket) - { - /* Lock it */ - EnterCriticalSection(&Socket->Lock); - - /* Re-enable the regular write event */ - SockReenableAsyncSelectEvent(Socket, FD_WRITE); - - /* Unlock and dereference socket */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -WSPSendTo(SOCKET Handle, - LPWSABUF lpBuffers, - DWORD dwBufferCount, - LPDWORD lpNumberOfBytesSent, - DWORD iFlags, - const struct sockaddr *SocketAddress, - INT SocketAddressLength, - LPWSAOVERLAPPED lpOverlapped, - LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, - LPWSATHREADID lpThreadId, - LPINT lpErrno) -{ - PIO_STATUS_BLOCK IoStatusBlock; - IO_STATUS_BLOCK DummyIoStatusBlock; - AFD_SEND_INFO_UDP SendInfo; - NTSTATUS Status; - PVOID APCContext; - PVOID ApcFunction; - HANDLE Event; - PWINSOCK_TEB_DATA ThreadData; - PSOCKET_INFORMATION Socket; - INT ErrorCode; - INT ReturnValue; - CHAR AddressBuffer[FIELD_OFFSET(TDI_ADDRESS_INFO, Address) + - MAX_TDI_ADDRESS_LENGTH]; - PTRANSPORT_ADDRESS TdiAddress = (PTRANSPORT_ADDRESS)AddressBuffer; - ULONG TdiAddressSize; - INT SockaddrLength; - PSOCKADDR Sockaddr; - SOCKADDR_INFO SocketInfo; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* - * Check if this isn't a datagram socket or if it's a connected socket - * without an address - */ - if (!MSAFD_IS_DGRAM_SOCK(Socket) || - ((Socket->SharedData.State == SocketConnected) && - (!SocketAddress || !SocketAddressLength))) - { - /* Call WSPSend instead */ - SockDereferenceSocket(Socket); - return WSPSend(Handle, - lpBuffers, - dwBufferCount, - lpNumberOfBytesSent, - iFlags, - lpOverlapped, - lpCompletionRoutine, - lpThreadId, - lpErrno); - } - - /* If the socket isn't connected, we need an address*/ - if ((Socket->SharedData.State != SocketConnected) && (!SocketAddress)) - { - /* Fail */ - ErrorCode = WSAENOTCONN; - goto error; - } - - /* Validate length */ - if (SocketAddressLength < Socket->HelperData->MaxWSAddressLength) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Verify flags */ - if (iFlags & ~MSG_DONTROUTE) - { - /* Fail */ - ErrorCode = WSAEOPNOTSUPP; - goto error; - } - - /* Make sure send shutdown isn't active */ - if (Socket->SharedData.SendShutdown) - { - /* Fail */ - ErrorCode = WSAESHUTDOWN; - goto error; - } - - /* Make sure address families match */ - if (Socket->SharedData.AddressFamily != SocketAddress->sa_family) - { - /* Fail */ - ErrorCode = WSAEOPNOTSUPP; - goto error; - } - - /* Check if broadcast is enabled */ - if (!Socket->SharedData.Broadcast) - { - /* The caller might want to enable it; get the Sockaddr type */ - ErrorCode = Socket->HelperData->WSHGetSockaddrType((PSOCKADDR)SocketAddress, - SocketAddressLength, - &SocketInfo); - if (ErrorCode != NO_ERROR) goto error; - - /* Check if this is a broadcast attempt */ - if (SocketInfo.AddressInfo == SockaddrAddressInfoBroadcast) - { - /* The socket won't allow it */ - ErrorCode = WSAEACCES; - goto error; - } - } - - /* Check if this socket isn't bound yet */ - if (Socket->SharedData.State == SocketOpen) - { - /* Check if we can request the wildcard address */ - if (Socket->HelperData->WSHGetWildcardSockaddr) - { - /* Allocate a new Sockaddr */ - SockaddrLength = Socket->HelperData->MaxWSAddressLength; - Sockaddr = SockAllocateHeapRoutine(SockPrivateHeap, 0, SockaddrLength); - if (!Sockaddr) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - - /* Get the wildcard sockaddr */ - ErrorCode = Socket->HelperData->WSHGetWildcardSockaddr(Socket->HelperContext, - Sockaddr, - &SockaddrLength); - if (ErrorCode != NO_ERROR) - { - /* Free memory and fail */ - RtlFreeHeap(SockPrivateHeap, 0, Sockaddr); - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Make sure it's still unbound */ - if (Socket->SharedData.State == SocketOpen) - { - /* Bind it */ - ReturnValue = WSPBind(Handle, - Sockaddr, - SockaddrLength, - &ErrorCode); - } - else - { - /* It's bound now, fake success */ - ReturnValue = NO_ERROR; - } - - /* Release the lock and free memory */ - LeaveCriticalSection(&Socket->Lock); - RtlFreeHeap(SockPrivateHeap, 0, Sockaddr); - - /* Check if we failed */ - if (ReturnValue == SOCKET_ERROR) goto error; - } - else - { - /* Unbound socket, but can't get the wildcard. Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - } - - /* Check how long the TDI Address is */ - TdiAddressSize = Socket->HelperData->MaxTDIAddressLength; - - /* See if it can fit in the stack */ - if (TdiAddressSize > sizeof(AddressBuffer)) - { - /* Allocate from heap */ - TdiAddress = SockAllocateHeapRoutine(SockPrivateHeap, 0, TdiAddressSize); - if (!TdiAddress) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - } - - /* Build the TDI Address */ - ErrorCode = SockBuildTdiAddress(TdiAddress, - (PSOCKADDR)SocketAddress, - min(SocketAddressLength, - Socket->HelperData->MaxWSAddressLength)); - if (ErrorCode != NO_ERROR) goto error; - - /* Set up the Send Structure */ - SendInfo.BufferArray = (PAFD_WSABUF)lpBuffers; - SendInfo.BufferCount = dwBufferCount; - SendInfo.AfdFlags = 0; - SendInfo.TdiConnection.RemoteAddress = TdiAddress; - SendInfo.TdiConnection.RemoteAddressLength = TdiAddressSize; - - /* Verifiy if we should use APC */ - if (!lpOverlapped) - { - /* Not using Overlapped structure, so use normal blocking on event */ - APCContext = NULL; - ApcFunction = NULL; - Event = ThreadData->EventHandle; - IoStatusBlock = &DummyIoStatusBlock; - } - else - { - /* Using apc, check if we have a completion routine */ - if (!lpCompletionRoutine) - { - /* No need for APC */ - APCContext = lpOverlapped; - ApcFunction = NULL; - Event = lpOverlapped->hEvent; - } - else - { - /* Use APC */ - ApcFunction = SockIoCompletion; - APCContext = lpCompletionRoutine; - Event = NULL; - - /* Skip Fast I/O */ - SendInfo.AfdFlags = AFD_SKIP_FIO; - } - - /* Use the overlapped's structure buffer for the I/O Status Block */ - IoStatusBlock = (PIO_STATUS_BLOCK)&lpOverlapped->Internal; - - /* Make this an overlapped I/O in AFD */ - SendInfo.AfdFlags |= AFD_OVERLAPPED; - } - - /* Set is as Pending for now */ - IoStatusBlock->Status = STATUS_PENDING; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - Event, - ApcFunction, - APCContext, - IoStatusBlock, - IOCTL_AFD_SEND_DATAGRAM, - &SendInfo, - sizeof(SendInfo), - NULL, - 0); - - /* Increase the pending APC Count if we're using an APC */ - if (!NT_ERROR(Status) && ApcFunction) - { - ThreadData->PendingAPCs++; - InterlockedIncrement(&SockProcessPendingAPCCount); - } - - /* Wait for completition if not overlapped */ - if ((Status == STATUS_PENDING) && !(lpOverlapped)) - { - /* Wait for completion */ - ReturnValue = SockWaitForSingleObject(Event, - Handle, - MAYBE_BLOCKING_HOOK, - SEND_TIMEOUT); - - /* Check if the wait was successful */ - if (ReturnValue) - { - /* Get new status */ - Status = IoStatusBlock->Status; - } - else - { - /* Cancel the I/O */ - SockCancelIo(Handle); - Status = STATUS_IO_TIMEOUT; - } - } - - /* Check status */ - switch (Status) - { - /* Success */ - case STATUS_SUCCESS: - break; - - /* Pending I/O */ - case STATUS_PENDING: - ErrorCode = WSA_IO_PENDING; - goto error; - - /* Other NT Error */ - default: - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - break; - } - - /* Return the number of bytes sent */ - *lpNumberOfBytesSent = PtrToUlong(IoStatusBlock->Information); - -error: - - /* Check if we have a socket */ - if (Socket) - { - /* Check if async select was active and this blocked */ - if (SockAsyncSelectCalled && (ErrorCode == WSAEWOULDBLOCK)) - { - /* Lock it */ - EnterCriticalSection(&Socket->Lock); - - /* Re-enable the regular write event */ - SockReenableAsyncSelectEvent(Socket, FD_WRITE); - - /* Unlock socket */ - LeaveCriticalSection(&Socket->Lock); - } - - /* Dereference socket */ - SockDereferenceSocket(Socket); - } - - /* Check if we should free the TDI Address */ - if (TdiAddress && (TdiAddress != (PVOID)AddressBuffer)) - { - /* Free it from the heap */ - RtlFreeHeap(SockPrivateHeap, 0, TdiAddress); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -WSPSend(SOCKET Handle, - LPWSABUF lpBuffers, - DWORD dwBufferCount, - LPDWORD lpNumberOfBytesSent, - DWORD iFlags, - LPWSAOVERLAPPED lpOverlapped, - LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, - LPWSATHREADID lpThreadId, - LPINT lpErrno) -{ - PIO_STATUS_BLOCK IoStatusBlock; - IO_STATUS_BLOCK DummyIoStatusBlock; - AFD_SEND_INFO SendInfo; - NTSTATUS Status; - PVOID APCContext; - PVOID ApcFunction; - HANDLE Event; - PWINSOCK_TEB_DATA ThreadData; - PSOCKET_INFORMATION Socket; - INT ErrorCode; - BOOLEAN ReturnValue; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Set up the Receive Structure */ - SendInfo.BufferArray = (PAFD_WSABUF)lpBuffers; - SendInfo.BufferCount = dwBufferCount; - SendInfo.TdiFlags = 0; - SendInfo.AfdFlags = 0; - - /* Set the TDI Flags */ - if (iFlags) - { - /* Check for valid flags */ - if ((iFlags & ~(MSG_OOB | MSG_DONTROUTE | MSG_PARTIAL))) - { - /* Fail */ - ErrorCode = WSAEOPNOTSUPP; - goto error; - } - - /* Check if OOB is being used */ - if (iFlags & MSG_OOB) - { - /* Use Expedited Send for OOB */ - SendInfo.TdiFlags |= TDI_SEND_EXPEDITED; - } - - /* Use Partial Send if enabled */ - if (iFlags & MSG_PARTIAL) SendInfo.TdiFlags |= TDI_SEND_PARTIAL; - } - - /* Verifiy if we should use APC */ - if (!lpOverlapped) - { - /* Not using Overlapped structure, so use normal blocking on event */ - APCContext = NULL; - ApcFunction = NULL; - Event = ThreadData->EventHandle; - IoStatusBlock = &DummyIoStatusBlock; - } - else - { - /* Using apc, check if we have a completion routine */ - if (!lpCompletionRoutine) - { - /* No need for APC */ - APCContext = lpOverlapped; - ApcFunction = NULL; - Event = lpOverlapped->hEvent; - } - else - { - /* Use APC */ - ApcFunction = SockIoCompletion; - APCContext = lpCompletionRoutine; - Event = NULL; - - /* Skip Fast I/O */ - SendInfo.AfdFlags = AFD_SKIP_FIO; - } - - /* Use the overlapped's structure buffer for the I/O Status Block */ - IoStatusBlock = (PIO_STATUS_BLOCK)&lpOverlapped->Internal; - - /* Make this an overlapped I/O in AFD */ - SendInfo.AfdFlags |= AFD_OVERLAPPED; - } - - /* Set is as Pending for now */ - IoStatusBlock->Status = STATUS_PENDING; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile((HANDLE)Handle, - Event, - ApcFunction, - APCContext, - IoStatusBlock, - IOCTL_AFD_SEND, - &SendInfo, - sizeof(SendInfo), - NULL, - 0); - - /* Increase the pending APC Count if we're using an APC */ - if (!NT_ERROR(Status) && ApcFunction) - { - ThreadData->PendingAPCs++; - InterlockedIncrement(&SockProcessPendingAPCCount); - } - - /* Wait for completition if not overlapped */ - if ((Status == STATUS_PENDING) && !(lpOverlapped)) - { - /* Wait for completion */ - ReturnValue = SockWaitForSingleObject(Event, - Handle, - MAYBE_BLOCKING_HOOK, - SEND_TIMEOUT); - - /* Check if the wait was successful */ - if (ReturnValue) - { - /* Get new status */ - Status = IoStatusBlock->Status; - } - else - { - /* Cancel the I/O */ - SockCancelIo(Handle); - Status = STATUS_IO_TIMEOUT; - } - } - - /* Check status */ - switch (Status) - { - /* Success */ - case STATUS_SUCCESS: - break; - - /* Pending I/O */ - case STATUS_PENDING: - ErrorCode = WSA_IO_PENDING; - goto error; - - /* Other NT Error */ - default: - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - break; - } - - /* Return the number of bytes sent */ - *lpNumberOfBytesSent = PtrToUlong(IoStatusBlock->Information); - -error: - - /* Check if async select was active and this blocked */ - if (SockAsyncSelectCalled && (ErrorCode == WSAEWOULDBLOCK)) - { - /* Get the socket */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (Socket) - { - /* Lock it */ - EnterCriticalSection(&Socket->Lock); - - /* Re-enable the regular write event */ - SockReenableAsyncSelectEvent(Socket, FD_WRITE); - - /* Unlock and dereference socket */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -WSPSendTo(SOCKET Handle, - LPWSABUF lpBuffers, - DWORD dwBufferCount, - LPDWORD lpNumberOfBytesSent, - DWORD iFlags, - const struct sockaddr *SocketAddress, - INT SocketAddressLength, - LPWSAOVERLAPPED lpOverlapped, - LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, - LPWSATHREADID lpThreadId, - LPINT lpErrno) -{ - PIO_STATUS_BLOCK IoStatusBlock; - IO_STATUS_BLOCK DummyIoStatusBlock; - AFD_SEND_INFO_UDP SendInfo; - NTSTATUS Status; - PVOID APCContext; - PVOID ApcFunction; - HANDLE Event; - PWINSOCK_TEB_DATA ThreadData; - PSOCKET_INFORMATION Socket; - INT ErrorCode; - INT ReturnValue; - CHAR AddressBuffer[FIELD_OFFSET(TDI_ADDRESS_INFO, Address) + - MAX_TDI_ADDRESS_LENGTH]; - PTRANSPORT_ADDRESS TdiAddress = (PTRANSPORT_ADDRESS)AddressBuffer; - ULONG TdiAddressSize; - INT SockaddrLength; - PSOCKADDR Sockaddr; - SOCKADDR_INFO SocketInfo; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* - * Check if this isn't a datagram socket or if it's a connected socket - * without an address - */ - if (!MSAFD_IS_DGRAM_SOCK(Socket) || - ((Socket->SharedData.State == SocketConnected) && - (!SocketAddress || !SocketAddressLength))) - { - /* Call WSPSend instead */ - SockDereferenceSocket(Socket); - return WSPSend(Handle, - lpBuffers, - dwBufferCount, - lpNumberOfBytesSent, - iFlags, - lpOverlapped, - lpCompletionRoutine, - lpThreadId, - lpErrno); - } - - /* If the socket isn't connected, we need an address*/ - if ((Socket->SharedData.State != SocketConnected) && (!SocketAddress)) - { - /* Fail */ - ErrorCode = WSAENOTCONN; - goto error; - } - - /* Validate length */ - if (SocketAddressLength < Socket->HelperData->MaxWSAddressLength) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Verify flags */ - if (iFlags & ~MSG_DONTROUTE) - { - /* Fail */ - ErrorCode = WSAEOPNOTSUPP; - goto error; - } - - /* Make sure send shutdown isn't active */ - if (Socket->SharedData.SendShutdown) - { - /* Fail */ - ErrorCode = WSAESHUTDOWN; - goto error; - } - - /* Make sure address families match */ - if (Socket->SharedData.AddressFamily != SocketAddress->sa_family) - { - /* Fail */ - ErrorCode = WSAEOPNOTSUPP; - goto error; - } - - /* Check if broadcast is enabled */ - if (!Socket->SharedData.Broadcast) - { - /* The caller might want to enable it; get the Sockaddr type */ - ErrorCode = Socket->HelperData->WSHGetSockaddrType((PSOCKADDR)SocketAddress, - SocketAddressLength, - &SocketInfo); - if (ErrorCode != NO_ERROR) goto error; - - /* Check if this is a broadcast attempt */ - if (SocketInfo.AddressInfo == SockaddrAddressInfoBroadcast) - { - /* The socket won't allow it */ - ErrorCode = WSAEACCES; - goto error; - } - } - - /* Check if this socket isn't bound yet */ - if (Socket->SharedData.State == SocketOpen) - { - /* Check if we can request the wildcard address */ - if (Socket->HelperData->WSHGetWildcardSockaddr) - { - /* Allocate a new Sockaddr */ - SockaddrLength = Socket->HelperData->MaxWSAddressLength; - Sockaddr = SockAllocateHeapRoutine(SockPrivateHeap, 0, SockaddrLength); - if (!Sockaddr) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - - /* Get the wildcard sockaddr */ - ErrorCode = Socket->HelperData->WSHGetWildcardSockaddr(Socket->HelperContext, - Sockaddr, - &SockaddrLength); - if (ErrorCode != NO_ERROR) - { - /* Free memory and fail */ - RtlFreeHeap(SockPrivateHeap, 0, Sockaddr); - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Make sure it's still unbound */ - if (Socket->SharedData.State == SocketOpen) - { - /* Bind it */ - ReturnValue = WSPBind(Handle, - Sockaddr, - SockaddrLength, - &ErrorCode); - } - else - { - /* It's bound now, fake success */ - ReturnValue = NO_ERROR; - } - - /* Release the lock and free memory */ - LeaveCriticalSection(&Socket->Lock); - RtlFreeHeap(SockPrivateHeap, 0, Sockaddr); - - /* Check if we failed */ - if (ReturnValue == SOCKET_ERROR) goto error; - } - else - { - /* Unbound socket, but can't get the wildcard. Fail */ - ErrorCode = WSAEINVAL; - goto error; - } - } - - /* Check how long the TDI Address is */ - TdiAddressSize = Socket->HelperData->MaxTDIAddressLength; - - /* See if it can fit in the stack */ - if (TdiAddressSize > sizeof(AddressBuffer)) - { - /* Allocate from heap */ - TdiAddress = SockAllocateHeapRoutine(SockPrivateHeap, 0, TdiAddressSize); - if (!TdiAddress) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - } - - /* Build the TDI Address */ - ErrorCode = SockBuildTdiAddress(TdiAddress, - (PSOCKADDR)SocketAddress, - min(SocketAddressLength, - Socket->HelperData->MaxWSAddressLength)); - if (ErrorCode != NO_ERROR) goto error; - - /* Set up the Send Structure */ - SendInfo.BufferArray = (PAFD_WSABUF)lpBuffers; - SendInfo.BufferCount = dwBufferCount; - SendInfo.AfdFlags = 0; - SendInfo.TdiConnection.RemoteAddress = TdiAddress; - SendInfo.TdiConnection.RemoteAddressLength = TdiAddressSize; - - /* Verifiy if we should use APC */ - if (!lpOverlapped) - { - /* Not using Overlapped structure, so use normal blocking on event */ - APCContext = NULL; - ApcFunction = NULL; - Event = ThreadData->EventHandle; - IoStatusBlock = &DummyIoStatusBlock; - } - else - { - /* Using apc, check if we have a completion routine */ - if (!lpCompletionRoutine) - { - /* No need for APC */ - APCContext = lpOverlapped; - ApcFunction = NULL; - Event = lpOverlapped->hEvent; - } - else - { - /* Use APC */ - ApcFunction = SockIoCompletion; - APCContext = lpCompletionRoutine; - Event = NULL; - - /* Skip Fast I/O */ - SendInfo.AfdFlags = AFD_SKIP_FIO; - } - - /* Use the overlapped's structure buffer for the I/O Status Block */ - IoStatusBlock = (PIO_STATUS_BLOCK)&lpOverlapped->Internal; - - /* Make this an overlapped I/O in AFD */ - SendInfo.AfdFlags |= AFD_OVERLAPPED; - } - - /* Set is as Pending for now */ - IoStatusBlock->Status = STATUS_PENDING; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - Event, - ApcFunction, - APCContext, - IoStatusBlock, - IOCTL_AFD_SEND_DATAGRAM, - &SendInfo, - sizeof(SendInfo), - NULL, - 0); - - /* Increase the pending APC Count if we're using an APC */ - if (!NT_ERROR(Status) && ApcFunction) - { - ThreadData->PendingAPCs++; - InterlockedIncrement(&SockProcessPendingAPCCount); - } - - /* Wait for completition if not overlapped */ - if ((Status == STATUS_PENDING) && !(lpOverlapped)) - { - /* Wait for completion */ - ReturnValue = SockWaitForSingleObject(Event, - Handle, - MAYBE_BLOCKING_HOOK, - SEND_TIMEOUT); - - /* Check if the wait was successful */ - if (ReturnValue) - { - /* Get new status */ - Status = IoStatusBlock->Status; - } - else - { - /* Cancel the I/O */ - SockCancelIo(Handle); - Status = STATUS_IO_TIMEOUT; - } - } - - /* Check status */ - switch (Status) - { - /* Success */ - case STATUS_SUCCESS: - break; - - /* Pending I/O */ - case STATUS_PENDING: - ErrorCode = WSA_IO_PENDING; - goto error; - - /* Other NT Error */ - default: - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - break; - } - - /* Return the number of bytes sent */ - *lpNumberOfBytesSent = PtrToUlong(IoStatusBlock->Information); - -error: - - /* Check if we have a socket */ - if (Socket) - { - /* Check if async select was active and this blocked */ - if (SockAsyncSelectCalled && (ErrorCode == WSAEWOULDBLOCK)) - { - /* Lock it */ - EnterCriticalSection(&Socket->Lock); - - /* Re-enable the regular write event */ - SockReenableAsyncSelectEvent(Socket, FD_WRITE); - - /* Unlock socket */ - LeaveCriticalSection(&Socket->Lock); - } - - /* Dereference socket */ - SockDereferenceSocket(Socket); - } - - /* Check if we should free the TDI Address */ - if (TdiAddress && (TdiAddress != (PVOID)AddressBuffer)) - { - /* Free it from the heap */ - RtlFreeHeap(SockPrivateHeap, 0, TdiAddress); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - diff --git a/dll/win32/mswsock/msafd/shutdown.c b/dll/win32/mswsock/msafd/shutdown.c index 3d24ea4e66d..9ed93deb1be 100644 --- a/dll/win32/mswsock/msafd/shutdown.c +++ b/dll/win32/mswsock/msafd/shutdown.c @@ -172,525 +172,3 @@ error: return NO_ERROR; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -WSPRecvDisconnect(IN SOCKET s, - OUT LPWSABUF lpInboundDisconnectData, - OUT LPINT lpErrno) -{ - return 0; -} - -INT -WSPAPI -WSPSendDisconnect(IN SOCKET s, - IN LPWSABUF lpOutboundDisconnectData, - OUT LPINT lpErrno) -{ - return 0; -} - -INT -WSPAPI -WSPShutdown(SOCKET Handle, - INT HowTo, - LPINT lpErrno) - -{ - IO_STATUS_BLOCK IoStatusBlock; - AFD_DISCONNECT_INFO DisconnectInfo; - PSOCKET_INFORMATION Socket; - PWINSOCK_TEB_DATA ThreadData; - DWORD HelperEvent; - INT ErrorCode; - NTSTATUS Status; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* If the socket is not connection-less, fail if it's not connected */ - if ((MSAFD_IS_DGRAM_SOCK(Socket)) && !(SockIsSocketConnected(Socket))) - { - /* Fail */ - ErrorCode = WSAENOTCONN; - goto error; - } - - /* Set AFD Disconnect Type and WSH Notification Type */ - switch (HowTo) - { - case SD_RECEIVE: - /* Set receive disconnect */ - DisconnectInfo.DisconnectType = AFD_DISCONNECT_RECV; - HelperEvent = WSH_NOTIFY_SHUTDOWN_RECEIVE; - - /* Save it for ourselves */ - Socket->SharedData.ReceiveShutdown = TRUE; - break; - - case SD_SEND: - /* Set receive disconnect */ - DisconnectInfo.DisconnectType = AFD_DISCONNECT_SEND; - HelperEvent = WSH_NOTIFY_SHUTDOWN_SEND; - - /* Save it for ourselves */ - Socket->SharedData.SendShutdown = TRUE; - break; - - case SD_BOTH: - /* Set both */ - DisconnectInfo.DisconnectType = AFD_DISCONNECT_RECV | AFD_DISCONNECT_SEND; - HelperEvent = WSH_NOTIFY_SHUTDOWN_ALL; - - /* Save it for ourselves */ - Socket->SharedData.ReceiveShutdown = Socket->SharedData.SendShutdown = TRUE; - break; - - default: - /* Fail, invalid type */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Inifite Timeout */ - DisconnectInfo.Timeout = RtlConvertLongToLargeInteger(-1); - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_DISCONNECT, - &DisconnectInfo, - sizeof(DisconnectInfo), - NULL, - 0); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion outside the lock */ - LeaveCriticalSection(&Socket->Lock); - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - EnterCriticalSection(&Socket->Lock); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Notify helper DLL */ - ErrorCode = SockNotifyHelperDll(Socket, HelperEvent); - if (ErrorCode != NO_ERROR) goto error; - -error: - /* Check if we have a socket here */ - if (Socket) - { - /* Release the lock and dereference */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -WSPRecvDisconnect(IN SOCKET s, - OUT LPWSABUF lpInboundDisconnectData, - OUT LPINT lpErrno) -{ - return 0; -} - -INT -WSPAPI -WSPSendDisconnect(IN SOCKET s, - IN LPWSABUF lpOutboundDisconnectData, - OUT LPINT lpErrno) -{ - return 0; -} - -INT -WSPAPI -WSPShutdown(SOCKET Handle, - INT HowTo, - LPINT lpErrno) - -{ - IO_STATUS_BLOCK IoStatusBlock; - AFD_DISCONNECT_INFO DisconnectInfo; - PSOCKET_INFORMATION Socket; - PWINSOCK_TEB_DATA ThreadData; - DWORD HelperEvent; - INT ErrorCode; - NTSTATUS Status; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* If the socket is not connection-less, fail if it's not connected */ - if ((MSAFD_IS_DGRAM_SOCK(Socket)) && !(SockIsSocketConnected(Socket))) - { - /* Fail */ - ErrorCode = WSAENOTCONN; - goto error; - } - - /* Set AFD Disconnect Type and WSH Notification Type */ - switch (HowTo) - { - case SD_RECEIVE: - /* Set receive disconnect */ - DisconnectInfo.DisconnectType = AFD_DISCONNECT_RECV; - HelperEvent = WSH_NOTIFY_SHUTDOWN_RECEIVE; - - /* Save it for ourselves */ - Socket->SharedData.ReceiveShutdown = TRUE; - break; - - case SD_SEND: - /* Set receive disconnect */ - DisconnectInfo.DisconnectType = AFD_DISCONNECT_SEND; - HelperEvent = WSH_NOTIFY_SHUTDOWN_SEND; - - /* Save it for ourselves */ - Socket->SharedData.SendShutdown = TRUE; - break; - - case SD_BOTH: - /* Set both */ - DisconnectInfo.DisconnectType = AFD_DISCONNECT_RECV | AFD_DISCONNECT_SEND; - HelperEvent = WSH_NOTIFY_SHUTDOWN_ALL; - - /* Save it for ourselves */ - Socket->SharedData.ReceiveShutdown = Socket->SharedData.SendShutdown = TRUE; - break; - - default: - /* Fail, invalid type */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Inifite Timeout */ - DisconnectInfo.Timeout = RtlConvertLongToLargeInteger(-1); - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_DISCONNECT, - &DisconnectInfo, - sizeof(DisconnectInfo), - NULL, - 0); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion outside the lock */ - LeaveCriticalSection(&Socket->Lock); - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - EnterCriticalSection(&Socket->Lock); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Notify helper DLL */ - ErrorCode = SockNotifyHelperDll(Socket, HelperEvent); - if (ErrorCode != NO_ERROR) goto error; - -error: - /* Check if we have a socket here */ - if (Socket) - { - /* Release the lock and dereference */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -WSPRecvDisconnect(IN SOCKET s, - OUT LPWSABUF lpInboundDisconnectData, - OUT LPINT lpErrno) -{ - return 0; -} - -INT -WSPAPI -WSPSendDisconnect(IN SOCKET s, - IN LPWSABUF lpOutboundDisconnectData, - OUT LPINT lpErrno) -{ - return 0; -} - -INT -WSPAPI -WSPShutdown(SOCKET Handle, - INT HowTo, - LPINT lpErrno) - -{ - IO_STATUS_BLOCK IoStatusBlock; - AFD_DISCONNECT_INFO DisconnectInfo; - PSOCKET_INFORMATION Socket; - PWINSOCK_TEB_DATA ThreadData; - DWORD HelperEvent; - INT ErrorCode; - NTSTATUS Status; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* If the socket is not connection-less, fail if it's not connected */ - if ((MSAFD_IS_DGRAM_SOCK(Socket)) && !(SockIsSocketConnected(Socket))) - { - /* Fail */ - ErrorCode = WSAENOTCONN; - goto error; - } - - /* Set AFD Disconnect Type and WSH Notification Type */ - switch (HowTo) - { - case SD_RECEIVE: - /* Set receive disconnect */ - DisconnectInfo.DisconnectType = AFD_DISCONNECT_RECV; - HelperEvent = WSH_NOTIFY_SHUTDOWN_RECEIVE; - - /* Save it for ourselves */ - Socket->SharedData.ReceiveShutdown = TRUE; - break; - - case SD_SEND: - /* Set receive disconnect */ - DisconnectInfo.DisconnectType = AFD_DISCONNECT_SEND; - HelperEvent = WSH_NOTIFY_SHUTDOWN_SEND; - - /* Save it for ourselves */ - Socket->SharedData.SendShutdown = TRUE; - break; - - case SD_BOTH: - /* Set both */ - DisconnectInfo.DisconnectType = AFD_DISCONNECT_RECV | AFD_DISCONNECT_SEND; - HelperEvent = WSH_NOTIFY_SHUTDOWN_ALL; - - /* Save it for ourselves */ - Socket->SharedData.ReceiveShutdown = Socket->SharedData.SendShutdown = TRUE; - break; - - default: - /* Fail, invalid type */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Inifite Timeout */ - DisconnectInfo.Timeout = RtlConvertLongToLargeInteger(-1); - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_DISCONNECT, - &DisconnectInfo, - sizeof(DisconnectInfo), - NULL, - 0); - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion outside the lock */ - LeaveCriticalSection(&Socket->Lock); - SockWaitForSingleObject(ThreadData->EventHandle, - Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - EnterCriticalSection(&Socket->Lock); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Notify helper DLL */ - ErrorCode = SockNotifyHelperDll(Socket, HelperEvent); - if (ErrorCode != NO_ERROR) goto error; - -error: - /* Check if we have a socket here */ - if (Socket) - { - /* Release the lock and dereference */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - diff --git a/dll/win32/mswsock/msafd/sockerr.c b/dll/win32/mswsock/msafd/sockerr.c index 83430cc0062..953dfc44bbf 100644 --- a/dll/win32/mswsock/msafd/sockerr.c +++ b/dll/win32/mswsock/msafd/sockerr.c @@ -136,417 +136,3 @@ NtStatusToSocketError(IN NTSTATUS Status) } } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -NtStatusToSocketError(IN NTSTATUS Status) -{ - switch (Status) - { - case STATUS_PENDING: - return ERROR_IO_PENDING; - - case STATUS_INVALID_HANDLE: - case STATUS_OBJECT_TYPE_MISMATCH: - return WSAENOTSOCK; - - case STATUS_INSUFFICIENT_RESOURCES: - case STATUS_PAGEFILE_QUOTA: - case STATUS_COMMITMENT_LIMIT: - case STATUS_WORKING_SET_QUOTA: - case STATUS_NO_MEMORY: - case STATUS_CONFLICTING_ADDRESSES: - case STATUS_QUOTA_EXCEEDED: - case STATUS_TOO_MANY_PAGING_FILES: - case STATUS_REMOTE_RESOURCES: - case STATUS_TOO_MANY_ADDRESSES: - return WSAENOBUFS; - - case STATUS_SHARING_VIOLATION: - case STATUS_ADDRESS_ALREADY_EXISTS: - return WSAEADDRINUSE; - - case STATUS_LINK_TIMEOUT: - case STATUS_IO_TIMEOUT: - case STATUS_TIMEOUT: - return WSAETIMEDOUT; - - case STATUS_GRACEFUL_DISCONNECT: - return WSAEDISCON; - - case STATUS_REMOTE_DISCONNECT: - case STATUS_CONNECTION_RESET: - case STATUS_LINK_FAILED: - case STATUS_CONNECTION_DISCONNECTED: - case STATUS_PORT_UNREACHABLE: - return WSAECONNRESET; - - case STATUS_LOCAL_DISCONNECT: - case STATUS_TRANSACTION_ABORTED: - case STATUS_CONNECTION_ABORTED: - return WSAECONNABORTED; - - case STATUS_BAD_NETWORK_PATH: - case STATUS_NETWORK_UNREACHABLE: - case STATUS_PROTOCOL_UNREACHABLE: - return WSAENETUNREACH; - - case STATUS_HOST_UNREACHABLE: - return WSAEHOSTUNREACH; - - case STATUS_CANCELLED: - case STATUS_REQUEST_ABORTED: - return WSAEINTR; - - case STATUS_BUFFER_OVERFLOW: - case STATUS_INVALID_BUFFER_SIZE: - return WSAEMSGSIZE; - - case STATUS_BUFFER_TOO_SMALL: - case STATUS_ACCESS_VIOLATION: - return WSAEFAULT; - - case STATUS_DEVICE_NOT_READY: - case STATUS_REQUEST_NOT_ACCEPTED: - return WSAEWOULDBLOCK; - - case STATUS_INVALID_NETWORK_RESPONSE: - case STATUS_NETWORK_BUSY: - case STATUS_NO_SUCH_DEVICE: - case STATUS_NO_SUCH_FILE: - case STATUS_OBJECT_PATH_NOT_FOUND: - case STATUS_OBJECT_NAME_NOT_FOUND: - case STATUS_UNEXPECTED_NETWORK_ERROR: - return WSAENETDOWN; - - case STATUS_INVALID_CONNECTION: - return WSAENOTCONN; - - case STATUS_REMOTE_NOT_LISTENING: - case STATUS_CONNECTION_REFUSED: - return WSAECONNREFUSED; - - case STATUS_PIPE_DISCONNECTED: - return WSAESHUTDOWN; - - case STATUS_INVALID_ADDRESS: - case STATUS_INVALID_ADDRESS_COMPONENT: - return WSAEADDRNOTAVAIL; - - case STATUS_NOT_SUPPORTED: - case STATUS_NOT_IMPLEMENTED: - return WSAEOPNOTSUPP; - - case STATUS_ACCESS_DENIED: - return WSAEACCES; - - default: - - if ( NT_SUCCESS(Status) ) { - - return NO_ERROR; - } - - - case STATUS_UNSUCCESSFUL: - case STATUS_INVALID_PARAMETER: - case STATUS_ADDRESS_CLOSED: - case STATUS_CONNECTION_INVALID: - case STATUS_ADDRESS_ALREADY_ASSOCIATED: - case STATUS_ADDRESS_NOT_ASSOCIATED: - case STATUS_CONNECTION_ACTIVE: - case STATUS_INVALID_DEVICE_STATE: - case STATUS_INVALID_DEVICE_REQUEST: - return WSAEINVAL; - } -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -NtStatusToSocketError(IN NTSTATUS Status) -{ - switch (Status) - { - case STATUS_PENDING: - return ERROR_IO_PENDING; - - case STATUS_INVALID_HANDLE: - case STATUS_OBJECT_TYPE_MISMATCH: - return WSAENOTSOCK; - - case STATUS_INSUFFICIENT_RESOURCES: - case STATUS_PAGEFILE_QUOTA: - case STATUS_COMMITMENT_LIMIT: - case STATUS_WORKING_SET_QUOTA: - case STATUS_NO_MEMORY: - case STATUS_CONFLICTING_ADDRESSES: - case STATUS_QUOTA_EXCEEDED: - case STATUS_TOO_MANY_PAGING_FILES: - case STATUS_REMOTE_RESOURCES: - case STATUS_TOO_MANY_ADDRESSES: - return WSAENOBUFS; - - case STATUS_SHARING_VIOLATION: - case STATUS_ADDRESS_ALREADY_EXISTS: - return WSAEADDRINUSE; - - case STATUS_LINK_TIMEOUT: - case STATUS_IO_TIMEOUT: - case STATUS_TIMEOUT: - return WSAETIMEDOUT; - - case STATUS_GRACEFUL_DISCONNECT: - return WSAEDISCON; - - case STATUS_REMOTE_DISCONNECT: - case STATUS_CONNECTION_RESET: - case STATUS_LINK_FAILED: - case STATUS_CONNECTION_DISCONNECTED: - case STATUS_PORT_UNREACHABLE: - return WSAECONNRESET; - - case STATUS_LOCAL_DISCONNECT: - case STATUS_TRANSACTION_ABORTED: - case STATUS_CONNECTION_ABORTED: - return WSAECONNABORTED; - - case STATUS_BAD_NETWORK_PATH: - case STATUS_NETWORK_UNREACHABLE: - case STATUS_PROTOCOL_UNREACHABLE: - return WSAENETUNREACH; - - case STATUS_HOST_UNREACHABLE: - return WSAEHOSTUNREACH; - - case STATUS_CANCELLED: - case STATUS_REQUEST_ABORTED: - return WSAEINTR; - - case STATUS_BUFFER_OVERFLOW: - case STATUS_INVALID_BUFFER_SIZE: - return WSAEMSGSIZE; - - case STATUS_BUFFER_TOO_SMALL: - case STATUS_ACCESS_VIOLATION: - return WSAEFAULT; - - case STATUS_DEVICE_NOT_READY: - case STATUS_REQUEST_NOT_ACCEPTED: - return WSAEWOULDBLOCK; - - case STATUS_INVALID_NETWORK_RESPONSE: - case STATUS_NETWORK_BUSY: - case STATUS_NO_SUCH_DEVICE: - case STATUS_NO_SUCH_FILE: - case STATUS_OBJECT_PATH_NOT_FOUND: - case STATUS_OBJECT_NAME_NOT_FOUND: - case STATUS_UNEXPECTED_NETWORK_ERROR: - return WSAENETDOWN; - - case STATUS_INVALID_CONNECTION: - return WSAENOTCONN; - - case STATUS_REMOTE_NOT_LISTENING: - case STATUS_CONNECTION_REFUSED: - return WSAECONNREFUSED; - - case STATUS_PIPE_DISCONNECTED: - return WSAESHUTDOWN; - - case STATUS_INVALID_ADDRESS: - case STATUS_INVALID_ADDRESS_COMPONENT: - return WSAEADDRNOTAVAIL; - - case STATUS_NOT_SUPPORTED: - case STATUS_NOT_IMPLEMENTED: - return WSAEOPNOTSUPP; - - case STATUS_ACCESS_DENIED: - return WSAEACCES; - - default: - - if ( NT_SUCCESS(Status) ) { - - return NO_ERROR; - } - - - case STATUS_UNSUCCESSFUL: - case STATUS_INVALID_PARAMETER: - case STATUS_ADDRESS_CLOSED: - case STATUS_CONNECTION_INVALID: - case STATUS_ADDRESS_ALREADY_ASSOCIATED: - case STATUS_ADDRESS_NOT_ASSOCIATED: - case STATUS_CONNECTION_ACTIVE: - case STATUS_INVALID_DEVICE_STATE: - case STATUS_INVALID_DEVICE_REQUEST: - return WSAEINVAL; - } -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -NtStatusToSocketError(IN NTSTATUS Status) -{ - switch (Status) - { - case STATUS_PENDING: - return ERROR_IO_PENDING; - - case STATUS_INVALID_HANDLE: - case STATUS_OBJECT_TYPE_MISMATCH: - return WSAENOTSOCK; - - case STATUS_INSUFFICIENT_RESOURCES: - case STATUS_PAGEFILE_QUOTA: - case STATUS_COMMITMENT_LIMIT: - case STATUS_WORKING_SET_QUOTA: - case STATUS_NO_MEMORY: - case STATUS_CONFLICTING_ADDRESSES: - case STATUS_QUOTA_EXCEEDED: - case STATUS_TOO_MANY_PAGING_FILES: - case STATUS_REMOTE_RESOURCES: - case STATUS_TOO_MANY_ADDRESSES: - return WSAENOBUFS; - - case STATUS_SHARING_VIOLATION: - case STATUS_ADDRESS_ALREADY_EXISTS: - return WSAEADDRINUSE; - - case STATUS_LINK_TIMEOUT: - case STATUS_IO_TIMEOUT: - case STATUS_TIMEOUT: - return WSAETIMEDOUT; - - case STATUS_GRACEFUL_DISCONNECT: - return WSAEDISCON; - - case STATUS_REMOTE_DISCONNECT: - case STATUS_CONNECTION_RESET: - case STATUS_LINK_FAILED: - case STATUS_CONNECTION_DISCONNECTED: - case STATUS_PORT_UNREACHABLE: - return WSAECONNRESET; - - case STATUS_LOCAL_DISCONNECT: - case STATUS_TRANSACTION_ABORTED: - case STATUS_CONNECTION_ABORTED: - return WSAECONNABORTED; - - case STATUS_BAD_NETWORK_PATH: - case STATUS_NETWORK_UNREACHABLE: - case STATUS_PROTOCOL_UNREACHABLE: - return WSAENETUNREACH; - - case STATUS_HOST_UNREACHABLE: - return WSAEHOSTUNREACH; - - case STATUS_CANCELLED: - case STATUS_REQUEST_ABORTED: - return WSAEINTR; - - case STATUS_BUFFER_OVERFLOW: - case STATUS_INVALID_BUFFER_SIZE: - return WSAEMSGSIZE; - - case STATUS_BUFFER_TOO_SMALL: - case STATUS_ACCESS_VIOLATION: - return WSAEFAULT; - - case STATUS_DEVICE_NOT_READY: - case STATUS_REQUEST_NOT_ACCEPTED: - return WSAEWOULDBLOCK; - - case STATUS_INVALID_NETWORK_RESPONSE: - case STATUS_NETWORK_BUSY: - case STATUS_NO_SUCH_DEVICE: - case STATUS_NO_SUCH_FILE: - case STATUS_OBJECT_PATH_NOT_FOUND: - case STATUS_OBJECT_NAME_NOT_FOUND: - case STATUS_UNEXPECTED_NETWORK_ERROR: - return WSAENETDOWN; - - case STATUS_INVALID_CONNECTION: - return WSAENOTCONN; - - case STATUS_REMOTE_NOT_LISTENING: - case STATUS_CONNECTION_REFUSED: - return WSAECONNREFUSED; - - case STATUS_PIPE_DISCONNECTED: - return WSAESHUTDOWN; - - case STATUS_INVALID_ADDRESS: - case STATUS_INVALID_ADDRESS_COMPONENT: - return WSAEADDRNOTAVAIL; - - case STATUS_NOT_SUPPORTED: - case STATUS_NOT_IMPLEMENTED: - return WSAEOPNOTSUPP; - - case STATUS_ACCESS_DENIED: - return WSAEACCES; - - default: - - if ( NT_SUCCESS(Status) ) { - - return NO_ERROR; - } - - - case STATUS_UNSUCCESSFUL: - case STATUS_INVALID_PARAMETER: - case STATUS_ADDRESS_CLOSED: - case STATUS_CONNECTION_INVALID: - case STATUS_ADDRESS_ALREADY_ASSOCIATED: - case STATUS_ADDRESS_NOT_ASSOCIATED: - case STATUS_CONNECTION_ACTIVE: - case STATUS_INVALID_DEVICE_STATE: - case STATUS_INVALID_DEVICE_REQUEST: - return WSAEINVAL; - } -} - diff --git a/dll/win32/mswsock/msafd/socket.c b/dll/win32/mswsock/msafd/socket.c index 61e491d57e0..02a1c2c6dde 100644 --- a/dll/win32/mswsock/msafd/socket.c +++ b/dll/win32/mswsock/msafd/socket.c @@ -797,2400 +797,3 @@ WSPCloseSocket(IN SOCKET Handle, return NO_ERROR; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -SockSocket(INT AddressFamily, - INT SocketType, - INT Protocol, - LPGUID ProviderId, - GROUP g, - DWORD dwFlags, - DWORD ProviderFlags, - DWORD ServiceFlags, - DWORD CatalogEntryId, - PSOCKET_INFORMATION *NewSocket) -{ - INT ErrorCode; - UNICODE_STRING TransportName; - PVOID HelperDllContext; - PHELPER_DATA HelperData = NULL; - DWORD HelperEvents; - PFILE_FULL_EA_INFORMATION Ea = NULL; - PAFD_CREATE_PACKET AfdPacket; - SOCKET Handle = INVALID_SOCKET; - PSOCKET_INFORMATION Socket = NULL; - BOOLEAN LockInit = FALSE; - USHORT SizeOfPacket; - DWORD SizeOfEa, SocketLength; - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING DevName; - LARGE_INTEGER GroupData; - DWORD CreateOptions = 0; - IO_STATUS_BLOCK IoStatusBlock; - PWAH_HANDLE WahHandle; - NTSTATUS Status; - CHAR AfdPacketBuffer[96]; - - /* Initialize the transport name */ - RtlInitUnicodeString(&TransportName, NULL); - - /* Get Helper Data and Transport */ - ErrorCode = SockGetTdiName(&AddressFamily, - &SocketType, - &Protocol, - ProviderId, - g, - dwFlags, - &TransportName, - &HelperDllContext, - &HelperData, - &HelperEvents); - - /* Check for error */ - if (ErrorCode != NO_ERROR) goto error; - - /* Figure out the socket context structure size */ - SocketLength = sizeof(*Socket) + (HelperData->MinWSAddressLength * 2); - - /* Allocate a socket */ - Socket = SockAllocateHeapRoutine(SockPrivateHeap, 0, SocketLength); - if (!Socket) - { - /* Couldn't create it; we need to tell WSH so it can cleanup */ - if (HelperEvents & WSH_NOTIFY_CLOSE) - { - HelperData->WSHNotify(HelperDllContext, - INVALID_SOCKET, - NULL, - NULL, - WSH_NOTIFY_CLOSE); - } - - /* Fail and return */ - ErrorCode = WSAENOBUFS; - goto error; - } - - /* Initialize it */ - RtlZeroMemory(Socket, SocketLength); - Socket->RefCount = 2; - Socket->Handle = INVALID_SOCKET; - Socket->SharedData.State = SocketUndefined; - Socket->SharedData.AddressFamily = AddressFamily; - Socket->SharedData.SocketType = SocketType; - Socket->SharedData.Protocol = Protocol; - Socket->ProviderId = *ProviderId; - Socket->HelperContext = HelperDllContext; - Socket->HelperData = HelperData; - Socket->HelperEvents = HelperEvents; - Socket->LocalAddress = (PVOID)(Socket + 1); - Socket->SharedData.SizeOfLocalAddress = HelperData->MaxWSAddressLength; - Socket->RemoteAddress = (PVOID)((ULONG_PTR)Socket->LocalAddress + - HelperData->MaxWSAddressLength); - Socket->SharedData.SizeOfRemoteAddress = HelperData->MaxWSAddressLength; - Socket->SharedData.UseDelayedAcceptance = HelperData->UseDelayedAcceptance; - Socket->SharedData.CreateFlags = dwFlags; - Socket->SharedData.CatalogEntryId = CatalogEntryId; - Socket->SharedData.ServiceFlags1 = ServiceFlags; - Socket->SharedData.ProviderFlags = ProviderFlags; - Socket->SharedData.GroupID = g; - Socket->SharedData.GroupType = 0; - Socket->SharedData.UseSAN = FALSE; - Socket->SanData = NULL; - Socket->DontUseSan = FALSE; - - /* Initialize the socket lock */ - InitializeCriticalSection(&Socket->Lock); - LockInit = TRUE; - - /* Packet Size */ - SizeOfPacket = TransportName.Length + sizeof(*AfdPacket) + sizeof(WCHAR); - - /* EA Size */ - SizeOfEa = SizeOfPacket + sizeof(*Ea) + AFD_PACKET_COMMAND_LENGTH; - - /* See if our stack buffer is big enough to hold it */ - if (SizeOfEa <= sizeof(AfdPacketBuffer)) - { - /* Use our stack */ - Ea = (PFILE_FULL_EA_INFORMATION)AfdPacketBuffer; - } - else - { - /* Allocate from heap */ - Ea = SockAllocateHeapRoutine(SockPrivateHeap, 0, SizeOfEa); - if (!Ea) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - } - - /* Set up EA */ - Ea->NextEntryOffset = 0; - Ea->Flags = 0; - Ea->EaNameLength = AFD_PACKET_COMMAND_LENGTH; - RtlCopyMemory(Ea->EaName, AfdCommand, AFD_PACKET_COMMAND_LENGTH + 1); - Ea->EaValueLength = SizeOfPacket; - - /* Set up AFD Packet */ - AfdPacket = (PAFD_CREATE_PACKET)(Ea->EaName + Ea->EaNameLength + 1); - AfdPacket->SizeOfTransportName = TransportName.Length; - RtlCopyMemory(AfdPacket->TransportName, - TransportName.Buffer, - TransportName.Length + sizeof(WCHAR)); - AfdPacket->EndpointFlags = 0; - - /* Set up Endpoint Flags */ - if ((Socket->SharedData.ServiceFlags1 & XP1_CONNECTIONLESS)) - { - /* Check the Socket Type */ - if ((SocketType != SOCK_DGRAM) && (SocketType != SOCK_RAW)) - { - /* Only RAW or UDP can be Connectionless */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Set the flag for AFD */ - AfdPacket->EndpointFlags |= AFD_ENDPOINT_CONNECTIONLESS; - } - - if ((Socket->SharedData.ServiceFlags1 & XP1_MESSAGE_ORIENTED)) - { - /* Check if this is a Stream Socket */ - if (SocketType == SOCK_STREAM) - { - /* Check if we actually support this */ - if (!(Socket->SharedData.ServiceFlags1 & XP1_PSEUDO_STREAM)) - { - /* The Provider doesn't support Message Oriented Streams */ - ErrorCode = WSAEINVAL; - goto error; - } - } - - /* Set the flag for AFD */ - AfdPacket->EndpointFlags |= AFD_ENDPOINT_MESSAGE_ORIENTED; - } - - /* If this is a Raw Socket, let AFD know */ - if (SocketType == SOCK_RAW) AfdPacket->EndpointFlags |= AFD_ENDPOINT_RAW; - - /* Check if we are a Multipoint Control/Data Root or Leaf */ - if (dwFlags & (WSA_FLAG_MULTIPOINT_C_ROOT | - WSA_FLAG_MULTIPOINT_C_LEAF | - WSA_FLAG_MULTIPOINT_D_ROOT | - WSA_FLAG_MULTIPOINT_D_LEAF)) - { - /* First make sure we support Multipoint */ - if (!(Socket->SharedData.ServiceFlags1 & XP1_SUPPORT_MULTIPOINT)) - { - /* The Provider doesn't actually support Multipoint */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Set the flag for AFD */ - AfdPacket->EndpointFlags |= AFD_ENDPOINT_MULTIPOINT; - - /* Check if we are a Control Plane Root */ - if (dwFlags & WSA_FLAG_MULTIPOINT_C_ROOT) - { - /* Check if we actually support this or if we're already a leaf */ - if ((!(Socket->SharedData.ServiceFlags1 & - XP1_MULTIPOINT_CONTROL_PLANE)) || - ((dwFlags & WSA_FLAG_MULTIPOINT_C_LEAF))) - { - ErrorCode = WSAEINVAL; - goto error; - } - - /* Set the flag for AFD */ - AfdPacket->EndpointFlags |= AFD_ENDPOINT_C_ROOT; - } - - /* Check if we a Data Plane Root */ - if (dwFlags & WSA_FLAG_MULTIPOINT_D_ROOT) - { - /* Check if we actually support this or if we're already a leaf */ - if ((!(Socket->SharedData.ServiceFlags1 & - XP1_MULTIPOINT_DATA_PLANE)) || - ((dwFlags & WSA_FLAG_MULTIPOINT_D_LEAF))) - { - ErrorCode = WSAEINVAL; - goto error; - } - - /* Set the flag for AFD */ - AfdPacket->EndpointFlags |= AFD_ENDPOINT_D_ROOT; - } - } - - /* Set the group ID */ - AfdPacket->GroupID = g; - - /* Set up Object Attributes */ - RtlInitUnicodeString(&DevName, L"\\Device\\Afd\\Endpoint"); - InitializeObjectAttributes(&ObjectAttributes, - &DevName, - OBJ_CASE_INSENSITIVE | OBJ_INHERIT, - NULL, - NULL); - - /* Check if we're not using Overlapped I/O */ - if (!(dwFlags & WSA_FLAG_OVERLAPPED)) - { - /* Set Synchronous I/O */ - CreateOptions = FILE_SYNCHRONOUS_IO_NONALERT; - } - - /* Acquire the global lock */ - SockAcquireRwLockShared(&SocketGlobalLock); - - /* Create the Socket */ - Status = NtCreateFile((PHANDLE)&Handle, - GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, - &ObjectAttributes, - &IoStatusBlock, - NULL, - 0, - FILE_SHARE_READ | FILE_SHARE_WRITE, - FILE_OPEN_IF, - CreateOptions, - Ea, - SizeOfEa); - if (!NT_SUCCESS(Status)) - { - /* Release the lock and fail */ - SockReleaseRwLockShared(&SocketGlobalLock); - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Save Handle */ - Socket->Handle = Handle; - - /* Check if a group was given */ - if (g != 0) - { - /* Get Group Id and Type */ - ErrorCode = SockGetInformation(Socket, - AFD_INFO_GROUP_ID_TYPE, - NULL, - 0, - NULL, - NULL, - &GroupData); - - /* Save them */ - Socket->SharedData.GroupID = GroupData.u.LowPart; - Socket->SharedData.GroupType = GroupData.u.HighPart; - } - - /* Check if we need to get the window sizes */ - if (!SockSendBufferWindow) - { - /* Get send window size */ - SockGetInformation(Socket, - AFD_INFO_SEND_WINDOW_SIZE, - NULL, - 0, - NULL, - &SockSendBufferWindow, - NULL); - - /* Get receive window size */ - SockGetInformation(Socket, - AFD_INFO_RECEIVE_WINDOW_SIZE, - NULL, - 0, - NULL, - &SockReceiveBufferWindow, - NULL); - } - - /* Save window sizes */ - Socket->SharedData.SizeOfRecvBuffer = SockReceiveBufferWindow; - Socket->SharedData.SizeOfSendBuffer = SockSendBufferWindow; - - /* Insert it into our table */ - WahHandle = WahInsertHandleContext(SockContextTable, &Socket->WshContext); - - /* We can release the lock now */ - SockReleaseRwLockShared(&SocketGlobalLock); - - /* Check if the handles don't match for some reason */ - if (WahHandle != &Socket->WshContext) - { - /* Do they not match? */ - if (WahHandle) - { - /* They don't... someone must've used CloseHandle */ - SockDereferenceSocket((PSOCKET_INFORMATION)WahHandle); - - /* Use the correct handle now */ - WahHandle = &Socket->WshContext; - } - else - { - /* It's not that they don't match: we don't have one at all! */ - ErrorCode = WSAENOBUFS; - goto error; - } - } - -error: - /* Check if we can free the transport name */ - if ((SocketType == SOCK_RAW) && (TransportName.Buffer)) - { - /* Free it */ - RtlFreeHeap(RtlGetProcessHeap(), 0, TransportName.Buffer); - } - - /* Check if we have the EA from the heap */ - if ((Ea) && (Ea != (PVOID)AfdPacketBuffer)) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, Ea); - } - - /* Check if this is actually success */ - if (ErrorCode != NO_ERROR) - { - /* Check if we have a socket by now */ - if (Socket) - { - /* Tell the Helper DLL we're closing it */ - SockNotifyHelperDll(Socket, WSH_NOTIFY_CLOSE); - - /* Close its handle if it's valid */ - if (Socket->WshContext.Handle != INVALID_HANDLE_VALUE) - { - NtClose(Socket->WshContext.Handle); - } - - /* Delete its lock */ - if (LockInit) DeleteCriticalSection(&Socket->Lock); - - /* Remove our socket reference */ - SockDereferenceSocket(Socket); - - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, Socket); - } - } - - /* Return Socket and error code */ - *NewSocket = Socket; - return ErrorCode; -} - -INT -WSPAPI -SockCloseSocket(IN PSOCKET_INFORMATION Socket) -{ - INT ErrorCode; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - IO_STATUS_BLOCK IoStatusBlock; - NTSTATUS Status; - AFD_DISCONNECT_INFO DisconnectInfo; - SOCKET_STATE OldState; - ULONG LingerWait; - ULONG SendsInProgress; - ULONG SleepWait; - BOOLEAN ActiveConnect; - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* If a Close is already in Process... */ - if (Socket->SharedData.State == SocketClosed) - { - /* Release lock and fail */ - LeaveCriticalSection(&Socket->Lock); - return WSAENOTSOCK; - } - - /* Save the old state and set the new one to closed */ - OldState = Socket->SharedData.State; - Socket->SharedData.State = SocketClosed; - - /* Check if the socket has an active async data */ - ActiveConnect = (Socket->AsyncData != NULL); - - /* We're done with the socket, release the lock */ - LeaveCriticalSection(&Socket->Lock); - - /* - * If SO_LINGER is ON and the Socket was connected or had an active async - * connect context, then we'll disconnect it. Note that we won't do this - * for connection-less (UDP/RAW) sockets or if a send shutdown is active. - */ - if ((OldState == SocketConnected || ActiveConnect) && - !(Socket->SharedData.SendShutdown) && - !MSAFD_IS_DGRAM_SOCK(Socket) && - (Socket->SharedData.LingerData.l_onoff)) - { - /* We need to respect the timeout */ - SleepWait = 100; - LingerWait = Socket->SharedData.LingerData.l_linger * 1000; - - /* Loop until no more sends are pending, within the timeout */ - while (LingerWait) - { - /* Find out how many Sends are in Progress */ - if (SockGetInformation(Socket, - AFD_INFO_SENDS_IN_PROGRESS, - NULL, - 0, - NULL, - &SendsInProgress, - NULL)) - { - /* Bail out if anything but NO_ERROR */ - LingerWait = 0; - break; - } - - /* Bail out if no more sends are pending */ - if (!SendsInProgress) break; - - /* - * We have to execute a sleep, so it's kind of like - * a block. If the socket is Nonblock, we cannot - * go on since asyncronous operation is expected - * and we cannot offer it - */ - if (Socket->SharedData.NonBlocking) - { - /* Acquire the socket lock */ - EnterCriticalSection(&Socket->Lock); - - /* Restore the socket state */ - Socket->SharedData.State = OldState; - - /* Release the lock again */ - LeaveCriticalSection(&Socket->Lock); - - /* Fail with error code */ - return WSAEWOULDBLOCK; - } - - /* Now we can sleep, and decrement the linger wait */ - /* - * FIXME: It seems Windows does some funky acceleration - * since the waiting seems to be longer and longer. I - * don't think this improves performance so much, so we - * wait a fixed time instead. - */ - Sleep(SleepWait); - LingerWait -= SleepWait; - } - - /* - * We have reached the timeout or sends are over. - * Disconnect if the timeout has been reached. - */ - if (LingerWait <= 0) - { - /* There is no timeout, and this is an abortive disconnect */ - DisconnectInfo.Timeout = RtlConvertLongToLargeInteger(0); - DisconnectInfo.DisconnectType = AFD_DISCONNECT_ABORT; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_DISCONNECT, - &DisconnectInfo, - sizeof(DisconnectInfo), - NULL, - 0); - /* Check if the operation is pending */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - !Socket->SharedData.LingerData.l_onoff ? - NO_BLOCKING_HOOK : ALWAYS_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* We actually accept errors, unless the driver wasn't ready */ - if (Status == STATUS_DEVICE_NOT_READY) - { - /* This is the equivalent of a WOULDBLOCK, which we fail */ - /* Acquire the socket lock */ - EnterCriticalSection(&Socket->Lock); - - /* Restore the socket state */ - Socket->SharedData.State = OldState; - - /* Release the lock again */ - LeaveCriticalSection(&Socket->Lock); - - /* Fail with error code */ - return WSAEWOULDBLOCK; - } - } - } - - /* Acquire the global lock to protect the handle table */ - SockAcquireRwLockShared(&SocketGlobalLock); - - /* Protect the socket too */ - EnterCriticalSection(&Socket->Lock); - - /* Notify the Helper DLL of Socket Closure */ - ErrorCode = SockNotifyHelperDll(Socket, WSH_NOTIFY_CLOSE); - - /* Cleanup Time! */ - Socket->HelperContext = NULL; - Socket->SharedData.AsyncDisabledEvents = -1; - if (Socket->TdiAddressHandle) - { - /* Close and forget the handle */ - NtClose(Socket->TdiAddressHandle); - Socket->TdiAddressHandle = NULL; - } - if (Socket->TdiConnectionHandle) - { - /* Close and forget the handle */ - NtClose(Socket->TdiConnectionHandle); - Socket->TdiConnectionHandle = NULL; - } - - /* Remove the handle from the table */ - ErrorCode = WahRemoveHandleContext(SockContextTable, &Socket->WshContext); - if (ErrorCode == NO_ERROR) - { - /* Close the socket's handle */ - NtClose(Socket->WshContext.Handle); - - /* Dereference the socket */ - SockDereferenceSocket(Socket); - } - else - { - /* This isn't a socket anymore, or something */ - ErrorCode = WSAENOTSOCK; - } - - /* Release both locks */ - LeaveCriticalSection(&Socket->Lock); - SockReleaseRwLockShared(&SocketGlobalLock); - - /* Return success */ - return ErrorCode; -} - -SOCKET -WSPAPI -WSPSocket(INT AddressFamily, - INT SocketType, - INT Protocol, - LPWSAPROTOCOL_INFOW lpProtocolInfo, - GROUP g, - DWORD dwFlags, - LPINT lpErrno) -{ - DWORD CatalogId; - SOCKET Handle = INVALID_SOCKET; - INT ErrorCode; - DWORD ServiceFlags, ProviderFlags; - PWINSOCK_TEB_DATA ThreadData; - PSOCKET_INFORMATION Socket; - GUID ProviderId; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return INVALID_SOCKET; - } - - /* Get the catalog ID */ - CatalogId = lpProtocolInfo->dwCatalogEntryId; - - /* Check if this is a duplication */ - if(lpProtocolInfo->dwProviderReserved) - { - /* Get the duplicate handle */ - Handle = (SOCKET)lpProtocolInfo->dwProviderReserved; - - /* Get our structure for it */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if(Socket) - { - /* Tell Winsock about it */ - Socket->Handle = SockUpcallTable->lpWPUModifyIFSHandle(CatalogId, - Handle, - &ErrorCode); - /* Check if we got an invalid handle back */ - if(Socket->Handle == INVALID_SOCKET) - { - /* Restore it for the error path */ - Socket->Handle = Handle; - } - } - else - { - /* The duplicate handle is invalid */ - ErrorCode = WSAEINVAL; - } - - /* Fail */ - goto error; - } - - /* See if the address family should be recovered from the protocl info */ - if (!AddressFamily || AddressFamily == FROM_PROTOCOL_INFO) - { - /* Use protocol info data */ - AddressFamily = lpProtocolInfo->iAddressFamily; - } - - /* See if the address family should be recovered from the protocl info */ - if(!SocketType || SocketType == FROM_PROTOCOL_INFO ) - { - /* Use protocol info data */ - SocketType = lpProtocolInfo->iSocketType; - } - - /* See if the address family should be recovered from the protocl info */ - if(Protocol == FROM_PROTOCOL_INFO) - { - /* Use protocol info data */ - Protocol = lpProtocolInfo->iProtocol; - } - - /* Save the service, provider flags and provider ID */ - ServiceFlags = lpProtocolInfo->dwServiceFlags1; - ProviderFlags = lpProtocolInfo->dwProviderFlags; - ProviderId = lpProtocolInfo->ProviderId; - - /* Create the actual socket */ - ErrorCode = SockSocket(AddressFamily, - SocketType, - Protocol, - &ProviderId, - g, - dwFlags, - ProviderFlags, - ServiceFlags, - CatalogId, - &Socket); - if (ErrorCode == ERROR_SUCCESS) - { - /* Acquire the socket lock */ - EnterCriticalSection(&Socket->Lock); - - /* Set status to opened */ - Socket->SharedData.State = SocketOpen; - - /* Create the Socket Context */ - ErrorCode = SockSetHandleContext(Socket); - if (ErrorCode != NO_ERROR) - { - /* Release the lock, close the socket and fail */ - LeaveCriticalSection(&Socket->Lock); - SockCloseSocket(Socket); - goto error; - } - - /* Notify Winsock */ - Handle = SockUpcallTable->lpWPUModifyIFSHandle(Socket->SharedData.CatalogEntryId, - (SOCKET)Socket->WshContext.Handle, - &ErrorCode); - - /* Does Winsock not like it? */ - if (Handle == INVALID_SOCKET) - { - /* Release the lock, close the socket and fail */ - LeaveCriticalSection(&Socket->Lock); - SockCloseSocket(Socket); - goto error; - } - - /* Release the lock */ - LeaveCriticalSection(&Socket->Lock); - } - -error: - /* Write return code */ - *lpErrno = ErrorCode; - - /* Check if we have a socket and dereference it */ - if (Socket) SockDereferenceSocket(Socket); - - /* Return handle */ - return Handle; -} - -INT -WSPAPI -WSPCloseSocket(IN SOCKET Handle, - OUT LPINT lpErrno) -{ - INT ErrorCode; - PSOCKET_INFORMATION Socket; - PWINSOCK_TEB_DATA ThreadData; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - *lpErrno = WSAENOTSOCK; - return SOCKET_ERROR; - } - - /* Close it */ - ErrorCode = SockCloseSocket(Socket); - - /* Remove the final reference */ - SockDereferenceSocket(Socket); - - /* Check if we got here by error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -SockSocket(INT AddressFamily, - INT SocketType, - INT Protocol, - LPGUID ProviderId, - GROUP g, - DWORD dwFlags, - DWORD ProviderFlags, - DWORD ServiceFlags, - DWORD CatalogEntryId, - PSOCKET_INFORMATION *NewSocket) -{ - INT ErrorCode; - UNICODE_STRING TransportName; - PVOID HelperDllContext; - PHELPER_DATA HelperData = NULL; - DWORD HelperEvents; - PFILE_FULL_EA_INFORMATION Ea = NULL; - PAFD_CREATE_PACKET AfdPacket; - SOCKET Handle = INVALID_SOCKET; - PSOCKET_INFORMATION Socket = NULL; - BOOLEAN LockInit = FALSE; - USHORT SizeOfPacket; - DWORD SizeOfEa, SocketLength; - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING DevName; - LARGE_INTEGER GroupData; - DWORD CreateOptions = 0; - IO_STATUS_BLOCK IoStatusBlock; - PWAH_HANDLE WahHandle; - NTSTATUS Status; - CHAR AfdPacketBuffer[96]; - - /* Initialize the transport name */ - RtlInitUnicodeString(&TransportName, NULL); - - /* Get Helper Data and Transport */ - ErrorCode = SockGetTdiName(&AddressFamily, - &SocketType, - &Protocol, - ProviderId, - g, - dwFlags, - &TransportName, - &HelperDllContext, - &HelperData, - &HelperEvents); - - /* Check for error */ - if (ErrorCode != NO_ERROR) goto error; - - /* Figure out the socket context structure size */ - SocketLength = sizeof(*Socket) + (HelperData->MinWSAddressLength * 2); - - /* Allocate a socket */ - Socket = SockAllocateHeapRoutine(SockPrivateHeap, 0, SocketLength); - if (!Socket) - { - /* Couldn't create it; we need to tell WSH so it can cleanup */ - if (HelperEvents & WSH_NOTIFY_CLOSE) - { - HelperData->WSHNotify(HelperDllContext, - INVALID_SOCKET, - NULL, - NULL, - WSH_NOTIFY_CLOSE); - } - - /* Fail and return */ - ErrorCode = WSAENOBUFS; - goto error; - } - - /* Initialize it */ - RtlZeroMemory(Socket, SocketLength); - Socket->RefCount = 2; - Socket->Handle = INVALID_SOCKET; - Socket->SharedData.State = SocketUndefined; - Socket->SharedData.AddressFamily = AddressFamily; - Socket->SharedData.SocketType = SocketType; - Socket->SharedData.Protocol = Protocol; - Socket->ProviderId = *ProviderId; - Socket->HelperContext = HelperDllContext; - Socket->HelperData = HelperData; - Socket->HelperEvents = HelperEvents; - Socket->LocalAddress = (PVOID)(Socket + 1); - Socket->SharedData.SizeOfLocalAddress = HelperData->MaxWSAddressLength; - Socket->RemoteAddress = (PVOID)((ULONG_PTR)Socket->LocalAddress + - HelperData->MaxWSAddressLength); - Socket->SharedData.SizeOfRemoteAddress = HelperData->MaxWSAddressLength; - Socket->SharedData.UseDelayedAcceptance = HelperData->UseDelayedAcceptance; - Socket->SharedData.CreateFlags = dwFlags; - Socket->SharedData.CatalogEntryId = CatalogEntryId; - Socket->SharedData.ServiceFlags1 = ServiceFlags; - Socket->SharedData.ProviderFlags = ProviderFlags; - Socket->SharedData.GroupID = g; - Socket->SharedData.GroupType = 0; - Socket->SharedData.UseSAN = FALSE; - Socket->SanData = NULL; - Socket->DontUseSan = FALSE; - - /* Initialize the socket lock */ - InitializeCriticalSection(&Socket->Lock); - LockInit = TRUE; - - /* Packet Size */ - SizeOfPacket = TransportName.Length + sizeof(*AfdPacket) + sizeof(WCHAR); - - /* EA Size */ - SizeOfEa = SizeOfPacket + sizeof(*Ea) + AFD_PACKET_COMMAND_LENGTH; - - /* See if our stack buffer is big enough to hold it */ - if (SizeOfEa <= sizeof(AfdPacketBuffer)) - { - /* Use our stack */ - Ea = (PFILE_FULL_EA_INFORMATION)AfdPacketBuffer; - } - else - { - /* Allocate from heap */ - Ea = SockAllocateHeapRoutine(SockPrivateHeap, 0, SizeOfEa); - if (!Ea) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - } - - /* Set up EA */ - Ea->NextEntryOffset = 0; - Ea->Flags = 0; - Ea->EaNameLength = AFD_PACKET_COMMAND_LENGTH; - RtlCopyMemory(Ea->EaName, AfdCommand, AFD_PACKET_COMMAND_LENGTH + 1); - Ea->EaValueLength = SizeOfPacket; - - /* Set up AFD Packet */ - AfdPacket = (PAFD_CREATE_PACKET)(Ea->EaName + Ea->EaNameLength + 1); - AfdPacket->SizeOfTransportName = TransportName.Length; - RtlCopyMemory(AfdPacket->TransportName, - TransportName.Buffer, - TransportName.Length + sizeof(WCHAR)); - AfdPacket->EndpointFlags = 0; - - /* Set up Endpoint Flags */ - if ((Socket->SharedData.ServiceFlags1 & XP1_CONNECTIONLESS)) - { - /* Check the Socket Type */ - if ((SocketType != SOCK_DGRAM) && (SocketType != SOCK_RAW)) - { - /* Only RAW or UDP can be Connectionless */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Set the flag for AFD */ - AfdPacket->EndpointFlags |= AFD_ENDPOINT_CONNECTIONLESS; - } - - if ((Socket->SharedData.ServiceFlags1 & XP1_MESSAGE_ORIENTED)) - { - /* Check if this is a Stream Socket */ - if (SocketType == SOCK_STREAM) - { - /* Check if we actually support this */ - if (!(Socket->SharedData.ServiceFlags1 & XP1_PSEUDO_STREAM)) - { - /* The Provider doesn't support Message Oriented Streams */ - ErrorCode = WSAEINVAL; - goto error; - } - } - - /* Set the flag for AFD */ - AfdPacket->EndpointFlags |= AFD_ENDPOINT_MESSAGE_ORIENTED; - } - - /* If this is a Raw Socket, let AFD know */ - if (SocketType == SOCK_RAW) AfdPacket->EndpointFlags |= AFD_ENDPOINT_RAW; - - /* Check if we are a Multipoint Control/Data Root or Leaf */ - if (dwFlags & (WSA_FLAG_MULTIPOINT_C_ROOT | - WSA_FLAG_MULTIPOINT_C_LEAF | - WSA_FLAG_MULTIPOINT_D_ROOT | - WSA_FLAG_MULTIPOINT_D_LEAF)) - { - /* First make sure we support Multipoint */ - if (!(Socket->SharedData.ServiceFlags1 & XP1_SUPPORT_MULTIPOINT)) - { - /* The Provider doesn't actually support Multipoint */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Set the flag for AFD */ - AfdPacket->EndpointFlags |= AFD_ENDPOINT_MULTIPOINT; - - /* Check if we are a Control Plane Root */ - if (dwFlags & WSA_FLAG_MULTIPOINT_C_ROOT) - { - /* Check if we actually support this or if we're already a leaf */ - if ((!(Socket->SharedData.ServiceFlags1 & - XP1_MULTIPOINT_CONTROL_PLANE)) || - ((dwFlags & WSA_FLAG_MULTIPOINT_C_LEAF))) - { - ErrorCode = WSAEINVAL; - goto error; - } - - /* Set the flag for AFD */ - AfdPacket->EndpointFlags |= AFD_ENDPOINT_C_ROOT; - } - - /* Check if we a Data Plane Root */ - if (dwFlags & WSA_FLAG_MULTIPOINT_D_ROOT) - { - /* Check if we actually support this or if we're already a leaf */ - if ((!(Socket->SharedData.ServiceFlags1 & - XP1_MULTIPOINT_DATA_PLANE)) || - ((dwFlags & WSA_FLAG_MULTIPOINT_D_LEAF))) - { - ErrorCode = WSAEINVAL; - goto error; - } - - /* Set the flag for AFD */ - AfdPacket->EndpointFlags |= AFD_ENDPOINT_D_ROOT; - } - } - - /* Set the group ID */ - AfdPacket->GroupID = g; - - /* Set up Object Attributes */ - RtlInitUnicodeString(&DevName, L"\\Device\\Afd\\Endpoint"); - InitializeObjectAttributes(&ObjectAttributes, - &DevName, - OBJ_CASE_INSENSITIVE | OBJ_INHERIT, - NULL, - NULL); - - /* Check if we're not using Overlapped I/O */ - if (!(dwFlags & WSA_FLAG_OVERLAPPED)) - { - /* Set Synchronous I/O */ - CreateOptions = FILE_SYNCHRONOUS_IO_NONALERT; - } - - /* Acquire the global lock */ - SockAcquireRwLockShared(&SocketGlobalLock); - - /* Create the Socket */ - Status = NtCreateFile((PHANDLE)&Handle, - GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, - &ObjectAttributes, - &IoStatusBlock, - NULL, - 0, - FILE_SHARE_READ | FILE_SHARE_WRITE, - FILE_OPEN_IF, - CreateOptions, - Ea, - SizeOfEa); - if (!NT_SUCCESS(Status)) - { - /* Release the lock and fail */ - SockReleaseRwLockShared(&SocketGlobalLock); - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Save Handle */ - Socket->Handle = Handle; - - /* Check if a group was given */ - if (g != 0) - { - /* Get Group Id and Type */ - ErrorCode = SockGetInformation(Socket, - AFD_INFO_GROUP_ID_TYPE, - NULL, - 0, - NULL, - NULL, - &GroupData); - - /* Save them */ - Socket->SharedData.GroupID = GroupData.u.LowPart; - Socket->SharedData.GroupType = GroupData.u.HighPart; - } - - /* Check if we need to get the window sizes */ - if (!SockSendBufferWindow) - { - /* Get send window size */ - SockGetInformation(Socket, - AFD_INFO_SEND_WINDOW_SIZE, - NULL, - 0, - NULL, - &SockSendBufferWindow, - NULL); - - /* Get receive window size */ - SockGetInformation(Socket, - AFD_INFO_RECEIVE_WINDOW_SIZE, - NULL, - 0, - NULL, - &SockReceiveBufferWindow, - NULL); - } - - /* Save window sizes */ - Socket->SharedData.SizeOfRecvBuffer = SockReceiveBufferWindow; - Socket->SharedData.SizeOfSendBuffer = SockSendBufferWindow; - - /* Insert it into our table */ - WahHandle = WahInsertHandleContext(SockContextTable, &Socket->WshContext); - - /* We can release the lock now */ - SockReleaseRwLockShared(&SocketGlobalLock); - - /* Check if the handles don't match for some reason */ - if (WahHandle != &Socket->WshContext) - { - /* Do they not match? */ - if (WahHandle) - { - /* They don't... someone must've used CloseHandle */ - SockDereferenceSocket((PSOCKET_INFORMATION)WahHandle); - - /* Use the correct handle now */ - WahHandle = &Socket->WshContext; - } - else - { - /* It's not that they don't match: we don't have one at all! */ - ErrorCode = WSAENOBUFS; - goto error; - } - } - -error: - /* Check if we can free the transport name */ - if ((SocketType == SOCK_RAW) && (TransportName.Buffer)) - { - /* Free it */ - RtlFreeHeap(RtlGetProcessHeap(), 0, TransportName.Buffer); - } - - /* Check if we have the EA from the heap */ - if ((Ea) && (Ea != (PVOID)AfdPacketBuffer)) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, Ea); - } - - /* Check if this is actually success */ - if (ErrorCode != NO_ERROR) - { - /* Check if we have a socket by now */ - if (Socket) - { - /* Tell the Helper DLL we're closing it */ - SockNotifyHelperDll(Socket, WSH_NOTIFY_CLOSE); - - /* Close its handle if it's valid */ - if (Socket->WshContext.Handle != INVALID_HANDLE_VALUE) - { - NtClose(Socket->WshContext.Handle); - } - - /* Delete its lock */ - if (LockInit) DeleteCriticalSection(&Socket->Lock); - - /* Remove our socket reference */ - SockDereferenceSocket(Socket); - - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, Socket); - } - } - - /* Return Socket and error code */ - *NewSocket = Socket; - return ErrorCode; -} - -INT -WSPAPI -SockCloseSocket(IN PSOCKET_INFORMATION Socket) -{ - INT ErrorCode; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - IO_STATUS_BLOCK IoStatusBlock; - NTSTATUS Status; - AFD_DISCONNECT_INFO DisconnectInfo; - SOCKET_STATE OldState; - ULONG LingerWait; - ULONG SendsInProgress; - ULONG SleepWait; - BOOLEAN ActiveConnect; - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* If a Close is already in Process... */ - if (Socket->SharedData.State == SocketClosed) - { - /* Release lock and fail */ - LeaveCriticalSection(&Socket->Lock); - return WSAENOTSOCK; - } - - /* Save the old state and set the new one to closed */ - OldState = Socket->SharedData.State; - Socket->SharedData.State = SocketClosed; - - /* Check if the socket has an active async data */ - ActiveConnect = (Socket->AsyncData != NULL); - - /* We're done with the socket, release the lock */ - LeaveCriticalSection(&Socket->Lock); - - /* - * If SO_LINGER is ON and the Socket was connected or had an active async - * connect context, then we'll disconnect it. Note that we won't do this - * for connection-less (UDP/RAW) sockets or if a send shutdown is active. - */ - if ((OldState == SocketConnected || ActiveConnect) && - !(Socket->SharedData.SendShutdown) && - !MSAFD_IS_DGRAM_SOCK(Socket) && - (Socket->SharedData.LingerData.l_onoff)) - { - /* We need to respect the timeout */ - SleepWait = 100; - LingerWait = Socket->SharedData.LingerData.l_linger * 1000; - - /* Loop until no more sends are pending, within the timeout */ - while (LingerWait) - { - /* Find out how many Sends are in Progress */ - if (SockGetInformation(Socket, - AFD_INFO_SENDS_IN_PROGRESS, - NULL, - 0, - NULL, - &SendsInProgress, - NULL)) - { - /* Bail out if anything but NO_ERROR */ - LingerWait = 0; - break; - } - - /* Bail out if no more sends are pending */ - if (!SendsInProgress) break; - - /* - * We have to execute a sleep, so it's kind of like - * a block. If the socket is Nonblock, we cannot - * go on since asyncronous operation is expected - * and we cannot offer it - */ - if (Socket->SharedData.NonBlocking) - { - /* Acquire the socket lock */ - EnterCriticalSection(&Socket->Lock); - - /* Restore the socket state */ - Socket->SharedData.State = OldState; - - /* Release the lock again */ - LeaveCriticalSection(&Socket->Lock); - - /* Fail with error code */ - return WSAEWOULDBLOCK; - } - - /* Now we can sleep, and decrement the linger wait */ - /* - * FIXME: It seems Windows does some funky acceleration - * since the waiting seems to be longer and longer. I - * don't think this improves performance so much, so we - * wait a fixed time instead. - */ - Sleep(SleepWait); - LingerWait -= SleepWait; - } - - /* - * We have reached the timeout or sends are over. - * Disconnect if the timeout has been reached. - */ - if (LingerWait <= 0) - { - /* There is no timeout, and this is an abortive disconnect */ - DisconnectInfo.Timeout = RtlConvertLongToLargeInteger(0); - DisconnectInfo.DisconnectType = AFD_DISCONNECT_ABORT; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_DISCONNECT, - &DisconnectInfo, - sizeof(DisconnectInfo), - NULL, - 0); - /* Check if the operation is pending */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - !Socket->SharedData.LingerData.l_onoff ? - NO_BLOCKING_HOOK : ALWAYS_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* We actually accept errors, unless the driver wasn't ready */ - if (Status == STATUS_DEVICE_NOT_READY) - { - /* This is the equivalent of a WOULDBLOCK, which we fail */ - /* Acquire the socket lock */ - EnterCriticalSection(&Socket->Lock); - - /* Restore the socket state */ - Socket->SharedData.State = OldState; - - /* Release the lock again */ - LeaveCriticalSection(&Socket->Lock); - - /* Fail with error code */ - return WSAEWOULDBLOCK; - } - } - } - - /* Acquire the global lock to protect the handle table */ - SockAcquireRwLockShared(&SocketGlobalLock); - - /* Protect the socket too */ - EnterCriticalSection(&Socket->Lock); - - /* Notify the Helper DLL of Socket Closure */ - ErrorCode = SockNotifyHelperDll(Socket, WSH_NOTIFY_CLOSE); - - /* Cleanup Time! */ - Socket->HelperContext = NULL; - Socket->SharedData.AsyncDisabledEvents = -1; - if (Socket->TdiAddressHandle) - { - /* Close and forget the handle */ - NtClose(Socket->TdiAddressHandle); - Socket->TdiAddressHandle = NULL; - } - if (Socket->TdiConnectionHandle) - { - /* Close and forget the handle */ - NtClose(Socket->TdiConnectionHandle); - Socket->TdiConnectionHandle = NULL; - } - - /* Remove the handle from the table */ - ErrorCode = WahRemoveHandleContext(SockContextTable, &Socket->WshContext); - if (ErrorCode == NO_ERROR) - { - /* Close the socket's handle */ - NtClose(Socket->WshContext.Handle); - - /* Dereference the socket */ - SockDereferenceSocket(Socket); - } - else - { - /* This isn't a socket anymore, or something */ - ErrorCode = WSAENOTSOCK; - } - - /* Release both locks */ - LeaveCriticalSection(&Socket->Lock); - SockReleaseRwLockShared(&SocketGlobalLock); - - /* Return success */ - return ErrorCode; -} - -SOCKET -WSPAPI -WSPSocket(INT AddressFamily, - INT SocketType, - INT Protocol, - LPWSAPROTOCOL_INFOW lpProtocolInfo, - GROUP g, - DWORD dwFlags, - LPINT lpErrno) -{ - DWORD CatalogId; - SOCKET Handle = INVALID_SOCKET; - INT ErrorCode; - DWORD ServiceFlags, ProviderFlags; - PWINSOCK_TEB_DATA ThreadData; - PSOCKET_INFORMATION Socket; - GUID ProviderId; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return INVALID_SOCKET; - } - - /* Get the catalog ID */ - CatalogId = lpProtocolInfo->dwCatalogEntryId; - - /* Check if this is a duplication */ - if(lpProtocolInfo->dwProviderReserved) - { - /* Get the duplicate handle */ - Handle = (SOCKET)lpProtocolInfo->dwProviderReserved; - - /* Get our structure for it */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if(Socket) - { - /* Tell Winsock about it */ - Socket->Handle = SockUpcallTable->lpWPUModifyIFSHandle(CatalogId, - Handle, - &ErrorCode); - /* Check if we got an invalid handle back */ - if(Socket->Handle == INVALID_SOCKET) - { - /* Restore it for the error path */ - Socket->Handle = Handle; - } - } - else - { - /* The duplicate handle is invalid */ - ErrorCode = WSAEINVAL; - } - - /* Fail */ - goto error; - } - - /* See if the address family should be recovered from the protocl info */ - if (!AddressFamily || AddressFamily == FROM_PROTOCOL_INFO) - { - /* Use protocol info data */ - AddressFamily = lpProtocolInfo->iAddressFamily; - } - - /* See if the address family should be recovered from the protocl info */ - if(!SocketType || SocketType == FROM_PROTOCOL_INFO ) - { - /* Use protocol info data */ - SocketType = lpProtocolInfo->iSocketType; - } - - /* See if the address family should be recovered from the protocl info */ - if(Protocol == FROM_PROTOCOL_INFO) - { - /* Use protocol info data */ - Protocol = lpProtocolInfo->iProtocol; - } - - /* Save the service, provider flags and provider ID */ - ServiceFlags = lpProtocolInfo->dwServiceFlags1; - ProviderFlags = lpProtocolInfo->dwProviderFlags; - ProviderId = lpProtocolInfo->ProviderId; - - /* Create the actual socket */ - ErrorCode = SockSocket(AddressFamily, - SocketType, - Protocol, - &ProviderId, - g, - dwFlags, - ProviderFlags, - ServiceFlags, - CatalogId, - &Socket); - if (ErrorCode == ERROR_SUCCESS) - { - /* Acquire the socket lock */ - EnterCriticalSection(&Socket->Lock); - - /* Set status to opened */ - Socket->SharedData.State = SocketOpen; - - /* Create the Socket Context */ - ErrorCode = SockSetHandleContext(Socket); - if (ErrorCode != NO_ERROR) - { - /* Release the lock, close the socket and fail */ - LeaveCriticalSection(&Socket->Lock); - SockCloseSocket(Socket); - goto error; - } - - /* Notify Winsock */ - Handle = SockUpcallTable->lpWPUModifyIFSHandle(Socket->SharedData.CatalogEntryId, - (SOCKET)Socket->WshContext.Handle, - &ErrorCode); - - /* Does Winsock not like it? */ - if (Handle == INVALID_SOCKET) - { - /* Release the lock, close the socket and fail */ - LeaveCriticalSection(&Socket->Lock); - SockCloseSocket(Socket); - goto error; - } - - /* Release the lock */ - LeaveCriticalSection(&Socket->Lock); - } - -error: - /* Write return code */ - *lpErrno = ErrorCode; - - /* Check if we have a socket and dereference it */ - if (Socket) SockDereferenceSocket(Socket); - - /* Return handle */ - return Handle; -} - -INT -WSPAPI -WSPCloseSocket(IN SOCKET Handle, - OUT LPINT lpErrno) -{ - INT ErrorCode; - PSOCKET_INFORMATION Socket; - PWINSOCK_TEB_DATA ThreadData; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - *lpErrno = WSAENOTSOCK; - return SOCKET_ERROR; - } - - /* Close it */ - ErrorCode = SockCloseSocket(Socket); - - /* Remove the final reference */ - SockDereferenceSocket(Socket); - - /* Check if we got here by error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -SockSocket(INT AddressFamily, - INT SocketType, - INT Protocol, - LPGUID ProviderId, - GROUP g, - DWORD dwFlags, - DWORD ProviderFlags, - DWORD ServiceFlags, - DWORD CatalogEntryId, - PSOCKET_INFORMATION *NewSocket) -{ - INT ErrorCode; - UNICODE_STRING TransportName; - PVOID HelperDllContext; - PHELPER_DATA HelperData = NULL; - DWORD HelperEvents; - PFILE_FULL_EA_INFORMATION Ea = NULL; - PAFD_CREATE_PACKET AfdPacket; - SOCKET Handle = INVALID_SOCKET; - PSOCKET_INFORMATION Socket = NULL; - BOOLEAN LockInit = FALSE; - USHORT SizeOfPacket; - DWORD SizeOfEa, SocketLength; - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING DevName; - LARGE_INTEGER GroupData; - DWORD CreateOptions = 0; - IO_STATUS_BLOCK IoStatusBlock; - PWAH_HANDLE WahHandle; - NTSTATUS Status; - CHAR AfdPacketBuffer[96]; - - /* Initialize the transport name */ - RtlInitUnicodeString(&TransportName, NULL); - - /* Get Helper Data and Transport */ - ErrorCode = SockGetTdiName(&AddressFamily, - &SocketType, - &Protocol, - ProviderId, - g, - dwFlags, - &TransportName, - &HelperDllContext, - &HelperData, - &HelperEvents); - - /* Check for error */ - if (ErrorCode != NO_ERROR) goto error; - - /* Figure out the socket context structure size */ - SocketLength = sizeof(*Socket) + (HelperData->MinWSAddressLength * 2); - - /* Allocate a socket */ - Socket = SockAllocateHeapRoutine(SockPrivateHeap, 0, SocketLength); - if (!Socket) - { - /* Couldn't create it; we need to tell WSH so it can cleanup */ - if (HelperEvents & WSH_NOTIFY_CLOSE) - { - HelperData->WSHNotify(HelperDllContext, - INVALID_SOCKET, - NULL, - NULL, - WSH_NOTIFY_CLOSE); - } - - /* Fail and return */ - ErrorCode = WSAENOBUFS; - goto error; - } - - /* Initialize it */ - RtlZeroMemory(Socket, SocketLength); - Socket->RefCount = 2; - Socket->Handle = INVALID_SOCKET; - Socket->SharedData.State = SocketUndefined; - Socket->SharedData.AddressFamily = AddressFamily; - Socket->SharedData.SocketType = SocketType; - Socket->SharedData.Protocol = Protocol; - Socket->ProviderId = *ProviderId; - Socket->HelperContext = HelperDllContext; - Socket->HelperData = HelperData; - Socket->HelperEvents = HelperEvents; - Socket->LocalAddress = (PVOID)(Socket + 1); - Socket->SharedData.SizeOfLocalAddress = HelperData->MaxWSAddressLength; - Socket->RemoteAddress = (PVOID)((ULONG_PTR)Socket->LocalAddress + - HelperData->MaxWSAddressLength); - Socket->SharedData.SizeOfRemoteAddress = HelperData->MaxWSAddressLength; - Socket->SharedData.UseDelayedAcceptance = HelperData->UseDelayedAcceptance; - Socket->SharedData.CreateFlags = dwFlags; - Socket->SharedData.CatalogEntryId = CatalogEntryId; - Socket->SharedData.ServiceFlags1 = ServiceFlags; - Socket->SharedData.ProviderFlags = ProviderFlags; - Socket->SharedData.GroupID = g; - Socket->SharedData.GroupType = 0; - Socket->SharedData.UseSAN = FALSE; - Socket->SanData = NULL; - Socket->DontUseSan = FALSE; - - /* Initialize the socket lock */ - InitializeCriticalSection(&Socket->Lock); - LockInit = TRUE; - - /* Packet Size */ - SizeOfPacket = TransportName.Length + sizeof(*AfdPacket) + sizeof(WCHAR); - - /* EA Size */ - SizeOfEa = SizeOfPacket + sizeof(*Ea) + AFD_PACKET_COMMAND_LENGTH; - - /* See if our stack buffer is big enough to hold it */ - if (SizeOfEa <= sizeof(AfdPacketBuffer)) - { - /* Use our stack */ - Ea = (PFILE_FULL_EA_INFORMATION)AfdPacketBuffer; - } - else - { - /* Allocate from heap */ - Ea = SockAllocateHeapRoutine(SockPrivateHeap, 0, SizeOfEa); - if (!Ea) - { - /* Fail */ - ErrorCode = WSAENOBUFS; - goto error; - } - } - - /* Set up EA */ - Ea->NextEntryOffset = 0; - Ea->Flags = 0; - Ea->EaNameLength = AFD_PACKET_COMMAND_LENGTH; - RtlCopyMemory(Ea->EaName, AfdCommand, AFD_PACKET_COMMAND_LENGTH + 1); - Ea->EaValueLength = SizeOfPacket; - - /* Set up AFD Packet */ - AfdPacket = (PAFD_CREATE_PACKET)(Ea->EaName + Ea->EaNameLength + 1); - AfdPacket->SizeOfTransportName = TransportName.Length; - RtlCopyMemory(AfdPacket->TransportName, - TransportName.Buffer, - TransportName.Length + sizeof(WCHAR)); - AfdPacket->EndpointFlags = 0; - - /* Set up Endpoint Flags */ - if ((Socket->SharedData.ServiceFlags1 & XP1_CONNECTIONLESS)) - { - /* Check the Socket Type */ - if ((SocketType != SOCK_DGRAM) && (SocketType != SOCK_RAW)) - { - /* Only RAW or UDP can be Connectionless */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Set the flag for AFD */ - AfdPacket->EndpointFlags |= AFD_ENDPOINT_CONNECTIONLESS; - } - - if ((Socket->SharedData.ServiceFlags1 & XP1_MESSAGE_ORIENTED)) - { - /* Check if this is a Stream Socket */ - if (SocketType == SOCK_STREAM) - { - /* Check if we actually support this */ - if (!(Socket->SharedData.ServiceFlags1 & XP1_PSEUDO_STREAM)) - { - /* The Provider doesn't support Message Oriented Streams */ - ErrorCode = WSAEINVAL; - goto error; - } - } - - /* Set the flag for AFD */ - AfdPacket->EndpointFlags |= AFD_ENDPOINT_MESSAGE_ORIENTED; - } - - /* If this is a Raw Socket, let AFD know */ - if (SocketType == SOCK_RAW) AfdPacket->EndpointFlags |= AFD_ENDPOINT_RAW; - - /* Check if we are a Multipoint Control/Data Root or Leaf */ - if (dwFlags & (WSA_FLAG_MULTIPOINT_C_ROOT | - WSA_FLAG_MULTIPOINT_C_LEAF | - WSA_FLAG_MULTIPOINT_D_ROOT | - WSA_FLAG_MULTIPOINT_D_LEAF)) - { - /* First make sure we support Multipoint */ - if (!(Socket->SharedData.ServiceFlags1 & XP1_SUPPORT_MULTIPOINT)) - { - /* The Provider doesn't actually support Multipoint */ - ErrorCode = WSAEINVAL; - goto error; - } - - /* Set the flag for AFD */ - AfdPacket->EndpointFlags |= AFD_ENDPOINT_MULTIPOINT; - - /* Check if we are a Control Plane Root */ - if (dwFlags & WSA_FLAG_MULTIPOINT_C_ROOT) - { - /* Check if we actually support this or if we're already a leaf */ - if ((!(Socket->SharedData.ServiceFlags1 & - XP1_MULTIPOINT_CONTROL_PLANE)) || - ((dwFlags & WSA_FLAG_MULTIPOINT_C_LEAF))) - { - ErrorCode = WSAEINVAL; - goto error; - } - - /* Set the flag for AFD */ - AfdPacket->EndpointFlags |= AFD_ENDPOINT_C_ROOT; - } - - /* Check if we a Data Plane Root */ - if (dwFlags & WSA_FLAG_MULTIPOINT_D_ROOT) - { - /* Check if we actually support this or if we're already a leaf */ - if ((!(Socket->SharedData.ServiceFlags1 & - XP1_MULTIPOINT_DATA_PLANE)) || - ((dwFlags & WSA_FLAG_MULTIPOINT_D_LEAF))) - { - ErrorCode = WSAEINVAL; - goto error; - } - - /* Set the flag for AFD */ - AfdPacket->EndpointFlags |= AFD_ENDPOINT_D_ROOT; - } - } - - /* Set the group ID */ - AfdPacket->GroupID = g; - - /* Set up Object Attributes */ - RtlInitUnicodeString(&DevName, L"\\Device\\Afd\\Endpoint"); - InitializeObjectAttributes(&ObjectAttributes, - &DevName, - OBJ_CASE_INSENSITIVE | OBJ_INHERIT, - NULL, - NULL); - - /* Check if we're not using Overlapped I/O */ - if (!(dwFlags & WSA_FLAG_OVERLAPPED)) - { - /* Set Synchronous I/O */ - CreateOptions = FILE_SYNCHRONOUS_IO_NONALERT; - } - - /* Acquire the global lock */ - SockAcquireRwLockShared(&SocketGlobalLock); - - /* Create the Socket */ - Status = NtCreateFile((PHANDLE)&Handle, - GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, - &ObjectAttributes, - &IoStatusBlock, - NULL, - 0, - FILE_SHARE_READ | FILE_SHARE_WRITE, - FILE_OPEN_IF, - CreateOptions, - Ea, - SizeOfEa); - if (!NT_SUCCESS(Status)) - { - /* Release the lock and fail */ - SockReleaseRwLockShared(&SocketGlobalLock); - ErrorCode = NtStatusToSocketError(Status); - goto error; - } - - /* Save Handle */ - Socket->Handle = Handle; - - /* Check if a group was given */ - if (g != 0) - { - /* Get Group Id and Type */ - ErrorCode = SockGetInformation(Socket, - AFD_INFO_GROUP_ID_TYPE, - NULL, - 0, - NULL, - NULL, - &GroupData); - - /* Save them */ - Socket->SharedData.GroupID = GroupData.u.LowPart; - Socket->SharedData.GroupType = GroupData.u.HighPart; - } - - /* Check if we need to get the window sizes */ - if (!SockSendBufferWindow) - { - /* Get send window size */ - SockGetInformation(Socket, - AFD_INFO_SEND_WINDOW_SIZE, - NULL, - 0, - NULL, - &SockSendBufferWindow, - NULL); - - /* Get receive window size */ - SockGetInformation(Socket, - AFD_INFO_RECEIVE_WINDOW_SIZE, - NULL, - 0, - NULL, - &SockReceiveBufferWindow, - NULL); - } - - /* Save window sizes */ - Socket->SharedData.SizeOfRecvBuffer = SockReceiveBufferWindow; - Socket->SharedData.SizeOfSendBuffer = SockSendBufferWindow; - - /* Insert it into our table */ - WahHandle = WahInsertHandleContext(SockContextTable, &Socket->WshContext); - - /* We can release the lock now */ - SockReleaseRwLockShared(&SocketGlobalLock); - - /* Check if the handles don't match for some reason */ - if (WahHandle != &Socket->WshContext) - { - /* Do they not match? */ - if (WahHandle) - { - /* They don't... someone must've used CloseHandle */ - SockDereferenceSocket((PSOCKET_INFORMATION)WahHandle); - - /* Use the correct handle now */ - WahHandle = &Socket->WshContext; - } - else - { - /* It's not that they don't match: we don't have one at all! */ - ErrorCode = WSAENOBUFS; - goto error; - } - } - -error: - /* Check if we can free the transport name */ - if ((SocketType == SOCK_RAW) && (TransportName.Buffer)) - { - /* Free it */ - RtlFreeHeap(RtlGetProcessHeap(), 0, TransportName.Buffer); - } - - /* Check if we have the EA from the heap */ - if ((Ea) && (Ea != (PVOID)AfdPacketBuffer)) - { - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, Ea); - } - - /* Check if this is actually success */ - if (ErrorCode != NO_ERROR) - { - /* Check if we have a socket by now */ - if (Socket) - { - /* Tell the Helper DLL we're closing it */ - SockNotifyHelperDll(Socket, WSH_NOTIFY_CLOSE); - - /* Close its handle if it's valid */ - if (Socket->WshContext.Handle != INVALID_HANDLE_VALUE) - { - NtClose(Socket->WshContext.Handle); - } - - /* Delete its lock */ - if (LockInit) DeleteCriticalSection(&Socket->Lock); - - /* Remove our socket reference */ - SockDereferenceSocket(Socket); - - /* Free it */ - RtlFreeHeap(SockPrivateHeap, 0, Socket); - } - } - - /* Return Socket and error code */ - *NewSocket = Socket; - return ErrorCode; -} - -INT -WSPAPI -SockCloseSocket(IN PSOCKET_INFORMATION Socket) -{ - INT ErrorCode; - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - IO_STATUS_BLOCK IoStatusBlock; - NTSTATUS Status; - AFD_DISCONNECT_INFO DisconnectInfo; - SOCKET_STATE OldState; - ULONG LingerWait; - ULONG SendsInProgress; - ULONG SleepWait; - BOOLEAN ActiveConnect; - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* If a Close is already in Process... */ - if (Socket->SharedData.State == SocketClosed) - { - /* Release lock and fail */ - LeaveCriticalSection(&Socket->Lock); - return WSAENOTSOCK; - } - - /* Save the old state and set the new one to closed */ - OldState = Socket->SharedData.State; - Socket->SharedData.State = SocketClosed; - - /* Check if the socket has an active async data */ - ActiveConnect = (Socket->AsyncData != NULL); - - /* We're done with the socket, release the lock */ - LeaveCriticalSection(&Socket->Lock); - - /* - * If SO_LINGER is ON and the Socket was connected or had an active async - * connect context, then we'll disconnect it. Note that we won't do this - * for connection-less (UDP/RAW) sockets or if a send shutdown is active. - */ - if ((OldState == SocketConnected || ActiveConnect) && - !(Socket->SharedData.SendShutdown) && - !MSAFD_IS_DGRAM_SOCK(Socket) && - (Socket->SharedData.LingerData.l_onoff)) - { - /* We need to respect the timeout */ - SleepWait = 100; - LingerWait = Socket->SharedData.LingerData.l_linger * 1000; - - /* Loop until no more sends are pending, within the timeout */ - while (LingerWait) - { - /* Find out how many Sends are in Progress */ - if (SockGetInformation(Socket, - AFD_INFO_SENDS_IN_PROGRESS, - NULL, - 0, - NULL, - &SendsInProgress, - NULL)) - { - /* Bail out if anything but NO_ERROR */ - LingerWait = 0; - break; - } - - /* Bail out if no more sends are pending */ - if (!SendsInProgress) break; - - /* - * We have to execute a sleep, so it's kind of like - * a block. If the socket is Nonblock, we cannot - * go on since asyncronous operation is expected - * and we cannot offer it - */ - if (Socket->SharedData.NonBlocking) - { - /* Acquire the socket lock */ - EnterCriticalSection(&Socket->Lock); - - /* Restore the socket state */ - Socket->SharedData.State = OldState; - - /* Release the lock again */ - LeaveCriticalSection(&Socket->Lock); - - /* Fail with error code */ - return WSAEWOULDBLOCK; - } - - /* Now we can sleep, and decrement the linger wait */ - /* - * FIXME: It seems Windows does some funky acceleration - * since the waiting seems to be longer and longer. I - * don't think this improves performance so much, so we - * wait a fixed time instead. - */ - Sleep(SleepWait); - LingerWait -= SleepWait; - } - - /* - * We have reached the timeout or sends are over. - * Disconnect if the timeout has been reached. - */ - if (LingerWait <= 0) - { - /* There is no timeout, and this is an abortive disconnect */ - DisconnectInfo.Timeout = RtlConvertLongToLargeInteger(0); - DisconnectInfo.DisconnectType = AFD_DISCONNECT_ABORT; - - /* Send IOCTL */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - NULL, - &IoStatusBlock, - IOCTL_AFD_DISCONNECT, - &DisconnectInfo, - sizeof(DisconnectInfo), - NULL, - 0); - /* Check if the operation is pending */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - !Socket->SharedData.LingerData.l_onoff ? - NO_BLOCKING_HOOK : ALWAYS_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* We actually accept errors, unless the driver wasn't ready */ - if (Status == STATUS_DEVICE_NOT_READY) - { - /* This is the equivalent of a WOULDBLOCK, which we fail */ - /* Acquire the socket lock */ - EnterCriticalSection(&Socket->Lock); - - /* Restore the socket state */ - Socket->SharedData.State = OldState; - - /* Release the lock again */ - LeaveCriticalSection(&Socket->Lock); - - /* Fail with error code */ - return WSAEWOULDBLOCK; - } - } - } - - /* Acquire the global lock to protect the handle table */ - SockAcquireRwLockShared(&SocketGlobalLock); - - /* Protect the socket too */ - EnterCriticalSection(&Socket->Lock); - - /* Notify the Helper DLL of Socket Closure */ - ErrorCode = SockNotifyHelperDll(Socket, WSH_NOTIFY_CLOSE); - - /* Cleanup Time! */ - Socket->HelperContext = NULL; - Socket->SharedData.AsyncDisabledEvents = -1; - if (Socket->TdiAddressHandle) - { - /* Close and forget the handle */ - NtClose(Socket->TdiAddressHandle); - Socket->TdiAddressHandle = NULL; - } - if (Socket->TdiConnectionHandle) - { - /* Close and forget the handle */ - NtClose(Socket->TdiConnectionHandle); - Socket->TdiConnectionHandle = NULL; - } - - /* Remove the handle from the table */ - ErrorCode = WahRemoveHandleContext(SockContextTable, &Socket->WshContext); - if (ErrorCode == NO_ERROR) - { - /* Close the socket's handle */ - NtClose(Socket->WshContext.Handle); - - /* Dereference the socket */ - SockDereferenceSocket(Socket); - } - else - { - /* This isn't a socket anymore, or something */ - ErrorCode = WSAENOTSOCK; - } - - /* Release both locks */ - LeaveCriticalSection(&Socket->Lock); - SockReleaseRwLockShared(&SocketGlobalLock); - - /* Return success */ - return ErrorCode; -} - -SOCKET -WSPAPI -WSPSocket(INT AddressFamily, - INT SocketType, - INT Protocol, - LPWSAPROTOCOL_INFOW lpProtocolInfo, - GROUP g, - DWORD dwFlags, - LPINT lpErrno) -{ - DWORD CatalogId; - SOCKET Handle = INVALID_SOCKET; - INT ErrorCode; - DWORD ServiceFlags, ProviderFlags; - PWINSOCK_TEB_DATA ThreadData; - PSOCKET_INFORMATION Socket; - GUID ProviderId; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return INVALID_SOCKET; - } - - /* Get the catalog ID */ - CatalogId = lpProtocolInfo->dwCatalogEntryId; - - /* Check if this is a duplication */ - if(lpProtocolInfo->dwProviderReserved) - { - /* Get the duplicate handle */ - Handle = (SOCKET)lpProtocolInfo->dwProviderReserved; - - /* Get our structure for it */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if(Socket) - { - /* Tell Winsock about it */ - Socket->Handle = SockUpcallTable->lpWPUModifyIFSHandle(CatalogId, - Handle, - &ErrorCode); - /* Check if we got an invalid handle back */ - if(Socket->Handle == INVALID_SOCKET) - { - /* Restore it for the error path */ - Socket->Handle = Handle; - } - } - else - { - /* The duplicate handle is invalid */ - ErrorCode = WSAEINVAL; - } - - /* Fail */ - goto error; - } - - /* See if the address family should be recovered from the protocl info */ - if (!AddressFamily || AddressFamily == FROM_PROTOCOL_INFO) - { - /* Use protocol info data */ - AddressFamily = lpProtocolInfo->iAddressFamily; - } - - /* See if the address family should be recovered from the protocl info */ - if(!SocketType || SocketType == FROM_PROTOCOL_INFO ) - { - /* Use protocol info data */ - SocketType = lpProtocolInfo->iSocketType; - } - - /* See if the address family should be recovered from the protocl info */ - if(Protocol == FROM_PROTOCOL_INFO) - { - /* Use protocol info data */ - Protocol = lpProtocolInfo->iProtocol; - } - - /* Save the service, provider flags and provider ID */ - ServiceFlags = lpProtocolInfo->dwServiceFlags1; - ProviderFlags = lpProtocolInfo->dwProviderFlags; - ProviderId = lpProtocolInfo->ProviderId; - - /* Create the actual socket */ - ErrorCode = SockSocket(AddressFamily, - SocketType, - Protocol, - &ProviderId, - g, - dwFlags, - ProviderFlags, - ServiceFlags, - CatalogId, - &Socket); - if (ErrorCode == ERROR_SUCCESS) - { - /* Acquire the socket lock */ - EnterCriticalSection(&Socket->Lock); - - /* Set status to opened */ - Socket->SharedData.State = SocketOpen; - - /* Create the Socket Context */ - ErrorCode = SockSetHandleContext(Socket); - if (ErrorCode != NO_ERROR) - { - /* Release the lock, close the socket and fail */ - LeaveCriticalSection(&Socket->Lock); - SockCloseSocket(Socket); - goto error; - } - - /* Notify Winsock */ - Handle = SockUpcallTable->lpWPUModifyIFSHandle(Socket->SharedData.CatalogEntryId, - (SOCKET)Socket->WshContext.Handle, - &ErrorCode); - - /* Does Winsock not like it? */ - if (Handle == INVALID_SOCKET) - { - /* Release the lock, close the socket and fail */ - LeaveCriticalSection(&Socket->Lock); - SockCloseSocket(Socket); - goto error; - } - - /* Release the lock */ - LeaveCriticalSection(&Socket->Lock); - } - -error: - /* Write return code */ - *lpErrno = ErrorCode; - - /* Check if we have a socket and dereference it */ - if (Socket) SockDereferenceSocket(Socket); - - /* Return handle */ - return Handle; -} - -INT -WSPAPI -WSPCloseSocket(IN SOCKET Handle, - OUT LPINT lpErrno) -{ - INT ErrorCode; - PSOCKET_INFORMATION Socket; - PWINSOCK_TEB_DATA ThreadData; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - *lpErrno = WSAENOTSOCK; - return SOCKET_ERROR; - } - - /* Close it */ - ErrorCode = SockCloseSocket(Socket); - - /* Remove the final reference */ - SockDereferenceSocket(Socket); - - /* Check if we got here by error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - diff --git a/dll/win32/mswsock/msafd/sockopt.c b/dll/win32/mswsock/msafd/sockopt.c index b2692ffbc8a..e99f2d2e84c 100644 --- a/dll/win32/mswsock/msafd/sockopt.c +++ b/dll/win32/mswsock/msafd/sockopt.c @@ -587,1770 +587,3 @@ error: return NO_ERROR; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -DWORD SockSendBufferWindow; -DWORD SockReceiveBufferWindow; - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -SockUpdateWindowSizes(IN PSOCKET_INFORMATION Socket, - IN BOOLEAN Force) -{ - INT ErrorCode; - - /* Check if this is a connection-less socket */ - if (Socket->SharedData.ServiceFlags1 & XP1_CONNECTIONLESS) - { - /* It must be bound */ - if (Socket->SharedData.State == SocketOpen) return NO_ERROR; - } - else - { - /* It must be connected */ - if (Socket->SharedData.State == SocketConnected) return NO_ERROR; - - /* Get the TDI handles for it */ - ErrorCode = SockGetTdiHandles(Socket); - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Tell WSH the new size */ - ErrorCode = Socket->HelperData->WSHSetSocketInformation(Socket->HelperContext, - Socket->Handle, - Socket->TdiAddressHandle, - Socket->TdiConnectionHandle, - SOL_SOCKET, - SO_RCVBUF, - (PVOID)&Socket->SharedData.SizeOfRecvBuffer, - sizeof(DWORD)); - } - - /* Check if the buffer changed, or if this is a force */ - if ((Socket->SharedData.SizeOfRecvBuffer != SockReceiveBufferWindow) || - (Force)) - { - /* Set the information in AFD */ - ErrorCode = SockSetInformation(Socket, - AFD_INFO_RECEIVE_WINDOW_SIZE, - NULL, - &Socket->SharedData.SizeOfRecvBuffer, - NULL); - if (ErrorCode != NO_ERROR) return ErrorCode; - } - - /* Do the same thing for the send buffer */ - if ((Socket->SharedData.SizeOfSendBuffer != SockSendBufferWindow) || - (Force)) - { - /* Set the information in AFD */ - ErrorCode = SockSetInformation(Socket, - AFD_INFO_SEND_WINDOW_SIZE, - NULL, - &Socket->SharedData.SizeOfSendBuffer, - NULL); - if (ErrorCode != NO_ERROR) return ErrorCode; - } - - /* Return to caller */ - return NO_ERROR; -} - -BOOLEAN -WSPAPI -IsValidOptionForSocket(IN PSOCKET_INFORMATION Socket, - IN INT Level, - IN INT OptionName) -{ - /* SOL_INTERNAL is always illegal when external, of course */ - if (Level == SOL_INTERNAL) return FALSE; - - /* Anything else but SOL_SOCKET we can't handle, so assume it's legal */ - if (Level != SOL_SOCKET) return TRUE; - - /* Check the option name */ - switch (OptionName) - { - case SO_DONTLINGER: - case SO_KEEPALIVE: - case SO_LINGER: - case SO_OOBINLINE: - case SO_ACCEPTCONN: - /* Only valid on stream sockets */ - if (MSAFD_IS_DGRAM_SOCK(Socket)) return FALSE; - - /* It is one, suceed */ - return TRUE; - - case SO_BROADCAST: - /* Only valid on datagram sockets */ - if (MSAFD_IS_DGRAM_SOCK(Socket)) return TRUE; - - /* It isn't one, fail */ - return FALSE; - - case SO_PROTOCOL_INFOA: - /* Winsock 2 has a hack for this, we should get the W version */ - return FALSE; - - default: - /* Anything else is always valid */ - return TRUE; - } -} - -INT -WSPAPI -SockGetConnectData(IN PSOCKET_INFORMATION Socket, - IN ULONG Ioctl, - IN PVOID Buffer, - IN ULONG BufferLength, - OUT PULONG BufferReturned) -{ - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - NTSTATUS Status; - IO_STATUS_BLOCK IoStatusBlock; - AFD_PENDING_ACCEPT_DATA ConnectData; - - /* Make sure we have Accept Info in the TEB for this Socket */ - if ((ThreadData->AcceptData) && - (ThreadData->AcceptData->ListenHandle == Socket->WshContext.Handle)) - { - /* Set the connect data structure */ - ConnectData.SequenceNumber = ThreadData->AcceptData->SequenceNumber; - ConnectData.ReturnSize = FALSE; - - /* Send it to AFD */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - 0, - &IoStatusBlock, - Ioctl, - &ConnectData, - sizeof(ConnectData), - Buffer, - BufferLength); - } - else - { - /* Request it from AFD */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - 0, - &IoStatusBlock, - Ioctl, - NULL, - 0, - Buffer, - BufferLength); - } - - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - return NtStatusToSocketError(Status); - } - - /* Return the length */ - if (BufferReturned) *BufferReturned = PtrToUlong(IoStatusBlock.Information); - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -WSPIoctl(IN SOCKET Handle, - IN DWORD dwIoControlCode, - IN LPVOID lpvInBuffer, - IN DWORD cbInBuffer, - OUT LPVOID lpvOutBuffer, - IN DWORD cbOutBuffer, - OUT LPDWORD lpcbBytesReturned, - IN LPWSAOVERLAPPED lpOverlapped, - IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, - IN LPWSATHREADID lpThreadId, - OUT LPINT lpErrno) -{ - PSOCKET_INFORMATION Socket; - INT ErrorCode; - PWINSOCK_TEB_DATA ThreadData; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - switch(dwIoControlCode) { - - case FIONBIO: - - /* Check if the Buffer is OK */ - if(cbInBuffer < sizeof(ULONG)) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - return 0; - - default: - - /* Unsupported for now */ - *lpErrno = WSAEINVAL; - return SOCKET_ERROR; - } - -error: - /* Check if we had a socket */ - if (Socket) - { - /* Release lock and dereference it */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Return error */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return to caller */ - return NO_ERROR; -} - - -INT -WSPAPI -WSPGetSockOpt(IN SOCKET Handle, - IN INT Level, - IN INT OptionName, - OUT CHAR FAR* OptionValue, - IN OUT LPINT OptionLength, - OUT LPINT lpErrno) -{ - PSOCKET_INFORMATION Socket; - INT ErrorCode; - PWINSOCK_TEB_DATA ThreadData; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - *lpErrno = WSAENOTSOCK; - return SOCKET_ERROR; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Make sure we're not closed */ - if (Socket->SharedData.State == SocketClosed) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Validate the pointer and length */ - if (!(OptionValue) || - !(OptionLength) || - (*OptionLength < sizeof(CHAR)) || - (*OptionLength & 0x80000000)) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Validate option */ - if (!IsValidOptionForSocket(Socket, Level, OptionName)) - { - /* Fail */ - ErrorCode = WSAENOPROTOOPT; - goto error; - } - - /* If it's one of the recognized options */ - if (Level == SOL_SOCKET && - (OptionName == SO_BROADCAST || - OptionName == SO_DEBUG || - OptionName == SO_DONTLINGER || - OptionName == SO_LINGER || - OptionName == SO_OOBINLINE || - OptionName == SO_RCVBUF || - OptionName == SO_REUSEADDR || - OptionName == SO_EXCLUSIVEADDRUSE || - OptionName == SO_CONDITIONAL_ACCEPT || - OptionName == SO_SNDBUF || - OptionName == SO_TYPE || - OptionName == SO_ACCEPTCONN || - OptionName == SO_ERROR)) - { - /* Clear the buffer first */ - RtlZeroMemory(OptionValue, *OptionLength); - } - - - /* Check the Level first */ - switch (Level) - { - /* Handle SOL_SOCKET */ - case SOL_SOCKET: - - /* Now check the Option */ - switch (OptionName) - { - case SO_TYPE: - - /* Validate the size */ - if (*OptionLength < sizeof(INT)) - { - /* Size is too small, fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Return the data */ - *OptionValue = Socket->SharedData.SocketType; - *OptionLength = sizeof(INT); - break; - - case SO_RCVBUF: - - /* Validate the size */ - if (*OptionLength < sizeof(INT)) - { - /* Size is too small, fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Return the data */ - *(PINT)OptionValue = Socket->SharedData.SizeOfRecvBuffer; - *OptionLength = sizeof(INT); - break; - - case SO_SNDBUF: - - /* Validate the size */ - if (*OptionLength < sizeof(INT)) - { - /* Size is too small, fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Return the data */ - *(PINT)OptionValue = Socket->SharedData.SizeOfSendBuffer; - *OptionLength = sizeof(INT); - break; - - case SO_ACCEPTCONN: - - /* Return the data */ - *OptionValue = Socket->SharedData.Listening; - *OptionLength = sizeof(BOOLEAN); - break; - - case SO_BROADCAST: - - /* Return the data */ - *OptionValue = Socket->SharedData.Broadcast; - *OptionLength = sizeof(BOOLEAN); - break; - - case SO_DEBUG: - - /* Return the data */ - *OptionValue = Socket->SharedData.Debug; - *OptionLength = sizeof(BOOLEAN); - break; - - case SO_CONDITIONAL_ACCEPT: - case SO_DONTLINGER: - case SO_DONTROUTE: - case SO_ERROR: - case SO_GROUP_ID: - case SO_GROUP_PRIORITY: - case SO_KEEPALIVE: - case SO_LINGER: - case SO_MAX_MSG_SIZE: - case SO_OOBINLINE: - case SO_PROTOCOL_INFO: - case SO_REUSEADDR: - - /* Unsupported */ - - default: - - /* Unsupported by us, give it to the helper */ - ErrorCode = SockGetTdiHandles(Socket); - if (ErrorCode != NO_ERROR) goto error; - - /* Call the helper */ - ErrorCode = Socket->HelperData->WSHGetSocketInformation(Socket->HelperContext, - Handle, - Socket->TdiAddressHandle, - Socket->TdiConnectionHandle, - Level, - OptionName, - OptionValue, - OptionLength); - if (ErrorCode != NO_ERROR) goto error; - break; - } - - default: - - /* Unsupported by us, give it to the helper */ - ErrorCode = SockGetTdiHandles(Socket); - if (ErrorCode != NO_ERROR) goto error; - - /* Call the helper */ - ErrorCode = Socket->HelperData->WSHGetSocketInformation(Socket->HelperContext, - Handle, - Socket->TdiAddressHandle, - Socket->TdiConnectionHandle, - Level, - OptionName, - OptionValue, - OptionLength); - if (ErrorCode != NO_ERROR) goto error; - break; - } - -error: - /* Release the lock and dereference the socket */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - - /* Handle error case */ - if (ErrorCode != NO_ERROR) - { - /* Return error */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -WSPSetSockOpt(IN SOCKET Handle, - IN INT Level, - IN INT OptionName, - IN CONST CHAR FAR *OptionValue, - IN INT OptionLength, - OUT LPINT lpErrno) -{ - PSOCKET_INFORMATION Socket; - INT ErrorCode; - PWINSOCK_TEB_DATA ThreadData; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - *lpErrno = WSAENOTSOCK; - return SOCKET_ERROR; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Make sure we're not closed */ - if (Socket->SharedData.State == SocketClosed) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Validate the pointer */ - if (!OptionValue) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Validate option */ - if (!IsValidOptionForSocket(Socket, Level, OptionName)) - { - /* Fail */ - ErrorCode = WSAENOPROTOOPT; - goto error; - } - - /* FIXME: Write code */ - -error: - - /* Check if this is the failure path */ - if (ErrorCode != NO_ERROR) - { - /* Dereference and unlock the socket */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - - /* Return error */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Update the socket's state in AFD */ - ErrorCode = SockSetHandleContext(Socket); - if (ErrorCode != NO_ERROR) goto error; - - /* Return success */ - return NO_ERROR; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -DWORD SockSendBufferWindow; -DWORD SockReceiveBufferWindow; - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -SockUpdateWindowSizes(IN PSOCKET_INFORMATION Socket, - IN BOOLEAN Force) -{ - INT ErrorCode; - - /* Check if this is a connection-less socket */ - if (Socket->SharedData.ServiceFlags1 & XP1_CONNECTIONLESS) - { - /* It must be bound */ - if (Socket->SharedData.State == SocketOpen) return NO_ERROR; - } - else - { - /* It must be connected */ - if (Socket->SharedData.State == SocketConnected) return NO_ERROR; - - /* Get the TDI handles for it */ - ErrorCode = SockGetTdiHandles(Socket); - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Tell WSH the new size */ - ErrorCode = Socket->HelperData->WSHSetSocketInformation(Socket->HelperContext, - Socket->Handle, - Socket->TdiAddressHandle, - Socket->TdiConnectionHandle, - SOL_SOCKET, - SO_RCVBUF, - (PVOID)&Socket->SharedData.SizeOfRecvBuffer, - sizeof(DWORD)); - } - - /* Check if the buffer changed, or if this is a force */ - if ((Socket->SharedData.SizeOfRecvBuffer != SockReceiveBufferWindow) || - (Force)) - { - /* Set the information in AFD */ - ErrorCode = SockSetInformation(Socket, - AFD_INFO_RECEIVE_WINDOW_SIZE, - NULL, - &Socket->SharedData.SizeOfRecvBuffer, - NULL); - if (ErrorCode != NO_ERROR) return ErrorCode; - } - - /* Do the same thing for the send buffer */ - if ((Socket->SharedData.SizeOfSendBuffer != SockSendBufferWindow) || - (Force)) - { - /* Set the information in AFD */ - ErrorCode = SockSetInformation(Socket, - AFD_INFO_SEND_WINDOW_SIZE, - NULL, - &Socket->SharedData.SizeOfSendBuffer, - NULL); - if (ErrorCode != NO_ERROR) return ErrorCode; - } - - /* Return to caller */ - return NO_ERROR; -} - -BOOLEAN -WSPAPI -IsValidOptionForSocket(IN PSOCKET_INFORMATION Socket, - IN INT Level, - IN INT OptionName) -{ - /* SOL_INTERNAL is always illegal when external, of course */ - if (Level == SOL_INTERNAL) return FALSE; - - /* Anything else but SOL_SOCKET we can't handle, so assume it's legal */ - if (Level != SOL_SOCKET) return TRUE; - - /* Check the option name */ - switch (OptionName) - { - case SO_DONTLINGER: - case SO_KEEPALIVE: - case SO_LINGER: - case SO_OOBINLINE: - case SO_ACCEPTCONN: - /* Only valid on stream sockets */ - if (MSAFD_IS_DGRAM_SOCK(Socket)) return FALSE; - - /* It is one, suceed */ - return TRUE; - - case SO_BROADCAST: - /* Only valid on datagram sockets */ - if (MSAFD_IS_DGRAM_SOCK(Socket)) return TRUE; - - /* It isn't one, fail */ - return FALSE; - - case SO_PROTOCOL_INFOA: - /* Winsock 2 has a hack for this, we should get the W version */ - return FALSE; - - default: - /* Anything else is always valid */ - return TRUE; - } -} - -INT -WSPAPI -SockGetConnectData(IN PSOCKET_INFORMATION Socket, - IN ULONG Ioctl, - IN PVOID Buffer, - IN ULONG BufferLength, - OUT PULONG BufferReturned) -{ - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - NTSTATUS Status; - IO_STATUS_BLOCK IoStatusBlock; - AFD_PENDING_ACCEPT_DATA ConnectData; - - /* Make sure we have Accept Info in the TEB for this Socket */ - if ((ThreadData->AcceptData) && - (ThreadData->AcceptData->ListenHandle == Socket->WshContext.Handle)) - { - /* Set the connect data structure */ - ConnectData.SequenceNumber = ThreadData->AcceptData->SequenceNumber; - ConnectData.ReturnSize = FALSE; - - /* Send it to AFD */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - 0, - &IoStatusBlock, - Ioctl, - &ConnectData, - sizeof(ConnectData), - Buffer, - BufferLength); - } - else - { - /* Request it from AFD */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - 0, - &IoStatusBlock, - Ioctl, - NULL, - 0, - Buffer, - BufferLength); - } - - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - return NtStatusToSocketError(Status); - } - - /* Return the length */ - if (BufferReturned) *BufferReturned = PtrToUlong(IoStatusBlock.Information); - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -WSPIoctl(IN SOCKET Handle, - IN DWORD dwIoControlCode, - IN LPVOID lpvInBuffer, - IN DWORD cbInBuffer, - OUT LPVOID lpvOutBuffer, - IN DWORD cbOutBuffer, - OUT LPDWORD lpcbBytesReturned, - IN LPWSAOVERLAPPED lpOverlapped, - IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, - IN LPWSATHREADID lpThreadId, - OUT LPINT lpErrno) -{ - PSOCKET_INFORMATION Socket; - INT ErrorCode; - PWINSOCK_TEB_DATA ThreadData; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - switch(dwIoControlCode) { - - case FIONBIO: - - /* Check if the Buffer is OK */ - if(cbInBuffer < sizeof(ULONG)) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - return 0; - - default: - - /* Unsupported for now */ - *lpErrno = WSAEINVAL; - return SOCKET_ERROR; - } - -error: - /* Check if we had a socket */ - if (Socket) - { - /* Release lock and dereference it */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Return error */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return to caller */ - return NO_ERROR; -} - - -INT -WSPAPI -WSPGetSockOpt(IN SOCKET Handle, - IN INT Level, - IN INT OptionName, - OUT CHAR FAR* OptionValue, - IN OUT LPINT OptionLength, - OUT LPINT lpErrno) -{ - PSOCKET_INFORMATION Socket; - INT ErrorCode; - PWINSOCK_TEB_DATA ThreadData; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - *lpErrno = WSAENOTSOCK; - return SOCKET_ERROR; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Make sure we're not closed */ - if (Socket->SharedData.State == SocketClosed) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Validate the pointer and length */ - if (!(OptionValue) || - !(OptionLength) || - (*OptionLength < sizeof(CHAR)) || - (*OptionLength & 0x80000000)) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Validate option */ - if (!IsValidOptionForSocket(Socket, Level, OptionName)) - { - /* Fail */ - ErrorCode = WSAENOPROTOOPT; - goto error; - } - - /* If it's one of the recognized options */ - if (Level == SOL_SOCKET && - (OptionName == SO_BROADCAST || - OptionName == SO_DEBUG || - OptionName == SO_DONTLINGER || - OptionName == SO_LINGER || - OptionName == SO_OOBINLINE || - OptionName == SO_RCVBUF || - OptionName == SO_REUSEADDR || - OptionName == SO_EXCLUSIVEADDRUSE || - OptionName == SO_CONDITIONAL_ACCEPT || - OptionName == SO_SNDBUF || - OptionName == SO_TYPE || - OptionName == SO_ACCEPTCONN || - OptionName == SO_ERROR)) - { - /* Clear the buffer first */ - RtlZeroMemory(OptionValue, *OptionLength); - } - - - /* Check the Level first */ - switch (Level) - { - /* Handle SOL_SOCKET */ - case SOL_SOCKET: - - /* Now check the Option */ - switch (OptionName) - { - case SO_TYPE: - - /* Validate the size */ - if (*OptionLength < sizeof(INT)) - { - /* Size is too small, fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Return the data */ - *OptionValue = Socket->SharedData.SocketType; - *OptionLength = sizeof(INT); - break; - - case SO_RCVBUF: - - /* Validate the size */ - if (*OptionLength < sizeof(INT)) - { - /* Size is too small, fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Return the data */ - *(PINT)OptionValue = Socket->SharedData.SizeOfRecvBuffer; - *OptionLength = sizeof(INT); - break; - - case SO_SNDBUF: - - /* Validate the size */ - if (*OptionLength < sizeof(INT)) - { - /* Size is too small, fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Return the data */ - *(PINT)OptionValue = Socket->SharedData.SizeOfSendBuffer; - *OptionLength = sizeof(INT); - break; - - case SO_ACCEPTCONN: - - /* Return the data */ - *OptionValue = Socket->SharedData.Listening; - *OptionLength = sizeof(BOOLEAN); - break; - - case SO_BROADCAST: - - /* Return the data */ - *OptionValue = Socket->SharedData.Broadcast; - *OptionLength = sizeof(BOOLEAN); - break; - - case SO_DEBUG: - - /* Return the data */ - *OptionValue = Socket->SharedData.Debug; - *OptionLength = sizeof(BOOLEAN); - break; - - case SO_CONDITIONAL_ACCEPT: - case SO_DONTLINGER: - case SO_DONTROUTE: - case SO_ERROR: - case SO_GROUP_ID: - case SO_GROUP_PRIORITY: - case SO_KEEPALIVE: - case SO_LINGER: - case SO_MAX_MSG_SIZE: - case SO_OOBINLINE: - case SO_PROTOCOL_INFO: - case SO_REUSEADDR: - - /* Unsupported */ - - default: - - /* Unsupported by us, give it to the helper */ - ErrorCode = SockGetTdiHandles(Socket); - if (ErrorCode != NO_ERROR) goto error; - - /* Call the helper */ - ErrorCode = Socket->HelperData->WSHGetSocketInformation(Socket->HelperContext, - Handle, - Socket->TdiAddressHandle, - Socket->TdiConnectionHandle, - Level, - OptionName, - OptionValue, - OptionLength); - if (ErrorCode != NO_ERROR) goto error; - break; - } - - default: - - /* Unsupported by us, give it to the helper */ - ErrorCode = SockGetTdiHandles(Socket); - if (ErrorCode != NO_ERROR) goto error; - - /* Call the helper */ - ErrorCode = Socket->HelperData->WSHGetSocketInformation(Socket->HelperContext, - Handle, - Socket->TdiAddressHandle, - Socket->TdiConnectionHandle, - Level, - OptionName, - OptionValue, - OptionLength); - if (ErrorCode != NO_ERROR) goto error; - break; - } - -error: - /* Release the lock and dereference the socket */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - - /* Handle error case */ - if (ErrorCode != NO_ERROR) - { - /* Return error */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -WSPSetSockOpt(IN SOCKET Handle, - IN INT Level, - IN INT OptionName, - IN CONST CHAR FAR *OptionValue, - IN INT OptionLength, - OUT LPINT lpErrno) -{ - PSOCKET_INFORMATION Socket; - INT ErrorCode; - PWINSOCK_TEB_DATA ThreadData; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - *lpErrno = WSAENOTSOCK; - return SOCKET_ERROR; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Make sure we're not closed */ - if (Socket->SharedData.State == SocketClosed) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Validate the pointer */ - if (!OptionValue) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Validate option */ - if (!IsValidOptionForSocket(Socket, Level, OptionName)) - { - /* Fail */ - ErrorCode = WSAENOPROTOOPT; - goto error; - } - - /* FIXME: Write code */ - -error: - - /* Check if this is the failure path */ - if (ErrorCode != NO_ERROR) - { - /* Dereference and unlock the socket */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - - /* Return error */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Update the socket's state in AFD */ - ErrorCode = SockSetHandleContext(Socket); - if (ErrorCode != NO_ERROR) goto error; - - /* Return success */ - return NO_ERROR; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -DWORD SockSendBufferWindow; -DWORD SockReceiveBufferWindow; - -/* FUNCTIONS *****************************************************************/ - -INT -WSPAPI -SockUpdateWindowSizes(IN PSOCKET_INFORMATION Socket, - IN BOOLEAN Force) -{ - INT ErrorCode; - - /* Check if this is a connection-less socket */ - if (Socket->SharedData.ServiceFlags1 & XP1_CONNECTIONLESS) - { - /* It must be bound */ - if (Socket->SharedData.State == SocketOpen) return NO_ERROR; - } - else - { - /* It must be connected */ - if (Socket->SharedData.State == SocketConnected) return NO_ERROR; - - /* Get the TDI handles for it */ - ErrorCode = SockGetTdiHandles(Socket); - if (ErrorCode != NO_ERROR) return ErrorCode; - - /* Tell WSH the new size */ - ErrorCode = Socket->HelperData->WSHSetSocketInformation(Socket->HelperContext, - Socket->Handle, - Socket->TdiAddressHandle, - Socket->TdiConnectionHandle, - SOL_SOCKET, - SO_RCVBUF, - (PVOID)&Socket->SharedData.SizeOfRecvBuffer, - sizeof(DWORD)); - } - - /* Check if the buffer changed, or if this is a force */ - if ((Socket->SharedData.SizeOfRecvBuffer != SockReceiveBufferWindow) || - (Force)) - { - /* Set the information in AFD */ - ErrorCode = SockSetInformation(Socket, - AFD_INFO_RECEIVE_WINDOW_SIZE, - NULL, - &Socket->SharedData.SizeOfRecvBuffer, - NULL); - if (ErrorCode != NO_ERROR) return ErrorCode; - } - - /* Do the same thing for the send buffer */ - if ((Socket->SharedData.SizeOfSendBuffer != SockSendBufferWindow) || - (Force)) - { - /* Set the information in AFD */ - ErrorCode = SockSetInformation(Socket, - AFD_INFO_SEND_WINDOW_SIZE, - NULL, - &Socket->SharedData.SizeOfSendBuffer, - NULL); - if (ErrorCode != NO_ERROR) return ErrorCode; - } - - /* Return to caller */ - return NO_ERROR; -} - -BOOLEAN -WSPAPI -IsValidOptionForSocket(IN PSOCKET_INFORMATION Socket, - IN INT Level, - IN INT OptionName) -{ - /* SOL_INTERNAL is always illegal when external, of course */ - if (Level == SOL_INTERNAL) return FALSE; - - /* Anything else but SOL_SOCKET we can't handle, so assume it's legal */ - if (Level != SOL_SOCKET) return TRUE; - - /* Check the option name */ - switch (OptionName) - { - case SO_DONTLINGER: - case SO_KEEPALIVE: - case SO_LINGER: - case SO_OOBINLINE: - case SO_ACCEPTCONN: - /* Only valid on stream sockets */ - if (MSAFD_IS_DGRAM_SOCK(Socket)) return FALSE; - - /* It is one, suceed */ - return TRUE; - - case SO_BROADCAST: - /* Only valid on datagram sockets */ - if (MSAFD_IS_DGRAM_SOCK(Socket)) return TRUE; - - /* It isn't one, fail */ - return FALSE; - - case SO_PROTOCOL_INFOA: - /* Winsock 2 has a hack for this, we should get the W version */ - return FALSE; - - default: - /* Anything else is always valid */ - return TRUE; - } -} - -INT -WSPAPI -SockGetConnectData(IN PSOCKET_INFORMATION Socket, - IN ULONG Ioctl, - IN PVOID Buffer, - IN ULONG BufferLength, - OUT PULONG BufferReturned) -{ - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - NTSTATUS Status; - IO_STATUS_BLOCK IoStatusBlock; - AFD_PENDING_ACCEPT_DATA ConnectData; - - /* Make sure we have Accept Info in the TEB for this Socket */ - if ((ThreadData->AcceptData) && - (ThreadData->AcceptData->ListenHandle == Socket->WshContext.Handle)) - { - /* Set the connect data structure */ - ConnectData.SequenceNumber = ThreadData->AcceptData->SequenceNumber; - ConnectData.ReturnSize = FALSE; - - /* Send it to AFD */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - 0, - &IoStatusBlock, - Ioctl, - &ConnectData, - sizeof(ConnectData), - Buffer, - BufferLength); - } - else - { - /* Request it from AFD */ - Status = NtDeviceIoControlFile(Socket->WshContext.Handle, - ThreadData->EventHandle, - NULL, - 0, - &IoStatusBlock, - Ioctl, - NULL, - 0, - Buffer, - BufferLength); - } - - /* Check if we need to wait */ - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - SockWaitForSingleObject(ThreadData->EventHandle, - Socket->Handle, - NO_BLOCKING_HOOK, - NO_TIMEOUT); - - /* Get new status */ - Status = IoStatusBlock.Status; - } - - /* Check for error */ - if (!NT_SUCCESS(Status)) - { - /* Fail */ - return NtStatusToSocketError(Status); - } - - /* Return the length */ - if (BufferReturned) *BufferReturned = PtrToUlong(IoStatusBlock.Information); - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -WSPIoctl(IN SOCKET Handle, - IN DWORD dwIoControlCode, - IN LPVOID lpvInBuffer, - IN DWORD cbInBuffer, - OUT LPVOID lpvOutBuffer, - IN DWORD cbOutBuffer, - OUT LPDWORD lpcbBytesReturned, - IN LPWSAOVERLAPPED lpOverlapped, - IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, - IN LPWSATHREADID lpThreadId, - OUT LPINT lpErrno) -{ - PSOCKET_INFORMATION Socket; - INT ErrorCode; - PWINSOCK_TEB_DATA ThreadData; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - switch(dwIoControlCode) { - - case FIONBIO: - - /* Check if the Buffer is OK */ - if(cbInBuffer < sizeof(ULONG)) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - return 0; - - default: - - /* Unsupported for now */ - *lpErrno = WSAEINVAL; - return SOCKET_ERROR; - } - -error: - /* Check if we had a socket */ - if (Socket) - { - /* Release lock and dereference it */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - } - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Return error */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return to caller */ - return NO_ERROR; -} - - -INT -WSPAPI -WSPGetSockOpt(IN SOCKET Handle, - IN INT Level, - IN INT OptionName, - OUT CHAR FAR* OptionValue, - IN OUT LPINT OptionLength, - OUT LPINT lpErrno) -{ - PSOCKET_INFORMATION Socket; - INT ErrorCode; - PWINSOCK_TEB_DATA ThreadData; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - *lpErrno = WSAENOTSOCK; - return SOCKET_ERROR; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Make sure we're not closed */ - if (Socket->SharedData.State == SocketClosed) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Validate the pointer and length */ - if (!(OptionValue) || - !(OptionLength) || - (*OptionLength < sizeof(CHAR)) || - (*OptionLength & 0x80000000)) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Validate option */ - if (!IsValidOptionForSocket(Socket, Level, OptionName)) - { - /* Fail */ - ErrorCode = WSAENOPROTOOPT; - goto error; - } - - /* If it's one of the recognized options */ - if (Level == SOL_SOCKET && - (OptionName == SO_BROADCAST || - OptionName == SO_DEBUG || - OptionName == SO_DONTLINGER || - OptionName == SO_LINGER || - OptionName == SO_OOBINLINE || - OptionName == SO_RCVBUF || - OptionName == SO_REUSEADDR || - OptionName == SO_EXCLUSIVEADDRUSE || - OptionName == SO_CONDITIONAL_ACCEPT || - OptionName == SO_SNDBUF || - OptionName == SO_TYPE || - OptionName == SO_ACCEPTCONN || - OptionName == SO_ERROR)) - { - /* Clear the buffer first */ - RtlZeroMemory(OptionValue, *OptionLength); - } - - - /* Check the Level first */ - switch (Level) - { - /* Handle SOL_SOCKET */ - case SOL_SOCKET: - - /* Now check the Option */ - switch (OptionName) - { - case SO_TYPE: - - /* Validate the size */ - if (*OptionLength < sizeof(INT)) - { - /* Size is too small, fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Return the data */ - *OptionValue = Socket->SharedData.SocketType; - *OptionLength = sizeof(INT); - break; - - case SO_RCVBUF: - - /* Validate the size */ - if (*OptionLength < sizeof(INT)) - { - /* Size is too small, fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Return the data */ - *(PINT)OptionValue = Socket->SharedData.SizeOfRecvBuffer; - *OptionLength = sizeof(INT); - break; - - case SO_SNDBUF: - - /* Validate the size */ - if (*OptionLength < sizeof(INT)) - { - /* Size is too small, fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Return the data */ - *(PINT)OptionValue = Socket->SharedData.SizeOfSendBuffer; - *OptionLength = sizeof(INT); - break; - - case SO_ACCEPTCONN: - - /* Return the data */ - *OptionValue = Socket->SharedData.Listening; - *OptionLength = sizeof(BOOLEAN); - break; - - case SO_BROADCAST: - - /* Return the data */ - *OptionValue = Socket->SharedData.Broadcast; - *OptionLength = sizeof(BOOLEAN); - break; - - case SO_DEBUG: - - /* Return the data */ - *OptionValue = Socket->SharedData.Debug; - *OptionLength = sizeof(BOOLEAN); - break; - - case SO_CONDITIONAL_ACCEPT: - case SO_DONTLINGER: - case SO_DONTROUTE: - case SO_ERROR: - case SO_GROUP_ID: - case SO_GROUP_PRIORITY: - case SO_KEEPALIVE: - case SO_LINGER: - case SO_MAX_MSG_SIZE: - case SO_OOBINLINE: - case SO_PROTOCOL_INFO: - case SO_REUSEADDR: - - /* Unsupported */ - - default: - - /* Unsupported by us, give it to the helper */ - ErrorCode = SockGetTdiHandles(Socket); - if (ErrorCode != NO_ERROR) goto error; - - /* Call the helper */ - ErrorCode = Socket->HelperData->WSHGetSocketInformation(Socket->HelperContext, - Handle, - Socket->TdiAddressHandle, - Socket->TdiConnectionHandle, - Level, - OptionName, - OptionValue, - OptionLength); - if (ErrorCode != NO_ERROR) goto error; - break; - } - - default: - - /* Unsupported by us, give it to the helper */ - ErrorCode = SockGetTdiHandles(Socket); - if (ErrorCode != NO_ERROR) goto error; - - /* Call the helper */ - ErrorCode = Socket->HelperData->WSHGetSocketInformation(Socket->HelperContext, - Handle, - Socket->TdiAddressHandle, - Socket->TdiConnectionHandle, - Level, - OptionName, - OptionValue, - OptionLength); - if (ErrorCode != NO_ERROR) goto error; - break; - } - -error: - /* Release the lock and dereference the socket */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - - /* Handle error case */ - if (ErrorCode != NO_ERROR) - { - /* Return error */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Return success */ - return NO_ERROR; -} - -INT -WSPAPI -WSPSetSockOpt(IN SOCKET Handle, - IN INT Level, - IN INT OptionName, - IN CONST CHAR FAR *OptionValue, - IN INT OptionLength, - OUT LPINT lpErrno) -{ - PSOCKET_INFORMATION Socket; - INT ErrorCode; - PWINSOCK_TEB_DATA ThreadData; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Get the socket structure */ - Socket = SockFindAndReferenceSocket(Handle, TRUE); - if (!Socket) - { - /* Fail */ - *lpErrno = WSAENOTSOCK; - return SOCKET_ERROR; - } - - /* Lock the socket */ - EnterCriticalSection(&Socket->Lock); - - /* Make sure we're not closed */ - if (Socket->SharedData.State == SocketClosed) - { - /* Fail */ - ErrorCode = WSAENOTSOCK; - goto error; - } - - /* Validate the pointer */ - if (!OptionValue) - { - /* Fail */ - ErrorCode = WSAEFAULT; - goto error; - } - - /* Validate option */ - if (!IsValidOptionForSocket(Socket, Level, OptionName)) - { - /* Fail */ - ErrorCode = WSAENOPROTOOPT; - goto error; - } - - /* FIXME: Write code */ - -error: - - /* Check if this is the failure path */ - if (ErrorCode != NO_ERROR) - { - /* Dereference and unlock the socket */ - LeaveCriticalSection(&Socket->Lock); - SockDereferenceSocket(Socket); - - /* Return error */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Update the socket's state in AFD */ - ErrorCode = SockSetHandleContext(Socket); - if (ErrorCode != NO_ERROR) goto error; - - /* Return success */ - return NO_ERROR; -} - diff --git a/dll/win32/mswsock/msafd/spi.c b/dll/win32/mswsock/msafd/spi.c index eadc7194da5..07093fd35bb 100644 --- a/dll/win32/mswsock/msafd/spi.c +++ b/dll/win32/mswsock/msafd/spi.c @@ -219,666 +219,3 @@ WSPCleanup(OUT LPINT lpErrno) return 0; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -PVOID pfnIcfOpenPort; -PICF_CONNECT pfnIcfConnect; -PVOID pfnIcfDisconnect; -HINSTANCE IcfDllHandle; - -WSPPROC_TABLE SockProcTable = -{ - &WSPAccept, - &WSPAddressToString, - &WSPAsyncSelect, - &WSPBind, - &WSPCancelBlockingCall, - &WSPCleanup, - &WSPCloseSocket, - &WSPConnect, - &WSPDuplicateSocket, - &WSPEnumNetworkEvents, - &WSPEventSelect, - &WSPGetOverlappedResult, - &WSPGetPeerName, - &WSPGetSockName, - &WSPGetSockOpt, - &WSPGetQOSByName, - &WSPIoctl, - &WSPJoinLeaf, - &WSPListen, - &WSPRecv, - &WSPRecvDisconnect, - &WSPRecvFrom, - &WSPSelect, - &WSPSend, - &WSPSendDisconnect, - &WSPSendTo, - &WSPSetSockOpt, - &WSPShutdown, - &WSPSocket, - &WSPStringToAddress -}; - -LONG SockWspStartupCount; -WSPUPCALLTABLE SockUpcallTableHack; -LPWSPUPCALLTABLE SockUpcallTable; - -/* FUNCTIONS *****************************************************************/ - -VOID -WSPAPI -NewIcfConnection(IN PSOCK_ICF_DATA IcfData) -{ - /* Load the ICF DLL */ - IcfData->DllHandle = LoadLibraryW(L"hhnetcfg.dll"); - if (IcfData->DllHandle) - { - /* Get the entrypoints */ - IcfData->IcfOpenDynamicFwPort = GetProcAddress(IcfData->DllHandle, - "IcfOpenDynamicFwPort"); - IcfData->IcfConnect = (PICF_CONNECT)GetProcAddress(IcfData->DllHandle, - "IcfConnect"); - IcfData->IcfDisconnect = GetProcAddress(IcfData->DllHandle, - "IcfDisconnect"); - - /* Now call IcfConnect */ - if (!IcfData->IcfConnect(IcfData)) - { - /* We failed, release the library */ - FreeLibrary(IcfData->DllHandle); - } - } -} - -VOID -WSPAPI -InitializeIcfConnection(IN PSOCK_ICF_DATA IcfData) -{ - /* Make sure we have an ICF Handle */ - if (IcfData->IcfHandle) - { - /* Save the function pointers and dll handle */ - IcfDllHandle = IcfData->DllHandle; - pfnIcfOpenPort = IcfData->IcfOpenDynamicFwPort; - pfnIcfConnect = IcfData->IcfConnect; - pfnIcfDisconnect = IcfData->IcfDisconnect; - } -} - -VOID -WSPAPI -CloseIcfConnection(IN PSOCK_ICF_DATA IcfData) -{ - /* Make sure we have an ICF Handle */ - if (IcfData->IcfHandle) - { - /* Call IcfDisconnect */ - IcfData->IcfConnect(IcfData); - - /* Release the library */ - FreeLibrary(IcfData->DllHandle); - } -} - -INT -WSPAPI -WSPStartup(IN WORD wVersionRequested, - OUT LPWSPDATA lpWSPData, - IN LPWSAPROTOCOL_INFOW lpProtocolInfo, - IN WSPUPCALLTABLE UpcallTable, - OUT LPWSPPROC_TABLE lpProcTable) -{ - CHAR DllPath[MAX_PATH]; - HINSTANCE DllHandle; - SOCK_ICF_DATA IcfData; - NT_PRODUCT_TYPE ProductType; - - /* Call the generic mswsock initialization routine */ - if (!MSWSOCK_Initialize()) return WSAENOBUFS; - - /* Check if we have TEB data yet */ - if (!NtCurrentTeb()->WinSockData) - { - /* We don't have thread data yet, initialize it */ - if (!MSAFD_SockThreadInitialize()) return WSAENOBUFS; - } - - /* Check the version number */ - if (wVersionRequested != MAKEWORD(2,2)) return WSAVERNOTSUPPORTED; - - /* Get ICF entrypoints */ - NewIcfConnection(&IcfData); - - /* Acquire the global lock */ - SockAcquireRwLockExclusive(&SocketGlobalLock); - - /* Check if we've never initialized before */ - if (!SockWspStartupCount) - { - /* Check if we have a context table by now */ - if (!SockContextTable) - { - /* Create it */ - if (WahCreateHandleContextTable(&SockContextTable) != NO_ERROR) - { - /* Fail */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - CloseIcfConnection(&IcfData); - return WSASYSCALLFAILURE; - } - } - - /* Bias our load count so we won't be killed with pending APCs */ - GetModuleFileNameA(SockModuleHandle, DllPath, MAX_PATH); - DllHandle = LoadLibraryA(DllPath); - if (!DllHandle) - { - /* Weird error, release and return */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - CloseIcfConnection(&IcfData); - return WSASYSCALLFAILURE; - } - - /* Initialize ICF */ - InitializeIcfConnection(&IcfData); - - /* Set our Upcall Table */ - SockUpcallTableHack = UpcallTable; - SockUpcallTable = &SockUpcallTableHack; - } - - /* Increase startup count */ - SockWspStartupCount++; - - /* Return our version */ - lpWSPData->wVersion = MAKEWORD(2, 2); - lpWSPData->wHighVersion = MAKEWORD(2, 2); - wcscpy(lpWSPData->szDescription, L"Microsoft Windows Sockets Version 2."); - - /* Return our Internal Table */ - *lpProcTable = SockProcTable; - - /* Check if this is a SAN GUID */ - if (IsEqualGUID(&lpProtocolInfo->ProviderId, &SockTcpProviderInfo.ProviderId)) - { - /* Get the product type and check if this is a server OS */ - RtlGetNtProductType(&ProductType); - if (ProductType != NtProductWinNt) - { - /* Get the SAN TCP/IP Catalog ID */ - /* FIXME: SockSanGetTcpipCatalogId(); */ - - /* Initialize SAN if it's enabled */ - if (SockSanEnabled) SockSanInitialize(); - } - } - - /* Release the lock and return */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - - /* Return to caller */ - return NO_ERROR; -} - -INT -WSPAPI -WSPCleanup(OUT LPINT lpErrno) -{ - /* FIXME: Clean up */ - *lpErrno = NO_ERROR; - return 0; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -PVOID pfnIcfOpenPort; -PICF_CONNECT pfnIcfConnect; -PVOID pfnIcfDisconnect; -HINSTANCE IcfDllHandle; - -WSPPROC_TABLE SockProcTable = -{ - &WSPAccept, - &WSPAddressToString, - &WSPAsyncSelect, - &WSPBind, - &WSPCancelBlockingCall, - &WSPCleanup, - &WSPCloseSocket, - &WSPConnect, - &WSPDuplicateSocket, - &WSPEnumNetworkEvents, - &WSPEventSelect, - &WSPGetOverlappedResult, - &WSPGetPeerName, - &WSPGetSockName, - &WSPGetSockOpt, - &WSPGetQOSByName, - &WSPIoctl, - &WSPJoinLeaf, - &WSPListen, - &WSPRecv, - &WSPRecvDisconnect, - &WSPRecvFrom, - &WSPSelect, - &WSPSend, - &WSPSendDisconnect, - &WSPSendTo, - &WSPSetSockOpt, - &WSPShutdown, - &WSPSocket, - &WSPStringToAddress -}; - -LONG SockWspStartupCount; -WSPUPCALLTABLE SockUpcallTableHack; -LPWSPUPCALLTABLE SockUpcallTable; - -/* FUNCTIONS *****************************************************************/ - -VOID -WSPAPI -NewIcfConnection(IN PSOCK_ICF_DATA IcfData) -{ - /* Load the ICF DLL */ - IcfData->DllHandle = LoadLibraryW(L"hhnetcfg.dll"); - if (IcfData->DllHandle) - { - /* Get the entrypoints */ - IcfData->IcfOpenDynamicFwPort = GetProcAddress(IcfData->DllHandle, - "IcfOpenDynamicFwPort"); - IcfData->IcfConnect = (PICF_CONNECT)GetProcAddress(IcfData->DllHandle, - "IcfConnect"); - IcfData->IcfDisconnect = GetProcAddress(IcfData->DllHandle, - "IcfDisconnect"); - - /* Now call IcfConnect */ - if (!IcfData->IcfConnect(IcfData)) - { - /* We failed, release the library */ - FreeLibrary(IcfData->DllHandle); - } - } -} - -VOID -WSPAPI -InitializeIcfConnection(IN PSOCK_ICF_DATA IcfData) -{ - /* Make sure we have an ICF Handle */ - if (IcfData->IcfHandle) - { - /* Save the function pointers and dll handle */ - IcfDllHandle = IcfData->DllHandle; - pfnIcfOpenPort = IcfData->IcfOpenDynamicFwPort; - pfnIcfConnect = IcfData->IcfConnect; - pfnIcfDisconnect = IcfData->IcfDisconnect; - } -} - -VOID -WSPAPI -CloseIcfConnection(IN PSOCK_ICF_DATA IcfData) -{ - /* Make sure we have an ICF Handle */ - if (IcfData->IcfHandle) - { - /* Call IcfDisconnect */ - IcfData->IcfConnect(IcfData); - - /* Release the library */ - FreeLibrary(IcfData->DllHandle); - } -} - -INT -WSPAPI -WSPStartup(IN WORD wVersionRequested, - OUT LPWSPDATA lpWSPData, - IN LPWSAPROTOCOL_INFOW lpProtocolInfo, - IN WSPUPCALLTABLE UpcallTable, - OUT LPWSPPROC_TABLE lpProcTable) -{ - CHAR DllPath[MAX_PATH]; - HINSTANCE DllHandle; - SOCK_ICF_DATA IcfData; - NT_PRODUCT_TYPE ProductType; - - /* Call the generic mswsock initialization routine */ - if (!MSWSOCK_Initialize()) return WSAENOBUFS; - - /* Check if we have TEB data yet */ - if (!NtCurrentTeb()->WinSockData) - { - /* We don't have thread data yet, initialize it */ - if (!MSAFD_SockThreadInitialize()) return WSAENOBUFS; - } - - /* Check the version number */ - if (wVersionRequested != MAKEWORD(2,2)) return WSAVERNOTSUPPORTED; - - /* Get ICF entrypoints */ - NewIcfConnection(&IcfData); - - /* Acquire the global lock */ - SockAcquireRwLockExclusive(&SocketGlobalLock); - - /* Check if we've never initialized before */ - if (!SockWspStartupCount) - { - /* Check if we have a context table by now */ - if (!SockContextTable) - { - /* Create it */ - if (WahCreateHandleContextTable(&SockContextTable) != NO_ERROR) - { - /* Fail */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - CloseIcfConnection(&IcfData); - return WSASYSCALLFAILURE; - } - } - - /* Bias our load count so we won't be killed with pending APCs */ - GetModuleFileNameA(SockModuleHandle, DllPath, MAX_PATH); - DllHandle = LoadLibraryA(DllPath); - if (!DllHandle) - { - /* Weird error, release and return */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - CloseIcfConnection(&IcfData); - return WSASYSCALLFAILURE; - } - - /* Initialize ICF */ - InitializeIcfConnection(&IcfData); - - /* Set our Upcall Table */ - SockUpcallTableHack = UpcallTable; - SockUpcallTable = &SockUpcallTableHack; - } - - /* Increase startup count */ - SockWspStartupCount++; - - /* Return our version */ - lpWSPData->wVersion = MAKEWORD(2, 2); - lpWSPData->wHighVersion = MAKEWORD(2, 2); - wcscpy(lpWSPData->szDescription, L"Microsoft Windows Sockets Version 2."); - - /* Return our Internal Table */ - *lpProcTable = SockProcTable; - - /* Check if this is a SAN GUID */ - if (IsEqualGUID(&lpProtocolInfo->ProviderId, &SockTcpProviderInfo.ProviderId)) - { - /* Get the product type and check if this is a server OS */ - RtlGetNtProductType(&ProductType); - if (ProductType != NtProductWinNt) - { - /* Get the SAN TCP/IP Catalog ID */ - /* FIXME: SockSanGetTcpipCatalogId(); */ - - /* Initialize SAN if it's enabled */ - if (SockSanEnabled) SockSanInitialize(); - } - } - - /* Release the lock and return */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - - /* Return to caller */ - return NO_ERROR; -} - -INT -WSPAPI -WSPCleanup(OUT LPINT lpErrno) -{ - /* FIXME: Clean up */ - *lpErrno = NO_ERROR; - return 0; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -PVOID pfnIcfOpenPort; -PICF_CONNECT pfnIcfConnect; -PVOID pfnIcfDisconnect; -HINSTANCE IcfDllHandle; - -WSPPROC_TABLE SockProcTable = -{ - &WSPAccept, - &WSPAddressToString, - &WSPAsyncSelect, - &WSPBind, - &WSPCancelBlockingCall, - &WSPCleanup, - &WSPCloseSocket, - &WSPConnect, - &WSPDuplicateSocket, - &WSPEnumNetworkEvents, - &WSPEventSelect, - &WSPGetOverlappedResult, - &WSPGetPeerName, - &WSPGetSockName, - &WSPGetSockOpt, - &WSPGetQOSByName, - &WSPIoctl, - &WSPJoinLeaf, - &WSPListen, - &WSPRecv, - &WSPRecvDisconnect, - &WSPRecvFrom, - &WSPSelect, - &WSPSend, - &WSPSendDisconnect, - &WSPSendTo, - &WSPSetSockOpt, - &WSPShutdown, - &WSPSocket, - &WSPStringToAddress -}; - -LONG SockWspStartupCount; -WSPUPCALLTABLE SockUpcallTableHack; -LPWSPUPCALLTABLE SockUpcallTable; - -/* FUNCTIONS *****************************************************************/ - -VOID -WSPAPI -NewIcfConnection(IN PSOCK_ICF_DATA IcfData) -{ - /* Load the ICF DLL */ - IcfData->DllHandle = LoadLibraryW(L"hhnetcfg.dll"); - if (IcfData->DllHandle) - { - /* Get the entrypoints */ - IcfData->IcfOpenDynamicFwPort = GetProcAddress(IcfData->DllHandle, - "IcfOpenDynamicFwPort"); - IcfData->IcfConnect = (PICF_CONNECT)GetProcAddress(IcfData->DllHandle, - "IcfConnect"); - IcfData->IcfDisconnect = GetProcAddress(IcfData->DllHandle, - "IcfDisconnect"); - - /* Now call IcfConnect */ - if (!IcfData->IcfConnect(IcfData)) - { - /* We failed, release the library */ - FreeLibrary(IcfData->DllHandle); - } - } -} - -VOID -WSPAPI -InitializeIcfConnection(IN PSOCK_ICF_DATA IcfData) -{ - /* Make sure we have an ICF Handle */ - if (IcfData->IcfHandle) - { - /* Save the function pointers and dll handle */ - IcfDllHandle = IcfData->DllHandle; - pfnIcfOpenPort = IcfData->IcfOpenDynamicFwPort; - pfnIcfConnect = IcfData->IcfConnect; - pfnIcfDisconnect = IcfData->IcfDisconnect; - } -} - -VOID -WSPAPI -CloseIcfConnection(IN PSOCK_ICF_DATA IcfData) -{ - /* Make sure we have an ICF Handle */ - if (IcfData->IcfHandle) - { - /* Call IcfDisconnect */ - IcfData->IcfConnect(IcfData); - - /* Release the library */ - FreeLibrary(IcfData->DllHandle); - } -} - -INT -WSPAPI -WSPStartup(IN WORD wVersionRequested, - OUT LPWSPDATA lpWSPData, - IN LPWSAPROTOCOL_INFOW lpProtocolInfo, - IN WSPUPCALLTABLE UpcallTable, - OUT LPWSPPROC_TABLE lpProcTable) -{ - CHAR DllPath[MAX_PATH]; - HINSTANCE DllHandle; - SOCK_ICF_DATA IcfData; - NT_PRODUCT_TYPE ProductType; - - /* Call the generic mswsock initialization routine */ - if (!MSWSOCK_Initialize()) return WSAENOBUFS; - - /* Check if we have TEB data yet */ - if (!NtCurrentTeb()->WinSockData) - { - /* We don't have thread data yet, initialize it */ - if (!MSAFD_SockThreadInitialize()) return WSAENOBUFS; - } - - /* Check the version number */ - if (wVersionRequested != MAKEWORD(2,2)) return WSAVERNOTSUPPORTED; - - /* Get ICF entrypoints */ - NewIcfConnection(&IcfData); - - /* Acquire the global lock */ - SockAcquireRwLockExclusive(&SocketGlobalLock); - - /* Check if we've never initialized before */ - if (!SockWspStartupCount) - { - /* Check if we have a context table by now */ - if (!SockContextTable) - { - /* Create it */ - if (WahCreateHandleContextTable(&SockContextTable) != NO_ERROR) - { - /* Fail */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - CloseIcfConnection(&IcfData); - return WSASYSCALLFAILURE; - } - } - - /* Bias our load count so we won't be killed with pending APCs */ - GetModuleFileNameA(SockModuleHandle, DllPath, MAX_PATH); - DllHandle = LoadLibraryA(DllPath); - if (!DllHandle) - { - /* Weird error, release and return */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - CloseIcfConnection(&IcfData); - return WSASYSCALLFAILURE; - } - - /* Initialize ICF */ - InitializeIcfConnection(&IcfData); - - /* Set our Upcall Table */ - SockUpcallTableHack = UpcallTable; - SockUpcallTable = &SockUpcallTableHack; - } - - /* Increase startup count */ - SockWspStartupCount++; - - /* Return our version */ - lpWSPData->wVersion = MAKEWORD(2, 2); - lpWSPData->wHighVersion = MAKEWORD(2, 2); - wcscpy(lpWSPData->szDescription, L"Microsoft Windows Sockets Version 2."); - - /* Return our Internal Table */ - *lpProcTable = SockProcTable; - - /* Check if this is a SAN GUID */ - if (IsEqualGUID(&lpProtocolInfo->ProviderId, &SockTcpProviderInfo.ProviderId)) - { - /* Get the product type and check if this is a server OS */ - RtlGetNtProductType(&ProductType); - if (ProductType != NtProductWinNt) - { - /* Get the SAN TCP/IP Catalog ID */ - /* FIXME: SockSanGetTcpipCatalogId(); */ - - /* Initialize SAN if it's enabled */ - if (SockSanEnabled) SockSanInitialize(); - } - } - - /* Release the lock and return */ - SockReleaseRwLockExclusive(&SocketGlobalLock); - - /* Return to caller */ - return NO_ERROR; -} - -INT -WSPAPI -WSPCleanup(OUT LPINT lpErrno) -{ - /* FIXME: Clean up */ - *lpErrno = NO_ERROR; - return 0; -} - diff --git a/dll/win32/mswsock/msafd/tpackets.c b/dll/win32/mswsock/msafd/tpackets.c index 3e062e90d63..bd1ad2806dc 100644 --- a/dll/win32/mswsock/msafd/tpackets.c +++ b/dll/win32/mswsock/msafd/tpackets.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/msafd/tranfile.c b/dll/win32/mswsock/msafd/tranfile.c index 3e062e90d63..bd1ad2806dc 100644 --- a/dll/win32/mswsock/msafd/tranfile.c +++ b/dll/win32/mswsock/msafd/tranfile.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/msafd/wspmisc.c b/dll/win32/mswsock/msafd/wspmisc.c index 0acd28256eb..eeab724286f 100644 --- a/dll/win32/mswsock/msafd/wspmisc.c +++ b/dll/win32/mswsock/msafd/wspmisc.c @@ -86,267 +86,3 @@ WSPDuplicateSocket(IN SOCKET s, return 0; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -BOOL -WSPAPI -WSPGetQOSByName(IN SOCKET Handle, - IN OUT LPWSABUF lpQOSName, - OUT LPQOS lpQOS, - OUT LPINT lpErrno) -{ - PWINSOCK_TEB_DATA ThreadData; - INT ErrorCode; - DWORD BytesReturned; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Call WSPIoctl for the job */ - WSPIoctl(Handle, - SIO_GET_QOS, - NULL, - 0, - lpQOS, - sizeof(QOS), - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return FALSE; - } - - /* Success */ - return TRUE; -} - -INT -WSPAPI -WSPCancelBlockingCall(OUT LPINT lpErrno) -{ - return 0; -} - -BOOL -WSPAPI -WSPGetOverlappedResult(IN SOCKET s, - IN LPWSAOVERLAPPED lpOverlapped, - OUT LPDWORD lpcbTransfer, - IN BOOL fWait, - OUT LPDWORD lpdwFlags, - OUT LPINT lpErrno) -{ - return FALSE; -} - -INT -WSPAPI -WSPDuplicateSocket(IN SOCKET s, - IN DWORD dwProcessId, - OUT LPWSAPROTOCOL_INFOW lpProtocolInfo, - OUT LPINT lpErrno) -{ - return 0; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -BOOL -WSPAPI -WSPGetQOSByName(IN SOCKET Handle, - IN OUT LPWSABUF lpQOSName, - OUT LPQOS lpQOS, - OUT LPINT lpErrno) -{ - PWINSOCK_TEB_DATA ThreadData; - INT ErrorCode; - DWORD BytesReturned; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Call WSPIoctl for the job */ - WSPIoctl(Handle, - SIO_GET_QOS, - NULL, - 0, - lpQOS, - sizeof(QOS), - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return FALSE; - } - - /* Success */ - return TRUE; -} - -INT -WSPAPI -WSPCancelBlockingCall(OUT LPINT lpErrno) -{ - return 0; -} - -BOOL -WSPAPI -WSPGetOverlappedResult(IN SOCKET s, - IN LPWSAOVERLAPPED lpOverlapped, - OUT LPDWORD lpcbTransfer, - IN BOOL fWait, - OUT LPDWORD lpdwFlags, - OUT LPINT lpErrno) -{ - return FALSE; -} - -INT -WSPAPI -WSPDuplicateSocket(IN SOCKET s, - IN DWORD dwProcessId, - OUT LPWSAPROTOCOL_INFOW lpProtocolInfo, - OUT LPINT lpErrno) -{ - return 0; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -BOOL -WSPAPI -WSPGetQOSByName(IN SOCKET Handle, - IN OUT LPWSABUF lpQOSName, - OUT LPQOS lpQOS, - OUT LPINT lpErrno) -{ - PWINSOCK_TEB_DATA ThreadData; - INT ErrorCode; - DWORD BytesReturned; - - /* Enter prolog */ - ErrorCode = SockEnterApiFast(&ThreadData); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return SOCKET_ERROR; - } - - /* Call WSPIoctl for the job */ - WSPIoctl(Handle, - SIO_GET_QOS, - NULL, - 0, - lpQOS, - sizeof(QOS), - &BytesReturned, - NULL, - NULL, - NULL, - &ErrorCode); - - /* Check for error */ - if (ErrorCode != NO_ERROR) - { - /* Fail */ - *lpErrno = ErrorCode; - return FALSE; - } - - /* Success */ - return TRUE; -} - -INT -WSPAPI -WSPCancelBlockingCall(OUT LPINT lpErrno) -{ - return 0; -} - -BOOL -WSPAPI -WSPGetOverlappedResult(IN SOCKET s, - IN LPWSAOVERLAPPED lpOverlapped, - OUT LPDWORD lpcbTransfer, - IN BOOL fWait, - OUT LPDWORD lpdwFlags, - OUT LPINT lpErrno) -{ - return FALSE; -} - -INT -WSPAPI -WSPDuplicateSocket(IN SOCKET s, - IN DWORD dwProcessId, - OUT LPWSAPROTOCOL_INFOW lpProtocolInfo, - OUT LPINT lpErrno) -{ - return 0; -} - diff --git a/dll/win32/mswsock/mswsock.rbuild b/dll/win32/mswsock/mswsock.rbuild index 473eac1689e..4c4e3d39ab3 100644 --- a/dll/win32/mswsock/mswsock.rbuild +++ b/dll/win32/mswsock/mswsock.rbuild @@ -1,7 +1,7 @@ include/reactos/winsock - dnslib/inc + dns/inc include/reactos/drivers ntdll advapi32 diff --git a/dll/win32/mswsock/mswsock/init.c b/dll/win32/mswsock/mswsock/init.c index 2a8bc65e9e7..446d0788df4 100644 --- a/dll/win32/mswsock/mswsock/init.c +++ b/dll/win32/mswsock/mswsock/init.c @@ -202,615 +202,3 @@ DllMain(HANDLE hModule, return TRUE; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -BOOL SockProcessTerminating; -LONG SockProcessPendingAPCCount; -HINSTANCE SockModuleHandle; - -/* FUNCTIONS *****************************************************************/ - -BOOL -WSPAPI -MSWSOCK_Initialize(VOID) -{ - SYSTEM_INFO SystemInfo; - - /* If our heap is already initialized, we can skip everything */ - if (SockAllocateHeapRoutine) return TRUE; - - /* Make sure nobody thinks we're terminating */ - SockProcessTerminating = FALSE; - - /* Get the system information */ - GetSystemInfo(&SystemInfo); - - /* Check if this is an MP machine */ - if (SystemInfo.dwNumberOfProcessors > 1) - { - /* Use our own heap on MP, to reduce locks */ - SockAllocateHeapRoutine = SockInitializeHeap; - SockPrivateHeap = NULL; - } - else - { - /* Use process heap */ - SockAllocateHeapRoutine = RtlAllocateHeap; - SockPrivateHeap = RtlGetProcessHeap(); - } - - /* Initialize WSM data */ - gWSM_NSPStartupRef = -1; - gWSM_NSPCallRef = 0; - - /* Initialize the helper listhead */ - InitializeListHead(&SockHelperDllListHead); - - /* Initialize the global lock */ - SockInitializeRwLockAndSpinCount(&SocketGlobalLock, 1000); - - /* Initialize the socket lock */ - InitializeCriticalSection(&MSWSOCK_SocketLock); - - /* Initialize RnR locks and other RnR data */ - Rnr_ProcessInit(); - - /* Return success */ - return TRUE; -} - -BOOL -APIENTRY -DllMain(HANDLE hModule, - DWORD dwReason, - LPVOID lpReserved) -{ - OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo; - PWINSOCK_TEB_DATA ThreadData; - - /* Check what's going on */ - switch (dwReason) - { - /* Process attaching */ - case DLL_PROCESS_ATTACH: - - /* Save module handles */ - SockModuleHandle = hModule; - NlsMsgSourcemModuleHandle = hModule; - - /* Initialize us */ - MSWSOCK_Initialize(); - break; - - /* Detaching */ - case DLL_PROCESS_DETACH: - - /* Did we initialize yet? */ - if (!SockAllocateHeapRoutine) break; - - /* Fail all future calls */ - SockProcessTerminating = TRUE; - - /* Is this a FreeLibrary? */ - if (!lpReserved) - { - /* Cleanup RNR */ - Rnr_ProcessCleanup(); - - /* Delete the socket lock */ - DeleteCriticalSection(&MSWSOCK_SocketLock); - - /* Check if we have an Async Queue Port */ - if (SockAsyncQueuePort) - { - /* Unprotect the handle */ - HandleInfo.ProtectFromClose = FALSE; - HandleInfo.Inherit = FALSE; - NtSetInformationObject(SockAsyncQueuePort, - ObjectHandleFlagInformation, - &HandleInfo, - sizeof(HandleInfo)); - - /* Close it, and clear the port */ - NtClose(SockAsyncQueuePort); - SockAsyncQueuePort = NULL; - } - - /* Check if we have a context table */ - if (SockContextTable) - { - /* Destroy it */ - WahDestroyHandleContextTable(SockContextTable); - SockContextTable = NULL; - } - - /* Delete the global lock as well */ - SockDeleteRwLock(&SocketGlobalLock); - - /* Check if we have a buffer keytable */ - if (SockBufferKeyTable) - { - /* Free it */ - VirtualFree(SockBufferKeyTable, 0, MEM_RELEASE); - } - } - - /* Check if we have to a SAN cleanup event */ - if (SockSanCleanUpCompleteEvent) - { - /* Close the event handle */ - CloseHandle(SockSanCleanUpCompleteEvent); - } - - /* Thread detaching */ - case DLL_THREAD_DETACH: - - /* Set the context to NULL for thread detach */ - if (dwReason == DLL_THREAD_DETACH) lpReserved = NULL; - - /* Check if this is a normal thread detach */ - if (!lpReserved) - { - /* Do RnR Thread cleanup */ - Rnr_ThreadCleanup(); - - /* Get thread data */ - ThreadData = NtCurrentTeb()->WinSockData; - if (ThreadData) - { - /* Check if any APCs are pending */ - if (ThreadData->PendingAPCs) - { - /* Save the value */ - InterlockedExchangeAdd(&SockProcessPendingAPCCount, - -(ThreadData->PendingAPCs)); - - /* Close the evnet handle */ - NtClose(ThreadData->EventHandle); - - /* Free the thread data and set it to null */ - RtlFreeHeap(GetProcessHeap(), 0, (PVOID)ThreadData); - NtCurrentTeb()->WinSockData = NULL; - } - } - } - - /* Check if this is a process detach fallthrough */ - if (dwReason == DLL_PROCESS_DETACH && !lpReserved) - { - /* Check if we're using a private heap */ - if (SockPrivateHeap != RtlGetProcessHeap()) - { - /* Destroy it */ - RtlDestroyHeap(SockPrivateHeap); - } - SockAllocateHeapRoutine = NULL; - } - break; - - case DLL_THREAD_ATTACH: - break; - } - - /* Return */ - return TRUE; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -BOOL SockProcessTerminating; -LONG SockProcessPendingAPCCount; -HINSTANCE SockModuleHandle; - -/* FUNCTIONS *****************************************************************/ - -BOOL -WSPAPI -MSWSOCK_Initialize(VOID) -{ - SYSTEM_INFO SystemInfo; - - /* If our heap is already initialized, we can skip everything */ - if (SockAllocateHeapRoutine) return TRUE; - - /* Make sure nobody thinks we're terminating */ - SockProcessTerminating = FALSE; - - /* Get the system information */ - GetSystemInfo(&SystemInfo); - - /* Check if this is an MP machine */ - if (SystemInfo.dwNumberOfProcessors > 1) - { - /* Use our own heap on MP, to reduce locks */ - SockAllocateHeapRoutine = SockInitializeHeap; - SockPrivateHeap = NULL; - } - else - { - /* Use process heap */ - SockAllocateHeapRoutine = RtlAllocateHeap; - SockPrivateHeap = RtlGetProcessHeap(); - } - - /* Initialize WSM data */ - gWSM_NSPStartupRef = -1; - gWSM_NSPCallRef = 0; - - /* Initialize the helper listhead */ - InitializeListHead(&SockHelperDllListHead); - - /* Initialize the global lock */ - SockInitializeRwLockAndSpinCount(&SocketGlobalLock, 1000); - - /* Initialize the socket lock */ - InitializeCriticalSection(&MSWSOCK_SocketLock); - - /* Initialize RnR locks and other RnR data */ - Rnr_ProcessInit(); - - /* Return success */ - return TRUE; -} - -BOOL -APIENTRY -DllMain(HANDLE hModule, - DWORD dwReason, - LPVOID lpReserved) -{ - OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo; - PWINSOCK_TEB_DATA ThreadData; - - /* Check what's going on */ - switch (dwReason) - { - /* Process attaching */ - case DLL_PROCESS_ATTACH: - - /* Save module handles */ - SockModuleHandle = hModule; - NlsMsgSourcemModuleHandle = hModule; - - /* Initialize us */ - MSWSOCK_Initialize(); - break; - - /* Detaching */ - case DLL_PROCESS_DETACH: - - /* Did we initialize yet? */ - if (!SockAllocateHeapRoutine) break; - - /* Fail all future calls */ - SockProcessTerminating = TRUE; - - /* Is this a FreeLibrary? */ - if (!lpReserved) - { - /* Cleanup RNR */ - Rnr_ProcessCleanup(); - - /* Delete the socket lock */ - DeleteCriticalSection(&MSWSOCK_SocketLock); - - /* Check if we have an Async Queue Port */ - if (SockAsyncQueuePort) - { - /* Unprotect the handle */ - HandleInfo.ProtectFromClose = FALSE; - HandleInfo.Inherit = FALSE; - NtSetInformationObject(SockAsyncQueuePort, - ObjectHandleFlagInformation, - &HandleInfo, - sizeof(HandleInfo)); - - /* Close it, and clear the port */ - NtClose(SockAsyncQueuePort); - SockAsyncQueuePort = NULL; - } - - /* Check if we have a context table */ - if (SockContextTable) - { - /* Destroy it */ - WahDestroyHandleContextTable(SockContextTable); - SockContextTable = NULL; - } - - /* Delete the global lock as well */ - SockDeleteRwLock(&SocketGlobalLock); - - /* Check if we have a buffer keytable */ - if (SockBufferKeyTable) - { - /* Free it */ - VirtualFree(SockBufferKeyTable, 0, MEM_RELEASE); - } - } - - /* Check if we have to a SAN cleanup event */ - if (SockSanCleanUpCompleteEvent) - { - /* Close the event handle */ - CloseHandle(SockSanCleanUpCompleteEvent); - } - - /* Thread detaching */ - case DLL_THREAD_DETACH: - - /* Set the context to NULL for thread detach */ - if (dwReason == DLL_THREAD_DETACH) lpReserved = NULL; - - /* Check if this is a normal thread detach */ - if (!lpReserved) - { - /* Do RnR Thread cleanup */ - Rnr_ThreadCleanup(); - - /* Get thread data */ - ThreadData = NtCurrentTeb()->WinSockData; - if (ThreadData) - { - /* Check if any APCs are pending */ - if (ThreadData->PendingAPCs) - { - /* Save the value */ - InterlockedExchangeAdd(&SockProcessPendingAPCCount, - -(ThreadData->PendingAPCs)); - - /* Close the evnet handle */ - NtClose(ThreadData->EventHandle); - - /* Free the thread data and set it to null */ - RtlFreeHeap(GetProcessHeap(), 0, (PVOID)ThreadData); - NtCurrentTeb()->WinSockData = NULL; - } - } - } - - /* Check if this is a process detach fallthrough */ - if (dwReason == DLL_PROCESS_DETACH && !lpReserved) - { - /* Check if we're using a private heap */ - if (SockPrivateHeap != RtlGetProcessHeap()) - { - /* Destroy it */ - RtlDestroyHeap(SockPrivateHeap); - } - SockAllocateHeapRoutine = NULL; - } - break; - - case DLL_THREAD_ATTACH: - break; - } - - /* Return */ - return TRUE; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -BOOL SockProcessTerminating; -LONG SockProcessPendingAPCCount; -HINSTANCE SockModuleHandle; - -/* FUNCTIONS *****************************************************************/ - -BOOL -WSPAPI -MSWSOCK_Initialize(VOID) -{ - SYSTEM_INFO SystemInfo; - - /* If our heap is already initialized, we can skip everything */ - if (SockAllocateHeapRoutine) return TRUE; - - /* Make sure nobody thinks we're terminating */ - SockProcessTerminating = FALSE; - - /* Get the system information */ - GetSystemInfo(&SystemInfo); - - /* Check if this is an MP machine */ - if (SystemInfo.dwNumberOfProcessors > 1) - { - /* Use our own heap on MP, to reduce locks */ - SockAllocateHeapRoutine = SockInitializeHeap; - SockPrivateHeap = NULL; - } - else - { - /* Use process heap */ - SockAllocateHeapRoutine = RtlAllocateHeap; - SockPrivateHeap = RtlGetProcessHeap(); - } - - /* Initialize WSM data */ - gWSM_NSPStartupRef = -1; - gWSM_NSPCallRef = 0; - - /* Initialize the helper listhead */ - InitializeListHead(&SockHelperDllListHead); - - /* Initialize the global lock */ - SockInitializeRwLockAndSpinCount(&SocketGlobalLock, 1000); - - /* Initialize the socket lock */ - InitializeCriticalSection(&MSWSOCK_SocketLock); - - /* Initialize RnR locks and other RnR data */ - Rnr_ProcessInit(); - - /* Return success */ - return TRUE; -} - -BOOL -APIENTRY -DllMain(HANDLE hModule, - DWORD dwReason, - LPVOID lpReserved) -{ - OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo; - PWINSOCK_TEB_DATA ThreadData; - - /* Check what's going on */ - switch (dwReason) - { - /* Process attaching */ - case DLL_PROCESS_ATTACH: - - /* Save module handles */ - SockModuleHandle = hModule; - NlsMsgSourcemModuleHandle = hModule; - - /* Initialize us */ - MSWSOCK_Initialize(); - break; - - /* Detaching */ - case DLL_PROCESS_DETACH: - - /* Did we initialize yet? */ - if (!SockAllocateHeapRoutine) break; - - /* Fail all future calls */ - SockProcessTerminating = TRUE; - - /* Is this a FreeLibrary? */ - if (!lpReserved) - { - /* Cleanup RNR */ - Rnr_ProcessCleanup(); - - /* Delete the socket lock */ - DeleteCriticalSection(&MSWSOCK_SocketLock); - - /* Check if we have an Async Queue Port */ - if (SockAsyncQueuePort) - { - /* Unprotect the handle */ - HandleInfo.ProtectFromClose = FALSE; - HandleInfo.Inherit = FALSE; - NtSetInformationObject(SockAsyncQueuePort, - ObjectHandleFlagInformation, - &HandleInfo, - sizeof(HandleInfo)); - - /* Close it, and clear the port */ - NtClose(SockAsyncQueuePort); - SockAsyncQueuePort = NULL; - } - - /* Check if we have a context table */ - if (SockContextTable) - { - /* Destroy it */ - WahDestroyHandleContextTable(SockContextTable); - SockContextTable = NULL; - } - - /* Delete the global lock as well */ - SockDeleteRwLock(&SocketGlobalLock); - - /* Check if we have a buffer keytable */ - if (SockBufferKeyTable) - { - /* Free it */ - VirtualFree(SockBufferKeyTable, 0, MEM_RELEASE); - } - } - - /* Check if we have to a SAN cleanup event */ - if (SockSanCleanUpCompleteEvent) - { - /* Close the event handle */ - CloseHandle(SockSanCleanUpCompleteEvent); - } - - /* Thread detaching */ - case DLL_THREAD_DETACH: - - /* Set the context to NULL for thread detach */ - if (dwReason == DLL_THREAD_DETACH) lpReserved = NULL; - - /* Check if this is a normal thread detach */ - if (!lpReserved) - { - /* Do RnR Thread cleanup */ - Rnr_ThreadCleanup(); - - /* Get thread data */ - ThreadData = NtCurrentTeb()->WinSockData; - if (ThreadData) - { - /* Check if any APCs are pending */ - if (ThreadData->PendingAPCs) - { - /* Save the value */ - InterlockedExchangeAdd(&SockProcessPendingAPCCount, - -(ThreadData->PendingAPCs)); - - /* Close the evnet handle */ - NtClose(ThreadData->EventHandle); - - /* Free the thread data and set it to null */ - RtlFreeHeap(GetProcessHeap(), 0, (PVOID)ThreadData); - NtCurrentTeb()->WinSockData = NULL; - } - } - } - - /* Check if this is a process detach fallthrough */ - if (dwReason == DLL_PROCESS_DETACH && !lpReserved) - { - /* Check if we're using a private heap */ - if (SockPrivateHeap != RtlGetProcessHeap()) - { - /* Destroy it */ - RtlDestroyHeap(SockPrivateHeap); - } - SockAllocateHeapRoutine = NULL; - } - break; - - case DLL_THREAD_ATTACH: - break; - } - - /* Return */ - return TRUE; -} - diff --git a/dll/win32/mswsock/mswsock/msext.c b/dll/win32/mswsock/mswsock/msext.c index a67b63389a3..fb8a67e1e04 100644 --- a/dll/win32/mswsock/mswsock/msext.c +++ b/dll/win32/mswsock/mswsock/msext.c @@ -50,159 +50,3 @@ TransmitFile(SOCKET Socket, Flags); } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -PVOID SockBufferKeyTable; -ULONG SockBufferKeyTableSize; - -/* FUNCTIONS *****************************************************************/ -BOOL -WINAPI -TransmitFile(SOCKET Socket, - HANDLE File, - DWORD NumberOfBytesToWrite, - DWORD NumberOfBytesPerSend, - LPOVERLAPPED Overlapped, - LPTRANSMIT_FILE_BUFFERS TransmitBuffers, - DWORD Flags) -{ - static GUID TransmitFileGUID = WSAID_TRANSMITFILE; - LPFN_TRANSMITFILE pfnTransmitFile; - DWORD cbBytesReturned; - - if (WSAIoctl(Socket, - SIO_GET_EXTENSION_FUNCTION_POINTER, - &TransmitFileGUID, - sizeof(TransmitFileGUID), - &pfnTransmitFile, - sizeof(pfnTransmitFile), - &cbBytesReturned, - NULL, - NULL) == SOCKET_ERROR) - { - return FALSE; - } - - return pfnTransmitFile(Socket, - File, - NumberOfBytesToWrite, - NumberOfBytesPerSend, - Overlapped, - TransmitBuffers, - Flags); -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -PVOID SockBufferKeyTable; -ULONG SockBufferKeyTableSize; - -/* FUNCTIONS *****************************************************************/ -BOOL -WINAPI -TransmitFile(SOCKET Socket, - HANDLE File, - DWORD NumberOfBytesToWrite, - DWORD NumberOfBytesPerSend, - LPOVERLAPPED Overlapped, - LPTRANSMIT_FILE_BUFFERS TransmitBuffers, - DWORD Flags) -{ - static GUID TransmitFileGUID = WSAID_TRANSMITFILE; - LPFN_TRANSMITFILE pfnTransmitFile; - DWORD cbBytesReturned; - - if (WSAIoctl(Socket, - SIO_GET_EXTENSION_FUNCTION_POINTER, - &TransmitFileGUID, - sizeof(TransmitFileGUID), - &pfnTransmitFile, - sizeof(pfnTransmitFile), - &cbBytesReturned, - NULL, - NULL) == SOCKET_ERROR) - { - return FALSE; - } - - return pfnTransmitFile(Socket, - File, - NumberOfBytesToWrite, - NumberOfBytesPerSend, - Overlapped, - TransmitBuffers, - Flags); -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -PVOID SockBufferKeyTable; -ULONG SockBufferKeyTableSize; - -/* FUNCTIONS *****************************************************************/ -BOOL -WINAPI -TransmitFile(SOCKET Socket, - HANDLE File, - DWORD NumberOfBytesToWrite, - DWORD NumberOfBytesPerSend, - LPOVERLAPPED Overlapped, - LPTRANSMIT_FILE_BUFFERS TransmitBuffers, - DWORD Flags) -{ - static GUID TransmitFileGUID = WSAID_TRANSMITFILE; - LPFN_TRANSMITFILE pfnTransmitFile; - DWORD cbBytesReturned; - - if (WSAIoctl(Socket, - SIO_GET_EXTENSION_FUNCTION_POINTER, - &TransmitFileGUID, - sizeof(TransmitFileGUID), - &pfnTransmitFile, - sizeof(pfnTransmitFile), - &cbBytesReturned, - NULL, - NULL) == SOCKET_ERROR) - { - return FALSE; - } - - return pfnTransmitFile(Socket, - File, - NumberOfBytesToWrite, - NumberOfBytesPerSend, - Overlapped, - TransmitBuffers, - Flags); -} - diff --git a/dll/win32/mswsock/mswsock/nspgaddr.c b/dll/win32/mswsock/mswsock/nspgaddr.c index 3e062e90d63..bd1ad2806dc 100644 --- a/dll/win32/mswsock/mswsock/nspgaddr.c +++ b/dll/win32/mswsock/mswsock/nspgaddr.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/mswsock/nspmisc.c b/dll/win32/mswsock/mswsock/nspmisc.c index 3e062e90d63..bd1ad2806dc 100644 --- a/dll/win32/mswsock/mswsock/nspmisc.c +++ b/dll/win32/mswsock/mswsock/nspmisc.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/mswsock/nspsvc.c b/dll/win32/mswsock/mswsock/nspsvc.c index 3e062e90d63..bd1ad2806dc 100644 --- a/dll/win32/mswsock/mswsock/nspsvc.c +++ b/dll/win32/mswsock/mswsock/nspsvc.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/mswsock/nsptcpip.c b/dll/win32/mswsock/mswsock/nsptcpip.c index 3e062e90d63..bd1ad2806dc 100644 --- a/dll/win32/mswsock/mswsock/nsptcpip.c +++ b/dll/win32/mswsock/mswsock/nsptcpip.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/mswsock/nsputil.c b/dll/win32/mswsock/mswsock/nsputil.c index 3e062e90d63..bd1ad2806dc 100644 --- a/dll/win32/mswsock/mswsock/nsputil.c +++ b/dll/win32/mswsock/mswsock/nsputil.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/mswsock/proc.c b/dll/win32/mswsock/mswsock/proc.c index 6b45b5b8f85..4cb227144ec 100644 --- a/dll/win32/mswsock/mswsock/proc.c +++ b/dll/win32/mswsock/mswsock/proc.c @@ -112,345 +112,3 @@ MSAFD_SockThreadInitialize(VOID) return TRUE; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -PRTL_HEAP_ALLOCATE SockAllocateHeapRoutine; -HANDLE SockPrivateHeap; -CRITICAL_SECTION MSWSOCK_SocketLock; -PWAH_HANDLE_TABLE SockContextTable; - -/* FUNCTIONS *****************************************************************/ - -PVOID -WSPAPI -SockInitializeHeap(IN HANDLE Heap, - IN ULONG Flags, - IN ULONG Size) -{ - /* Create the heap */ - Heap = RtlCreateHeap(HEAP_GROWABLE, - NULL, - 0, - 0, - NULL, - NULL); - - /* Check if we created it successfully */ - if (Heap) - { - /* Write its pointer */ - if (InterlockedCompareExchangePointer(&SockPrivateHeap, Heap, NULL)) - { - /* Someone already allocated it, destroy ours */ - RtlDestroyHeap(Heap); - } - } - else - { - /* Write the default heap */ - (void)InterlockedCompareExchangePointer(&SockPrivateHeap, - RtlGetProcessHeap(), - NULL); - } - - /* Set the reap heap routine now */ - SockAllocateHeapRoutine = RtlAllocateHeap; - - /* Call it */ - return SockAllocateHeapRoutine(SockPrivateHeap, Flags, Size); -} - -INT -WSPAPI -SockEnterApiSlow(OUT PWINSOCK_TEB_DATA *ThreadData) -{ - /* Check again if we're terminating */ - if (SockProcessTerminating) return WSANOTINITIALISED; - - /* Check if WSPStartup wasn't called */ - if (SockWspStartupCount <= 0) return WSANOTINITIALISED; - - /* Get the thread data */ - *ThreadData = NtCurrentTeb()->WinSockData; - if (!(*ThreadData)) - { - /* Try to initialize the thread */ - if (!MSAFD_SockThreadInitialize()) return WSAENOBUFS; - - /* Get the thread data again */ - *ThreadData = NtCurrentTeb()->WinSockData; - } - - /* Return */ - return NO_ERROR; -} - -BOOL -WSPAPI -MSAFD_SockThreadInitialize(VOID) -{ - NTSTATUS Status; - HANDLE EventHandle; - PWINSOCK_TEB_DATA TebData; - - /* Initialize the event handle */ - Status = NtCreateEvent(&EventHandle, - EVENT_ALL_ACCESS, - NULL, - NotificationEvent, - FALSE); - if (!NT_SUCCESS(Status)) return FALSE; - - /* Allocate the thread data */ - TebData = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(WINSOCK_TEB_DATA)); - if (!TebData) return FALSE; - - /* Set it and zero its contents */ - NtCurrentTeb()->WinSockData = TebData; - RtlZeroMemory(TebData, sizeof(WINSOCK_TEB_DATA)); - - /* Set the event handle */ - TebData->EventHandle = EventHandle; - - /* Return success */ - return TRUE; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -PRTL_HEAP_ALLOCATE SockAllocateHeapRoutine; -HANDLE SockPrivateHeap; -CRITICAL_SECTION MSWSOCK_SocketLock; -PWAH_HANDLE_TABLE SockContextTable; - -/* FUNCTIONS *****************************************************************/ - -PVOID -WSPAPI -SockInitializeHeap(IN HANDLE Heap, - IN ULONG Flags, - IN ULONG Size) -{ - /* Create the heap */ - Heap = RtlCreateHeap(HEAP_GROWABLE, - NULL, - 0, - 0, - NULL, - NULL); - - /* Check if we created it successfully */ - if (Heap) - { - /* Write its pointer */ - if (InterlockedCompareExchangePointer(&SockPrivateHeap, Heap, NULL)) - { - /* Someone already allocated it, destroy ours */ - RtlDestroyHeap(Heap); - } - } - else - { - /* Write the default heap */ - (void)InterlockedCompareExchangePointer(&SockPrivateHeap, - RtlGetProcessHeap(), - NULL); - } - - /* Set the reap heap routine now */ - SockAllocateHeapRoutine = RtlAllocateHeap; - - /* Call it */ - return SockAllocateHeapRoutine(SockPrivateHeap, Flags, Size); -} - -INT -WSPAPI -SockEnterApiSlow(OUT PWINSOCK_TEB_DATA *ThreadData) -{ - /* Check again if we're terminating */ - if (SockProcessTerminating) return WSANOTINITIALISED; - - /* Check if WSPStartup wasn't called */ - if (SockWspStartupCount <= 0) return WSANOTINITIALISED; - - /* Get the thread data */ - *ThreadData = NtCurrentTeb()->WinSockData; - if (!(*ThreadData)) - { - /* Try to initialize the thread */ - if (!MSAFD_SockThreadInitialize()) return WSAENOBUFS; - - /* Get the thread data again */ - *ThreadData = NtCurrentTeb()->WinSockData; - } - - /* Return */ - return NO_ERROR; -} - -BOOL -WSPAPI -MSAFD_SockThreadInitialize(VOID) -{ - NTSTATUS Status; - HANDLE EventHandle; - PWINSOCK_TEB_DATA TebData; - - /* Initialize the event handle */ - Status = NtCreateEvent(&EventHandle, - EVENT_ALL_ACCESS, - NULL, - NotificationEvent, - FALSE); - if (!NT_SUCCESS(Status)) return FALSE; - - /* Allocate the thread data */ - TebData = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(WINSOCK_TEB_DATA)); - if (!TebData) return FALSE; - - /* Set it and zero its contents */ - NtCurrentTeb()->WinSockData = TebData; - RtlZeroMemory(TebData, sizeof(WINSOCK_TEB_DATA)); - - /* Set the event handle */ - TebData->EventHandle = EventHandle; - - /* Return success */ - return TRUE; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -PRTL_HEAP_ALLOCATE SockAllocateHeapRoutine; -HANDLE SockPrivateHeap; -CRITICAL_SECTION MSWSOCK_SocketLock; -PWAH_HANDLE_TABLE SockContextTable; - -/* FUNCTIONS *****************************************************************/ - -PVOID -WSPAPI -SockInitializeHeap(IN HANDLE Heap, - IN ULONG Flags, - IN ULONG Size) -{ - /* Create the heap */ - Heap = RtlCreateHeap(HEAP_GROWABLE, - NULL, - 0, - 0, - NULL, - NULL); - - /* Check if we created it successfully */ - if (Heap) - { - /* Write its pointer */ - if (InterlockedCompareExchangePointer(&SockPrivateHeap, Heap, NULL)) - { - /* Someone already allocated it, destroy ours */ - RtlDestroyHeap(Heap); - } - } - else - { - /* Write the default heap */ - (void)InterlockedCompareExchangePointer(&SockPrivateHeap, - RtlGetProcessHeap(), - NULL); - } - - /* Set the reap heap routine now */ - SockAllocateHeapRoutine = RtlAllocateHeap; - - /* Call it */ - return SockAllocateHeapRoutine(SockPrivateHeap, Flags, Size); -} - -INT -WSPAPI -SockEnterApiSlow(OUT PWINSOCK_TEB_DATA *ThreadData) -{ - /* Check again if we're terminating */ - if (SockProcessTerminating) return WSANOTINITIALISED; - - /* Check if WSPStartup wasn't called */ - if (SockWspStartupCount <= 0) return WSANOTINITIALISED; - - /* Get the thread data */ - *ThreadData = NtCurrentTeb()->WinSockData; - if (!(*ThreadData)) - { - /* Try to initialize the thread */ - if (!MSAFD_SockThreadInitialize()) return WSAENOBUFS; - - /* Get the thread data again */ - *ThreadData = NtCurrentTeb()->WinSockData; - } - - /* Return */ - return NO_ERROR; -} - -BOOL -WSPAPI -MSAFD_SockThreadInitialize(VOID) -{ - NTSTATUS Status; - HANDLE EventHandle; - PWINSOCK_TEB_DATA TebData; - - /* Initialize the event handle */ - Status = NtCreateEvent(&EventHandle, - EVENT_ALL_ACCESS, - NULL, - NotificationEvent, - FALSE); - if (!NT_SUCCESS(Status)) return FALSE; - - /* Allocate the thread data */ - TebData = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(WINSOCK_TEB_DATA)); - if (!TebData) return FALSE; - - /* Set it and zero its contents */ - NtCurrentTeb()->WinSockData = TebData; - RtlZeroMemory(TebData, sizeof(WINSOCK_TEB_DATA)); - - /* Set the event handle */ - TebData->EventHandle = EventHandle; - - /* Return success */ - return TRUE; -} - diff --git a/dll/win32/mswsock/mswsock/recvex.c b/dll/win32/mswsock/mswsock/recvex.c index 3e062e90d63..bd1ad2806dc 100644 --- a/dll/win32/mswsock/mswsock/recvex.c +++ b/dll/win32/mswsock/mswsock/recvex.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/mswsock/setup.c b/dll/win32/mswsock/mswsock/setup.c index 3e062e90d63..bd1ad2806dc 100644 --- a/dll/win32/mswsock/mswsock/setup.c +++ b/dll/win32/mswsock/mswsock/setup.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/mswsock/stubs.c b/dll/win32/mswsock/mswsock/stubs.c index ad110552d1e..2ab9fc7a297 100644 --- a/dll/win32/mswsock/mswsock/stubs.c +++ b/dll/win32/mswsock/mswsock/stubs.c @@ -345,1044 +345,3 @@ NPLoadNameSpaces( return 0; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -BOOL -WINAPI -AcceptEx(SOCKET ListenSocket, - SOCKET AcceptSocket, - PVOID OutputBuffer, - DWORD ReceiveDataLength, - DWORD LocalAddressLength, - DWORD RemoteAddressLength, - LPDWORD BytesReceived, - LPOVERLAPPED Overlapped) -{ - OutputDebugStringW(L"AcceptEx is UNIMPLEMENTED\n"); - - return FALSE; -} - -VOID -WINAPI -GetAcceptExSockaddrs(PVOID OutputBuffer, - DWORD ReceiveDataLength, - DWORD LocalAddressLength, - DWORD RemoteAddressLength, - LPSOCKADDR* LocalSockaddr, - LPINT LocalSockaddrLength, - LPSOCKADDR* RemoteSockaddr, - LPINT RemoteSockaddrLength) -{ - OutputDebugStringW(L"GetAcceptExSockaddrs is UNIMPLEMENTED\n"); -} - -INT -WINAPI -GetAddressByNameA(DWORD NameSpace, - LPGUID ServiceType, - LPSTR ServiceName, - LPINT Protocols, - DWORD Resolution, - LPSERVICE_ASYNC_INFO ServiceAsyncInfo, - LPVOID CsaddrBuffer, - LPDWORD BufferLength, - LPSTR AliasBuffer, - LPDWORD AliasBufferLength) -{ - OutputDebugStringW(L"GetAddressByNameA is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -GetAddressByNameW(DWORD NameSpace, - LPGUID ServiceType, - LPWSTR ServiceName, - LPINT Protocols, - DWORD Resolution, - LPSERVICE_ASYNC_INFO ServiceAsyncInfo, - LPVOID CsaddrBuffer, - LPDWORD BufferLength, - LPWSTR AliasBuffer, - LPDWORD AliasBufferLength) -{ - OutputDebugStringW(L"GetAddressByNameW is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -GetServiceA(DWORD NameSpace, - LPGUID Guid, - LPSTR ServiceName, - DWORD Properties, - LPVOID Buffer, - LPDWORD BufferSize, - LPSERVICE_ASYNC_INFO ServiceAsyncInfo) -{ - OutputDebugStringW(L"GetServiceA is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -GetServiceW(DWORD NameSpace, - LPGUID Guid, - LPWSTR ServiceName, - DWORD Properties, - LPVOID Buffer, - LPDWORD BufferSize, - LPSERVICE_ASYNC_INFO ServiceAsyncInfo) -{ - OutputDebugStringW(L"GetServiceW is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -GetTypeByNameA(LPSTR ServiceName, - LPGUID ServiceType) -{ - OutputDebugStringW(L"GetTypeByNameA is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -GetTypeByNameW(LPWSTR ServiceName, - LPGUID ServiceType) -{ - OutputDebugStringW(L"GetTypeByNameW is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -MigrateWinsockConfiguration(DWORD Unknown1, - DWORD Unknown2, - DWORD Unknown3) -{ - OutputDebugStringW(L"MigrateWinsockConfiguration is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -SetServiceA(DWORD NameSpace, - DWORD Operation, - DWORD Flags, - LPSERVICE_INFOA ServiceInfo, - LPSERVICE_ASYNC_INFO ServiceAsyncInfo, - LPDWORD dwStatusFlags) -{ - OutputDebugStringW(L"SetServiceA is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -SetServiceW(DWORD NameSpace, - DWORD Operation, - DWORD Flags, - LPSERVICE_INFOW ServiceInfo, - LPSERVICE_ASYNC_INFO ServiceAsyncInfo, - LPDWORD dwStatusFlags) -{ - OutputDebugStringW(L"SetServiceW is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -int -WINAPI -WSARecvEx(SOCKET Sock, - char *Buf, - int Len, - int *Flags) -{ - OutputDebugStringW(L"WSARecvEx is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -int -WINAPI -dn_expand(unsigned char *MessagePtr, - unsigned char *EndofMesOrig, - unsigned char *CompDomNam, - unsigned char *ExpandDomNam, - int Length) -{ - OutputDebugStringW(L"dn_expand is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -struct netent * -WINAPI -getnetbyname(const char *name) -{ - OutputDebugStringW(L"getnetbyname is UNIMPLEMENTED\n"); - - return NULL; -} - -UINT -WINAPI -inet_network(const char *cp) -{ - OutputDebugStringW(L"inet_network is UNIMPLEMENTED\n"); - - return INADDR_NONE; -} - -SOCKET -WINAPI -rcmd(char **AHost, - USHORT InPort, - char *LocUser, - char *RemUser, - char *Cmd, - int *Fd2p) -{ - OutputDebugStringW(L"rcmd is UNIMPLEMENTED\n"); - - return INVALID_SOCKET; -} - -SOCKET -WINAPI -rexec(char **AHost, - int InPort, - char *User, - char *Passwd, - char *Cmd, - int *Fd2p) -{ - OutputDebugStringW(L"rexec is UNIMPLEMENTED\n"); - - return INVALID_SOCKET; -} - -SOCKET -WINAPI -rresvport(int *port) -{ - OutputDebugStringW(L"rresvport is UNIMPLEMENTED\n"); - - return INVALID_SOCKET; -} - -void -WINAPI -s_perror(const char *str) -{ - OutputDebugStringW(L"s_perror is UNIMPLEMENTED\n"); -} - -int -WINAPI -sethostname(char *Name, int NameLen) -{ - OutputDebugStringW(L"sethostname is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -GetNameByTypeA(LPGUID lpServiceType, LPSTR lpServiceName, DWORD dwNameLength) -{ - OutputDebugStringW(L"GetNameByTypeA is UNIMPLEMENTED\n"); - - return 0; -} - -INT -WINAPI -GetNameByTypeW(LPGUID lpServiceType, LPWSTR lpServiceName, DWORD dwNameLength) -{ - OutputDebugStringW(L"GetNameByTypeW is UNIMPLEMENTED\n"); - - return 0; -} - -VOID -WINAPI -StartWsdpService() -{ - OutputDebugStringW(L"StartWsdpService is UNIMPLEMENTED\n"); -} - -VOID -WINAPI -StopWsdpService() -{ - OutputDebugStringW(L"StopWsdpService is UNIMPLEMENTED\n"); -} - -DWORD -WINAPI -SvchostPushServiceGlobals(DWORD Value) -{ - OutputDebugStringW(L"SvchostPushServiceGlobals is UNIMPLEMENTED\n"); - - return 0; -} - -VOID -WINAPI -ServiceMain(DWORD Unknown1, DWORD Unknown2) -{ - OutputDebugStringW(L"ServiceMain is UNIMPLEMENTED\n"); -} - -INT -WINAPI -EnumProtocolsA(LPINT ProtocolCount, - LPVOID ProtocolBuffer, - LPDWORD BufferLength) -{ - OutputDebugStringW(L"EnumProtocolsA is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -EnumProtocolsW(LPINT ProtocolCount, - LPVOID ProtocolBuffer, - LPDWORD BufferLength) -{ - OutputDebugStringW(L"EnumProtocolsW is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -NPLoadNameSpaces( - IN OUT LPDWORD lpdwVersion, - IN OUT LPNS_ROUTINE nsrBuffer, - IN OUT LPDWORD lpdwBufferLength) -{ - OutputDebugStringW(L"NPLoadNameSpaces is UNIMPLEMENTED\n"); - - return 0; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -BOOL -WINAPI -AcceptEx(SOCKET ListenSocket, - SOCKET AcceptSocket, - PVOID OutputBuffer, - DWORD ReceiveDataLength, - DWORD LocalAddressLength, - DWORD RemoteAddressLength, - LPDWORD BytesReceived, - LPOVERLAPPED Overlapped) -{ - OutputDebugStringW(L"AcceptEx is UNIMPLEMENTED\n"); - - return FALSE; -} - -VOID -WINAPI -GetAcceptExSockaddrs(PVOID OutputBuffer, - DWORD ReceiveDataLength, - DWORD LocalAddressLength, - DWORD RemoteAddressLength, - LPSOCKADDR* LocalSockaddr, - LPINT LocalSockaddrLength, - LPSOCKADDR* RemoteSockaddr, - LPINT RemoteSockaddrLength) -{ - OutputDebugStringW(L"GetAcceptExSockaddrs is UNIMPLEMENTED\n"); -} - -INT -WINAPI -GetAddressByNameA(DWORD NameSpace, - LPGUID ServiceType, - LPSTR ServiceName, - LPINT Protocols, - DWORD Resolution, - LPSERVICE_ASYNC_INFO ServiceAsyncInfo, - LPVOID CsaddrBuffer, - LPDWORD BufferLength, - LPSTR AliasBuffer, - LPDWORD AliasBufferLength) -{ - OutputDebugStringW(L"GetAddressByNameA is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -GetAddressByNameW(DWORD NameSpace, - LPGUID ServiceType, - LPWSTR ServiceName, - LPINT Protocols, - DWORD Resolution, - LPSERVICE_ASYNC_INFO ServiceAsyncInfo, - LPVOID CsaddrBuffer, - LPDWORD BufferLength, - LPWSTR AliasBuffer, - LPDWORD AliasBufferLength) -{ - OutputDebugStringW(L"GetAddressByNameW is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -GetServiceA(DWORD NameSpace, - LPGUID Guid, - LPSTR ServiceName, - DWORD Properties, - LPVOID Buffer, - LPDWORD BufferSize, - LPSERVICE_ASYNC_INFO ServiceAsyncInfo) -{ - OutputDebugStringW(L"GetServiceA is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -GetServiceW(DWORD NameSpace, - LPGUID Guid, - LPWSTR ServiceName, - DWORD Properties, - LPVOID Buffer, - LPDWORD BufferSize, - LPSERVICE_ASYNC_INFO ServiceAsyncInfo) -{ - OutputDebugStringW(L"GetServiceW is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -GetTypeByNameA(LPSTR ServiceName, - LPGUID ServiceType) -{ - OutputDebugStringW(L"GetTypeByNameA is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -GetTypeByNameW(LPWSTR ServiceName, - LPGUID ServiceType) -{ - OutputDebugStringW(L"GetTypeByNameW is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -MigrateWinsockConfiguration(DWORD Unknown1, - DWORD Unknown2, - DWORD Unknown3) -{ - OutputDebugStringW(L"MigrateWinsockConfiguration is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -SetServiceA(DWORD NameSpace, - DWORD Operation, - DWORD Flags, - LPSERVICE_INFOA ServiceInfo, - LPSERVICE_ASYNC_INFO ServiceAsyncInfo, - LPDWORD dwStatusFlags) -{ - OutputDebugStringW(L"SetServiceA is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -SetServiceW(DWORD NameSpace, - DWORD Operation, - DWORD Flags, - LPSERVICE_INFOW ServiceInfo, - LPSERVICE_ASYNC_INFO ServiceAsyncInfo, - LPDWORD dwStatusFlags) -{ - OutputDebugStringW(L"SetServiceW is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -int -WINAPI -WSARecvEx(SOCKET Sock, - char *Buf, - int Len, - int *Flags) -{ - OutputDebugStringW(L"WSARecvEx is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -int -WINAPI -dn_expand(unsigned char *MessagePtr, - unsigned char *EndofMesOrig, - unsigned char *CompDomNam, - unsigned char *ExpandDomNam, - int Length) -{ - OutputDebugStringW(L"dn_expand is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -struct netent * -WINAPI -getnetbyname(const char *name) -{ - OutputDebugStringW(L"getnetbyname is UNIMPLEMENTED\n"); - - return NULL; -} - -UINT -WINAPI -inet_network(const char *cp) -{ - OutputDebugStringW(L"inet_network is UNIMPLEMENTED\n"); - - return INADDR_NONE; -} - -SOCKET -WINAPI -rcmd(char **AHost, - USHORT InPort, - char *LocUser, - char *RemUser, - char *Cmd, - int *Fd2p) -{ - OutputDebugStringW(L"rcmd is UNIMPLEMENTED\n"); - - return INVALID_SOCKET; -} - -SOCKET -WINAPI -rexec(char **AHost, - int InPort, - char *User, - char *Passwd, - char *Cmd, - int *Fd2p) -{ - OutputDebugStringW(L"rexec is UNIMPLEMENTED\n"); - - return INVALID_SOCKET; -} - -SOCKET -WINAPI -rresvport(int *port) -{ - OutputDebugStringW(L"rresvport is UNIMPLEMENTED\n"); - - return INVALID_SOCKET; -} - -void -WINAPI -s_perror(const char *str) -{ - OutputDebugStringW(L"s_perror is UNIMPLEMENTED\n"); -} - -int -WINAPI -sethostname(char *Name, int NameLen) -{ - OutputDebugStringW(L"sethostname is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -GetNameByTypeA(LPGUID lpServiceType, LPSTR lpServiceName, DWORD dwNameLength) -{ - OutputDebugStringW(L"GetNameByTypeA is UNIMPLEMENTED\n"); - - return 0; -} - -INT -WINAPI -GetNameByTypeW(LPGUID lpServiceType, LPWSTR lpServiceName, DWORD dwNameLength) -{ - OutputDebugStringW(L"GetNameByTypeW is UNIMPLEMENTED\n"); - - return 0; -} - -VOID -WINAPI -StartWsdpService() -{ - OutputDebugStringW(L"StartWsdpService is UNIMPLEMENTED\n"); -} - -VOID -WINAPI -StopWsdpService() -{ - OutputDebugStringW(L"StopWsdpService is UNIMPLEMENTED\n"); -} - -DWORD -WINAPI -SvchostPushServiceGlobals(DWORD Value) -{ - OutputDebugStringW(L"SvchostPushServiceGlobals is UNIMPLEMENTED\n"); - - return 0; -} - -VOID -WINAPI -ServiceMain(DWORD Unknown1, DWORD Unknown2) -{ - OutputDebugStringW(L"ServiceMain is UNIMPLEMENTED\n"); -} - -INT -WINAPI -EnumProtocolsA(LPINT ProtocolCount, - LPVOID ProtocolBuffer, - LPDWORD BufferLength) -{ - OutputDebugStringW(L"EnumProtocolsA is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -EnumProtocolsW(LPINT ProtocolCount, - LPVOID ProtocolBuffer, - LPDWORD BufferLength) -{ - OutputDebugStringW(L"EnumProtocolsW is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -NPLoadNameSpaces( - IN OUT LPDWORD lpdwVersion, - IN OUT LPNS_ROUTINE nsrBuffer, - IN OUT LPDWORD lpdwBufferLength) -{ - OutputDebugStringW(L"NPLoadNameSpaces is UNIMPLEMENTED\n"); - - return 0; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -BOOL -WINAPI -AcceptEx(SOCKET ListenSocket, - SOCKET AcceptSocket, - PVOID OutputBuffer, - DWORD ReceiveDataLength, - DWORD LocalAddressLength, - DWORD RemoteAddressLength, - LPDWORD BytesReceived, - LPOVERLAPPED Overlapped) -{ - OutputDebugStringW(L"AcceptEx is UNIMPLEMENTED\n"); - - return FALSE; -} - -VOID -WINAPI -GetAcceptExSockaddrs(PVOID OutputBuffer, - DWORD ReceiveDataLength, - DWORD LocalAddressLength, - DWORD RemoteAddressLength, - LPSOCKADDR* LocalSockaddr, - LPINT LocalSockaddrLength, - LPSOCKADDR* RemoteSockaddr, - LPINT RemoteSockaddrLength) -{ - OutputDebugStringW(L"GetAcceptExSockaddrs is UNIMPLEMENTED\n"); -} - -INT -WINAPI -GetAddressByNameA(DWORD NameSpace, - LPGUID ServiceType, - LPSTR ServiceName, - LPINT Protocols, - DWORD Resolution, - LPSERVICE_ASYNC_INFO ServiceAsyncInfo, - LPVOID CsaddrBuffer, - LPDWORD BufferLength, - LPSTR AliasBuffer, - LPDWORD AliasBufferLength) -{ - OutputDebugStringW(L"GetAddressByNameA is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -GetAddressByNameW(DWORD NameSpace, - LPGUID ServiceType, - LPWSTR ServiceName, - LPINT Protocols, - DWORD Resolution, - LPSERVICE_ASYNC_INFO ServiceAsyncInfo, - LPVOID CsaddrBuffer, - LPDWORD BufferLength, - LPWSTR AliasBuffer, - LPDWORD AliasBufferLength) -{ - OutputDebugStringW(L"GetAddressByNameW is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -GetServiceA(DWORD NameSpace, - LPGUID Guid, - LPSTR ServiceName, - DWORD Properties, - LPVOID Buffer, - LPDWORD BufferSize, - LPSERVICE_ASYNC_INFO ServiceAsyncInfo) -{ - OutputDebugStringW(L"GetServiceA is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -GetServiceW(DWORD NameSpace, - LPGUID Guid, - LPWSTR ServiceName, - DWORD Properties, - LPVOID Buffer, - LPDWORD BufferSize, - LPSERVICE_ASYNC_INFO ServiceAsyncInfo) -{ - OutputDebugStringW(L"GetServiceW is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -GetTypeByNameA(LPSTR ServiceName, - LPGUID ServiceType) -{ - OutputDebugStringW(L"GetTypeByNameA is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -GetTypeByNameW(LPWSTR ServiceName, - LPGUID ServiceType) -{ - OutputDebugStringW(L"GetTypeByNameW is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -MigrateWinsockConfiguration(DWORD Unknown1, - DWORD Unknown2, - DWORD Unknown3) -{ - OutputDebugStringW(L"MigrateWinsockConfiguration is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -SetServiceA(DWORD NameSpace, - DWORD Operation, - DWORD Flags, - LPSERVICE_INFOA ServiceInfo, - LPSERVICE_ASYNC_INFO ServiceAsyncInfo, - LPDWORD dwStatusFlags) -{ - OutputDebugStringW(L"SetServiceA is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -SetServiceW(DWORD NameSpace, - DWORD Operation, - DWORD Flags, - LPSERVICE_INFOW ServiceInfo, - LPSERVICE_ASYNC_INFO ServiceAsyncInfo, - LPDWORD dwStatusFlags) -{ - OutputDebugStringW(L"SetServiceW is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -int -WINAPI -WSARecvEx(SOCKET Sock, - char *Buf, - int Len, - int *Flags) -{ - OutputDebugStringW(L"WSARecvEx is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -int -WINAPI -dn_expand(unsigned char *MessagePtr, - unsigned char *EndofMesOrig, - unsigned char *CompDomNam, - unsigned char *ExpandDomNam, - int Length) -{ - OutputDebugStringW(L"dn_expand is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -struct netent * -WINAPI -getnetbyname(const char *name) -{ - OutputDebugStringW(L"getnetbyname is UNIMPLEMENTED\n"); - - return NULL; -} - -UINT -WINAPI -inet_network(const char *cp) -{ - OutputDebugStringW(L"inet_network is UNIMPLEMENTED\n"); - - return INADDR_NONE; -} - -SOCKET -WINAPI -rcmd(char **AHost, - USHORT InPort, - char *LocUser, - char *RemUser, - char *Cmd, - int *Fd2p) -{ - OutputDebugStringW(L"rcmd is UNIMPLEMENTED\n"); - - return INVALID_SOCKET; -} - -SOCKET -WINAPI -rexec(char **AHost, - int InPort, - char *User, - char *Passwd, - char *Cmd, - int *Fd2p) -{ - OutputDebugStringW(L"rexec is UNIMPLEMENTED\n"); - - return INVALID_SOCKET; -} - -SOCKET -WINAPI -rresvport(int *port) -{ - OutputDebugStringW(L"rresvport is UNIMPLEMENTED\n"); - - return INVALID_SOCKET; -} - -void -WINAPI -s_perror(const char *str) -{ - OutputDebugStringW(L"s_perror is UNIMPLEMENTED\n"); -} - -int -WINAPI -sethostname(char *Name, int NameLen) -{ - OutputDebugStringW(L"sethostname is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -GetNameByTypeA(LPGUID lpServiceType, LPSTR lpServiceName, DWORD dwNameLength) -{ - OutputDebugStringW(L"GetNameByTypeA is UNIMPLEMENTED\n"); - - return 0; -} - -INT -WINAPI -GetNameByTypeW(LPGUID lpServiceType, LPWSTR lpServiceName, DWORD dwNameLength) -{ - OutputDebugStringW(L"GetNameByTypeW is UNIMPLEMENTED\n"); - - return 0; -} - -VOID -WINAPI -StartWsdpService() -{ - OutputDebugStringW(L"StartWsdpService is UNIMPLEMENTED\n"); -} - -VOID -WINAPI -StopWsdpService() -{ - OutputDebugStringW(L"StopWsdpService is UNIMPLEMENTED\n"); -} - -DWORD -WINAPI -SvchostPushServiceGlobals(DWORD Value) -{ - OutputDebugStringW(L"SvchostPushServiceGlobals is UNIMPLEMENTED\n"); - - return 0; -} - -VOID -WINAPI -ServiceMain(DWORD Unknown1, DWORD Unknown2) -{ - OutputDebugStringW(L"ServiceMain is UNIMPLEMENTED\n"); -} - -INT -WINAPI -EnumProtocolsA(LPINT ProtocolCount, - LPVOID ProtocolBuffer, - LPDWORD BufferLength) -{ - OutputDebugStringW(L"EnumProtocolsA is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -EnumProtocolsW(LPINT ProtocolCount, - LPVOID ProtocolBuffer, - LPDWORD BufferLength) -{ - OutputDebugStringW(L"EnumProtocolsW is UNIMPLEMENTED\n"); - - return SOCKET_ERROR; -} - -INT -WINAPI -NPLoadNameSpaces( - IN OUT LPDWORD lpdwVersion, - IN OUT LPNS_ROUTINE nsrBuffer, - IN OUT LPDWORD lpdwBufferLength) -{ - OutputDebugStringW(L"NPLoadNameSpaces is UNIMPLEMENTED\n"); - - return 0; -} - diff --git a/dll/win32/mswsock/rnr20/context.c b/dll/win32/mswsock/rnr20/context.c index dfb5c79dde3..f3c17a86c54 100644 --- a/dll/win32/mswsock/rnr20/context.c +++ b/dll/win32/mswsock/rnr20/context.c @@ -160,489 +160,3 @@ RnrCtx_ListCleanup(VOID) ReleaseRnR2Lock(); } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -LIST_ENTRY ListAnchor; -BOOLEAN g_fRnrLockInit; -CRITICAL_SECTION g_RnrLock; - -#define AcquireRnR2Lock() EnterCriticalSection(&g_RnrLock); -#define ReleaseRnR2Lock() LeaveCriticalSection(&g_RnrLock); - -/* FUNCTIONS *****************************************************************/ - -PRNR_CONTEXT -WSPAPI -RnrCtx_Create(IN HANDLE LookupHandle, - IN LPWSTR ServiceName) -{ - PRNR_CONTEXT RnrContext; - SIZE_T StringSize = 0; - - /* Get the size of the string */ - if (ServiceName) StringSize = wcslen(ServiceName); - - /* Allocate the Context */ - RnrContext = Temp_AllocZero(sizeof(RNR_CONTEXT) + (DWORD)StringSize); - - /* Check that we got one */ - if (RnrContext) - { - /* Set it up */ - RnrContext->RefCount = 2; - RnrContext->Handle = (LookupHandle ? LookupHandle : (HANDLE)RnrContext); - RnrContext->Instance = -1; - RnrContext->Signature = 0xaabbccdd; - wcscpy(RnrContext->ServiceName, ServiceName); - - /* Insert it into the list */ - AcquireRnR2Lock(); - InsertHeadList(&ListAnchor, &RnrContext->ListEntry); - ReleaseRnR2Lock(); - } - - /* Return it */ - return RnrContext; -} - -VOID -WSPAPI -RnrCtx_Release(PRNR_CONTEXT RnrContext) -{ - /* Acquire the lock */ - AcquireRnR2Lock(); - - /* Decrease reference count and check if it's still in use */ - if(!(--RnrContext->RefCount)) - { - /* Remove it from the List */ - RemoveEntryList(&RnrContext->ListEntry); - - /* Release the lock */ - ReleaseRnR2Lock(); - - /* Deallocated any cached Hostent */ - if(RnrContext->CachedSaBlob) SaBlob_Free(RnrContext->CachedSaBlob); - - /* Deallocate the Blob */ - if(RnrContext->CachedBlob.pBlobData) - { - DnsApiFree(RnrContext->CachedBlob.pBlobData); - } - - /* Deallocate the actual context itself */ - DnsApiFree(RnrContext); - } - else - { - /* Release the lock */ - ReleaseRnR2Lock(); - } -} - -PRNR_CONTEXT -WSPAPI -RnrCtx_Get(HANDLE LookupHandle, - DWORD dwControlFlags, - PLONG Instance) -{ - PLIST_ENTRY Entry; - PRNR_CONTEXT RnRContext = NULL; - - /* Acquire the lock */ - AcquireRnR2Lock(); - - /* Loop the RNR Context List */ - for(Entry = ListAnchor.Flink; Entry != &ListAnchor; Entry = Entry->Flink) - { - /* Get the Current RNR Context */ - RnRContext = CONTAINING_RECORD(Entry, RNR_CONTEXT, ListEntry); - - /* Check if it matches the one we got */ - if(RnRContext == (PRNR_CONTEXT)LookupHandle) break; - } - - /* If we found it, mark it in use */ - if(RnRContext) RnRContext->RefCount++; - - /* Increase the Instance and return it */ - *Instance = ++RnRContext->Instance; - - /* If we're flushing the previous one, then bias the Instance by one */ - if(dwControlFlags & LUP_FLUSHPREVIOUS) *Instance = ++RnRContext->Instance; - - /* Release the lock */ - ReleaseRnR2Lock(); - - /* Return the Context */ - return RnRContext; -} - -VOID -WSPAPI -RnrCtx_DecInstance(IN PRNR_CONTEXT RnrContext) -{ - /* Acquire the lock */ - AcquireRnR2Lock(); - - /* Decrease instance count */ - RnrContext->Instance--; - - /* Release the lock */ - ReleaseRnR2Lock(); -} - -VOID -WSPAPI -RnrCtx_ListCleanup(VOID) -{ - PLIST_ENTRY Entry; - - /* Acquire RnR Lock */ - AcquireRnR2Lock(); - - /* Loop the contexts */ - while ((Entry = ListAnchor.Flink) != &ListAnchor) - { - /* Release this context */ - RnrCtx_Release(CONTAINING_RECORD(Entry, RNR_CONTEXT, ListEntry)); - } - - /* Release lock */ - ReleaseRnR2Lock(); -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -LIST_ENTRY ListAnchor; -BOOLEAN g_fRnrLockInit; -CRITICAL_SECTION g_RnrLock; - -#define AcquireRnR2Lock() EnterCriticalSection(&g_RnrLock); -#define ReleaseRnR2Lock() LeaveCriticalSection(&g_RnrLock); - -/* FUNCTIONS *****************************************************************/ - -PRNR_CONTEXT -WSPAPI -RnrCtx_Create(IN HANDLE LookupHandle, - IN LPWSTR ServiceName) -{ - PRNR_CONTEXT RnrContext; - SIZE_T StringSize = 0; - - /* Get the size of the string */ - if (ServiceName) StringSize = wcslen(ServiceName); - - /* Allocate the Context */ - RnrContext = Temp_AllocZero(sizeof(RNR_CONTEXT) + (DWORD)StringSize); - - /* Check that we got one */ - if (RnrContext) - { - /* Set it up */ - RnrContext->RefCount = 2; - RnrContext->Handle = (LookupHandle ? LookupHandle : (HANDLE)RnrContext); - RnrContext->Instance = -1; - RnrContext->Signature = 0xaabbccdd; - wcscpy(RnrContext->ServiceName, ServiceName); - - /* Insert it into the list */ - AcquireRnR2Lock(); - InsertHeadList(&ListAnchor, &RnrContext->ListEntry); - ReleaseRnR2Lock(); - } - - /* Return it */ - return RnrContext; -} - -VOID -WSPAPI -RnrCtx_Release(PRNR_CONTEXT RnrContext) -{ - /* Acquire the lock */ - AcquireRnR2Lock(); - - /* Decrease reference count and check if it's still in use */ - if(!(--RnrContext->RefCount)) - { - /* Remove it from the List */ - RemoveEntryList(&RnrContext->ListEntry); - - /* Release the lock */ - ReleaseRnR2Lock(); - - /* Deallocated any cached Hostent */ - if(RnrContext->CachedSaBlob) SaBlob_Free(RnrContext->CachedSaBlob); - - /* Deallocate the Blob */ - if(RnrContext->CachedBlob.pBlobData) - { - DnsApiFree(RnrContext->CachedBlob.pBlobData); - } - - /* Deallocate the actual context itself */ - DnsApiFree(RnrContext); - } - else - { - /* Release the lock */ - ReleaseRnR2Lock(); - } -} - -PRNR_CONTEXT -WSPAPI -RnrCtx_Get(HANDLE LookupHandle, - DWORD dwControlFlags, - PLONG Instance) -{ - PLIST_ENTRY Entry; - PRNR_CONTEXT RnRContext = NULL; - - /* Acquire the lock */ - AcquireRnR2Lock(); - - /* Loop the RNR Context List */ - for(Entry = ListAnchor.Flink; Entry != &ListAnchor; Entry = Entry->Flink) - { - /* Get the Current RNR Context */ - RnRContext = CONTAINING_RECORD(Entry, RNR_CONTEXT, ListEntry); - - /* Check if it matches the one we got */ - if(RnRContext == (PRNR_CONTEXT)LookupHandle) break; - } - - /* If we found it, mark it in use */ - if(RnRContext) RnRContext->RefCount++; - - /* Increase the Instance and return it */ - *Instance = ++RnRContext->Instance; - - /* If we're flushing the previous one, then bias the Instance by one */ - if(dwControlFlags & LUP_FLUSHPREVIOUS) *Instance = ++RnRContext->Instance; - - /* Release the lock */ - ReleaseRnR2Lock(); - - /* Return the Context */ - return RnRContext; -} - -VOID -WSPAPI -RnrCtx_DecInstance(IN PRNR_CONTEXT RnrContext) -{ - /* Acquire the lock */ - AcquireRnR2Lock(); - - /* Decrease instance count */ - RnrContext->Instance--; - - /* Release the lock */ - ReleaseRnR2Lock(); -} - -VOID -WSPAPI -RnrCtx_ListCleanup(VOID) -{ - PLIST_ENTRY Entry; - - /* Acquire RnR Lock */ - AcquireRnR2Lock(); - - /* Loop the contexts */ - while ((Entry = ListAnchor.Flink) != &ListAnchor) - { - /* Release this context */ - RnrCtx_Release(CONTAINING_RECORD(Entry, RNR_CONTEXT, ListEntry)); - } - - /* Release lock */ - ReleaseRnR2Lock(); -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -LIST_ENTRY ListAnchor; -BOOLEAN g_fRnrLockInit; -CRITICAL_SECTION g_RnrLock; - -#define AcquireRnR2Lock() EnterCriticalSection(&g_RnrLock); -#define ReleaseRnR2Lock() LeaveCriticalSection(&g_RnrLock); - -/* FUNCTIONS *****************************************************************/ - -PRNR_CONTEXT -WSPAPI -RnrCtx_Create(IN HANDLE LookupHandle, - IN LPWSTR ServiceName) -{ - PRNR_CONTEXT RnrContext; - SIZE_T StringSize = 0; - - /* Get the size of the string */ - if (ServiceName) StringSize = wcslen(ServiceName); - - /* Allocate the Context */ - RnrContext = Temp_AllocZero(sizeof(RNR_CONTEXT) + (DWORD)StringSize); - - /* Check that we got one */ - if (RnrContext) - { - /* Set it up */ - RnrContext->RefCount = 2; - RnrContext->Handle = (LookupHandle ? LookupHandle : (HANDLE)RnrContext); - RnrContext->Instance = -1; - RnrContext->Signature = 0xaabbccdd; - wcscpy(RnrContext->ServiceName, ServiceName); - - /* Insert it into the list */ - AcquireRnR2Lock(); - InsertHeadList(&ListAnchor, &RnrContext->ListEntry); - ReleaseRnR2Lock(); - } - - /* Return it */ - return RnrContext; -} - -VOID -WSPAPI -RnrCtx_Release(PRNR_CONTEXT RnrContext) -{ - /* Acquire the lock */ - AcquireRnR2Lock(); - - /* Decrease reference count and check if it's still in use */ - if(!(--RnrContext->RefCount)) - { - /* Remove it from the List */ - RemoveEntryList(&RnrContext->ListEntry); - - /* Release the lock */ - ReleaseRnR2Lock(); - - /* Deallocated any cached Hostent */ - if(RnrContext->CachedSaBlob) SaBlob_Free(RnrContext->CachedSaBlob); - - /* Deallocate the Blob */ - if(RnrContext->CachedBlob.pBlobData) - { - DnsApiFree(RnrContext->CachedBlob.pBlobData); - } - - /* Deallocate the actual context itself */ - DnsApiFree(RnrContext); - } - else - { - /* Release the lock */ - ReleaseRnR2Lock(); - } -} - -PRNR_CONTEXT -WSPAPI -RnrCtx_Get(HANDLE LookupHandle, - DWORD dwControlFlags, - PLONG Instance) -{ - PLIST_ENTRY Entry; - PRNR_CONTEXT RnRContext = NULL; - - /* Acquire the lock */ - AcquireRnR2Lock(); - - /* Loop the RNR Context List */ - for(Entry = ListAnchor.Flink; Entry != &ListAnchor; Entry = Entry->Flink) - { - /* Get the Current RNR Context */ - RnRContext = CONTAINING_RECORD(Entry, RNR_CONTEXT, ListEntry); - - /* Check if it matches the one we got */ - if(RnRContext == (PRNR_CONTEXT)LookupHandle) break; - } - - /* If we found it, mark it in use */ - if(RnRContext) RnRContext->RefCount++; - - /* Increase the Instance and return it */ - *Instance = ++RnRContext->Instance; - - /* If we're flushing the previous one, then bias the Instance by one */ - if(dwControlFlags & LUP_FLUSHPREVIOUS) *Instance = ++RnRContext->Instance; - - /* Release the lock */ - ReleaseRnR2Lock(); - - /* Return the Context */ - return RnRContext; -} - -VOID -WSPAPI -RnrCtx_DecInstance(IN PRNR_CONTEXT RnrContext) -{ - /* Acquire the lock */ - AcquireRnR2Lock(); - - /* Decrease instance count */ - RnrContext->Instance--; - - /* Release the lock */ - ReleaseRnR2Lock(); -} - -VOID -WSPAPI -RnrCtx_ListCleanup(VOID) -{ - PLIST_ENTRY Entry; - - /* Acquire RnR Lock */ - AcquireRnR2Lock(); - - /* Loop the contexts */ - while ((Entry = ListAnchor.Flink) != &ListAnchor) - { - /* Release this context */ - RnrCtx_Release(CONTAINING_RECORD(Entry, RNR_CONTEXT, ListEntry)); - } - - /* Release lock */ - ReleaseRnR2Lock(); -} - diff --git a/dll/win32/mswsock/rnr20/getserv.c b/dll/win32/mswsock/rnr20/getserv.c index 40d1f1bccaf..cbf06b2dc05 100644 --- a/dll/win32/mswsock/rnr20/getserv.c +++ b/dll/win32/mswsock/rnr20/getserv.c @@ -8,33 +8,3 @@ /* INCLUDES ******************************************************************/ #include "msafd.h" -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - diff --git a/dll/win32/mswsock/rnr20/init.c b/dll/win32/mswsock/rnr20/init.c index e313bd18021..1a7a747a538 100644 --- a/dll/win32/mswsock/rnr20/init.c +++ b/dll/win32/mswsock/rnr20/init.c @@ -87,270 +87,3 @@ Rnr_ThreadCleanup(VOID) /* Clean something in the TEB.. */ } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -BOOLEAN g_fSocketLockInit; -CRITICAL_SECTION RNRPROV_SocketLock; - -/* FUNCTIONS *****************************************************************/ - -VOID -WSPAPI -Rnr_ProcessInit(VOID) -{ - /* Initialize the RnR Locks */ - InitializeCriticalSection(&RNRPROV_SocketLock); - g_fSocketLockInit = TRUE; - InitializeCriticalSection(&g_RnrLock); - g_fRnrLockInit = TRUE; -} - -BOOLEAN -WSPAPI -Rnr_ThreadInit(VOID) -{ - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - PRNR_TEB_DATA RnrThreadData; - - /* Check if we have Thread Data */ - if (!ThreadData) - { - /* Initialize the entire DLL */ - if (!MSAFD_SockThreadInitialize()) return FALSE; - } - - /* Allocate the thread data */ - RnrThreadData = RtlAllocateHeap(RtlGetProcessHeap(), - 0, - sizeof(RNR_TEB_DATA)); - if (RnrThreadData) - { - /* Zero it out */ - RtlZeroMemory(RnrThreadData, sizeof(RNR_TEB_DATA)); - - /* Link it */ - ThreadData->RnrThreadData = RnrThreadData; - - /* Return success */ - return TRUE; - } - - /* If we got here, we failed */ - return FALSE; -} - -VOID -WSPAPI -Rnr_ProcessCleanup(VOID) -{ - /* Check if the RnR Lock is initalized */ - if (g_fRnrLockInit) - { - /* It is, so do NSP cleanup */ - Nsp_GlobalCleanup(); - - /* Free the lock if it's still there */ - if (g_fSocketLockInit) DeleteCriticalSection(&g_RnrLock); - g_fRnrLockInit = FALSE; - } - - /* Free the socket lock if it's there */ - if (g_fSocketLockInit) DeleteCriticalSection(&RNRPROV_SocketLock); - g_fRnrLockInit = FALSE; -} - -VOID -WSPAPI -Rnr_ThreadCleanup(VOID) -{ - /* Clean something in the TEB.. */ -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -BOOLEAN g_fSocketLockInit; -CRITICAL_SECTION RNRPROV_SocketLock; - -/* FUNCTIONS *****************************************************************/ - -VOID -WSPAPI -Rnr_ProcessInit(VOID) -{ - /* Initialize the RnR Locks */ - InitializeCriticalSection(&RNRPROV_SocketLock); - g_fSocketLockInit = TRUE; - InitializeCriticalSection(&g_RnrLock); - g_fRnrLockInit = TRUE; -} - -BOOLEAN -WSPAPI -Rnr_ThreadInit(VOID) -{ - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - PRNR_TEB_DATA RnrThreadData; - - /* Check if we have Thread Data */ - if (!ThreadData) - { - /* Initialize the entire DLL */ - if (!MSAFD_SockThreadInitialize()) return FALSE; - } - - /* Allocate the thread data */ - RnrThreadData = RtlAllocateHeap(RtlGetProcessHeap(), - 0, - sizeof(RNR_TEB_DATA)); - if (RnrThreadData) - { - /* Zero it out */ - RtlZeroMemory(RnrThreadData, sizeof(RNR_TEB_DATA)); - - /* Link it */ - ThreadData->RnrThreadData = RnrThreadData; - - /* Return success */ - return TRUE; - } - - /* If we got here, we failed */ - return FALSE; -} - -VOID -WSPAPI -Rnr_ProcessCleanup(VOID) -{ - /* Check if the RnR Lock is initalized */ - if (g_fRnrLockInit) - { - /* It is, so do NSP cleanup */ - Nsp_GlobalCleanup(); - - /* Free the lock if it's still there */ - if (g_fSocketLockInit) DeleteCriticalSection(&g_RnrLock); - g_fRnrLockInit = FALSE; - } - - /* Free the socket lock if it's there */ - if (g_fSocketLockInit) DeleteCriticalSection(&RNRPROV_SocketLock); - g_fRnrLockInit = FALSE; -} - -VOID -WSPAPI -Rnr_ThreadCleanup(VOID) -{ - /* Clean something in the TEB.. */ -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -BOOLEAN g_fSocketLockInit; -CRITICAL_SECTION RNRPROV_SocketLock; - -/* FUNCTIONS *****************************************************************/ - -VOID -WSPAPI -Rnr_ProcessInit(VOID) -{ - /* Initialize the RnR Locks */ - InitializeCriticalSection(&RNRPROV_SocketLock); - g_fSocketLockInit = TRUE; - InitializeCriticalSection(&g_RnrLock); - g_fRnrLockInit = TRUE; -} - -BOOLEAN -WSPAPI -Rnr_ThreadInit(VOID) -{ - PWINSOCK_TEB_DATA ThreadData = NtCurrentTeb()->WinSockData; - PRNR_TEB_DATA RnrThreadData; - - /* Check if we have Thread Data */ - if (!ThreadData) - { - /* Initialize the entire DLL */ - if (!MSAFD_SockThreadInitialize()) return FALSE; - } - - /* Allocate the thread data */ - RnrThreadData = RtlAllocateHeap(RtlGetProcessHeap(), - 0, - sizeof(RNR_TEB_DATA)); - if (RnrThreadData) - { - /* Zero it out */ - RtlZeroMemory(RnrThreadData, sizeof(RNR_TEB_DATA)); - - /* Link it */ - ThreadData->RnrThreadData = RnrThreadData; - - /* Return success */ - return TRUE; - } - - /* If we got here, we failed */ - return FALSE; -} - -VOID -WSPAPI -Rnr_ProcessCleanup(VOID) -{ - /* Check if the RnR Lock is initalized */ - if (g_fRnrLockInit) - { - /* It is, so do NSP cleanup */ - Nsp_GlobalCleanup(); - - /* Free the lock if it's still there */ - if (g_fSocketLockInit) DeleteCriticalSection(&g_RnrLock); - g_fRnrLockInit = FALSE; - } - - /* Free the socket lock if it's there */ - if (g_fSocketLockInit) DeleteCriticalSection(&RNRPROV_SocketLock); - g_fRnrLockInit = FALSE; -} - -VOID -WSPAPI -Rnr_ThreadCleanup(VOID) -{ - /* Clean something in the TEB.. */ -} - diff --git a/dll/win32/mswsock/rnr20/logit.c b/dll/win32/mswsock/rnr20/logit.c index 40d1f1bccaf..cbf06b2dc05 100644 --- a/dll/win32/mswsock/rnr20/logit.c +++ b/dll/win32/mswsock/rnr20/logit.c @@ -8,33 +8,3 @@ /* INCLUDES ******************************************************************/ #include "msafd.h" -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - diff --git a/dll/win32/mswsock/rnr20/lookup.c b/dll/win32/mswsock/rnr20/lookup.c index 3f8e7198a6f..44d7b39a985 100644 --- a/dll/win32/mswsock/rnr20/lookup.c +++ b/dll/win32/mswsock/rnr20/lookup.c @@ -357,1080 +357,3 @@ Rnr_NbtResolveAddr(IN IN_ADDR Address) return NULL; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -extern DWORD MaskOfGuids; -extern GUID NbtProviderId; - -/* FUNCTIONS *****************************************************************/ - -PDNS_BLOB -WINAPI -Rnr_DoHostnameLookup(IN PRNR_CONTEXT RnrContext) -{ - INT ErrorCode; - LPWSTR LocalName; - PDNS_BLOB Blob = NULL; - - /* Query the Local Hostname */ - DnsQueryConfig(DnsConfigHostName_W, - DNS_CONFIG_FLAG_ALLOC, - NULL, - NULL, - &LocalName, - 0); - if (!LocalName) - { - /* Set error code if we got "Success" */ - ErrorCode = GetLastError(); - if (ErrorCode == NO_ERROR) ErrorCode = ERROR_OUTOFMEMORY; - goto Fail; - } - - /* Create a Blob */ - Blob = SaBlob_Create(0); - if (!Blob) - { - /* Set error code if we got "Success" */ - ErrorCode = GetLastError(); - if (ErrorCode == NO_ERROR) ErrorCode = ERROR_OUTOFMEMORY; - goto Fail; - } - - /* Write the name */ - ErrorCode = SaBlob_WriteNameOrAlias(Blob, LocalName, FALSE); - if (ErrorCode != NO_ERROR) goto Fail; - - /* Free the name and return the blob */ - DnsApiFree(LocalName); - return Blob; - -Fail: - /* Some kind of failure... delete the blob first */ - if (Blob) SaBlob_Free(Blob); - - /* Free the name */ - DnsApiFree(LocalName); - - /* Set the error and fail */ - SetLastError(ErrorCode); - return NULL; -} - -PDNS_BLOB -WINAPI -Rnr_GetHostByAddr(IN PRNR_CONTEXT RnrContext) -{ - BOOLEAN Prolog; - PDNS_BLOB Blob = NULL; - INT ErrorCode = ERROR_SUCCESS; - DWORD ControlFlags = RnrContext->dwControlFlags; - IN6_ADDR Address; - ULONG AddressSize = sizeof(IN6_ADDR); - DWORD AddressFamily = AF_UNSPEC; - WCHAR ReverseAddress[256]; - - /* Enter the RNR Prolog */ - Prolog = RNRPROV_SockEnterApi(); - if (!Prolog) return NULL; - - /* Get an Address */ - Dns_StringToAddressW(&Address, - &AddressSize, - RnrContext->ServiceName, - &AddressFamily); - - /* Check the address family */ - if (AddressFamily == AF_INET) - { - /* Convert it to the IPv4 Reverse Name */ - Dns_Ip4AddressToReverseName_W(ReverseAddress, *(PIN_ADDR)&Address); - } - else if (AddressFamily == AF_INET6) - { - /* Convert it to the IPv6 Reverse Name */ - Dns_Ip6AddressToReverseName_W(ReverseAddress, Address); - } - - /* Do the DNS Lookup */ - Blob = SaBlob_Query(ReverseAddress, - DNS_TYPE_PTR, - (ControlFlags & LUP_FLUSHCACHE) ? - DNS_QUERY_BYPASS_CACHE : - DNS_QUERY_STANDARD, - NULL, - AddressFamily); - if (!Blob) - { - /* If this is IPv4... */ - if (AddressFamily == AF_INET) - { - /* Can we try NBT? */ - if (Rnr_CheckIfUseNbt(RnrContext)) - { - /* Do NBT Resolution */ - Blob = Rnr_NbtResolveAddr(*(PIN_ADDR)&Address); - } - } - - /* Do we still not have a blob? */ - if (!Blob) ErrorCode = WSANO_DATA; - } - - /* Set the error code and return */ - SetLastError(ErrorCode); - return Blob; -} - -PDNS_BLOB -WINAPI -Rnr_DoDnsLookup(IN PRNR_CONTEXT RnrContext) -{ - LPWSTR Name = RnrContext->ServiceName; - LPGUID Guid = &RnrContext->lpServiceClassId; - WORD DnsType; - PVOID ReservedData = NULL; - PVOID *Reserved = NULL; - BOOL DoDnsQuery = TRUE; - BOOL DoNbtQuery = TRUE; - DWORD DnsFlags; - PDNS_BLOB Blob; - IN_ADDR Addr; - - /* Get the DNS Query Type */ - DnsType = GetDnsQueryTypeFromGuid(Guid); - - /* Check the request type */ - if ((DnsType != DNS_TYPE_A) || - (DnsType != DNS_TYPE_ATMA) || - (DnsType != DNS_TYPE_AAAA) || - (DnsType != DNS_TYPE_PTR)) - { - /* Not a sockaddr request, so read the raw data */ - Reserved = &ReservedData; - } - - /* Check the NS request type */ - switch (RnrContext->dwNameSpace) - { - /* Set the DNS flags for a TCP/IP Local Namespace */ - case NS_TCPIP_LOCAL: - DnsFlags = DNS_QUERY_NO_HOSTS_FILE | DNS_QUERY_NO_WIRE_QUERY; - break; - - /* Set the DNS flags for a TCP/IP Hosts Namespace */ - case NS_TCPIP_HOSTS: - DnsFlags = DNS_QUERY_NO_LOCAL_NAME | - DNS_QUERY_NO_WIRE_QUERY | - DNS_QUERY_BYPASS_CACHE; - break; - - /* Default flags for default, DNS or WINS Namespaces */ - case NS_DNS: - case NS_WINS: - default: - DnsFlags = 0; - break; - } - - /* Check if this is a DNS Server lookup or normal host lookup */ - if (!(Name) && - (DnsType != DNS_TYPE_A) && - ((RnrContext->UdpPort == 53) || (RnrContext->TcpPort == 53))) - { - /* This is actually a DNS Server lookup */ - Name = L"..DnsServers"; - DnsFlags = DNS_QUERY_NO_HOSTS_FILE | - DNS_QUERY_NO_WIRE_QUERY | - DNS_QUERY_BYPASS_CACHE; - } - else - { - /* Normal name lookup */ - DnsFlags |= 0x4000000; - - /* Check which Rr Type this request is */ - if (RnrContext->RrType == 0x10000002) - { - /* - * Check if the previous value should be flushed or if this - * is a local lookup. - */ - if ((RnrContext->dwControlFlags & LUP_FLUSHPREVIOUS) && - (RnrContext->LookupFlags & LOCAL)) - { - /* Tell DNS not to use the Hosts file */ - DnsFlags |= DNS_QUERY_NO_HOSTS_FILE; - } - - /* Tell DNS that this is a ... request */ - DnsFlags |= 0x10000000; - } - } - - /* Check if flushing is enabled */ - if (RnrContext->dwControlFlags & LUP_FLUSHCACHE) - { - /* Bypass the Cache */ - DnsFlags |= DNS_QUERY_BYPASS_CACHE; - } - - /* Make sure we are going to to a DNS Query */ - if (DoDnsQuery) - { - /* Do the DNS Query */ - Blob = SaBlob_Query(Name, - DnsType, - DnsFlags, - Reserved, - 0); - - /* Check if we had reserved data */ - if (Reserved == &ReservedData) - { - /* Check if we need to use it */ - if (RnrContext->RnrId) - { - /* FIXME */ - //SaveAnswer( - } - - /* Free it */ - DnsApiFree(ReservedData); - } - } - - /* Ok, did we get a blob? */ - if (Blob) - { - /* We did..does it have not have name yet? */ - if (!Blob->Name) - { - /* It doesn't... was this a Hostname GUID? */ - if (!memcmp(Guid, &HostnameGuid, sizeof(GUID))) - { - /* Did we not get a name? */ - if (Name || *Name) - { - /* Then we must fail this request */ - SaBlob_Free(Blob); - Blob = NULL; - } - } - } - } - else if (DoNbtQuery) - { - /* Is this an IPv4 record? */ - if (DnsType == DNS_TYPE_A) - { - /* Check if we can use NBT, and use NBT to resolve it */ - if (Rnr_CheckIfUseNbt(RnrContext)) Blob = Rnr_NbtResolveName(Name); - } - else if (DnsType == DNS_TYPE_PTR) - { - /* IPv4 reverse address. Convert it */ - if (Dns_Ip4ReverseNameToAddress_W(&Addr, Name)) - { - /* Resolve it */ - Blob = Rnr_NbtResolveAddr(Addr); - } - } - } - - /* Do we not have a blob? Set the error code */ - if (!Blob) SetLastError(WSANO_ADDRESS); - - /* Return the blob */ - return Blob; -} - -BOOLEAN -WINAPI -Rnr_CheckIfUseNbt(PRNR_CONTEXT RnrContext) -{ - /* If an Rr ID was specified, don't use NBT */ - if (RnrContext->RrType) return FALSE; - - /* Check if we have more then one GUID */ - if (MaskOfGuids) - { - /* Compare this guy's GUID with the NBT Provider GUID */ - if (memcmp(&RnrContext->lpProviderId, - &NbtProviderId, - sizeof(GUID))) - { - /* Not NBT Guid */ - return FALSE; - } - } - - /* Is the DNS Namespace valid for NBT? */ - if ((RnrContext->dwNameSpace == NS_ALL) || - (RnrContext->dwNameSpace == NS_NETBT) || - (RnrContext->dwNameSpace == NS_WINS)) - { - /* Use NBT */ - return TRUE; - } - - /* Don't use NBT */ - return FALSE; -} - -PDNS_BLOB -WINAPI -Rnr_NbtResolveName(IN LPWSTR Name) -{ - /* - * Heh...right...NBT lookups...as if! - * Seriously, don't bother -- MS is considering to deprecate this - * in Vista SP1 or Blackcomb. If someone complains about this, please - * instruct them to deposit a very large check in my bank account... - * - AI 03/12/05 - */ - return NULL; -} - -PDNS_BLOB -WINAPI -Rnr_NbtResolveAddr(IN IN_ADDR Address) -{ - /* - * Heh...right...NBT lookups...as if! - * Seriously, don't bother -- MS is considering to deprecate this - * in Vista SP1 or Blackcomb. If someone complains about this, please - * instruct them to deposit a very large check in my bank account... - * - AI 03/12/05 - */ - return NULL; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -extern DWORD MaskOfGuids; -extern GUID NbtProviderId; - -/* FUNCTIONS *****************************************************************/ - -PDNS_BLOB -WINAPI -Rnr_DoHostnameLookup(IN PRNR_CONTEXT RnrContext) -{ - INT ErrorCode; - LPWSTR LocalName; - PDNS_BLOB Blob = NULL; - - /* Query the Local Hostname */ - DnsQueryConfig(DnsConfigHostName_W, - DNS_CONFIG_FLAG_ALLOC, - NULL, - NULL, - &LocalName, - 0); - if (!LocalName) - { - /* Set error code if we got "Success" */ - ErrorCode = GetLastError(); - if (ErrorCode == NO_ERROR) ErrorCode = ERROR_OUTOFMEMORY; - goto Fail; - } - - /* Create a Blob */ - Blob = SaBlob_Create(0); - if (!Blob) - { - /* Set error code if we got "Success" */ - ErrorCode = GetLastError(); - if (ErrorCode == NO_ERROR) ErrorCode = ERROR_OUTOFMEMORY; - goto Fail; - } - - /* Write the name */ - ErrorCode = SaBlob_WriteNameOrAlias(Blob, LocalName, FALSE); - if (ErrorCode != NO_ERROR) goto Fail; - - /* Free the name and return the blob */ - DnsApiFree(LocalName); - return Blob; - -Fail: - /* Some kind of failure... delete the blob first */ - if (Blob) SaBlob_Free(Blob); - - /* Free the name */ - DnsApiFree(LocalName); - - /* Set the error and fail */ - SetLastError(ErrorCode); - return NULL; -} - -PDNS_BLOB -WINAPI -Rnr_GetHostByAddr(IN PRNR_CONTEXT RnrContext) -{ - BOOLEAN Prolog; - PDNS_BLOB Blob = NULL; - INT ErrorCode = ERROR_SUCCESS; - DWORD ControlFlags = RnrContext->dwControlFlags; - IN6_ADDR Address; - ULONG AddressSize = sizeof(IN6_ADDR); - DWORD AddressFamily = AF_UNSPEC; - WCHAR ReverseAddress[256]; - - /* Enter the RNR Prolog */ - Prolog = RNRPROV_SockEnterApi(); - if (!Prolog) return NULL; - - /* Get an Address */ - Dns_StringToAddressW(&Address, - &AddressSize, - RnrContext->ServiceName, - &AddressFamily); - - /* Check the address family */ - if (AddressFamily == AF_INET) - { - /* Convert it to the IPv4 Reverse Name */ - Dns_Ip4AddressToReverseName_W(ReverseAddress, *(PIN_ADDR)&Address); - } - else if (AddressFamily == AF_INET6) - { - /* Convert it to the IPv6 Reverse Name */ - Dns_Ip6AddressToReverseName_W(ReverseAddress, Address); - } - - /* Do the DNS Lookup */ - Blob = SaBlob_Query(ReverseAddress, - DNS_TYPE_PTR, - (ControlFlags & LUP_FLUSHCACHE) ? - DNS_QUERY_BYPASS_CACHE : - DNS_QUERY_STANDARD, - NULL, - AddressFamily); - if (!Blob) - { - /* If this is IPv4... */ - if (AddressFamily == AF_INET) - { - /* Can we try NBT? */ - if (Rnr_CheckIfUseNbt(RnrContext)) - { - /* Do NBT Resolution */ - Blob = Rnr_NbtResolveAddr(*(PIN_ADDR)&Address); - } - } - - /* Do we still not have a blob? */ - if (!Blob) ErrorCode = WSANO_DATA; - } - - /* Set the error code and return */ - SetLastError(ErrorCode); - return Blob; -} - -PDNS_BLOB -WINAPI -Rnr_DoDnsLookup(IN PRNR_CONTEXT RnrContext) -{ - LPWSTR Name = RnrContext->ServiceName; - LPGUID Guid = &RnrContext->lpServiceClassId; - WORD DnsType; - PVOID ReservedData = NULL; - PVOID *Reserved = NULL; - BOOL DoDnsQuery = TRUE; - BOOL DoNbtQuery = TRUE; - DWORD DnsFlags; - PDNS_BLOB Blob; - IN_ADDR Addr; - - /* Get the DNS Query Type */ - DnsType = GetDnsQueryTypeFromGuid(Guid); - - /* Check the request type */ - if ((DnsType != DNS_TYPE_A) || - (DnsType != DNS_TYPE_ATMA) || - (DnsType != DNS_TYPE_AAAA) || - (DnsType != DNS_TYPE_PTR)) - { - /* Not a sockaddr request, so read the raw data */ - Reserved = &ReservedData; - } - - /* Check the NS request type */ - switch (RnrContext->dwNameSpace) - { - /* Set the DNS flags for a TCP/IP Local Namespace */ - case NS_TCPIP_LOCAL: - DnsFlags = DNS_QUERY_NO_HOSTS_FILE | DNS_QUERY_NO_WIRE_QUERY; - break; - - /* Set the DNS flags for a TCP/IP Hosts Namespace */ - case NS_TCPIP_HOSTS: - DnsFlags = DNS_QUERY_NO_LOCAL_NAME | - DNS_QUERY_NO_WIRE_QUERY | - DNS_QUERY_BYPASS_CACHE; - break; - - /* Default flags for default, DNS or WINS Namespaces */ - case NS_DNS: - case NS_WINS: - default: - DnsFlags = 0; - break; - } - - /* Check if this is a DNS Server lookup or normal host lookup */ - if (!(Name) && - (DnsType != DNS_TYPE_A) && - ((RnrContext->UdpPort == 53) || (RnrContext->TcpPort == 53))) - { - /* This is actually a DNS Server lookup */ - Name = L"..DnsServers"; - DnsFlags = DNS_QUERY_NO_HOSTS_FILE | - DNS_QUERY_NO_WIRE_QUERY | - DNS_QUERY_BYPASS_CACHE; - } - else - { - /* Normal name lookup */ - DnsFlags |= 0x4000000; - - /* Check which Rr Type this request is */ - if (RnrContext->RrType == 0x10000002) - { - /* - * Check if the previous value should be flushed or if this - * is a local lookup. - */ - if ((RnrContext->dwControlFlags & LUP_FLUSHPREVIOUS) && - (RnrContext->LookupFlags & LOCAL)) - { - /* Tell DNS not to use the Hosts file */ - DnsFlags |= DNS_QUERY_NO_HOSTS_FILE; - } - - /* Tell DNS that this is a ... request */ - DnsFlags |= 0x10000000; - } - } - - /* Check if flushing is enabled */ - if (RnrContext->dwControlFlags & LUP_FLUSHCACHE) - { - /* Bypass the Cache */ - DnsFlags |= DNS_QUERY_BYPASS_CACHE; - } - - /* Make sure we are going to to a DNS Query */ - if (DoDnsQuery) - { - /* Do the DNS Query */ - Blob = SaBlob_Query(Name, - DnsType, - DnsFlags, - Reserved, - 0); - - /* Check if we had reserved data */ - if (Reserved == &ReservedData) - { - /* Check if we need to use it */ - if (RnrContext->RnrId) - { - /* FIXME */ - //SaveAnswer( - } - - /* Free it */ - DnsApiFree(ReservedData); - } - } - - /* Ok, did we get a blob? */ - if (Blob) - { - /* We did..does it have not have name yet? */ - if (!Blob->Name) - { - /* It doesn't... was this a Hostname GUID? */ - if (!memcmp(Guid, &HostnameGuid, sizeof(GUID))) - { - /* Did we not get a name? */ - if (Name || *Name) - { - /* Then we must fail this request */ - SaBlob_Free(Blob); - Blob = NULL; - } - } - } - } - else if (DoNbtQuery) - { - /* Is this an IPv4 record? */ - if (DnsType == DNS_TYPE_A) - { - /* Check if we can use NBT, and use NBT to resolve it */ - if (Rnr_CheckIfUseNbt(RnrContext)) Blob = Rnr_NbtResolveName(Name); - } - else if (DnsType == DNS_TYPE_PTR) - { - /* IPv4 reverse address. Convert it */ - if (Dns_Ip4ReverseNameToAddress_W(&Addr, Name)) - { - /* Resolve it */ - Blob = Rnr_NbtResolveAddr(Addr); - } - } - } - - /* Do we not have a blob? Set the error code */ - if (!Blob) SetLastError(WSANO_ADDRESS); - - /* Return the blob */ - return Blob; -} - -BOOLEAN -WINAPI -Rnr_CheckIfUseNbt(PRNR_CONTEXT RnrContext) -{ - /* If an Rr ID was specified, don't use NBT */ - if (RnrContext->RrType) return FALSE; - - /* Check if we have more then one GUID */ - if (MaskOfGuids) - { - /* Compare this guy's GUID with the NBT Provider GUID */ - if (memcmp(&RnrContext->lpProviderId, - &NbtProviderId, - sizeof(GUID))) - { - /* Not NBT Guid */ - return FALSE; - } - } - - /* Is the DNS Namespace valid for NBT? */ - if ((RnrContext->dwNameSpace == NS_ALL) || - (RnrContext->dwNameSpace == NS_NETBT) || - (RnrContext->dwNameSpace == NS_WINS)) - { - /* Use NBT */ - return TRUE; - } - - /* Don't use NBT */ - return FALSE; -} - -PDNS_BLOB -WINAPI -Rnr_NbtResolveName(IN LPWSTR Name) -{ - /* - * Heh...right...NBT lookups...as if! - * Seriously, don't bother -- MS is considering to deprecate this - * in Vista SP1 or Blackcomb. If someone complains about this, please - * instruct them to deposit a very large check in my bank account... - * - AI 03/12/05 - */ - return NULL; -} - -PDNS_BLOB -WINAPI -Rnr_NbtResolveAddr(IN IN_ADDR Address) -{ - /* - * Heh...right...NBT lookups...as if! - * Seriously, don't bother -- MS is considering to deprecate this - * in Vista SP1 or Blackcomb. If someone complains about this, please - * instruct them to deposit a very large check in my bank account... - * - AI 03/12/05 - */ - return NULL; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -extern DWORD MaskOfGuids; -extern GUID NbtProviderId; - -/* FUNCTIONS *****************************************************************/ - -PDNS_BLOB -WINAPI -Rnr_DoHostnameLookup(IN PRNR_CONTEXT RnrContext) -{ - INT ErrorCode; - LPWSTR LocalName; - PDNS_BLOB Blob = NULL; - - /* Query the Local Hostname */ - DnsQueryConfig(DnsConfigHostName_W, - DNS_CONFIG_FLAG_ALLOC, - NULL, - NULL, - &LocalName, - 0); - if (!LocalName) - { - /* Set error code if we got "Success" */ - ErrorCode = GetLastError(); - if (ErrorCode == NO_ERROR) ErrorCode = ERROR_OUTOFMEMORY; - goto Fail; - } - - /* Create a Blob */ - Blob = SaBlob_Create(0); - if (!Blob) - { - /* Set error code if we got "Success" */ - ErrorCode = GetLastError(); - if (ErrorCode == NO_ERROR) ErrorCode = ERROR_OUTOFMEMORY; - goto Fail; - } - - /* Write the name */ - ErrorCode = SaBlob_WriteNameOrAlias(Blob, LocalName, FALSE); - if (ErrorCode != NO_ERROR) goto Fail; - - /* Free the name and return the blob */ - DnsApiFree(LocalName); - return Blob; - -Fail: - /* Some kind of failure... delete the blob first */ - if (Blob) SaBlob_Free(Blob); - - /* Free the name */ - DnsApiFree(LocalName); - - /* Set the error and fail */ - SetLastError(ErrorCode); - return NULL; -} - -PDNS_BLOB -WINAPI -Rnr_GetHostByAddr(IN PRNR_CONTEXT RnrContext) -{ - BOOLEAN Prolog; - PDNS_BLOB Blob = NULL; - INT ErrorCode = ERROR_SUCCESS; - DWORD ControlFlags = RnrContext->dwControlFlags; - IN6_ADDR Address; - ULONG AddressSize = sizeof(IN6_ADDR); - DWORD AddressFamily = AF_UNSPEC; - WCHAR ReverseAddress[256]; - - /* Enter the RNR Prolog */ - Prolog = RNRPROV_SockEnterApi(); - if (!Prolog) return NULL; - - /* Get an Address */ - Dns_StringToAddressW(&Address, - &AddressSize, - RnrContext->ServiceName, - &AddressFamily); - - /* Check the address family */ - if (AddressFamily == AF_INET) - { - /* Convert it to the IPv4 Reverse Name */ - Dns_Ip4AddressToReverseName_W(ReverseAddress, *(PIN_ADDR)&Address); - } - else if (AddressFamily == AF_INET6) - { - /* Convert it to the IPv6 Reverse Name */ - Dns_Ip6AddressToReverseName_W(ReverseAddress, Address); - } - - /* Do the DNS Lookup */ - Blob = SaBlob_Query(ReverseAddress, - DNS_TYPE_PTR, - (ControlFlags & LUP_FLUSHCACHE) ? - DNS_QUERY_BYPASS_CACHE : - DNS_QUERY_STANDARD, - NULL, - AddressFamily); - if (!Blob) - { - /* If this is IPv4... */ - if (AddressFamily == AF_INET) - { - /* Can we try NBT? */ - if (Rnr_CheckIfUseNbt(RnrContext)) - { - /* Do NBT Resolution */ - Blob = Rnr_NbtResolveAddr(*(PIN_ADDR)&Address); - } - } - - /* Do we still not have a blob? */ - if (!Blob) ErrorCode = WSANO_DATA; - } - - /* Set the error code and return */ - SetLastError(ErrorCode); - return Blob; -} - -PDNS_BLOB -WINAPI -Rnr_DoDnsLookup(IN PRNR_CONTEXT RnrContext) -{ - LPWSTR Name = RnrContext->ServiceName; - LPGUID Guid = &RnrContext->lpServiceClassId; - WORD DnsType; - PVOID ReservedData = NULL; - PVOID *Reserved = NULL; - BOOL DoDnsQuery = TRUE; - BOOL DoNbtQuery = TRUE; - DWORD DnsFlags; - PDNS_BLOB Blob; - IN_ADDR Addr; - - /* Get the DNS Query Type */ - DnsType = GetDnsQueryTypeFromGuid(Guid); - - /* Check the request type */ - if ((DnsType != DNS_TYPE_A) || - (DnsType != DNS_TYPE_ATMA) || - (DnsType != DNS_TYPE_AAAA) || - (DnsType != DNS_TYPE_PTR)) - { - /* Not a sockaddr request, so read the raw data */ - Reserved = &ReservedData; - } - - /* Check the NS request type */ - switch (RnrContext->dwNameSpace) - { - /* Set the DNS flags for a TCP/IP Local Namespace */ - case NS_TCPIP_LOCAL: - DnsFlags = DNS_QUERY_NO_HOSTS_FILE | DNS_QUERY_NO_WIRE_QUERY; - break; - - /* Set the DNS flags for a TCP/IP Hosts Namespace */ - case NS_TCPIP_HOSTS: - DnsFlags = DNS_QUERY_NO_LOCAL_NAME | - DNS_QUERY_NO_WIRE_QUERY | - DNS_QUERY_BYPASS_CACHE; - break; - - /* Default flags for default, DNS or WINS Namespaces */ - case NS_DNS: - case NS_WINS: - default: - DnsFlags = 0; - break; - } - - /* Check if this is a DNS Server lookup or normal host lookup */ - if (!(Name) && - (DnsType != DNS_TYPE_A) && - ((RnrContext->UdpPort == 53) || (RnrContext->TcpPort == 53))) - { - /* This is actually a DNS Server lookup */ - Name = L"..DnsServers"; - DnsFlags = DNS_QUERY_NO_HOSTS_FILE | - DNS_QUERY_NO_WIRE_QUERY | - DNS_QUERY_BYPASS_CACHE; - } - else - { - /* Normal name lookup */ - DnsFlags |= 0x4000000; - - /* Check which Rr Type this request is */ - if (RnrContext->RrType == 0x10000002) - { - /* - * Check if the previous value should be flushed or if this - * is a local lookup. - */ - if ((RnrContext->dwControlFlags & LUP_FLUSHPREVIOUS) && - (RnrContext->LookupFlags & LOCAL)) - { - /* Tell DNS not to use the Hosts file */ - DnsFlags |= DNS_QUERY_NO_HOSTS_FILE; - } - - /* Tell DNS that this is a ... request */ - DnsFlags |= 0x10000000; - } - } - - /* Check if flushing is enabled */ - if (RnrContext->dwControlFlags & LUP_FLUSHCACHE) - { - /* Bypass the Cache */ - DnsFlags |= DNS_QUERY_BYPASS_CACHE; - } - - /* Make sure we are going to to a DNS Query */ - if (DoDnsQuery) - { - /* Do the DNS Query */ - Blob = SaBlob_Query(Name, - DnsType, - DnsFlags, - Reserved, - 0); - - /* Check if we had reserved data */ - if (Reserved == &ReservedData) - { - /* Check if we need to use it */ - if (RnrContext->RnrId) - { - /* FIXME */ - //SaveAnswer( - } - - /* Free it */ - DnsApiFree(ReservedData); - } - } - - /* Ok, did we get a blob? */ - if (Blob) - { - /* We did..does it have not have name yet? */ - if (!Blob->Name) - { - /* It doesn't... was this a Hostname GUID? */ - if (!memcmp(Guid, &HostnameGuid, sizeof(GUID))) - { - /* Did we not get a name? */ - if (Name || *Name) - { - /* Then we must fail this request */ - SaBlob_Free(Blob); - Blob = NULL; - } - } - } - } - else if (DoNbtQuery) - { - /* Is this an IPv4 record? */ - if (DnsType == DNS_TYPE_A) - { - /* Check if we can use NBT, and use NBT to resolve it */ - if (Rnr_CheckIfUseNbt(RnrContext)) Blob = Rnr_NbtResolveName(Name); - } - else if (DnsType == DNS_TYPE_PTR) - { - /* IPv4 reverse address. Convert it */ - if (Dns_Ip4ReverseNameToAddress_W(&Addr, Name)) - { - /* Resolve it */ - Blob = Rnr_NbtResolveAddr(Addr); - } - } - } - - /* Do we not have a blob? Set the error code */ - if (!Blob) SetLastError(WSANO_ADDRESS); - - /* Return the blob */ - return Blob; -} - -BOOLEAN -WINAPI -Rnr_CheckIfUseNbt(PRNR_CONTEXT RnrContext) -{ - /* If an Rr ID was specified, don't use NBT */ - if (RnrContext->RrType) return FALSE; - - /* Check if we have more then one GUID */ - if (MaskOfGuids) - { - /* Compare this guy's GUID with the NBT Provider GUID */ - if (memcmp(&RnrContext->lpProviderId, - &NbtProviderId, - sizeof(GUID))) - { - /* Not NBT Guid */ - return FALSE; - } - } - - /* Is the DNS Namespace valid for NBT? */ - if ((RnrContext->dwNameSpace == NS_ALL) || - (RnrContext->dwNameSpace == NS_NETBT) || - (RnrContext->dwNameSpace == NS_WINS)) - { - /* Use NBT */ - return TRUE; - } - - /* Don't use NBT */ - return FALSE; -} - -PDNS_BLOB -WINAPI -Rnr_NbtResolveName(IN LPWSTR Name) -{ - /* - * Heh...right...NBT lookups...as if! - * Seriously, don't bother -- MS is considering to deprecate this - * in Vista SP1 or Blackcomb. If someone complains about this, please - * instruct them to deposit a very large check in my bank account... - * - AI 03/12/05 - */ - return NULL; -} - -PDNS_BLOB -WINAPI -Rnr_NbtResolveAddr(IN IN_ADDR Address) -{ - /* - * Heh...right...NBT lookups...as if! - * Seriously, don't bother -- MS is considering to deprecate this - * in Vista SP1 or Blackcomb. If someone complains about this, please - * instruct them to deposit a very large check in my bank account... - * - AI 03/12/05 - */ - return NULL; -} - diff --git a/dll/win32/mswsock/rnr20/nbt.c b/dll/win32/mswsock/rnr20/nbt.c index 3e062e90d63..bd1ad2806dc 100644 --- a/dll/win32/mswsock/rnr20/nbt.c +++ b/dll/win32/mswsock/rnr20/nbt.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/rnr20/nsp.c b/dll/win32/mswsock/rnr20/nsp.c index 7c39fdad843..d5338e20a2a 100644 --- a/dll/win32/mswsock/rnr20/nsp.c +++ b/dll/win32/mswsock/rnr20/nsp.c @@ -942,2835 +942,3 @@ Quickie: return ErrorCode; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -#define ALL_LUP_FLAGS (0x0BFFF) - -/* DATA **********************************************************************/ - -LPWSTR g_pszHostName; -LPWSTR g_pszHostFqdn; -LONG g_NspRefCount; -GUID NbtProviderId = {0}; -GUID DNSProviderId = {0}; -DWORD MaskOfGuids; - -NSP_ROUTINE g_NspVector = {sizeof(NSP_ROUTINE), - 1, - 1, - Dns_NSPCleanup, - Dns_NSPLookupServiceBegin, - Dns_NSPLookupServiceNext, - Dns_NSPLookupServiceEnd, - Dns_NSPSetService, - Dns_NSPInstallServiceClass, - Dns_NSPRemoveServiceClass, - Dns_NSPGetServiceClassInfo}; - -/* FUNCTIONS *****************************************************************/ - -INT -WINAPI -Dns_NSPStartup(IN LPGUID lpProviderId, - IN OUT LPNSP_ROUTINE lpsnpRoutines) -{ - INT ErrorCode; - BOOLEAN Prolog; - - /* Validate the size */ - if (lpsnpRoutines->cbSize != sizeof(NSP_ROUTINE)) - { - /* Fail */ - SetLastError(WSAEINVALIDPROCTABLE); - return SOCKET_ERROR; - } - - /* Enter the prolog */ - Prolog = RNRPROV_SockEnterApi(); - if (Prolog) - { - /* Increase our reference count */ - InterlockedIncrement(&g_NspRefCount); - - /* Check if we don't have the hostname */ - if (!g_pszHostName) - { - /* Query it from DNS */ - DnsQueryConfig(DnsConfigHostName_W, - DNS_CONFIG_FLAG_ALLOC, - NULL, - NULL, - &g_pszHostName, - 0); - } - - /* Check if we have a hostname now, but not a Fully-Qualified Domain */ - if (g_pszHostName && !(g_pszHostFqdn)) - { - /* Get the domain from DNS */ - DnsQueryConfig(DnsConfigFullHostName_W, - DNS_CONFIG_FLAG_ALLOC, - NULL, - NULL, - &g_pszHostFqdn, - 0); - } - - /* If we don't have both of them, then set error */ - if (!(g_pszHostName) || !(g_pszHostFqdn)) ErrorCode = SOCKET_ERROR; - } - - /* Check if the Prolog or DNS Local Queries failed */ - if (!(Prolog) || (ErrorCode != NO_ERROR)) - { - /* Fail */ - SetLastError(WSASYSNOTREADY); - return SOCKET_ERROR; - } - - /* Copy the Routines */ - RtlMoveMemory(lpsnpRoutines, &g_NspVector, sizeof(NSP_ROUTINE)); - - /* Check if this is NBT or DNS */ - if (!memcmp(lpProviderId, &NbtProviderId, sizeof(GUID))) - { - /* Enable the NBT Mask */ - MaskOfGuids |= NBT_MASK; - } - else if (!memcmp(lpProviderId, &DNSProviderId, sizeof(GUID))) - { - /* Enable the DNS Mask */ - MaskOfGuids |= DNS_MASK; - } - - /* Return success */ - return NO_ERROR; -} - -VOID -WSPAPI -Nsp_GlobalCleanup(VOID) -{ - /* Cleanup the RnR Contexts */ - RnrCtx_ListCleanup(); - - /* Free the hostnames, if we have them */ - if (g_pszHostName) DnsApiFree(g_pszHostName); - if (g_pszHostFqdn) DnsApiFree(g_pszHostFqdn); - g_pszHostFqdn = g_pszHostName = NULL; -} - -INT -WINAPI -NSPStartup(IN LPGUID lpProviderId, - IN OUT LPNSP_ROUTINE lpsnpRoutines) -{ - INT ErrorCode; - - /* Initialize the DLL */ - ErrorCode = MSWSOCK_Initialize(); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - SetLastError(WSANOTINITIALISED); - return SOCKET_ERROR; - } - - /* Check if this is Winsock Mobile or DNS */ - if (!memcmp(lpProviderId, &gNLANamespaceGuid, sizeof(GUID))) - { - /* Initialize WSM */ - return WSM_NSPStartup(lpProviderId, lpsnpRoutines); - } - - /* Initialize DNS */ - return Dns_NSPStartup(lpProviderId, lpsnpRoutines); -} - -INT -WINAPI -Dns_NSPCleanup(IN LPGUID lpProviderId) -{ - /* Decrement our reference count and do global cleanup if it's reached 0 */ - if (!(InterlockedDecrement(&g_NspRefCount))) Nsp_GlobalCleanup(); - - /* Return success */ - return NO_ERROR; -} - -INT -WINAPI -Dns_NSPSetService(IN LPGUID lpProviderId, - IN LPWSASERVICECLASSINFOW lpServiceClassInfo, - IN LPWSAQUERYSETW lpqsRegInfo, - IN WSAESETSERVICEOP essOperation, - IN DWORD dwControlFlags) -{ - /* Unlike NLA, DNS Services cannot be dynmically modified */ - SetLastError(ERROR_NOT_SUPPORTED); - return SOCKET_ERROR; -} - -INT -WINAPI -Dns_NSPInstallServiceClass(IN LPGUID lpProviderId, - IN LPWSASERVICECLASSINFOW lpServiceClassInfo) -{ - /* Unlike NLA, DNS Services cannot be dynmically modified */ - SetLastError(WSAEOPNOTSUPP); - return SOCKET_ERROR; -}; - -INT -WINAPI -Dns_NSPRemoveServiceClass(IN LPGUID lpProviderId, - IN LPGUID lpServiceCallId) -{ - /* Unlike NLA, DNS Services cannot be dynmically modified */ - SetLastError(WSAEOPNOTSUPP); - return SOCKET_ERROR; -} -INT -WINAPI -Dns_NSPGetServiceClassInfo(IN LPGUID lpProviderId, - IN OUT LPDWORD lpdwBufSize, - IN OUT LPWSASERVICECLASSINFOW lpServiceClassInfo) -{ - /* Unlike NLA, DNS Services cannot be dynmically modified */ - SetLastError(WSAEOPNOTSUPP); - return SOCKET_ERROR; -} - -INT -WINAPI -Dns_NSPLookupServiceEnd(IN HANDLE hLookup) -{ - PRNR_CONTEXT RnrContext; - - /* Get this handle's context */ - RnrContext = RnrCtx_Get(hLookup, 0, NULL); - - /* Mark it as completed */ - RnrContext->LookupFlags |= DONE; - - /* Dereference it once for our _Get */ - RnrCtx_Release(RnrContext); - - /* And once last to delete it */ - RnrCtx_Release(RnrContext); - - /* return */ - return NO_ERROR; -} - -INT -WINAPI -rnr_IdForGuid(IN LPGUID Guid) -{ - - if (memcmp(Guid, &InetHostName, sizeof(GUID))) return 0x10000002; - if (memcmp(Guid, &Ipv6Guid, sizeof(GUID))) return 0x10000023; - if (memcmp(Guid, &HostnameGuid, sizeof(GUID))) return 0x1; - if (memcmp(Guid, &AddressGuid, sizeof(GUID))) return 0x80000000; - if (memcmp(Guid, &IANAGuid, sizeof(GUID))) return 0x2; - if IS_SVCID_DNS(Guid) return 0x5000000; - if IS_SVCID_TCP(Guid) return 0x1000000; - if IS_SVCID_UDP(Guid) return 0x2000000; - return 0; -} - -PVOID -WSPAPI -FlatBuf_ReserveAlignDword(IN PFLATBUFF FlatBuffer, - IN ULONG Size) -{ - /* Let DNSLIB do the grunt work */ - return FlatBuf_Arg_Reserve((PVOID)FlatBuffer->BufferPos, - &FlatBuffer->BufferFreeSize, - Size, - sizeof(PVOID)); -} - -PVOID -WSPAPI -FlatBuf_WriteString(IN PFLATBUFF FlatBuffer, - IN PVOID String, - IN BOOLEAN IsUnicode) -{ - /* Let DNSLIB do the grunt work */ - return FlatBuf_Arg_WriteString((PVOID)FlatBuffer->BufferPos, - &FlatBuffer->BufferFreeSize, - String, - IsUnicode); -} - -PVOID -WSPAPI -FlatBuf_CopyMemory(IN PFLATBUFF FlatBuffer, - IN PVOID Buffer, - IN ULONG Size, - IN ULONG Align) -{ - /* Let DNSLIB do the grunt work */ - return FlatBuf_Arg_CopyMemory((PVOID)FlatBuffer->BufferPos, - &FlatBuffer->BufferFreeSize, - Buffer, - Size, - Align); -} - -INT -WINAPI -Dns_NSPLookupServiceBegin(LPGUID lpProviderId, - LPWSAQUERYSETW lpqsRestrictions, - LPWSASERVICECLASSINFOW lpServiceClassInfo, - DWORD dwControlFlags, - LPHANDLE lphLookup) -{ - INT ErrorCode = SOCKET_ERROR; - PWCHAR ServiceName = lpqsRestrictions->lpszServiceInstanceName; - LPGUID ServiceClassId; - INT RnrId; - ULONG LookupFlags = 0; - BOOL NameRequested = FALSE; - WCHAR StringBuffer[48]; - ULONG i; - DWORD LocalProtocols; - ULONG ProtocolFlags; - PSERVENT LookupServent; - DWORD UdpPort, TcpPort; - PRNR_CONTEXT RnrContext; - PSOCKADDR_IN ReverseSock; - - /* Check if the Size isn't weird */ - if(lpqsRestrictions->dwSize < sizeof(WSAQUERYSETW)) - { - ErrorCode = WSAEFAULT; - goto Quickie; - } - - /* Get the GUID */ - ServiceClassId = lpqsRestrictions->lpServiceClassId; - if(!ServiceClassId) - { - /* No GUID, fail */ - ErrorCode = WSA_INVALID_PARAMETER; - goto Quickie; - } - - /* Get the RNR ID */ - RnrId = rnr_IdForGuid(ServiceClassId); - - /* Make sure that the control flags are valid */ - if ((dwControlFlags & ~ALL_LUP_FLAGS) || - ((dwControlFlags & (LUP_CONTAINERS | LUP_NOCONTAINERS)) == - (LUP_CONTAINERS | LUP_NOCONTAINERS))) - { - /* Either non-recognized flags or invalid combos were passed */ - ErrorCode = WSA_INVALID_PARAMETER; - goto Quickie; - } - - /* Make sure that we have no context, and that LUP_CONTAINERS is not on */ - if(((lpqsRestrictions->lpszContext) && - (*lpqsRestrictions->lpszContext) && - (wcscmp(lpqsRestrictions->lpszContext, L"\\"))) || - (dwControlFlags & LUP_CONTAINERS)) - { - /* We don't support contexts or LUP_CONTAINERS */ - ErrorCode = WSANO_DATA; - goto Quickie; - } - - /* Is this a Reverse Lookup? */ - if (RnrId == 0x80000000) - { - /* Remember for later */ - LookupFlags = REVERSE; - } - else - { - /* Is this a IANA Lookup? */ - if (RnrId == 0x2) - { - /* Mask out this flag since it's of no use now */ - dwControlFlags &= ~(LUP_RETURN_ADDR); - - /* This is a IANA lookup, remember for later */ - LookupFlags |= IANA; - } - - /* Check if we need a name or not */ - if ((RnrId == 0x1) || - (RnrId == 0x10000002) || - (RnrId == 0x10000023) || - (RnrId == 0x10000022)) - { - /* We do */ - NameRequested = TRUE; - } - } - - /* Final check to make sure if we need a name or not */ - if (RnrId & 0x3000000) NameRequested = TRUE; - - /* No Service Name was specified */ - if(!(ServiceName) || !(*ServiceName)) - { - /* - * A name was requested but no Service Name was given, - * so this is a local lookup - */ - if(NameRequested) - { - /* A local Lookup */ - LookupFlags |= LOCAL; - ServiceName = L""; - } - else if((LookupFlags & REVERSE) && - (lpqsRestrictions->lpcsaBuffer) && - (lpqsRestrictions->dwNumberOfCsAddrs == 1)) - { - /* Reverse lookup, make sure a CS Address is there */ - ReverseSock = (struct sockaddr_in*) - lpqsRestrictions->lpcsaBuffer->RemoteAddr.lpSockaddr; - - /* Convert address to Unicode */ - MultiByteToWideChar(CP_ACP, - 0, - inet_ntoa(ReverseSock->sin_addr), - -1, - StringBuffer, - 16); - - /* Set it as the new name */ - ServiceName = StringBuffer; - } - else - { - /* We can't do anything without a service name at this point */ - ErrorCode = WSA_INVALID_PARAMETER; - goto Quickie; - } - } - else if(NameRequested) - { - /* Check for meaningful DNS Names */ - if (DnsNameCompare_W(ServiceName, L"localhost") || - DnsNameCompare_W(ServiceName, L"loopback")) - { - /* This is the local and/or loopback DNS name */ - LookupFlags |= (LOCAL | LOOPBACK); - } - else if (DnsNameCompare_W(ServiceName, g_pszHostName) || - DnsNameCompare_W(ServiceName, g_pszHostFqdn)) - { - /* This is the local name of the computer */ - LookupFlags |= LOCAL; - } - } - - /* Check if any restrictions were made on the protocols */ - if(lpqsRestrictions->lpafpProtocols) - { - /* Save our local copy to speed up the loop */ - LocalProtocols = lpqsRestrictions->dwNumberOfProtocols; - ProtocolFlags = 0; - - /* Loop the protocols */ - for(i = 0; LocalProtocols--;) - { - /* Make sure it's a family that we recognize */ - if ((lpqsRestrictions->lpafpProtocols[i].iAddressFamily == AF_INET) || - (lpqsRestrictions->lpafpProtocols[i].iAddressFamily == AF_INET6) || - (lpqsRestrictions->lpafpProtocols[i].iAddressFamily == AF_UNSPEC) || - (lpqsRestrictions->lpafpProtocols[i].iAddressFamily == AF_ATM)) - { - /* Find which one is used */ - switch(lpqsRestrictions->lpafpProtocols[i].iProtocol) - { - case IPPROTO_UDP: - ProtocolFlags |= UDP; - break; - case IPPROTO_TCP: - ProtocolFlags |= TCP; - break; - case PF_ATM: - ProtocolFlags |= ATM; - break; - default: - break; - } - } - } - /* Make sure we have at least a valid protocol */ - if (!ProtocolFlags) - { - /* Fail */ - ErrorCode = WSANO_DATA; - goto Quickie; - } - } - else - { - /* No restrictions, assume TCP/UDP */ - ProtocolFlags = (TCP | UDP); - } - - /* Create the Servent from the Service String */ - UdpPort = TcpPort = -1; - ProtocolFlags |= GetServerAndProtocolsFromString(lpqsRestrictions->lpszQueryString, - ServiceClassId, - &LookupServent); - - /* Extract the port numbers */ - if(LookupServent) - { - /* Are we using UDP? */ - if(ProtocolFlags & UDP) - { - /* Get the UDP Port, disable the TCP Port */ - UdpPort = ntohs(LookupServent->s_port); - TcpPort = -1; - } - else if(ProtocolFlags & TCP) - { - /* Get the TCP Port, disable the UDP Port */ - TcpPort = ntohs(LookupServent->s_port); - UdpPort = -1; - } - } - else - { - /* No servent, so use the Service ID to check */ - if(ProtocolFlags & UDP) - { - /* Get the Port from the Service ID */ - UdpPort = FetchPortFromClassInfo(UDP, - ServiceClassId, - lpServiceClassInfo); - } - else - { - /* No UDP */ - UdpPort = -1; - } - - /* No servent, so use the Service ID to check */ - if(ProtocolFlags & TCP) - { - /* Get the Port from the Service ID */ - UdpPort = FetchPortFromClassInfo(TCP, - ServiceClassId, - lpServiceClassInfo); - } - else - { - /* No TCP */ - TcpPort = -1; - } - } - - /* Check if we still don't have a valid port by now */ - if((TcpPort == -1) && (UdpPort == -1)) - { - /* Check if this is TCP */ - if ((ProtocolFlags & TCP) || !(ProtocolFlags & UDP)) - { - /* Set the UDP Port to 0 */ - UdpPort = 0; - } - else - { - /* Set the TCP Port to 0 */ - TcpPort = 0; - } - } - - /* Allocate a Context for this Query */ - RnrContext = RnrCtx_Create(NULL, ServiceName); - RnrContext->lpServiceClassId = *ServiceClassId; - RnrContext->RnrId = RnrId; - RnrContext->dwControlFlags = dwControlFlags; - RnrContext->TcpPort = TcpPort; - RnrContext->UdpPort = UdpPort; - RnrContext->LookupFlags = LookupFlags; - RnrContext->lpProviderId = *lpProviderId; - RnrContext->dwNameSpace = lpqsRestrictions->dwNameSpace; - RnrCtx_Release(RnrContext); - - /* Return the context as a handle */ - *lphLookup = (HANDLE)RnrContext; - - /* Check if this was a TCP, UDP or DNS Query */ - if(RnrId & 0x3000000) - { - /* Get the RR Type from the Service ID */ - RnrContext->RrType = RR_FROM_SVCID(ServiceClassId); - } - - /* Return Success */ - ErrorCode = ERROR_SUCCESS; - -Quickie: - /* Check if we got here through a failure path */ - if (ErrorCode != ERROR_SUCCESS) - { - /* Set the last error and fail */ - SetLastError(ErrorCode); - return SOCKET_ERROR; - } - - /* Return success */ - return ERROR_SUCCESS; -} - -INT -WSPAPI -BuildCsAddr(IN LPWSAQUERYSETW QuerySet, - IN PFLATBUFF FlatBuffer, - IN PDNS_BLOB Blob, - IN DWORD UdpPort, - IN DWORD TcpPort, - IN BOOLEAN ReverseLookup) -{ - return WSANO_DATA; -} - -INT -WINAPI -Dns_NSPLookupServiceNext(IN HANDLE hLookup, - IN DWORD dwControlFlags, - IN OUT LPDWORD lpdwBufferLength, - OUT LPWSAQUERYSETW lpqsResults) -{ - INT ErrorCode; - WSAQUERYSETW LocalResults; - LONG Instance; - PRNR_CONTEXT RnrContext = NULL; - FLATBUFF FlatBuffer; - PVOID Name; - PDNS_BLOB Blob = NULL; - DWORD PortNumber; - PSERVENT ServEntry = NULL; - PDNS_ARRAY DnsArray; - BOOLEAN IsUnicode = TRUE; - SIZE_T FreeSize; - ULONG BlobSize; - ULONG_PTR Position; - PVOID BlobData = NULL; - ULONG StringLength; - LPWSTR UnicodeName; - - /* Make sure that the control flags are valid */ - if ((dwControlFlags & ~ALL_LUP_FLAGS) || - ((dwControlFlags & (LUP_CONTAINERS | LUP_NOCONTAINERS)) == - (LUP_CONTAINERS | LUP_NOCONTAINERS))) - { - /* Either non-recognized flags or invalid combos were passed */ - ErrorCode = WSA_INVALID_PARAMETER; - goto Quickie; - } - - /* Get the Context */ - RnrContext = RnrCtx_Get(hLookup, dwControlFlags, &Instance); - if (!RnrContext) - { - /* This lookup handle must be invalid */ - SetLastError(WSA_INVALID_HANDLE); - return SOCKET_ERROR; - } - - /* Assume success for now */ - SetLastError(NO_ERROR); - - /* Validate the query set size */ - if (*lpdwBufferLength < sizeof(WSAQUERYSETW)) - { - /* Windows doesn't fail, but sets up a local QS for you... */ - lpqsResults = &LocalResults; - ErrorCode = WSAEFAULT; - } - - /* Zero out the buffer and fill out basic data */ - RtlZeroMemory(lpqsResults, sizeof(WSAQUERYSETW)); - lpqsResults->dwNameSpace = NS_DNS; - lpqsResults->dwSize = sizeof(WSAQUERYSETW); - - /* Initialize the Buffer */ - FlatBuf_Init(&FlatBuffer, - lpqsResults + 1, - (ULONG)(*lpdwBufferLength - sizeof(WSAQUERYSETW))); - - /* Check if this is an IANA Lookup */ - if(RnrContext->LookupFlags & IANA) - { - /* Service Lookup */ - GetServerAndProtocolsFromString(RnrContext->ServiceName, - (LPGUID)&HostnameGuid, - &ServEntry); - - /* Get the Port */ - PortNumber = ntohs(ServEntry->s_port); - - /* Use this as the name */ - Name = ServEntry->s_name; - IsUnicode = FALSE; - - /* Override some parts of the Context and check for TCP/UDP */ - if(!_stricmp("tcp", ServEntry->s_proto)) - { - /* Set the TCP Guid */ - SET_TCP_SVCID(&RnrContext->lpServiceClassId, PortNumber); - RnrContext->TcpPort = PortNumber; - RnrContext->UdpPort = -1; - } - else - { - /* Set the UDP Guid */ - SET_UDP_SVCID(&RnrContext->lpServiceClassId, PortNumber); - RnrContext->UdpPort = PortNumber; - RnrContext->TcpPort = -1; - } - } - else - { - /* Check if the caller requested for RES_SERVICE */ - if(RnrContext->dwControlFlags & LUP_RES_SERVICE) - { - /* Make sure that this is the first instance */ - if (Instance) - { - /* Fail */ - ErrorCode = WSA_E_NO_MORE; - goto Quickie; - } - -#if 0 - /* Create the blob */ - DnsArray = NULL; - Blob = SaBlob_CreateFromIp4(RnrContext->ServiceName, - 1, - &DnsArray); -#else - /* FIXME */ - Blob = NULL; - DnsArray = NULL; - ErrorCode = WSAEFAULT; - goto Quickie; -#endif - } - else if(!(Blob = RnrContext->CachedSaBlob)) - { - /* An actual Host Lookup, but we don't have a cached HostEntry yet */ - if (!memcmp(&RnrContext->lpServiceClassId, - &HostnameGuid, - sizeof(GUID)) && !(RnrContext->ServiceName)) - { - /* Do a Regular DNS Lookup */ - Blob = Rnr_DoHostnameLookup(RnrContext); - } - else if (RnrContext->LookupFlags & REVERSE) - { - /* Do a Reverse DNS Lookup */ - Blob = Rnr_GetHostByAddr(RnrContext); - } - else - { - /* Do a Hostname Lookup */ - Blob = Rnr_DoDnsLookup(RnrContext); - } - - /* Check if we got a blob, and cache it */ - if (Blob) RnrContext->CachedSaBlob = Blob; - } - - /* We should have a blob by now */ - if (!Blob) - { - /* We dont, fail */ - if (ErrorCode == NO_ERROR) - { - /* Supposedly no error, so find it out */ - ErrorCode = GetLastError(); - if (ErrorCode == NO_ERROR) ErrorCode = WSASERVICE_NOT_FOUND; - } - - /* Fail */ - goto Quickie; - } - } - - /* Check if this is the first instance or not */ - if(!RnrContext->Instance) - { - /* It is, get the name from the blob */ - Name = Blob->Name; - } - else - { - /* Only accept this scenario if the caller wanted Aliases */ - if((RnrContext->dwControlFlags & LUP_RETURN_ALIASES) && - (Blob->AliasCount > RnrContext->Instance)) - { - /* Get the name from the Alias */ - Name = Blob->Aliases[RnrContext->Instance]; - - /* Let the caller know that this is an Alias */ - /* lpqsResults->dwOutputFlags |= RESULT_IS_ALIAS; */ - } - else - { - /* Fail */ - ErrorCode = WSA_E_NO_MORE; - goto Quickie; - } - } - - /* Lookups are complete... time to return the right stuff! */ - lpqsResults->dwNameSpace = NS_DNS; - - /* Caller wants the Type back */ - if(RnrContext->dwControlFlags & LUP_RETURN_TYPE) - { - /* Copy into the flat buffer and point to it */ - lpqsResults->lpServiceClassId = FlatBuf_CopyMemory(&FlatBuffer, - &RnrContext->lpServiceClassId, - sizeof(GUID), - sizeof(PVOID)); - } - - /* Caller wants the Addreses Back */ - if((RnrContext->dwControlFlags & LUP_RETURN_ADDR) && (Blob)) - { - /* Build the CS Addr for the caller */ - ErrorCode = BuildCsAddr(lpqsResults, - &FlatBuffer, - Blob, - RnrContext->UdpPort, - RnrContext->TcpPort, - (RnrContext->LookupFlags & REVERSE) == 1); - } - - /* Caller wants a Blob */ - if(RnrContext->dwControlFlags & LUP_RETURN_BLOB) - { - /* Save the current size and position */ - FreeSize = FlatBuffer.BufferFreeSize; - Position = FlatBuffer.BufferPos; - - /* Allocate some space for the Public Blob */ - lpqsResults->lpBlob = FlatBuf_ReserveAlignDword(&FlatBuffer, - sizeof(BLOB)); - - /* Check for a Cached Blob */ - if((RnrContext->RrType) && (RnrContext->CachedBlob.pBlobData)) - { - /* We have a Cached Blob, use it */ - BlobSize = RnrContext->CachedBlob.cbSize; - BlobData = FlatBuf_ReserveAlignDword(&FlatBuffer, BlobSize); - - /* Copy into the blob */ - RtlCopyMemory(RnrContext->CachedBlob.pBlobData, - BlobData, - BlobSize); - } - else if (!Blob) - { - /* Create an ANSI Host Entry */ - BlobData = SaBlob_CreateHostent(&FlatBuffer.BufferPos, - &FlatBuffer.BufferFreeSize, - &BlobSize, - Blob, - AnsiString, - TRUE, - FALSE); - } - else if ((RnrContext->LookupFlags & IANA) && (ServEntry)) - { - /* Get Servent */ - BlobData = CopyServEntry(ServEntry, - &FlatBuffer.BufferPos, - &FlatBuffer.BufferFreeSize, - &BlobSize, - TRUE); - - /* Manually update the buffer (no SaBlob function for servents) */ - FlatBuffer.BufferPos += BlobSize; - FlatBuffer.BufferFreeSize -= BlobSize; - } - else - { - /* We have nothing to return! */ - BlobSize = 0; - lpqsResults->lpBlob = NULL; - FlatBuffer.BufferPos = Position; - FlatBuffer.BufferFreeSize = FreeSize; - } - - /* Make sure we have a blob by here */ - if (Blob) - { - /* Set it */ - lpqsResults->lpBlob->pBlobData = BlobData; - lpqsResults->lpBlob->cbSize = BlobSize; - } - else - { - /* Set the error code */ - ErrorCode = WSAEFAULT; - } - } - - /* Caller wants a name, and we have one */ - if((RnrContext->dwControlFlags & LUP_RETURN_NAME) && (Name)) - { - /* Check if we have an ANSI name */ - if (!IsUnicode) - { - /* Convert it */ - StringLength = 512; - Dns_StringCopy(&UnicodeName, - &StringLength, - Name, - 0, - AnsiString, - UnicodeString); - } - else - { - /* Keep the name as is */ - UnicodeName = (LPWSTR)Name; - } - - /* Write it to the buffer */ - Name = FlatBuf_WriteString(&FlatBuffer, UnicodeName, TRUE); - - /* Return it to the caller */ - lpqsResults->lpszServiceInstanceName = Name; - } - -Quickie: - /* Check which path got us here */ - if (ErrorCode != NO_ERROR) - { - /* Set error */ - SetLastError(ErrorCode); - - /* Check if was a memory error */ - if (ErrorCode == WSAEFAULT) - { - /* Update buffer length */ - *lpdwBufferLength -= (DWORD)FlatBuffer.BufferFreeSize; - - /* Decrease an instance */ - RnrCtx_DecInstance(RnrContext); - } - - /* Set the normalized error code */ - ErrorCode = SOCKET_ERROR; - } - - /* Release the RnR Context */ - RnrCtx_Release(RnrContext); - - /* Return error code */ - return ErrorCode; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -#define ALL_LUP_FLAGS (0x0BFFF) - -/* DATA **********************************************************************/ - -LPWSTR g_pszHostName; -LPWSTR g_pszHostFqdn; -LONG g_NspRefCount; -GUID NbtProviderId = {0}; -GUID DNSProviderId = {0}; -DWORD MaskOfGuids; - -NSP_ROUTINE g_NspVector = {sizeof(NSP_ROUTINE), - 1, - 1, - Dns_NSPCleanup, - Dns_NSPLookupServiceBegin, - Dns_NSPLookupServiceNext, - Dns_NSPLookupServiceEnd, - Dns_NSPSetService, - Dns_NSPInstallServiceClass, - Dns_NSPRemoveServiceClass, - Dns_NSPGetServiceClassInfo}; - -/* FUNCTIONS *****************************************************************/ - -INT -WINAPI -Dns_NSPStartup(IN LPGUID lpProviderId, - IN OUT LPNSP_ROUTINE lpsnpRoutines) -{ - INT ErrorCode; - BOOLEAN Prolog; - - /* Validate the size */ - if (lpsnpRoutines->cbSize != sizeof(NSP_ROUTINE)) - { - /* Fail */ - SetLastError(WSAEINVALIDPROCTABLE); - return SOCKET_ERROR; - } - - /* Enter the prolog */ - Prolog = RNRPROV_SockEnterApi(); - if (Prolog) - { - /* Increase our reference count */ - InterlockedIncrement(&g_NspRefCount); - - /* Check if we don't have the hostname */ - if (!g_pszHostName) - { - /* Query it from DNS */ - DnsQueryConfig(DnsConfigHostName_W, - DNS_CONFIG_FLAG_ALLOC, - NULL, - NULL, - &g_pszHostName, - 0); - } - - /* Check if we have a hostname now, but not a Fully-Qualified Domain */ - if (g_pszHostName && !(g_pszHostFqdn)) - { - /* Get the domain from DNS */ - DnsQueryConfig(DnsConfigFullHostName_W, - DNS_CONFIG_FLAG_ALLOC, - NULL, - NULL, - &g_pszHostFqdn, - 0); - } - - /* If we don't have both of them, then set error */ - if (!(g_pszHostName) || !(g_pszHostFqdn)) ErrorCode = SOCKET_ERROR; - } - - /* Check if the Prolog or DNS Local Queries failed */ - if (!(Prolog) || (ErrorCode != NO_ERROR)) - { - /* Fail */ - SetLastError(WSASYSNOTREADY); - return SOCKET_ERROR; - } - - /* Copy the Routines */ - RtlMoveMemory(lpsnpRoutines, &g_NspVector, sizeof(NSP_ROUTINE)); - - /* Check if this is NBT or DNS */ - if (!memcmp(lpProviderId, &NbtProviderId, sizeof(GUID))) - { - /* Enable the NBT Mask */ - MaskOfGuids |= NBT_MASK; - } - else if (!memcmp(lpProviderId, &DNSProviderId, sizeof(GUID))) - { - /* Enable the DNS Mask */ - MaskOfGuids |= DNS_MASK; - } - - /* Return success */ - return NO_ERROR; -} - -VOID -WSPAPI -Nsp_GlobalCleanup(VOID) -{ - /* Cleanup the RnR Contexts */ - RnrCtx_ListCleanup(); - - /* Free the hostnames, if we have them */ - if (g_pszHostName) DnsApiFree(g_pszHostName); - if (g_pszHostFqdn) DnsApiFree(g_pszHostFqdn); - g_pszHostFqdn = g_pszHostName = NULL; -} - -INT -WINAPI -NSPStartup(IN LPGUID lpProviderId, - IN OUT LPNSP_ROUTINE lpsnpRoutines) -{ - INT ErrorCode; - - /* Initialize the DLL */ - ErrorCode = MSWSOCK_Initialize(); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - SetLastError(WSANOTINITIALISED); - return SOCKET_ERROR; - } - - /* Check if this is Winsock Mobile or DNS */ - if (!memcmp(lpProviderId, &gNLANamespaceGuid, sizeof(GUID))) - { - /* Initialize WSM */ - return WSM_NSPStartup(lpProviderId, lpsnpRoutines); - } - - /* Initialize DNS */ - return Dns_NSPStartup(lpProviderId, lpsnpRoutines); -} - -INT -WINAPI -Dns_NSPCleanup(IN LPGUID lpProviderId) -{ - /* Decrement our reference count and do global cleanup if it's reached 0 */ - if (!(InterlockedDecrement(&g_NspRefCount))) Nsp_GlobalCleanup(); - - /* Return success */ - return NO_ERROR; -} - -INT -WINAPI -Dns_NSPSetService(IN LPGUID lpProviderId, - IN LPWSASERVICECLASSINFOW lpServiceClassInfo, - IN LPWSAQUERYSETW lpqsRegInfo, - IN WSAESETSERVICEOP essOperation, - IN DWORD dwControlFlags) -{ - /* Unlike NLA, DNS Services cannot be dynmically modified */ - SetLastError(ERROR_NOT_SUPPORTED); - return SOCKET_ERROR; -} - -INT -WINAPI -Dns_NSPInstallServiceClass(IN LPGUID lpProviderId, - IN LPWSASERVICECLASSINFOW lpServiceClassInfo) -{ - /* Unlike NLA, DNS Services cannot be dynmically modified */ - SetLastError(WSAEOPNOTSUPP); - return SOCKET_ERROR; -}; - -INT -WINAPI -Dns_NSPRemoveServiceClass(IN LPGUID lpProviderId, - IN LPGUID lpServiceCallId) -{ - /* Unlike NLA, DNS Services cannot be dynmically modified */ - SetLastError(WSAEOPNOTSUPP); - return SOCKET_ERROR; -} -INT -WINAPI -Dns_NSPGetServiceClassInfo(IN LPGUID lpProviderId, - IN OUT LPDWORD lpdwBufSize, - IN OUT LPWSASERVICECLASSINFOW lpServiceClassInfo) -{ - /* Unlike NLA, DNS Services cannot be dynmically modified */ - SetLastError(WSAEOPNOTSUPP); - return SOCKET_ERROR; -} - -INT -WINAPI -Dns_NSPLookupServiceEnd(IN HANDLE hLookup) -{ - PRNR_CONTEXT RnrContext; - - /* Get this handle's context */ - RnrContext = RnrCtx_Get(hLookup, 0, NULL); - - /* Mark it as completed */ - RnrContext->LookupFlags |= DONE; - - /* Dereference it once for our _Get */ - RnrCtx_Release(RnrContext); - - /* And once last to delete it */ - RnrCtx_Release(RnrContext); - - /* return */ - return NO_ERROR; -} - -INT -WINAPI -rnr_IdForGuid(IN LPGUID Guid) -{ - - if (memcmp(Guid, &InetHostName, sizeof(GUID))) return 0x10000002; - if (memcmp(Guid, &Ipv6Guid, sizeof(GUID))) return 0x10000023; - if (memcmp(Guid, &HostnameGuid, sizeof(GUID))) return 0x1; - if (memcmp(Guid, &AddressGuid, sizeof(GUID))) return 0x80000000; - if (memcmp(Guid, &IANAGuid, sizeof(GUID))) return 0x2; - if IS_SVCID_DNS(Guid) return 0x5000000; - if IS_SVCID_TCP(Guid) return 0x1000000; - if IS_SVCID_UDP(Guid) return 0x2000000; - return 0; -} - -PVOID -WSPAPI -FlatBuf_ReserveAlignDword(IN PFLATBUFF FlatBuffer, - IN ULONG Size) -{ - /* Let DNSLIB do the grunt work */ - return FlatBuf_Arg_Reserve((PVOID)FlatBuffer->BufferPos, - &FlatBuffer->BufferFreeSize, - Size, - sizeof(PVOID)); -} - -PVOID -WSPAPI -FlatBuf_WriteString(IN PFLATBUFF FlatBuffer, - IN PVOID String, - IN BOOLEAN IsUnicode) -{ - /* Let DNSLIB do the grunt work */ - return FlatBuf_Arg_WriteString((PVOID)FlatBuffer->BufferPos, - &FlatBuffer->BufferFreeSize, - String, - IsUnicode); -} - -PVOID -WSPAPI -FlatBuf_CopyMemory(IN PFLATBUFF FlatBuffer, - IN PVOID Buffer, - IN ULONG Size, - IN ULONG Align) -{ - /* Let DNSLIB do the grunt work */ - return FlatBuf_Arg_CopyMemory((PVOID)FlatBuffer->BufferPos, - &FlatBuffer->BufferFreeSize, - Buffer, - Size, - Align); -} - -INT -WINAPI -Dns_NSPLookupServiceBegin(LPGUID lpProviderId, - LPWSAQUERYSETW lpqsRestrictions, - LPWSASERVICECLASSINFOW lpServiceClassInfo, - DWORD dwControlFlags, - LPHANDLE lphLookup) -{ - INT ErrorCode = SOCKET_ERROR; - PWCHAR ServiceName = lpqsRestrictions->lpszServiceInstanceName; - LPGUID ServiceClassId; - INT RnrId; - ULONG LookupFlags = 0; - BOOL NameRequested = FALSE; - WCHAR StringBuffer[48]; - ULONG i; - DWORD LocalProtocols; - ULONG ProtocolFlags; - PSERVENT LookupServent; - DWORD UdpPort, TcpPort; - PRNR_CONTEXT RnrContext; - PSOCKADDR_IN ReverseSock; - - /* Check if the Size isn't weird */ - if(lpqsRestrictions->dwSize < sizeof(WSAQUERYSETW)) - { - ErrorCode = WSAEFAULT; - goto Quickie; - } - - /* Get the GUID */ - ServiceClassId = lpqsRestrictions->lpServiceClassId; - if(!ServiceClassId) - { - /* No GUID, fail */ - ErrorCode = WSA_INVALID_PARAMETER; - goto Quickie; - } - - /* Get the RNR ID */ - RnrId = rnr_IdForGuid(ServiceClassId); - - /* Make sure that the control flags are valid */ - if ((dwControlFlags & ~ALL_LUP_FLAGS) || - ((dwControlFlags & (LUP_CONTAINERS | LUP_NOCONTAINERS)) == - (LUP_CONTAINERS | LUP_NOCONTAINERS))) - { - /* Either non-recognized flags or invalid combos were passed */ - ErrorCode = WSA_INVALID_PARAMETER; - goto Quickie; - } - - /* Make sure that we have no context, and that LUP_CONTAINERS is not on */ - if(((lpqsRestrictions->lpszContext) && - (*lpqsRestrictions->lpszContext) && - (wcscmp(lpqsRestrictions->lpszContext, L"\\"))) || - (dwControlFlags & LUP_CONTAINERS)) - { - /* We don't support contexts or LUP_CONTAINERS */ - ErrorCode = WSANO_DATA; - goto Quickie; - } - - /* Is this a Reverse Lookup? */ - if (RnrId == 0x80000000) - { - /* Remember for later */ - LookupFlags = REVERSE; - } - else - { - /* Is this a IANA Lookup? */ - if (RnrId == 0x2) - { - /* Mask out this flag since it's of no use now */ - dwControlFlags &= ~(LUP_RETURN_ADDR); - - /* This is a IANA lookup, remember for later */ - LookupFlags |= IANA; - } - - /* Check if we need a name or not */ - if ((RnrId == 0x1) || - (RnrId == 0x10000002) || - (RnrId == 0x10000023) || - (RnrId == 0x10000022)) - { - /* We do */ - NameRequested = TRUE; - } - } - - /* Final check to make sure if we need a name or not */ - if (RnrId & 0x3000000) NameRequested = TRUE; - - /* No Service Name was specified */ - if(!(ServiceName) || !(*ServiceName)) - { - /* - * A name was requested but no Service Name was given, - * so this is a local lookup - */ - if(NameRequested) - { - /* A local Lookup */ - LookupFlags |= LOCAL; - ServiceName = L""; - } - else if((LookupFlags & REVERSE) && - (lpqsRestrictions->lpcsaBuffer) && - (lpqsRestrictions->dwNumberOfCsAddrs == 1)) - { - /* Reverse lookup, make sure a CS Address is there */ - ReverseSock = (struct sockaddr_in*) - lpqsRestrictions->lpcsaBuffer->RemoteAddr.lpSockaddr; - - /* Convert address to Unicode */ - MultiByteToWideChar(CP_ACP, - 0, - inet_ntoa(ReverseSock->sin_addr), - -1, - StringBuffer, - 16); - - /* Set it as the new name */ - ServiceName = StringBuffer; - } - else - { - /* We can't do anything without a service name at this point */ - ErrorCode = WSA_INVALID_PARAMETER; - goto Quickie; - } - } - else if(NameRequested) - { - /* Check for meaningful DNS Names */ - if (DnsNameCompare_W(ServiceName, L"localhost") || - DnsNameCompare_W(ServiceName, L"loopback")) - { - /* This is the local and/or loopback DNS name */ - LookupFlags |= (LOCAL | LOOPBACK); - } - else if (DnsNameCompare_W(ServiceName, g_pszHostName) || - DnsNameCompare_W(ServiceName, g_pszHostFqdn)) - { - /* This is the local name of the computer */ - LookupFlags |= LOCAL; - } - } - - /* Check if any restrictions were made on the protocols */ - if(lpqsRestrictions->lpafpProtocols) - { - /* Save our local copy to speed up the loop */ - LocalProtocols = lpqsRestrictions->dwNumberOfProtocols; - ProtocolFlags = 0; - - /* Loop the protocols */ - for(i = 0; LocalProtocols--;) - { - /* Make sure it's a family that we recognize */ - if ((lpqsRestrictions->lpafpProtocols[i].iAddressFamily == AF_INET) || - (lpqsRestrictions->lpafpProtocols[i].iAddressFamily == AF_INET6) || - (lpqsRestrictions->lpafpProtocols[i].iAddressFamily == AF_UNSPEC) || - (lpqsRestrictions->lpafpProtocols[i].iAddressFamily == AF_ATM)) - { - /* Find which one is used */ - switch(lpqsRestrictions->lpafpProtocols[i].iProtocol) - { - case IPPROTO_UDP: - ProtocolFlags |= UDP; - break; - case IPPROTO_TCP: - ProtocolFlags |= TCP; - break; - case PF_ATM: - ProtocolFlags |= ATM; - break; - default: - break; - } - } - } - /* Make sure we have at least a valid protocol */ - if (!ProtocolFlags) - { - /* Fail */ - ErrorCode = WSANO_DATA; - goto Quickie; - } - } - else - { - /* No restrictions, assume TCP/UDP */ - ProtocolFlags = (TCP | UDP); - } - - /* Create the Servent from the Service String */ - UdpPort = TcpPort = -1; - ProtocolFlags |= GetServerAndProtocolsFromString(lpqsRestrictions->lpszQueryString, - ServiceClassId, - &LookupServent); - - /* Extract the port numbers */ - if(LookupServent) - { - /* Are we using UDP? */ - if(ProtocolFlags & UDP) - { - /* Get the UDP Port, disable the TCP Port */ - UdpPort = ntohs(LookupServent->s_port); - TcpPort = -1; - } - else if(ProtocolFlags & TCP) - { - /* Get the TCP Port, disable the UDP Port */ - TcpPort = ntohs(LookupServent->s_port); - UdpPort = -1; - } - } - else - { - /* No servent, so use the Service ID to check */ - if(ProtocolFlags & UDP) - { - /* Get the Port from the Service ID */ - UdpPort = FetchPortFromClassInfo(UDP, - ServiceClassId, - lpServiceClassInfo); - } - else - { - /* No UDP */ - UdpPort = -1; - } - - /* No servent, so use the Service ID to check */ - if(ProtocolFlags & TCP) - { - /* Get the Port from the Service ID */ - UdpPort = FetchPortFromClassInfo(TCP, - ServiceClassId, - lpServiceClassInfo); - } - else - { - /* No TCP */ - TcpPort = -1; - } - } - - /* Check if we still don't have a valid port by now */ - if((TcpPort == -1) && (UdpPort == -1)) - { - /* Check if this is TCP */ - if ((ProtocolFlags & TCP) || !(ProtocolFlags & UDP)) - { - /* Set the UDP Port to 0 */ - UdpPort = 0; - } - else - { - /* Set the TCP Port to 0 */ - TcpPort = 0; - } - } - - /* Allocate a Context for this Query */ - RnrContext = RnrCtx_Create(NULL, ServiceName); - RnrContext->lpServiceClassId = *ServiceClassId; - RnrContext->RnrId = RnrId; - RnrContext->dwControlFlags = dwControlFlags; - RnrContext->TcpPort = TcpPort; - RnrContext->UdpPort = UdpPort; - RnrContext->LookupFlags = LookupFlags; - RnrContext->lpProviderId = *lpProviderId; - RnrContext->dwNameSpace = lpqsRestrictions->dwNameSpace; - RnrCtx_Release(RnrContext); - - /* Return the context as a handle */ - *lphLookup = (HANDLE)RnrContext; - - /* Check if this was a TCP, UDP or DNS Query */ - if(RnrId & 0x3000000) - { - /* Get the RR Type from the Service ID */ - RnrContext->RrType = RR_FROM_SVCID(ServiceClassId); - } - - /* Return Success */ - ErrorCode = ERROR_SUCCESS; - -Quickie: - /* Check if we got here through a failure path */ - if (ErrorCode != ERROR_SUCCESS) - { - /* Set the last error and fail */ - SetLastError(ErrorCode); - return SOCKET_ERROR; - } - - /* Return success */ - return ERROR_SUCCESS; -} - -INT -WSPAPI -BuildCsAddr(IN LPWSAQUERYSETW QuerySet, - IN PFLATBUFF FlatBuffer, - IN PDNS_BLOB Blob, - IN DWORD UdpPort, - IN DWORD TcpPort, - IN BOOLEAN ReverseLookup) -{ - return WSANO_DATA; -} - -INT -WINAPI -Dns_NSPLookupServiceNext(IN HANDLE hLookup, - IN DWORD dwControlFlags, - IN OUT LPDWORD lpdwBufferLength, - OUT LPWSAQUERYSETW lpqsResults) -{ - INT ErrorCode; - WSAQUERYSETW LocalResults; - LONG Instance; - PRNR_CONTEXT RnrContext = NULL; - FLATBUFF FlatBuffer; - PVOID Name; - PDNS_BLOB Blob = NULL; - DWORD PortNumber; - PSERVENT ServEntry = NULL; - PDNS_ARRAY DnsArray; - BOOLEAN IsUnicode = TRUE; - SIZE_T FreeSize; - ULONG BlobSize; - ULONG_PTR Position; - PVOID BlobData = NULL; - ULONG StringLength; - LPWSTR UnicodeName; - - /* Make sure that the control flags are valid */ - if ((dwControlFlags & ~ALL_LUP_FLAGS) || - ((dwControlFlags & (LUP_CONTAINERS | LUP_NOCONTAINERS)) == - (LUP_CONTAINERS | LUP_NOCONTAINERS))) - { - /* Either non-recognized flags or invalid combos were passed */ - ErrorCode = WSA_INVALID_PARAMETER; - goto Quickie; - } - - /* Get the Context */ - RnrContext = RnrCtx_Get(hLookup, dwControlFlags, &Instance); - if (!RnrContext) - { - /* This lookup handle must be invalid */ - SetLastError(WSA_INVALID_HANDLE); - return SOCKET_ERROR; - } - - /* Assume success for now */ - SetLastError(NO_ERROR); - - /* Validate the query set size */ - if (*lpdwBufferLength < sizeof(WSAQUERYSETW)) - { - /* Windows doesn't fail, but sets up a local QS for you... */ - lpqsResults = &LocalResults; - ErrorCode = WSAEFAULT; - } - - /* Zero out the buffer and fill out basic data */ - RtlZeroMemory(lpqsResults, sizeof(WSAQUERYSETW)); - lpqsResults->dwNameSpace = NS_DNS; - lpqsResults->dwSize = sizeof(WSAQUERYSETW); - - /* Initialize the Buffer */ - FlatBuf_Init(&FlatBuffer, - lpqsResults + 1, - (ULONG)(*lpdwBufferLength - sizeof(WSAQUERYSETW))); - - /* Check if this is an IANA Lookup */ - if(RnrContext->LookupFlags & IANA) - { - /* Service Lookup */ - GetServerAndProtocolsFromString(RnrContext->ServiceName, - (LPGUID)&HostnameGuid, - &ServEntry); - - /* Get the Port */ - PortNumber = ntohs(ServEntry->s_port); - - /* Use this as the name */ - Name = ServEntry->s_name; - IsUnicode = FALSE; - - /* Override some parts of the Context and check for TCP/UDP */ - if(!_stricmp("tcp", ServEntry->s_proto)) - { - /* Set the TCP Guid */ - SET_TCP_SVCID(&RnrContext->lpServiceClassId, PortNumber); - RnrContext->TcpPort = PortNumber; - RnrContext->UdpPort = -1; - } - else - { - /* Set the UDP Guid */ - SET_UDP_SVCID(&RnrContext->lpServiceClassId, PortNumber); - RnrContext->UdpPort = PortNumber; - RnrContext->TcpPort = -1; - } - } - else - { - /* Check if the caller requested for RES_SERVICE */ - if(RnrContext->dwControlFlags & LUP_RES_SERVICE) - { - /* Make sure that this is the first instance */ - if (Instance) - { - /* Fail */ - ErrorCode = WSA_E_NO_MORE; - goto Quickie; - } - -#if 0 - /* Create the blob */ - DnsArray = NULL; - Blob = SaBlob_CreateFromIp4(RnrContext->ServiceName, - 1, - &DnsArray); -#else - /* FIXME */ - Blob = NULL; - DnsArray = NULL; - ErrorCode = WSAEFAULT; - goto Quickie; -#endif - } - else if(!(Blob = RnrContext->CachedSaBlob)) - { - /* An actual Host Lookup, but we don't have a cached HostEntry yet */ - if (!memcmp(&RnrContext->lpServiceClassId, - &HostnameGuid, - sizeof(GUID)) && !(RnrContext->ServiceName)) - { - /* Do a Regular DNS Lookup */ - Blob = Rnr_DoHostnameLookup(RnrContext); - } - else if (RnrContext->LookupFlags & REVERSE) - { - /* Do a Reverse DNS Lookup */ - Blob = Rnr_GetHostByAddr(RnrContext); - } - else - { - /* Do a Hostname Lookup */ - Blob = Rnr_DoDnsLookup(RnrContext); - } - - /* Check if we got a blob, and cache it */ - if (Blob) RnrContext->CachedSaBlob = Blob; - } - - /* We should have a blob by now */ - if (!Blob) - { - /* We dont, fail */ - if (ErrorCode == NO_ERROR) - { - /* Supposedly no error, so find it out */ - ErrorCode = GetLastError(); - if (ErrorCode == NO_ERROR) ErrorCode = WSASERVICE_NOT_FOUND; - } - - /* Fail */ - goto Quickie; - } - } - - /* Check if this is the first instance or not */ - if(!RnrContext->Instance) - { - /* It is, get the name from the blob */ - Name = Blob->Name; - } - else - { - /* Only accept this scenario if the caller wanted Aliases */ - if((RnrContext->dwControlFlags & LUP_RETURN_ALIASES) && - (Blob->AliasCount > RnrContext->Instance)) - { - /* Get the name from the Alias */ - Name = Blob->Aliases[RnrContext->Instance]; - - /* Let the caller know that this is an Alias */ - /* lpqsResults->dwOutputFlags |= RESULT_IS_ALIAS; */ - } - else - { - /* Fail */ - ErrorCode = WSA_E_NO_MORE; - goto Quickie; - } - } - - /* Lookups are complete... time to return the right stuff! */ - lpqsResults->dwNameSpace = NS_DNS; - - /* Caller wants the Type back */ - if(RnrContext->dwControlFlags & LUP_RETURN_TYPE) - { - /* Copy into the flat buffer and point to it */ - lpqsResults->lpServiceClassId = FlatBuf_CopyMemory(&FlatBuffer, - &RnrContext->lpServiceClassId, - sizeof(GUID), - sizeof(PVOID)); - } - - /* Caller wants the Addreses Back */ - if((RnrContext->dwControlFlags & LUP_RETURN_ADDR) && (Blob)) - { - /* Build the CS Addr for the caller */ - ErrorCode = BuildCsAddr(lpqsResults, - &FlatBuffer, - Blob, - RnrContext->UdpPort, - RnrContext->TcpPort, - (RnrContext->LookupFlags & REVERSE) == 1); - } - - /* Caller wants a Blob */ - if(RnrContext->dwControlFlags & LUP_RETURN_BLOB) - { - /* Save the current size and position */ - FreeSize = FlatBuffer.BufferFreeSize; - Position = FlatBuffer.BufferPos; - - /* Allocate some space for the Public Blob */ - lpqsResults->lpBlob = FlatBuf_ReserveAlignDword(&FlatBuffer, - sizeof(BLOB)); - - /* Check for a Cached Blob */ - if((RnrContext->RrType) && (RnrContext->CachedBlob.pBlobData)) - { - /* We have a Cached Blob, use it */ - BlobSize = RnrContext->CachedBlob.cbSize; - BlobData = FlatBuf_ReserveAlignDword(&FlatBuffer, BlobSize); - - /* Copy into the blob */ - RtlCopyMemory(RnrContext->CachedBlob.pBlobData, - BlobData, - BlobSize); - } - else if (!Blob) - { - /* Create an ANSI Host Entry */ - BlobData = SaBlob_CreateHostent(&FlatBuffer.BufferPos, - &FlatBuffer.BufferFreeSize, - &BlobSize, - Blob, - AnsiString, - TRUE, - FALSE); - } - else if ((RnrContext->LookupFlags & IANA) && (ServEntry)) - { - /* Get Servent */ - BlobData = CopyServEntry(ServEntry, - &FlatBuffer.BufferPos, - &FlatBuffer.BufferFreeSize, - &BlobSize, - TRUE); - - /* Manually update the buffer (no SaBlob function for servents) */ - FlatBuffer.BufferPos += BlobSize; - FlatBuffer.BufferFreeSize -= BlobSize; - } - else - { - /* We have nothing to return! */ - BlobSize = 0; - lpqsResults->lpBlob = NULL; - FlatBuffer.BufferPos = Position; - FlatBuffer.BufferFreeSize = FreeSize; - } - - /* Make sure we have a blob by here */ - if (Blob) - { - /* Set it */ - lpqsResults->lpBlob->pBlobData = BlobData; - lpqsResults->lpBlob->cbSize = BlobSize; - } - else - { - /* Set the error code */ - ErrorCode = WSAEFAULT; - } - } - - /* Caller wants a name, and we have one */ - if((RnrContext->dwControlFlags & LUP_RETURN_NAME) && (Name)) - { - /* Check if we have an ANSI name */ - if (!IsUnicode) - { - /* Convert it */ - StringLength = 512; - Dns_StringCopy(&UnicodeName, - &StringLength, - Name, - 0, - AnsiString, - UnicodeString); - } - else - { - /* Keep the name as is */ - UnicodeName = (LPWSTR)Name; - } - - /* Write it to the buffer */ - Name = FlatBuf_WriteString(&FlatBuffer, UnicodeName, TRUE); - - /* Return it to the caller */ - lpqsResults->lpszServiceInstanceName = Name; - } - -Quickie: - /* Check which path got us here */ - if (ErrorCode != NO_ERROR) - { - /* Set error */ - SetLastError(ErrorCode); - - /* Check if was a memory error */ - if (ErrorCode == WSAEFAULT) - { - /* Update buffer length */ - *lpdwBufferLength -= (DWORD)FlatBuffer.BufferFreeSize; - - /* Decrease an instance */ - RnrCtx_DecInstance(RnrContext); - } - - /* Set the normalized error code */ - ErrorCode = SOCKET_ERROR; - } - - /* Release the RnR Context */ - RnrCtx_Release(RnrContext); - - /* Return error code */ - return ErrorCode; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -#define ALL_LUP_FLAGS (0x0BFFF) - -/* DATA **********************************************************************/ - -LPWSTR g_pszHostName; -LPWSTR g_pszHostFqdn; -LONG g_NspRefCount; -GUID NbtProviderId = {0}; -GUID DNSProviderId = {0}; -DWORD MaskOfGuids; - -NSP_ROUTINE g_NspVector = {sizeof(NSP_ROUTINE), - 1, - 1, - Dns_NSPCleanup, - Dns_NSPLookupServiceBegin, - Dns_NSPLookupServiceNext, - Dns_NSPLookupServiceEnd, - Dns_NSPSetService, - Dns_NSPInstallServiceClass, - Dns_NSPRemoveServiceClass, - Dns_NSPGetServiceClassInfo}; - -/* FUNCTIONS *****************************************************************/ - -INT -WINAPI -Dns_NSPStartup(IN LPGUID lpProviderId, - IN OUT LPNSP_ROUTINE lpsnpRoutines) -{ - INT ErrorCode; - BOOLEAN Prolog; - - /* Validate the size */ - if (lpsnpRoutines->cbSize != sizeof(NSP_ROUTINE)) - { - /* Fail */ - SetLastError(WSAEINVALIDPROCTABLE); - return SOCKET_ERROR; - } - - /* Enter the prolog */ - Prolog = RNRPROV_SockEnterApi(); - if (Prolog) - { - /* Increase our reference count */ - InterlockedIncrement(&g_NspRefCount); - - /* Check if we don't have the hostname */ - if (!g_pszHostName) - { - /* Query it from DNS */ - DnsQueryConfig(DnsConfigHostName_W, - DNS_CONFIG_FLAG_ALLOC, - NULL, - NULL, - &g_pszHostName, - 0); - } - - /* Check if we have a hostname now, but not a Fully-Qualified Domain */ - if (g_pszHostName && !(g_pszHostFqdn)) - { - /* Get the domain from DNS */ - DnsQueryConfig(DnsConfigFullHostName_W, - DNS_CONFIG_FLAG_ALLOC, - NULL, - NULL, - &g_pszHostFqdn, - 0); - } - - /* If we don't have both of them, then set error */ - if (!(g_pszHostName) || !(g_pszHostFqdn)) ErrorCode = SOCKET_ERROR; - } - - /* Check if the Prolog or DNS Local Queries failed */ - if (!(Prolog) || (ErrorCode != NO_ERROR)) - { - /* Fail */ - SetLastError(WSASYSNOTREADY); - return SOCKET_ERROR; - } - - /* Copy the Routines */ - RtlMoveMemory(lpsnpRoutines, &g_NspVector, sizeof(NSP_ROUTINE)); - - /* Check if this is NBT or DNS */ - if (!memcmp(lpProviderId, &NbtProviderId, sizeof(GUID))) - { - /* Enable the NBT Mask */ - MaskOfGuids |= NBT_MASK; - } - else if (!memcmp(lpProviderId, &DNSProviderId, sizeof(GUID))) - { - /* Enable the DNS Mask */ - MaskOfGuids |= DNS_MASK; - } - - /* Return success */ - return NO_ERROR; -} - -VOID -WSPAPI -Nsp_GlobalCleanup(VOID) -{ - /* Cleanup the RnR Contexts */ - RnrCtx_ListCleanup(); - - /* Free the hostnames, if we have them */ - if (g_pszHostName) DnsApiFree(g_pszHostName); - if (g_pszHostFqdn) DnsApiFree(g_pszHostFqdn); - g_pszHostFqdn = g_pszHostName = NULL; -} - -INT -WINAPI -NSPStartup(IN LPGUID lpProviderId, - IN OUT LPNSP_ROUTINE lpsnpRoutines) -{ - INT ErrorCode; - - /* Initialize the DLL */ - ErrorCode = MSWSOCK_Initialize(); - if (ErrorCode != NO_ERROR) - { - /* Fail */ - SetLastError(WSANOTINITIALISED); - return SOCKET_ERROR; - } - - /* Check if this is Winsock Mobile or DNS */ - if (!memcmp(lpProviderId, &gNLANamespaceGuid, sizeof(GUID))) - { - /* Initialize WSM */ - return WSM_NSPStartup(lpProviderId, lpsnpRoutines); - } - - /* Initialize DNS */ - return Dns_NSPStartup(lpProviderId, lpsnpRoutines); -} - -INT -WINAPI -Dns_NSPCleanup(IN LPGUID lpProviderId) -{ - /* Decrement our reference count and do global cleanup if it's reached 0 */ - if (!(InterlockedDecrement(&g_NspRefCount))) Nsp_GlobalCleanup(); - - /* Return success */ - return NO_ERROR; -} - -INT -WINAPI -Dns_NSPSetService(IN LPGUID lpProviderId, - IN LPWSASERVICECLASSINFOW lpServiceClassInfo, - IN LPWSAQUERYSETW lpqsRegInfo, - IN WSAESETSERVICEOP essOperation, - IN DWORD dwControlFlags) -{ - /* Unlike NLA, DNS Services cannot be dynmically modified */ - SetLastError(ERROR_NOT_SUPPORTED); - return SOCKET_ERROR; -} - -INT -WINAPI -Dns_NSPInstallServiceClass(IN LPGUID lpProviderId, - IN LPWSASERVICECLASSINFOW lpServiceClassInfo) -{ - /* Unlike NLA, DNS Services cannot be dynmically modified */ - SetLastError(WSAEOPNOTSUPP); - return SOCKET_ERROR; -}; - -INT -WINAPI -Dns_NSPRemoveServiceClass(IN LPGUID lpProviderId, - IN LPGUID lpServiceCallId) -{ - /* Unlike NLA, DNS Services cannot be dynmically modified */ - SetLastError(WSAEOPNOTSUPP); - return SOCKET_ERROR; -} -INT -WINAPI -Dns_NSPGetServiceClassInfo(IN LPGUID lpProviderId, - IN OUT LPDWORD lpdwBufSize, - IN OUT LPWSASERVICECLASSINFOW lpServiceClassInfo) -{ - /* Unlike NLA, DNS Services cannot be dynmically modified */ - SetLastError(WSAEOPNOTSUPP); - return SOCKET_ERROR; -} - -INT -WINAPI -Dns_NSPLookupServiceEnd(IN HANDLE hLookup) -{ - PRNR_CONTEXT RnrContext; - - /* Get this handle's context */ - RnrContext = RnrCtx_Get(hLookup, 0, NULL); - - /* Mark it as completed */ - RnrContext->LookupFlags |= DONE; - - /* Dereference it once for our _Get */ - RnrCtx_Release(RnrContext); - - /* And once last to delete it */ - RnrCtx_Release(RnrContext); - - /* return */ - return NO_ERROR; -} - -INT -WINAPI -rnr_IdForGuid(IN LPGUID Guid) -{ - - if (memcmp(Guid, &InetHostName, sizeof(GUID))) return 0x10000002; - if (memcmp(Guid, &Ipv6Guid, sizeof(GUID))) return 0x10000023; - if (memcmp(Guid, &HostnameGuid, sizeof(GUID))) return 0x1; - if (memcmp(Guid, &AddressGuid, sizeof(GUID))) return 0x80000000; - if (memcmp(Guid, &IANAGuid, sizeof(GUID))) return 0x2; - if IS_SVCID_DNS(Guid) return 0x5000000; - if IS_SVCID_TCP(Guid) return 0x1000000; - if IS_SVCID_UDP(Guid) return 0x2000000; - return 0; -} - -PVOID -WSPAPI -FlatBuf_ReserveAlignDword(IN PFLATBUFF FlatBuffer, - IN ULONG Size) -{ - /* Let DNSLIB do the grunt work */ - return FlatBuf_Arg_Reserve((PVOID)FlatBuffer->BufferPos, - &FlatBuffer->BufferFreeSize, - Size, - sizeof(PVOID)); -} - -PVOID -WSPAPI -FlatBuf_WriteString(IN PFLATBUFF FlatBuffer, - IN PVOID String, - IN BOOLEAN IsUnicode) -{ - /* Let DNSLIB do the grunt work */ - return FlatBuf_Arg_WriteString((PVOID)FlatBuffer->BufferPos, - &FlatBuffer->BufferFreeSize, - String, - IsUnicode); -} - -PVOID -WSPAPI -FlatBuf_CopyMemory(IN PFLATBUFF FlatBuffer, - IN PVOID Buffer, - IN ULONG Size, - IN ULONG Align) -{ - /* Let DNSLIB do the grunt work */ - return FlatBuf_Arg_CopyMemory((PVOID)FlatBuffer->BufferPos, - &FlatBuffer->BufferFreeSize, - Buffer, - Size, - Align); -} - -INT -WINAPI -Dns_NSPLookupServiceBegin(LPGUID lpProviderId, - LPWSAQUERYSETW lpqsRestrictions, - LPWSASERVICECLASSINFOW lpServiceClassInfo, - DWORD dwControlFlags, - LPHANDLE lphLookup) -{ - INT ErrorCode = SOCKET_ERROR; - PWCHAR ServiceName = lpqsRestrictions->lpszServiceInstanceName; - LPGUID ServiceClassId; - INT RnrId; - ULONG LookupFlags = 0; - BOOL NameRequested = FALSE; - WCHAR StringBuffer[48]; - ULONG i; - DWORD LocalProtocols; - ULONG ProtocolFlags; - PSERVENT LookupServent; - DWORD UdpPort, TcpPort; - PRNR_CONTEXT RnrContext; - PSOCKADDR_IN ReverseSock; - - /* Check if the Size isn't weird */ - if(lpqsRestrictions->dwSize < sizeof(WSAQUERYSETW)) - { - ErrorCode = WSAEFAULT; - goto Quickie; - } - - /* Get the GUID */ - ServiceClassId = lpqsRestrictions->lpServiceClassId; - if(!ServiceClassId) - { - /* No GUID, fail */ - ErrorCode = WSA_INVALID_PARAMETER; - goto Quickie; - } - - /* Get the RNR ID */ - RnrId = rnr_IdForGuid(ServiceClassId); - - /* Make sure that the control flags are valid */ - if ((dwControlFlags & ~ALL_LUP_FLAGS) || - ((dwControlFlags & (LUP_CONTAINERS | LUP_NOCONTAINERS)) == - (LUP_CONTAINERS | LUP_NOCONTAINERS))) - { - /* Either non-recognized flags or invalid combos were passed */ - ErrorCode = WSA_INVALID_PARAMETER; - goto Quickie; - } - - /* Make sure that we have no context, and that LUP_CONTAINERS is not on */ - if(((lpqsRestrictions->lpszContext) && - (*lpqsRestrictions->lpszContext) && - (wcscmp(lpqsRestrictions->lpszContext, L"\\"))) || - (dwControlFlags & LUP_CONTAINERS)) - { - /* We don't support contexts or LUP_CONTAINERS */ - ErrorCode = WSANO_DATA; - goto Quickie; - } - - /* Is this a Reverse Lookup? */ - if (RnrId == 0x80000000) - { - /* Remember for later */ - LookupFlags = REVERSE; - } - else - { - /* Is this a IANA Lookup? */ - if (RnrId == 0x2) - { - /* Mask out this flag since it's of no use now */ - dwControlFlags &= ~(LUP_RETURN_ADDR); - - /* This is a IANA lookup, remember for later */ - LookupFlags |= IANA; - } - - /* Check if we need a name or not */ - if ((RnrId == 0x1) || - (RnrId == 0x10000002) || - (RnrId == 0x10000023) || - (RnrId == 0x10000022)) - { - /* We do */ - NameRequested = TRUE; - } - } - - /* Final check to make sure if we need a name or not */ - if (RnrId & 0x3000000) NameRequested = TRUE; - - /* No Service Name was specified */ - if(!(ServiceName) || !(*ServiceName)) - { - /* - * A name was requested but no Service Name was given, - * so this is a local lookup - */ - if(NameRequested) - { - /* A local Lookup */ - LookupFlags |= LOCAL; - ServiceName = L""; - } - else if((LookupFlags & REVERSE) && - (lpqsRestrictions->lpcsaBuffer) && - (lpqsRestrictions->dwNumberOfCsAddrs == 1)) - { - /* Reverse lookup, make sure a CS Address is there */ - ReverseSock = (struct sockaddr_in*) - lpqsRestrictions->lpcsaBuffer->RemoteAddr.lpSockaddr; - - /* Convert address to Unicode */ - MultiByteToWideChar(CP_ACP, - 0, - inet_ntoa(ReverseSock->sin_addr), - -1, - StringBuffer, - 16); - - /* Set it as the new name */ - ServiceName = StringBuffer; - } - else - { - /* We can't do anything without a service name at this point */ - ErrorCode = WSA_INVALID_PARAMETER; - goto Quickie; - } - } - else if(NameRequested) - { - /* Check for meaningful DNS Names */ - if (DnsNameCompare_W(ServiceName, L"localhost") || - DnsNameCompare_W(ServiceName, L"loopback")) - { - /* This is the local and/or loopback DNS name */ - LookupFlags |= (LOCAL | LOOPBACK); - } - else if (DnsNameCompare_W(ServiceName, g_pszHostName) || - DnsNameCompare_W(ServiceName, g_pszHostFqdn)) - { - /* This is the local name of the computer */ - LookupFlags |= LOCAL; - } - } - - /* Check if any restrictions were made on the protocols */ - if(lpqsRestrictions->lpafpProtocols) - { - /* Save our local copy to speed up the loop */ - LocalProtocols = lpqsRestrictions->dwNumberOfProtocols; - ProtocolFlags = 0; - - /* Loop the protocols */ - for(i = 0; LocalProtocols--;) - { - /* Make sure it's a family that we recognize */ - if ((lpqsRestrictions->lpafpProtocols[i].iAddressFamily == AF_INET) || - (lpqsRestrictions->lpafpProtocols[i].iAddressFamily == AF_INET6) || - (lpqsRestrictions->lpafpProtocols[i].iAddressFamily == AF_UNSPEC) || - (lpqsRestrictions->lpafpProtocols[i].iAddressFamily == AF_ATM)) - { - /* Find which one is used */ - switch(lpqsRestrictions->lpafpProtocols[i].iProtocol) - { - case IPPROTO_UDP: - ProtocolFlags |= UDP; - break; - case IPPROTO_TCP: - ProtocolFlags |= TCP; - break; - case PF_ATM: - ProtocolFlags |= ATM; - break; - default: - break; - } - } - } - /* Make sure we have at least a valid protocol */ - if (!ProtocolFlags) - { - /* Fail */ - ErrorCode = WSANO_DATA; - goto Quickie; - } - } - else - { - /* No restrictions, assume TCP/UDP */ - ProtocolFlags = (TCP | UDP); - } - - /* Create the Servent from the Service String */ - UdpPort = TcpPort = -1; - ProtocolFlags |= GetServerAndProtocolsFromString(lpqsRestrictions->lpszQueryString, - ServiceClassId, - &LookupServent); - - /* Extract the port numbers */ - if(LookupServent) - { - /* Are we using UDP? */ - if(ProtocolFlags & UDP) - { - /* Get the UDP Port, disable the TCP Port */ - UdpPort = ntohs(LookupServent->s_port); - TcpPort = -1; - } - else if(ProtocolFlags & TCP) - { - /* Get the TCP Port, disable the UDP Port */ - TcpPort = ntohs(LookupServent->s_port); - UdpPort = -1; - } - } - else - { - /* No servent, so use the Service ID to check */ - if(ProtocolFlags & UDP) - { - /* Get the Port from the Service ID */ - UdpPort = FetchPortFromClassInfo(UDP, - ServiceClassId, - lpServiceClassInfo); - } - else - { - /* No UDP */ - UdpPort = -1; - } - - /* No servent, so use the Service ID to check */ - if(ProtocolFlags & TCP) - { - /* Get the Port from the Service ID */ - UdpPort = FetchPortFromClassInfo(TCP, - ServiceClassId, - lpServiceClassInfo); - } - else - { - /* No TCP */ - TcpPort = -1; - } - } - - /* Check if we still don't have a valid port by now */ - if((TcpPort == -1) && (UdpPort == -1)) - { - /* Check if this is TCP */ - if ((ProtocolFlags & TCP) || !(ProtocolFlags & UDP)) - { - /* Set the UDP Port to 0 */ - UdpPort = 0; - } - else - { - /* Set the TCP Port to 0 */ - TcpPort = 0; - } - } - - /* Allocate a Context for this Query */ - RnrContext = RnrCtx_Create(NULL, ServiceName); - RnrContext->lpServiceClassId = *ServiceClassId; - RnrContext->RnrId = RnrId; - RnrContext->dwControlFlags = dwControlFlags; - RnrContext->TcpPort = TcpPort; - RnrContext->UdpPort = UdpPort; - RnrContext->LookupFlags = LookupFlags; - RnrContext->lpProviderId = *lpProviderId; - RnrContext->dwNameSpace = lpqsRestrictions->dwNameSpace; - RnrCtx_Release(RnrContext); - - /* Return the context as a handle */ - *lphLookup = (HANDLE)RnrContext; - - /* Check if this was a TCP, UDP or DNS Query */ - if(RnrId & 0x3000000) - { - /* Get the RR Type from the Service ID */ - RnrContext->RrType = RR_FROM_SVCID(ServiceClassId); - } - - /* Return Success */ - ErrorCode = ERROR_SUCCESS; - -Quickie: - /* Check if we got here through a failure path */ - if (ErrorCode != ERROR_SUCCESS) - { - /* Set the last error and fail */ - SetLastError(ErrorCode); - return SOCKET_ERROR; - } - - /* Return success */ - return ERROR_SUCCESS; -} - -INT -WSPAPI -BuildCsAddr(IN LPWSAQUERYSETW QuerySet, - IN PFLATBUFF FlatBuffer, - IN PDNS_BLOB Blob, - IN DWORD UdpPort, - IN DWORD TcpPort, - IN BOOLEAN ReverseLookup) -{ - return WSANO_DATA; -} - -INT -WINAPI -Dns_NSPLookupServiceNext(IN HANDLE hLookup, - IN DWORD dwControlFlags, - IN OUT LPDWORD lpdwBufferLength, - OUT LPWSAQUERYSETW lpqsResults) -{ - INT ErrorCode; - WSAQUERYSETW LocalResults; - LONG Instance; - PRNR_CONTEXT RnrContext = NULL; - FLATBUFF FlatBuffer; - PVOID Name; - PDNS_BLOB Blob = NULL; - DWORD PortNumber; - PSERVENT ServEntry = NULL; - PDNS_ARRAY DnsArray; - BOOLEAN IsUnicode = TRUE; - SIZE_T FreeSize; - ULONG BlobSize; - ULONG_PTR Position; - PVOID BlobData = NULL; - ULONG StringLength; - LPWSTR UnicodeName; - - /* Make sure that the control flags are valid */ - if ((dwControlFlags & ~ALL_LUP_FLAGS) || - ((dwControlFlags & (LUP_CONTAINERS | LUP_NOCONTAINERS)) == - (LUP_CONTAINERS | LUP_NOCONTAINERS))) - { - /* Either non-recognized flags or invalid combos were passed */ - ErrorCode = WSA_INVALID_PARAMETER; - goto Quickie; - } - - /* Get the Context */ - RnrContext = RnrCtx_Get(hLookup, dwControlFlags, &Instance); - if (!RnrContext) - { - /* This lookup handle must be invalid */ - SetLastError(WSA_INVALID_HANDLE); - return SOCKET_ERROR; - } - - /* Assume success for now */ - SetLastError(NO_ERROR); - - /* Validate the query set size */ - if (*lpdwBufferLength < sizeof(WSAQUERYSETW)) - { - /* Windows doesn't fail, but sets up a local QS for you... */ - lpqsResults = &LocalResults; - ErrorCode = WSAEFAULT; - } - - /* Zero out the buffer and fill out basic data */ - RtlZeroMemory(lpqsResults, sizeof(WSAQUERYSETW)); - lpqsResults->dwNameSpace = NS_DNS; - lpqsResults->dwSize = sizeof(WSAQUERYSETW); - - /* Initialize the Buffer */ - FlatBuf_Init(&FlatBuffer, - lpqsResults + 1, - (ULONG)(*lpdwBufferLength - sizeof(WSAQUERYSETW))); - - /* Check if this is an IANA Lookup */ - if(RnrContext->LookupFlags & IANA) - { - /* Service Lookup */ - GetServerAndProtocolsFromString(RnrContext->ServiceName, - (LPGUID)&HostnameGuid, - &ServEntry); - - /* Get the Port */ - PortNumber = ntohs(ServEntry->s_port); - - /* Use this as the name */ - Name = ServEntry->s_name; - IsUnicode = FALSE; - - /* Override some parts of the Context and check for TCP/UDP */ - if(!_stricmp("tcp", ServEntry->s_proto)) - { - /* Set the TCP Guid */ - SET_TCP_SVCID(&RnrContext->lpServiceClassId, PortNumber); - RnrContext->TcpPort = PortNumber; - RnrContext->UdpPort = -1; - } - else - { - /* Set the UDP Guid */ - SET_UDP_SVCID(&RnrContext->lpServiceClassId, PortNumber); - RnrContext->UdpPort = PortNumber; - RnrContext->TcpPort = -1; - } - } - else - { - /* Check if the caller requested for RES_SERVICE */ - if(RnrContext->dwControlFlags & LUP_RES_SERVICE) - { - /* Make sure that this is the first instance */ - if (Instance) - { - /* Fail */ - ErrorCode = WSA_E_NO_MORE; - goto Quickie; - } - -#if 0 - /* Create the blob */ - DnsArray = NULL; - Blob = SaBlob_CreateFromIp4(RnrContext->ServiceName, - 1, - &DnsArray); -#else - /* FIXME */ - Blob = NULL; - DnsArray = NULL; - ErrorCode = WSAEFAULT; - goto Quickie; -#endif - } - else if(!(Blob = RnrContext->CachedSaBlob)) - { - /* An actual Host Lookup, but we don't have a cached HostEntry yet */ - if (!memcmp(&RnrContext->lpServiceClassId, - &HostnameGuid, - sizeof(GUID)) && !(RnrContext->ServiceName)) - { - /* Do a Regular DNS Lookup */ - Blob = Rnr_DoHostnameLookup(RnrContext); - } - else if (RnrContext->LookupFlags & REVERSE) - { - /* Do a Reverse DNS Lookup */ - Blob = Rnr_GetHostByAddr(RnrContext); - } - else - { - /* Do a Hostname Lookup */ - Blob = Rnr_DoDnsLookup(RnrContext); - } - - /* Check if we got a blob, and cache it */ - if (Blob) RnrContext->CachedSaBlob = Blob; - } - - /* We should have a blob by now */ - if (!Blob) - { - /* We dont, fail */ - if (ErrorCode == NO_ERROR) - { - /* Supposedly no error, so find it out */ - ErrorCode = GetLastError(); - if (ErrorCode == NO_ERROR) ErrorCode = WSASERVICE_NOT_FOUND; - } - - /* Fail */ - goto Quickie; - } - } - - /* Check if this is the first instance or not */ - if(!RnrContext->Instance) - { - /* It is, get the name from the blob */ - Name = Blob->Name; - } - else - { - /* Only accept this scenario if the caller wanted Aliases */ - if((RnrContext->dwControlFlags & LUP_RETURN_ALIASES) && - (Blob->AliasCount > RnrContext->Instance)) - { - /* Get the name from the Alias */ - Name = Blob->Aliases[RnrContext->Instance]; - - /* Let the caller know that this is an Alias */ - /* lpqsResults->dwOutputFlags |= RESULT_IS_ALIAS; */ - } - else - { - /* Fail */ - ErrorCode = WSA_E_NO_MORE; - goto Quickie; - } - } - - /* Lookups are complete... time to return the right stuff! */ - lpqsResults->dwNameSpace = NS_DNS; - - /* Caller wants the Type back */ - if(RnrContext->dwControlFlags & LUP_RETURN_TYPE) - { - /* Copy into the flat buffer and point to it */ - lpqsResults->lpServiceClassId = FlatBuf_CopyMemory(&FlatBuffer, - &RnrContext->lpServiceClassId, - sizeof(GUID), - sizeof(PVOID)); - } - - /* Caller wants the Addreses Back */ - if((RnrContext->dwControlFlags & LUP_RETURN_ADDR) && (Blob)) - { - /* Build the CS Addr for the caller */ - ErrorCode = BuildCsAddr(lpqsResults, - &FlatBuffer, - Blob, - RnrContext->UdpPort, - RnrContext->TcpPort, - (RnrContext->LookupFlags & REVERSE) == 1); - } - - /* Caller wants a Blob */ - if(RnrContext->dwControlFlags & LUP_RETURN_BLOB) - { - /* Save the current size and position */ - FreeSize = FlatBuffer.BufferFreeSize; - Position = FlatBuffer.BufferPos; - - /* Allocate some space for the Public Blob */ - lpqsResults->lpBlob = FlatBuf_ReserveAlignDword(&FlatBuffer, - sizeof(BLOB)); - - /* Check for a Cached Blob */ - if((RnrContext->RrType) && (RnrContext->CachedBlob.pBlobData)) - { - /* We have a Cached Blob, use it */ - BlobSize = RnrContext->CachedBlob.cbSize; - BlobData = FlatBuf_ReserveAlignDword(&FlatBuffer, BlobSize); - - /* Copy into the blob */ - RtlCopyMemory(RnrContext->CachedBlob.pBlobData, - BlobData, - BlobSize); - } - else if (!Blob) - { - /* Create an ANSI Host Entry */ - BlobData = SaBlob_CreateHostent(&FlatBuffer.BufferPos, - &FlatBuffer.BufferFreeSize, - &BlobSize, - Blob, - AnsiString, - TRUE, - FALSE); - } - else if ((RnrContext->LookupFlags & IANA) && (ServEntry)) - { - /* Get Servent */ - BlobData = CopyServEntry(ServEntry, - &FlatBuffer.BufferPos, - &FlatBuffer.BufferFreeSize, - &BlobSize, - TRUE); - - /* Manually update the buffer (no SaBlob function for servents) */ - FlatBuffer.BufferPos += BlobSize; - FlatBuffer.BufferFreeSize -= BlobSize; - } - else - { - /* We have nothing to return! */ - BlobSize = 0; - lpqsResults->lpBlob = NULL; - FlatBuffer.BufferPos = Position; - FlatBuffer.BufferFreeSize = FreeSize; - } - - /* Make sure we have a blob by here */ - if (Blob) - { - /* Set it */ - lpqsResults->lpBlob->pBlobData = BlobData; - lpqsResults->lpBlob->cbSize = BlobSize; - } - else - { - /* Set the error code */ - ErrorCode = WSAEFAULT; - } - } - - /* Caller wants a name, and we have one */ - if((RnrContext->dwControlFlags & LUP_RETURN_NAME) && (Name)) - { - /* Check if we have an ANSI name */ - if (!IsUnicode) - { - /* Convert it */ - StringLength = 512; - Dns_StringCopy(&UnicodeName, - &StringLength, - Name, - 0, - AnsiString, - UnicodeString); - } - else - { - /* Keep the name as is */ - UnicodeName = (LPWSTR)Name; - } - - /* Write it to the buffer */ - Name = FlatBuf_WriteString(&FlatBuffer, UnicodeName, TRUE); - - /* Return it to the caller */ - lpqsResults->lpszServiceInstanceName = Name; - } - -Quickie: - /* Check which path got us here */ - if (ErrorCode != NO_ERROR) - { - /* Set error */ - SetLastError(ErrorCode); - - /* Check if was a memory error */ - if (ErrorCode == WSAEFAULT) - { - /* Update buffer length */ - *lpdwBufferLength -= (DWORD)FlatBuffer.BufferFreeSize; - - /* Decrease an instance */ - RnrCtx_DecInstance(RnrContext); - } - - /* Set the normalized error code */ - ErrorCode = SOCKET_ERROR; - } - - /* Release the RnR Context */ - RnrCtx_Release(RnrContext); - - /* Return error code */ - return ErrorCode; -} - diff --git a/dll/win32/mswsock/rnr20/oldutil.c b/dll/win32/mswsock/rnr20/oldutil.c index 83a78e5d1e0..f66b81c5ea6 100644 --- a/dll/win32/mswsock/rnr20/oldutil.c +++ b/dll/win32/mswsock/rnr20/oldutil.c @@ -219,666 +219,3 @@ CopyServEntry(IN PSERVENT Servent, return NULL; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - - -/* FUNCTIONS *****************************************************************/ - -DWORD -WINAPI -FetchPortFromClassInfo(IN DWORD Type, - IN LPGUID Guid, - IN LPWSASERVICECLASSINFOW ServiceClassInfo) -{ - DWORD Port; - - if (Type == UDP) - { - if (IS_SVCID_UDP(Guid)) - { - /* Get the Port from the Service ID */ - Port = PORT_FROM_SVCID_UDP(Guid); - } - else - { - /* No UDP */ - Port = -1; - } - } - else if (Type == TCP) - { - if (IS_SVCID_TCP(Guid)) - { - /* Get the Port from the Service ID */ - Port = PORT_FROM_SVCID_TCP(Guid); - } - else - { - /* No TCP */ - Port = -1; - } - } - else - { - /* Invalid */ - Port = -1; - } - - /* Return it */ - return Port; -} - -WORD -WINAPI -GetDnsQueryTypeFromGuid(IN LPGUID Guid) -{ - WORD DnsType = DNS_TYPE_A; - - /* Check if this is is a DNS GUID and get the type from it */ - if (IS_SVCID_DNS(Guid)) DnsType = RR_FROM_SVCID(Guid); - - /* Return the DNS Type */ - return DnsType; -} - -LPSTR -WINAPI -GetAnsiNameRnR(IN LPWSTR UnicodeName, - IN LPSTR Domain, - OUT PBOOL Result) -{ - SIZE_T Length = 0; - LPSTR AnsiName; - - /* Check if we have a domain */ - if (Domain) Length = strlen(Domain); - - /* Calculate length needed and allocate it */ - Length += ((wcslen(UnicodeName) + 1) * sizeof(WCHAR) * 2); - AnsiName = DnsApiAlloc((DWORD)Length); - - /* Convert the string */ - WideCharToMultiByte(CP_ACP, - 0, - UnicodeName, - -1, - AnsiName, - (DWORD)Length, - 0, - Result); - - /* Add the domain, if needed */ - if (Domain) strcat(AnsiName, Domain); - - /* Return the ANSI name */ - return AnsiName; -} - -DWORD -WINAPI -GetServerAndProtocolsFromString(PWCHAR ServiceString, - LPGUID ServiceType, - PSERVENT *ReverseServent) -{ - PSERVENT LocalServent = NULL; - DWORD ProtocolFlags = 0; - PWCHAR ProtocolString; - PWCHAR ServiceName; - PCHAR AnsiServiceName; - PCHAR AnsiProtocolName; - PCHAR TempString; - ULONG ServiceNameLength; - ULONG PortNumber = 0; - - /* Make sure that this is valid for a Servent lookup */ - if ((ServiceString) && - (ServiceType) && - (memcmp(ServiceType, &HostnameGuid, sizeof(GUID))) && - (memcmp(ServiceType, &InetHostName, sizeof(GUID)))) - { - /* Extract the Protocol */ - ProtocolString = wcschr(ServiceString, L'/'); - if (!ProtocolString) ProtocolString = wcschr(ProtocolString, L'\0'); - - /* Find out the length of the service name */ - ServiceNameLength = (ULONG)(ProtocolString - ServiceString) * sizeof(WCHAR); - - /* Allocate it */ - ServiceName = DnsApiAlloc(ServiceNameLength + sizeof(UNICODE_NULL)); - - /* Copy it and null-terminate */ - RtlMoveMemory(ServiceName, ServiceString, ServiceNameLength); - ServiceName[ServiceNameLength] = UNICODE_NULL; - - /* Get the Ansi Service Name */ - AnsiServiceName = GetAnsiNameRnR(ServiceName, 0, NULL); - DnsApiFree(ServiceName); - if (AnsiServiceName) - { - /* If we only have a port number, convert it */ - for (TempString = AnsiServiceName; - *TempString && isdigit(*TempString); - TempString++); - - /* Convert to Port Number */ - if (!*TempString) PortNumber = atoi(AnsiServiceName); - - /* Check if we have a Protocol Name, and set it */ - if (!(*ProtocolString) || !(*++ProtocolString)) - { - /* No protocol string, so won't have it in ANSI either */ - AnsiProtocolName = NULL; - } - else - { - /* Get it in ANSI */ - AnsiProtocolName = GetAnsiNameRnR(ProtocolString, 0, NULL); - } - - /* Now do the actual operation */ - if (PortNumber) - { - /* FIXME: Get Servent by Port */ - } - else - { - /* FIXME: Get Servent by Name */ - } - - /* Free the ansi names if we had them */ - if (AnsiProtocolName) DnsApiFree(AnsiProtocolName); - if (AnsiServiceName) DnsApiFree(AnsiProtocolName); - } - } - - /* Return Servent */ - if (ReverseServent) *ReverseServent = LocalServent; - - /* Return Protocol */ - if (LocalServent) - { - /* Check if it was UDP */ - if (_stricmp("udp", LocalServent->s_proto)) - { - /* Return UDP */ - ProtocolFlags = UDP; - } - else - { - /* Return TCP */ - ProtocolFlags = TCP; - } - } - else - { - /* Return both, no restrictions */ - ProtocolFlags = (TCP | UDP); - } - - /* Return the flags */ - return ProtocolFlags; -} - -PSERVENT -WSPAPI -CopyServEntry(IN PSERVENT Servent, - IN OUT PULONG_PTR BufferPos, - IN OUT PULONG BufferFreeSize, - IN OUT PULONG BlobSize, - IN BOOLEAN Relative) -{ - return NULL; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - - -/* FUNCTIONS *****************************************************************/ - -DWORD -WINAPI -FetchPortFromClassInfo(IN DWORD Type, - IN LPGUID Guid, - IN LPWSASERVICECLASSINFOW ServiceClassInfo) -{ - DWORD Port; - - if (Type == UDP) - { - if (IS_SVCID_UDP(Guid)) - { - /* Get the Port from the Service ID */ - Port = PORT_FROM_SVCID_UDP(Guid); - } - else - { - /* No UDP */ - Port = -1; - } - } - else if (Type == TCP) - { - if (IS_SVCID_TCP(Guid)) - { - /* Get the Port from the Service ID */ - Port = PORT_FROM_SVCID_TCP(Guid); - } - else - { - /* No TCP */ - Port = -1; - } - } - else - { - /* Invalid */ - Port = -1; - } - - /* Return it */ - return Port; -} - -WORD -WINAPI -GetDnsQueryTypeFromGuid(IN LPGUID Guid) -{ - WORD DnsType = DNS_TYPE_A; - - /* Check if this is is a DNS GUID and get the type from it */ - if (IS_SVCID_DNS(Guid)) DnsType = RR_FROM_SVCID(Guid); - - /* Return the DNS Type */ - return DnsType; -} - -LPSTR -WINAPI -GetAnsiNameRnR(IN LPWSTR UnicodeName, - IN LPSTR Domain, - OUT PBOOL Result) -{ - SIZE_T Length = 0; - LPSTR AnsiName; - - /* Check if we have a domain */ - if (Domain) Length = strlen(Domain); - - /* Calculate length needed and allocate it */ - Length += ((wcslen(UnicodeName) + 1) * sizeof(WCHAR) * 2); - AnsiName = DnsApiAlloc((DWORD)Length); - - /* Convert the string */ - WideCharToMultiByte(CP_ACP, - 0, - UnicodeName, - -1, - AnsiName, - (DWORD)Length, - 0, - Result); - - /* Add the domain, if needed */ - if (Domain) strcat(AnsiName, Domain); - - /* Return the ANSI name */ - return AnsiName; -} - -DWORD -WINAPI -GetServerAndProtocolsFromString(PWCHAR ServiceString, - LPGUID ServiceType, - PSERVENT *ReverseServent) -{ - PSERVENT LocalServent = NULL; - DWORD ProtocolFlags = 0; - PWCHAR ProtocolString; - PWCHAR ServiceName; - PCHAR AnsiServiceName; - PCHAR AnsiProtocolName; - PCHAR TempString; - ULONG ServiceNameLength; - ULONG PortNumber = 0; - - /* Make sure that this is valid for a Servent lookup */ - if ((ServiceString) && - (ServiceType) && - (memcmp(ServiceType, &HostnameGuid, sizeof(GUID))) && - (memcmp(ServiceType, &InetHostName, sizeof(GUID)))) - { - /* Extract the Protocol */ - ProtocolString = wcschr(ServiceString, L'/'); - if (!ProtocolString) ProtocolString = wcschr(ProtocolString, L'\0'); - - /* Find out the length of the service name */ - ServiceNameLength = (ULONG)(ProtocolString - ServiceString) * sizeof(WCHAR); - - /* Allocate it */ - ServiceName = DnsApiAlloc(ServiceNameLength + sizeof(UNICODE_NULL)); - - /* Copy it and null-terminate */ - RtlMoveMemory(ServiceName, ServiceString, ServiceNameLength); - ServiceName[ServiceNameLength] = UNICODE_NULL; - - /* Get the Ansi Service Name */ - AnsiServiceName = GetAnsiNameRnR(ServiceName, 0, NULL); - DnsApiFree(ServiceName); - if (AnsiServiceName) - { - /* If we only have a port number, convert it */ - for (TempString = AnsiServiceName; - *TempString && isdigit(*TempString); - TempString++); - - /* Convert to Port Number */ - if (!*TempString) PortNumber = atoi(AnsiServiceName); - - /* Check if we have a Protocol Name, and set it */ - if (!(*ProtocolString) || !(*++ProtocolString)) - { - /* No protocol string, so won't have it in ANSI either */ - AnsiProtocolName = NULL; - } - else - { - /* Get it in ANSI */ - AnsiProtocolName = GetAnsiNameRnR(ProtocolString, 0, NULL); - } - - /* Now do the actual operation */ - if (PortNumber) - { - /* FIXME: Get Servent by Port */ - } - else - { - /* FIXME: Get Servent by Name */ - } - - /* Free the ansi names if we had them */ - if (AnsiProtocolName) DnsApiFree(AnsiProtocolName); - if (AnsiServiceName) DnsApiFree(AnsiProtocolName); - } - } - - /* Return Servent */ - if (ReverseServent) *ReverseServent = LocalServent; - - /* Return Protocol */ - if (LocalServent) - { - /* Check if it was UDP */ - if (_stricmp("udp", LocalServent->s_proto)) - { - /* Return UDP */ - ProtocolFlags = UDP; - } - else - { - /* Return TCP */ - ProtocolFlags = TCP; - } - } - else - { - /* Return both, no restrictions */ - ProtocolFlags = (TCP | UDP); - } - - /* Return the flags */ - return ProtocolFlags; -} - -PSERVENT -WSPAPI -CopyServEntry(IN PSERVENT Servent, - IN OUT PULONG_PTR BufferPos, - IN OUT PULONG BufferFreeSize, - IN OUT PULONG BlobSize, - IN BOOLEAN Relative) -{ - return NULL; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - - -/* FUNCTIONS *****************************************************************/ - -DWORD -WINAPI -FetchPortFromClassInfo(IN DWORD Type, - IN LPGUID Guid, - IN LPWSASERVICECLASSINFOW ServiceClassInfo) -{ - DWORD Port; - - if (Type == UDP) - { - if (IS_SVCID_UDP(Guid)) - { - /* Get the Port from the Service ID */ - Port = PORT_FROM_SVCID_UDP(Guid); - } - else - { - /* No UDP */ - Port = -1; - } - } - else if (Type == TCP) - { - if (IS_SVCID_TCP(Guid)) - { - /* Get the Port from the Service ID */ - Port = PORT_FROM_SVCID_TCP(Guid); - } - else - { - /* No TCP */ - Port = -1; - } - } - else - { - /* Invalid */ - Port = -1; - } - - /* Return it */ - return Port; -} - -WORD -WINAPI -GetDnsQueryTypeFromGuid(IN LPGUID Guid) -{ - WORD DnsType = DNS_TYPE_A; - - /* Check if this is is a DNS GUID and get the type from it */ - if (IS_SVCID_DNS(Guid)) DnsType = RR_FROM_SVCID(Guid); - - /* Return the DNS Type */ - return DnsType; -} - -LPSTR -WINAPI -GetAnsiNameRnR(IN LPWSTR UnicodeName, - IN LPSTR Domain, - OUT PBOOL Result) -{ - SIZE_T Length = 0; - LPSTR AnsiName; - - /* Check if we have a domain */ - if (Domain) Length = strlen(Domain); - - /* Calculate length needed and allocate it */ - Length += ((wcslen(UnicodeName) + 1) * sizeof(WCHAR) * 2); - AnsiName = DnsApiAlloc((DWORD)Length); - - /* Convert the string */ - WideCharToMultiByte(CP_ACP, - 0, - UnicodeName, - -1, - AnsiName, - (DWORD)Length, - 0, - Result); - - /* Add the domain, if needed */ - if (Domain) strcat(AnsiName, Domain); - - /* Return the ANSI name */ - return AnsiName; -} - -DWORD -WINAPI -GetServerAndProtocolsFromString(PWCHAR ServiceString, - LPGUID ServiceType, - PSERVENT *ReverseServent) -{ - PSERVENT LocalServent = NULL; - DWORD ProtocolFlags = 0; - PWCHAR ProtocolString; - PWCHAR ServiceName; - PCHAR AnsiServiceName; - PCHAR AnsiProtocolName; - PCHAR TempString; - ULONG ServiceNameLength; - ULONG PortNumber = 0; - - /* Make sure that this is valid for a Servent lookup */ - if ((ServiceString) && - (ServiceType) && - (memcmp(ServiceType, &HostnameGuid, sizeof(GUID))) && - (memcmp(ServiceType, &InetHostName, sizeof(GUID)))) - { - /* Extract the Protocol */ - ProtocolString = wcschr(ServiceString, L'/'); - if (!ProtocolString) ProtocolString = wcschr(ProtocolString, L'\0'); - - /* Find out the length of the service name */ - ServiceNameLength = (ULONG)(ProtocolString - ServiceString) * sizeof(WCHAR); - - /* Allocate it */ - ServiceName = DnsApiAlloc(ServiceNameLength + sizeof(UNICODE_NULL)); - - /* Copy it and null-terminate */ - RtlMoveMemory(ServiceName, ServiceString, ServiceNameLength); - ServiceName[ServiceNameLength] = UNICODE_NULL; - - /* Get the Ansi Service Name */ - AnsiServiceName = GetAnsiNameRnR(ServiceName, 0, NULL); - DnsApiFree(ServiceName); - if (AnsiServiceName) - { - /* If we only have a port number, convert it */ - for (TempString = AnsiServiceName; - *TempString && isdigit(*TempString); - TempString++); - - /* Convert to Port Number */ - if (!*TempString) PortNumber = atoi(AnsiServiceName); - - /* Check if we have a Protocol Name, and set it */ - if (!(*ProtocolString) || !(*++ProtocolString)) - { - /* No protocol string, so won't have it in ANSI either */ - AnsiProtocolName = NULL; - } - else - { - /* Get it in ANSI */ - AnsiProtocolName = GetAnsiNameRnR(ProtocolString, 0, NULL); - } - - /* Now do the actual operation */ - if (PortNumber) - { - /* FIXME: Get Servent by Port */ - } - else - { - /* FIXME: Get Servent by Name */ - } - - /* Free the ansi names if we had them */ - if (AnsiProtocolName) DnsApiFree(AnsiProtocolName); - if (AnsiServiceName) DnsApiFree(AnsiProtocolName); - } - } - - /* Return Servent */ - if (ReverseServent) *ReverseServent = LocalServent; - - /* Return Protocol */ - if (LocalServent) - { - /* Check if it was UDP */ - if (_stricmp("udp", LocalServent->s_proto)) - { - /* Return UDP */ - ProtocolFlags = UDP; - } - else - { - /* Return TCP */ - ProtocolFlags = TCP; - } - } - else - { - /* Return both, no restrictions */ - ProtocolFlags = (TCP | UDP); - } - - /* Return the flags */ - return ProtocolFlags; -} - -PSERVENT -WSPAPI -CopyServEntry(IN PSERVENT Servent, - IN OUT PULONG_PTR BufferPos, - IN OUT PULONG BufferFreeSize, - IN OUT PULONG BlobSize, - IN BOOLEAN Relative) -{ - return NULL; -} - diff --git a/dll/win32/mswsock/rnr20/proc.c b/dll/win32/mswsock/rnr20/proc.c index 7336526a34b..42597c43d6f 100644 --- a/dll/win32/mswsock/rnr20/proc.c +++ b/dll/win32/mswsock/rnr20/proc.c @@ -42,135 +42,3 @@ RNRPROV_SockEnterApi(VOID) return TRUE; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -BOOLEAN -WINAPI -RNRPROV_SockEnterApi(VOID) -{ - PWINSOCK_TEB_DATA ThreadData; - - /* Make sure we're not terminating */ - if (SockProcessTerminating) - { - SetLastError(WSANOTINITIALISED); - return FALSE; - } - - /* Check if we already intialized */ - ThreadData = NtCurrentTeb()->WinSockData; - if (!(ThreadData) || !(ThreadData->RnrThreadData)) - { - /* Initialize the thread */ - if (!Rnr_ThreadInit()) - { - /* Fail */ - SetLastError(WSAENOBUFS); - return FALSE; - } - } - - /* Return success */ - return TRUE; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -BOOLEAN -WINAPI -RNRPROV_SockEnterApi(VOID) -{ - PWINSOCK_TEB_DATA ThreadData; - - /* Make sure we're not terminating */ - if (SockProcessTerminating) - { - SetLastError(WSANOTINITIALISED); - return FALSE; - } - - /* Check if we already intialized */ - ThreadData = NtCurrentTeb()->WinSockData; - if (!(ThreadData) || !(ThreadData->RnrThreadData)) - { - /* Initialize the thread */ - if (!Rnr_ThreadInit()) - { - /* Fail */ - SetLastError(WSAENOBUFS); - return FALSE; - } - } - - /* Return success */ - return TRUE; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -BOOLEAN -WINAPI -RNRPROV_SockEnterApi(VOID) -{ - PWINSOCK_TEB_DATA ThreadData; - - /* Make sure we're not terminating */ - if (SockProcessTerminating) - { - SetLastError(WSANOTINITIALISED); - return FALSE; - } - - /* Check if we already intialized */ - ThreadData = NtCurrentTeb()->WinSockData; - if (!(ThreadData) || !(ThreadData->RnrThreadData)) - { - /* Initialize the thread */ - if (!Rnr_ThreadInit()) - { - /* Fail */ - SetLastError(WSAENOBUFS); - return FALSE; - } - } - - /* Return success */ - return TRUE; -} - diff --git a/dll/win32/mswsock/rnr20/r_comp.c b/dll/win32/mswsock/rnr20/r_comp.c index 40d1f1bccaf..cbf06b2dc05 100644 --- a/dll/win32/mswsock/rnr20/r_comp.c +++ b/dll/win32/mswsock/rnr20/r_comp.c @@ -8,33 +8,3 @@ /* INCLUDES ******************************************************************/ #include "msafd.h" -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - diff --git a/dll/win32/mswsock/rnr20/util.c b/dll/win32/mswsock/rnr20/util.c index 258edf6fc9c..c8412ab7b5d 100644 --- a/dll/win32/mswsock/rnr20/util.c +++ b/dll/win32/mswsock/rnr20/util.c @@ -30,99 +30,3 @@ Temp_AllocZero(IN DWORD Size) return Data; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -PVOID -WSPAPI -Temp_AllocZero(IN DWORD Size) -{ - PVOID Data; - - /* Allocate the memory */ - Data = DnsApiAlloc(Size); - if (Data) - { - /* Zero it out */ - RtlZeroMemory(Data, Size); - } - - /* Return it */ - return Data; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -PVOID -WSPAPI -Temp_AllocZero(IN DWORD Size) -{ - PVOID Data; - - /* Allocate the memory */ - Data = DnsApiAlloc(Size); - if (Data) - { - /* Zero it out */ - RtlZeroMemory(Data, Size); - } - - /* Return it */ - return Data; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -PVOID -WSPAPI -Temp_AllocZero(IN DWORD Size) -{ - PVOID Data; - - /* Allocate the memory */ - Data = DnsApiAlloc(Size); - if (Data) - { - /* Zero it out */ - RtlZeroMemory(Data, Size); - } - - /* Return it */ - return Data; -} - diff --git a/dll/win32/mswsock/wsmobile/lpc.c b/dll/win32/mswsock/wsmobile/lpc.c index 67c2fe25130..6aa6bde21d1 100644 --- a/dll/win32/mswsock/wsmobile/lpc.c +++ b/dll/win32/mswsock/wsmobile/lpc.c @@ -14,51 +14,3 @@ HINSTANCE NlsMsgSourcemModuleHandle; /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -HINSTANCE NlsMsgSourcemModuleHandle; - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -HINSTANCE NlsMsgSourcemModuleHandle; - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -HINSTANCE NlsMsgSourcemModuleHandle; - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/wsmobile/nsp.c b/dll/win32/mswsock/wsmobile/nsp.c index 70d21f483d6..048652a5be8 100644 --- a/dll/win32/mswsock/wsmobile/nsp.c +++ b/dll/win32/mswsock/wsmobile/nsp.c @@ -26,87 +26,3 @@ WSM_NSPStartup(IN LPGUID lpProviderId, return SOCKET_ERROR; } -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -LONG gWSM_NSPStartupRef; -LONG gWSM_NSPCallRef; -GUID gNLANamespaceGuid = NLA_NAMESPACE_GUID; - -/* FUNCTIONS *****************************************************************/ - -INT -WINAPI -WSM_NSPStartup(IN LPGUID lpProviderId, - IN OUT LPNSP_ROUTINE lpsnpRoutines) -{ - /* Go away */ - SetLastError(WSAEINVAL); - return SOCKET_ERROR; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -LONG gWSM_NSPStartupRef; -LONG gWSM_NSPCallRef; -GUID gNLANamespaceGuid = NLA_NAMESPACE_GUID; - -/* FUNCTIONS *****************************************************************/ - -INT -WINAPI -WSM_NSPStartup(IN LPGUID lpProviderId, - IN OUT LPNSP_ROUTINE lpsnpRoutines) -{ - /* Go away */ - SetLastError(WSAEINVAL); - return SOCKET_ERROR; -} - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -LONG gWSM_NSPStartupRef; -LONG gWSM_NSPCallRef; -GUID gNLANamespaceGuid = NLA_NAMESPACE_GUID; - -/* FUNCTIONS *****************************************************************/ - -INT -WINAPI -WSM_NSPStartup(IN LPGUID lpProviderId, - IN OUT LPNSP_ROUTINE lpsnpRoutines) -{ - /* Go away */ - SetLastError(WSAEINVAL); - return SOCKET_ERROR; -} - diff --git a/dll/win32/mswsock/wsmobile/service.c b/dll/win32/mswsock/wsmobile/service.c index 3e062e90d63..bd1ad2806dc 100644 --- a/dll/win32/mswsock/wsmobile/service.c +++ b/dll/win32/mswsock/wsmobile/service.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/dll/win32/mswsock/wsmobile/update.c b/dll/win32/mswsock/wsmobile/update.c index 3e062e90d63..bd1ad2806dc 100644 --- a/dll/win32/mswsock/wsmobile/update.c +++ b/dll/win32/mswsock/wsmobile/update.c @@ -12,45 +12,3 @@ /* FUNCTIONS *****************************************************************/ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Winsock 2 SPI - * FILE: lib/mswsock/lib/init.c - * PURPOSE: DLL Initialization - */ - -/* INCLUDES ******************************************************************/ -#include "msafd.h" - -/* DATA **********************************************************************/ - -/* FUNCTIONS *****************************************************************/ - diff --git a/include/reactos/winsock/msafd.h b/include/reactos/winsock/msafd.h index 1d94bab7f42..b29294fcd7b 100644 --- a/include/reactos/winsock/msafd.h +++ b/include/reactos/winsock/msafd.h @@ -50,55 +50,3 @@ #include "mswinsock.h" /* EOF */ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Ancillary Function Driver DLL - * FILE: include/msafd.h - * PURPOSE: Ancillary Function Driver DLL header - */ - -#define NTOS_MODE_USER -#define WIN32_NO_STATUS -#define _CRT_SECURE_NO_DEPRECATE -#define _WIN32_WINNT 0x502 - -/* Winsock Headers */ -#include -#include -#include -#include -#include -#include -#include - -/* NDK */ -#include -#include -#include -#include -#include - -/* Shared NSP Header */ -#include - -/* Winsock 2 API Helper Header */ -#include - -/* Winsock Helper Header */ -#include - -/* AFD/TDI Headers */ -#include -#include - -/* DNSLIB/API Header */ -#include -#include - -/* Library Headers */ -#include "msafdlib.h" -#include "rnr20lib.h" -#include "wsmobile.h" -#include "mswinsock.h" - -/* EOF */ diff --git a/include/reactos/winsock/msafdlib.h b/include/reactos/winsock/msafdlib.h index 2c5548b8af6..0944141e6f8 100644 --- a/include/reactos/winsock/msafdlib.h +++ b/include/reactos/winsock/msafdlib.h @@ -21,834 +21,6 @@ WSA_FLAG_MULTIPOINT_D_LEAF) -/* Socket State */ -typedef enum _SOCKET_STATE -{ - SocketUndefined = -1, - SocketOpen, - SocketBound, - SocketBoundUdp, - SocketConnected, - SocketClosed -} SOCKET_STATE, *PSOCKET_STATE; - -/* - * Shared Socket Information. - * It's called shared because we send it to Kernel-Mode for safekeeping - */ -typedef struct _SOCK_SHARED_INFO { - SOCKET_STATE State; - INT AddressFamily; - INT SocketType; - INT Protocol; - INT SizeOfLocalAddress; - INT SizeOfRemoteAddress; - struct linger LingerData; - ULONG SendTimeout; - ULONG RecvTimeout; - ULONG SizeOfRecvBuffer; - ULONG SizeOfSendBuffer; - struct { - BOOLEAN Listening:1; - BOOLEAN Broadcast:1; - BOOLEAN Debug:1; - BOOLEAN OobInline:1; - BOOLEAN ReuseAddresses:1; - BOOLEAN ExclusiveAddressUse:1; - BOOLEAN NonBlocking:1; - BOOLEAN DontUseWildcard:1; - BOOLEAN ReceiveShutdown:1; - BOOLEAN SendShutdown:1; - BOOLEAN UseDelayedAcceptance:1; - BOOLEAN UseSAN:1; - }; // Flags - DWORD CreateFlags; - DWORD CatalogEntryId; - DWORD ServiceFlags1; - DWORD ProviderFlags; - GROUP GroupID; - DWORD GroupType; - INT GroupPriority; - INT SocketLastError; - HWND hWnd; - LONG Unknown; - DWORD SequenceNumber; - UINT wMsg; - LONG AsyncEvents; - LONG AsyncDisabledEvents; -} SOCK_SHARED_INFO, *PSOCK_SHARED_INFO; - -/* Socket Helper Data. Holds information about the WSH Libraries */ -typedef struct _HELPER_DATA { - LIST_ENTRY Helpers; - LONG RefCount; - HANDLE hInstance; - INT MinWSAddressLength; - INT MaxWSAddressLength; - INT MinTDIAddressLength; - INT MaxTDIAddressLength; - BOOLEAN UseDelayedAcceptance; - PWINSOCK_MAPPING Mapping; - PWSH_OPEN_SOCKET WSHOpenSocket; - PWSH_OPEN_SOCKET2 WSHOpenSocket2; - PWSH_JOIN_LEAF WSHJoinLeaf; - PWSH_NOTIFY WSHNotify; - PWSH_GET_SOCKET_INFORMATION WSHGetSocketInformation; - PWSH_SET_SOCKET_INFORMATION WSHSetSocketInformation; - PWSH_GET_SOCKADDR_TYPE WSHGetSockaddrType; - PWSH_GET_WILDCARD_SOCKADDR WSHGetWildcardSockaddr; - PWSH_GET_BROADCAST_SOCKADDR WSHGetBroadcastSockaddr; - PWSH_ADDRESS_TO_STRING WSHAddressToString; - PWSH_STRING_TO_ADDRESS WSHStringToAddress; - PWSH_IOCTL WSHIoctl; - WCHAR TransportName[1]; -} HELPER_DATA, *PHELPER_DATA; - -typedef struct _ASYNC_DATA -{ - struct _SOCKET_INFORMATION *ParentSocket; - DWORD SequenceNumber; - IO_STATUS_BLOCK IoStatusBlock; - AFD_POLL_INFO AsyncSelectInfo; -} ASYNC_DATA, *PASYNC_DATA; - -/* The actual Socket Structure represented by a handle. Internal to us */ -typedef struct _SOCKET_INFORMATION { - union { - WSH_HANDLE WshContext; - struct { - LONG RefCount; - SOCKET Handle; - }; - }; - SOCK_SHARED_INFO SharedData; - GUID ProviderId; - DWORD HelperEvents; - PHELPER_DATA HelperData; - PVOID HelperContext; - PSOCKADDR LocalAddress; - PSOCKADDR RemoteAddress; - HANDLE TdiAddressHandle; - HANDLE TdiConnectionHandle; - PASYNC_DATA AsyncData; - HANDLE EventObject; - LONG NetworkEvents; - CRITICAL_SECTION Lock; - BOOL DontUseSan; - PVOID SanData; -} SOCKET_INFORMATION, *PSOCKET_INFORMATION; - -/* The blob of data we send to Kernel-Mode for safekeeping */ -typedef struct _SOCKET_CONTEXT { - SOCK_SHARED_INFO SharedData; - ULONG SizeOfHelperData; - ULONG Padding; - SOCKADDR LocalAddress; - SOCKADDR RemoteAddress; - /* Plus Helper Data */ -} SOCKET_CONTEXT, *PSOCKET_CONTEXT; - -typedef struct _SOCK_RW_LOCK -{ - volatile LONG ReaderCount; - HANDLE WriterWaitEvent; - RTL_CRITICAL_SECTION Lock; -} SOCK_RW_LOCK, *PSOCK_RW_LOCK; - -typedef struct _WINSOCK_TEB_DATA -{ - HANDLE EventHandle; - SOCKET SocketHandle; - PAFD_ACCEPT_DATA AcceptData; - LONG PendingAPCs; - BOOLEAN CancelIo; - ULONG Unknown; - PVOID RnrThreadData; -} WINSOCK_TEB_DATA, *PWINSOCK_TEB_DATA; - -typedef INT -(WINAPI *PICF_CONNECT)(PVOID IcfData); - -typedef struct _SOCK_ICF_DATA -{ - HANDLE IcfHandle; - PVOID IcfOpenDynamicFwPort; - PICF_CONNECT IcfConnect; - PVOID IcfDisconnect; - HINSTANCE DllHandle; -} SOCK_ICF_DATA, *PSOCK_ICF_DATA; - -typedef PVOID -(NTAPI *PRTL_HEAP_ALLOCATE)( - IN HANDLE Heap, - IN ULONG Flags, - IN ULONG Size -); - -extern HANDLE SockPrivateHeap; -extern PRTL_HEAP_ALLOCATE SockAllocateHeapRoutine; -extern SOCK_RW_LOCK SocketGlobalLock; -extern PWAH_HANDLE_TABLE SockContextTable; -extern LPWSPUPCALLTABLE SockUpcallTable; -extern BOOL SockProcessTerminating; -extern LONG SockWspStartupCount; -extern DWORD SockSendBufferWindow; -extern DWORD SockReceiveBufferWindow; -extern HANDLE SockAsyncQueuePort; -extern BOOLEAN SockAsyncSelectCalled; -extern LONG SockProcessPendingAPCCount; -extern HINSTANCE SockModuleHandle; -extern LONG gWSM_NSPStartupRef; -extern LONG gWSM_NSPCallRef; -extern LIST_ENTRY SockHelperDllListHead; -extern CRITICAL_SECTION MSWSOCK_SocketLock; -extern HINSTANCE NlsMsgSourcemModuleHandle; -extern PVOID SockBufferKeyTable; -extern ULONG SockBufferKeyTableSize; -extern LONG SockAsyncThreadReferenceCount; -extern BOOLEAN g_fRnrLockInit; -extern CRITICAL_SECTION g_RnrLock; - -BOOL -WSPAPI -MSWSOCK_Initialize(VOID); - -BOOL -WSPAPI -MSAFD_SockThreadInitialize(VOID); - -INT -WSPAPI -SockCreateAsyncQueuePort(VOID); - -PVOID -WSPAPI -SockInitializeHeap(IN HANDLE Heap, - IN ULONG Flags, - IN ULONG Size); - -NTSTATUS -WSPAPI -SockInitializeRwLockAndSpinCount( - IN PSOCK_RW_LOCK Lock, - IN ULONG SpinCount -); - -VOID -WSPAPI -SockAcquireRwLockExclusive(IN PSOCK_RW_LOCK Lock); - -VOID -WSPAPI -SockAcquireRwLockShared(IN PSOCK_RW_LOCK Lock); - -VOID -WSPAPI -SockReleaseRwLockExclusive(IN PSOCK_RW_LOCK Lock); - -VOID -WSPAPI -SockReleaseRwLockShared(IN PSOCK_RW_LOCK Lock); - -NTSTATUS -WSPAPI -SockDeleteRwLock(IN PSOCK_RW_LOCK Lock); - -INT -WSPAPI -SockGetConnectData(IN PSOCKET_INFORMATION Socket, - IN ULONG Ioctl, - IN PVOID Buffer, - IN ULONG BufferLength, - OUT PULONG BufferReturned); - -INT -WSPAPI -SockIsAddressConsistentWithConstrainedGroup(IN PSOCKET_INFORMATION Socket, - IN GROUP Group, - IN PSOCKADDR SocketAddress, - IN INT SocketAddressLength); - -BOOL -WSPAPI -SockWaitForSingleObject(IN HANDLE Handle, - IN SOCKET SocketHandle, - IN DWORD BlockingFlags, - IN DWORD TimeoutFlags); - -BOOLEAN -WSPAPI -SockIsSocketConnected(IN PSOCKET_INFORMATION Socket); - -INT -WSPAPI -SockNotifyHelperDll(IN PSOCKET_INFORMATION Socket, - IN DWORD Event); - -INT -WSPAPI -SockUpdateWindowSizes(IN PSOCKET_INFORMATION Socket, - IN BOOLEAN Force); - -INT -WSPAPI -SockBuildTdiAddress(OUT PTRANSPORT_ADDRESS TdiAddress, - IN PSOCKADDR Sockaddr, - IN INT SockaddrLength); - -INT -WSPAPI -SockBuildSockaddr(OUT PSOCKADDR Sockaddr, - OUT PINT SockaddrLength, - IN PTRANSPORT_ADDRESS TdiAddress); - -INT -WSPAPI -SockGetTdiHandles(IN PSOCKET_INFORMATION Socket); - -VOID -WSPAPI -SockIoCompletion(IN PVOID ApcContext, - IN PIO_STATUS_BLOCK IoStatusBlock, - DWORD Reserved); - -VOID -WSPAPI -SockCancelIo(IN SOCKET Handle); - -INT -WSPAPI -SockGetInformation(IN PSOCKET_INFORMATION Socket, - IN ULONG AfdInformationClass, - IN PVOID ExtraData OPTIONAL, - IN ULONG ExtraDataSize, - IN OUT PBOOLEAN Boolean OPTIONAL, - IN OUT PULONG Ulong OPTIONAL, - IN OUT PLARGE_INTEGER LargeInteger OPTIONAL); - -INT -WSPAPI -SockSetInformation(IN PSOCKET_INFORMATION Socket, - IN ULONG AfdInformationClass, - IN PBOOLEAN Boolean OPTIONAL, - IN PULONG Ulong OPTIONAL, - IN PLARGE_INTEGER LargeInteger OPTIONAL); - -INT -WSPAPI -SockSetHandleContext(IN PSOCKET_INFORMATION Socket); - -VOID -WSPAPI -SockDereferenceSocket(IN PSOCKET_INFORMATION Socket); - -VOID -WSPAPI -SockFreeHelperDll(IN PHELPER_DATA Helper); - -PSOCKET_INFORMATION -WSPAPI -SockFindAndReferenceSocket(IN SOCKET Handle, - IN BOOLEAN Import); - -INT -WSPAPI -SockEnterApiSlow(OUT PWINSOCK_TEB_DATA *ThreadData); - -VOID -WSPAPI -SockSanInitialize(VOID); - -VOID -WSPAPI -SockSanGetTcpipCatalogId(VOID); - -VOID -WSPAPI -CloseIcfConnection(IN PSOCK_ICF_DATA IcfData); - -VOID -WSPAPI -InitializeIcfConnection(IN PSOCK_ICF_DATA IcfData); - -VOID -WSPAPI -NewIcfConnection(IN PSOCK_ICF_DATA IcfData); - -INT -WSPAPI -NtStatusToSocketError(IN NTSTATUS Status); - -INT -WSPAPI -SockSocket(INT AddressFamily, - INT SocketType, - INT Protocol, - LPGUID ProviderId, - GROUP g, - DWORD dwFlags, - DWORD ProviderFlags, - DWORD ServiceFlags, - DWORD CatalogEntryId, - PSOCKET_INFORMATION *NewSocket); - -INT -WSPAPI -SockCloseSocket(IN PSOCKET_INFORMATION Socket); - -FORCEINLINE -INT -WSPAPI -SockEnterApiFast(OUT PWINSOCK_TEB_DATA *ThreadData) -{ - /* Make sure we aren't terminating and get our thread data */ - if (!(SockProcessTerminating) && - (SockWspStartupCount > 0) && - ((*ThreadData == NtCurrentTeb()->WinSockData))) - { - /* Everything is good, return */ - return NO_ERROR; - } - - /* Something didn't work out, use the slow path */ - return SockEnterApiSlow(ThreadData); -} - -FORCEINLINE -VOID -WSPAPI -SockDereferenceHelperDll(IN PHELPER_DATA Helper) -{ - /* Dereference and see if it's the last count */ - if (!InterlockedDecrement(&Helper->RefCount)) - { - /* Destroy the Helper DLL */ - SockFreeHelperDll(Helper); - } -} - -#define MSAFD_IS_DGRAM_SOCK(s) \ - (s->SharedData.ServiceFlags1 & XP1_CONNECTIONLESS) - -/* Global data that we want to share access with */ -extern HANDLE SockSanCleanUpCompleteEvent; -extern BOOLEAN SockSanEnabled; -extern WSAPROTOCOL_INFOW SockTcpProviderInfo; - -typedef VOID -(WSPAPI *PASYNC_COMPLETION_ROUTINE)( - PVOID Context, - PIO_STATUS_BLOCK IoStatusBlock -); - -/* Internal Helper Functions */ -INT -WSPAPI -SockLoadHelperDll( - PWSTR TransportName, - PWINSOCK_MAPPING Mapping, - PHELPER_DATA *HelperDllData -); - -INT -WSPAPI -SockLoadTransportMapping( - PWSTR TransportName, - PWINSOCK_MAPPING *Mapping -); - -INT -WSPAPI -SockLoadTransportList( - PWSTR *TransportList -); - -BOOL -WSPAPI -SockIsTripleInMapping(IN PWINSOCK_MAPPING Mapping, - IN INT AddressFamily, - OUT PBOOLEAN AfMatch, - IN INT SocketType, - OUT PBOOLEAN SockMatch, - IN INT Protocol, - OUT PBOOLEAN ProtoMatch); - -INT -WSPAPI -SockAsyncSelectHelper(IN PSOCKET_INFORMATION Socket, - IN HWND hWnd, - IN UINT wMsg, - IN LONG Events); - -INT -WSPAPI -SockEventSelectHelper(IN PSOCKET_INFORMATION Socket, - IN WSAEVENT EventObject, - IN LONG Events); - -BOOLEAN -WSPAPI -SockCheckAndReferenceAsyncThread(VOID); - -BOOLEAN -WSPAPI -SockCheckAndInitAsyncSelectHelper(VOID); - -INT -WSPAPI -SockGetTdiName(PINT AddressFamily, - PINT SocketType, - PINT Protocol, - LPGUID ProviderId, - GROUP Group, - DWORD Flags, - PUNICODE_STRING TransportName, - PVOID *HelperDllContext, - PHELPER_DATA *HelperDllData, - PDWORD Events); - -INT -WSPAPI -SockAsyncThread( - PVOID ThreadParam -); - -VOID -WSPAPI -SockProcessAsyncSelect(PSOCKET_INFORMATION Socket, - PASYNC_DATA AsyncData); - -VOID -WSPAPI -SockHandleAsyncIndication(IN PASYNC_COMPLETION_ROUTINE Callback, - IN PVOID Context, - IN PIO_STATUS_BLOCK IoStatusBlock); - -INT -WSPAPI -SockReenableAsyncSelectEvent(IN PSOCKET_INFORMATION Socket, - IN ULONG Event); - -VOID -WSPAPI -SockProcessQueuedAsyncSelect(PVOID Context, - PIO_STATUS_BLOCK IoStatusBlock); - -VOID -WSPAPI -SockAsyncSelectCompletion( - PVOID Context, - PIO_STATUS_BLOCK IoStatusBlock -); - -/* Public functions, but not exported! */ -SOCKET -WSPAPI -WSPAccept( - IN SOCKET s, - OUT LPSOCKADDR addr, - IN OUT LPINT addrlen, - IN LPCONDITIONPROC lpfnCondition, - IN DWORD dwCallbackData, - OUT LPINT lpErrno); - -INT -WSPAPI -WSPAddressToString( - IN LPSOCKADDR lpsaAddress, - IN DWORD dwAddressLength, - IN LPWSAPROTOCOL_INFOW lpProtocolInfo, - OUT LPWSTR lpszAddressString, - IN OUT LPDWORD lpdwAddressStringLength, - OUT LPINT lpErrno); - -INT -WSPAPI -WSPAsyncSelect( - IN SOCKET s, - IN HWND hWnd, - IN UINT wMsg, - IN LONG lEvent, - OUT LPINT lpErrno); - -INT -WSPAPI WSPBind( - IN SOCKET s, - IN CONST SOCKADDR *name, - IN INT namelen, - OUT LPINT lpErrno); - -INT -WSPAPI -WSPCancelBlockingCall( - OUT LPINT lpErrno); - -INT -WSPAPI -WSPCleanup( - OUT LPINT lpErrno); - -INT -WSPAPI -WSPCloseSocket( - IN SOCKET s, - OUT LPINT lpErrno); - -INT -WSPAPI -WSPConnect( - IN SOCKET s, - IN CONST SOCKADDR *name, - IN INT namelen, - IN LPWSABUF lpCallerData, - OUT LPWSABUF lpCalleeData, - IN LPQOS lpSQOS, - IN LPQOS lpGQOS, - OUT LPINT lpErrno); - -INT -WSPAPI -WSPDuplicateSocket( - IN SOCKET s, - IN DWORD dwProcessId, - OUT LPWSAPROTOCOL_INFOW lpProtocolInfo, - OUT LPINT lpErrno); - -INT -WSPAPI -WSPEnumNetworkEvents( - IN SOCKET s, - IN WSAEVENT hEventObject, - OUT LPWSANETWORKEVENTS lpNetworkEvents, - OUT LPINT lpErrno); - -INT -WSPAPI -WSPEventSelect( - IN SOCKET s, - IN WSAEVENT hEventObject, - IN LONG lNetworkEvents, - OUT LPINT lpErrno); - -BOOL -WSPAPI -WSPGetOverlappedResult( - IN SOCKET s, - IN LPWSAOVERLAPPED lpOverlapped, - OUT LPDWORD lpcbTransfer, - IN BOOL fWait, - OUT LPDWORD lpdwFlags, - OUT LPINT lpErrno); - -INT -WSPAPI -WSPGetPeerName( - IN SOCKET s, - OUT LPSOCKADDR name, - IN OUT LPINT namelen, - OUT LPINT lpErrno); - -BOOL -WSPAPI -WSPGetQOSByName( - IN SOCKET s, - IN OUT LPWSABUF lpQOSName, - OUT LPQOS lpQOS, - OUT LPINT lpErrno); - -INT -WSPAPI -WSPGetSockName( - IN SOCKET s, - OUT LPSOCKADDR name, - IN OUT LPINT namelen, - OUT LPINT lpErrno); - -INT -WSPAPI -WSPGetSockOpt( - IN SOCKET s, - IN INT level, - IN INT optname, - OUT CHAR FAR* optval, - IN OUT LPINT optlen, - OUT LPINT lpErrno); - -INT -WSPAPI -WSPIoctl( - IN SOCKET s, - IN DWORD dwIoControlCode, - IN LPVOID lpvInBuffer, - IN DWORD cbInBuffer, - OUT LPVOID lpvOutBuffer, - IN DWORD cbOutBuffer, - OUT LPDWORD lpcbBytesReturned, - IN LPWSAOVERLAPPED lpOverlapped, - IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, - IN LPWSATHREADID lpThreadId, - OUT LPINT lpErrno); - -SOCKET -WSPAPI -WSPJoinLeaf( - IN SOCKET s, - IN CONST SOCKADDR *name, - IN INT namelen, - IN LPWSABUF lpCallerData, - OUT LPWSABUF lpCalleeData, - IN LPQOS lpSQOS, - IN LPQOS lpGQOS, - IN DWORD dwFlags, - OUT LPINT lpErrno); - -INT -WSPAPI -WSPListen( - IN SOCKET s, - IN INT backlog, - OUT LPINT lpErrno); - -INT -WSPAPI -WSPRecv( - IN SOCKET s, - IN OUT LPWSABUF lpBuffers, - IN DWORD dwBufferCount, - OUT LPDWORD lpNumberOfBytesRecvd, - IN OUT LPDWORD lpFlags, - IN LPWSAOVERLAPPED lpOverlapped, - IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, - IN LPWSATHREADID lpThreadId, - OUT LPINT lpErrno); - -INT -WSPAPI -WSPRecvDisconnect( - IN SOCKET s, - OUT LPWSABUF lpInboundDisconnectData, - OUT LPINT lpErrno); - -INT -WSPAPI -WSPRecvFrom( - IN SOCKET s, - IN OUT LPWSABUF lpBuffers, - IN DWORD dwBufferCount, - OUT LPDWORD lpNumberOfBytesRecvd, - IN OUT LPDWORD lpFlags, - OUT LPSOCKADDR lpFrom, - IN OUT LPINT lpFromlen, - IN LPWSAOVERLAPPED lpOverlapped, - IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, - IN LPWSATHREADID lpThreadId, - OUT LPINT lpErrno); - -INT -WSPAPI -WSPSelect( - IN INT nfds, - IN OUT LPFD_SET readfds, - IN OUT LPFD_SET writefds, - IN OUT LPFD_SET exceptfds, - IN CONST LPTIMEVAL timeout, - OUT LPINT lpErrno); - -INT -WSPAPI -WSPSend( - IN SOCKET s, - IN LPWSABUF lpBuffers, - IN DWORD dwBufferCount, - OUT LPDWORD lpNumberOfBytesSent, - IN DWORD dwFlags, - IN LPWSAOVERLAPPED lpOverlapped, - IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, - IN LPWSATHREADID lpThreadId, - OUT LPINT lpErrno); - -INT -WSPAPI -WSPSendDisconnect( - IN SOCKET s, - IN LPWSABUF lpOutboundDisconnectData, - OUT LPINT lpErrno); - -INT -WSPAPI -WSPSendTo( - IN SOCKET s, - IN LPWSABUF lpBuffers, - IN DWORD dwBufferCount, - OUT LPDWORD lpNumberOfBytesSent, - IN DWORD dwFlags, - IN CONST SOCKADDR *lpTo, - IN INT iTolen, - IN LPWSAOVERLAPPED lpOverlapped, - IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, - IN LPWSATHREADID lpThreadId, - OUT LPINT lpErrno); - -INT -WSPAPI -WSPSetSockOpt( - IN SOCKET s, - IN INT level, - IN INT optname, - IN CONST CHAR FAR* optval, - IN INT optlen, - OUT LPINT lpErrno); - -INT -WSPAPI -WSPShutdown( - IN SOCKET s, - IN INT how, - OUT LPINT lpErrno); - -SOCKET -WSPAPI -WSPSocket( - IN INT af, - IN INT type, - IN INT protocol, - IN LPWSAPROTOCOL_INFOW lpProtocolInfo, - IN GROUP g, - IN DWORD dwFlags, - OUT LPINT lpErrno); - -INT -WSPAPI -WSPStringToAddress( - IN LPWSTR AddressString, - IN INT AddressFamily, - IN LPWSAPROTOCOL_INFOW lpProtocolInfo, - OUT LPSOCKADDR lpAddress, - IN OUT LPINT lpAddressLength, - OUT LPINT lpErrno); -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS WinSock 2 NSP - * FILE: lib/mswsock/sock.h - * PURPOSE: Winsock 2 SPI Utility Header - */ - -#define NO_BLOCKING_HOOK 0 -#define MAYBE_BLOCKING_HOOK 1 -#define ALWAYS_BLOCKING_HOOK 2 - -#define NO_TIMEOUT 0 -#define SEND_TIMEOUT 1 -#define RECV_TIMEOUT 2 - -#define MAX_TDI_ADDRESS_LENGTH 32 - -#define WSA_FLAG_MULTIPOINT_ALL (WSA_FLAG_MULTIPOINT_C_ROOT |\ - WSA_FLAG_MULTIPOINT_C_LEAF |\ - WSA_FLAG_MULTIPOINT_D_ROOT |\ - WSA_FLAG_MULTIPOINT_D_LEAF) - - /* Socket State */ typedef enum _SOCKET_STATE { diff --git a/include/reactos/winsock/mswinsock.h b/include/reactos/winsock/mswinsock.h index 403b5ea3550..fff06fc7416 100644 --- a/include/reactos/winsock/mswinsock.h +++ b/include/reactos/winsock/mswinsock.h @@ -17,22 +17,3 @@ typedef struct _NS_ROUTINE { #endif -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Ancillary Function Driver DLL - * FILE: include/mswsock.h - * PURPOSE: Ancillary Function Driver DLL header - */ -#ifndef __MSWINSOCK_H -#define __MSWINSOCK_H - -typedef DWORD (* LPFN_NSPAPI)(VOID); -typedef struct _NS_ROUTINE { - DWORD dwFunctionCount; - LPFN_NSPAPI *alpfnFunctions; - DWORD dwNameSpace; - DWORD dwPriority; -} NS_ROUTINE, *PNS_ROUTINE, * FAR LPNS_ROUTINE; - -#endif - diff --git a/include/reactos/winsock/rnr20lib.h b/include/reactos/winsock/rnr20lib.h index d44793345fa..38410e2d26e 100644 --- a/include/reactos/winsock/rnr20lib.h +++ b/include/reactos/winsock/rnr20lib.h @@ -263,268 +263,3 @@ Dns_NSPStartup( #endif -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS WinSock 2 NSP - * FILE: include/nsp_dns.h - * PURPOSE: WinSock 2 NSP Header - */ - -#ifndef __NSP_H -#define __NSP_H - -/* DEFINES *******************************************************************/ - -/* Lookup Flags */ -#define DONE 0x01 -#define REVERSE 0x02 -#define LOCAL 0x04 -#define IANA 0x10 -#define LOOPBACK 0x20 - -/* Protocol Flags */ -#define UDP 0x01 -#define TCP 0x02 -#define ATM 0x04 - -/* GUID Masks */ -#define NBT_MASK 0x01 -#define DNS_MASK 0x02 - -/* TYPES *********************************************************************/ - -typedef struct _RNR_CONTEXT -{ - LIST_ENTRY ListEntry; - HANDLE Handle; - PDNS_BLOB CachedSaBlob; - DWORD Signature; - DWORD RefCount; - DWORD Instance; - DWORD LookupFlags; - DWORD RnrId; - DWORD dwNameSpace; - DWORD RrType; - DWORD dwControlFlags; - DWORD UdpPort; - DWORD TcpPort; - DWORD ProtocolFlags; - BLOB CachedBlob; - GUID lpServiceClassId; - GUID lpProviderId; - WCHAR ServiceName[1]; -} RNR_CONTEXT, *PRNR_CONTEXT; - -typedef struct _RNR_TEB_DATA -{ - ULONG Foo; -} RNR_TEB_DATA, *PRNR_TEB_DATA; - -/* PROTOTYPES ****************************************************************/ - -/* - * proc.c - */ -BOOLEAN -WINAPI -RNRPROV_SockEnterApi(VOID); - -/* - * oldutil.c - */ -DWORD -WINAPI -GetServerAndProtocolsFromString( - PWCHAR ServiceString, - LPGUID ServiceType, - PSERVENT *ReverseServent -); - -DWORD -WINAPI -FetchPortFromClassInfo( - IN DWORD Type, - IN LPGUID Guid, - IN LPWSASERVICECLASSINFOW ServiceClassInfo -); - -PSERVENT -WSPAPI -CopyServEntry( - IN PSERVENT Servent, - IN OUT PULONG_PTR BufferPos, - IN OUT PULONG BufferFreeSize, - IN OUT PULONG BlobSize, - IN BOOLEAN Relative -); - -WORD -WINAPI -GetDnsQueryTypeFromGuid( - IN LPGUID Guid -); - -/* - * context.c - */ -VOID -WSPAPI -RnrCtx_ListCleanup(VOID); - -VOID -WSPAPI -RnrCtx_Release(PRNR_CONTEXT RnrContext); - -PRNR_CONTEXT -WSPAPI -RnrCtx_Get( - HANDLE LookupHandle, - DWORD dwControlFlags, - PLONG Instance -); - -PRNR_CONTEXT -WSPAPI -RnrCtx_Create( - IN HANDLE LookupHandle, - IN LPWSTR ServiceName -); - -VOID -WSPAPI -RnrCtx_DecInstance(IN PRNR_CONTEXT RnrContext); - -/* - * util.c - */ -PVOID -WSPAPI -Temp_AllocZero(IN DWORD Size); - -/* - * lookup.c - */ -PDNS_BLOB -WSPAPI -Rnr_DoHostnameLookup(IN PRNR_CONTEXT Context); - -PDNS_BLOB -WSPAPI -Rnr_GetHostByAddr(IN PRNR_CONTEXT Context); - -PDNS_BLOB -WSPAPI -Rnr_DoDnsLookup(IN PRNR_CONTEXT Context); - -BOOLEAN -WINAPI -Rnr_CheckIfUseNbt(PRNR_CONTEXT RnrContext); - -PDNS_BLOB -WINAPI -Rnr_NbtResolveAddr(IN IN_ADDR Address); - -PDNS_BLOB -WINAPI -Rnr_NbtResolveName(IN LPWSTR Name); - -/* - * init.c - */ -VOID -WSPAPI -Rnr_ProcessInit(VOID); - -VOID -WSPAPI -Rnr_ProcessCleanup(VOID); - -BOOLEAN -WSPAPI -Rnr_ThreadInit(VOID); - -VOID -WSPAPI -Rnr_ThreadCleanup(VOID); - -/* - * nsp.c - */ -VOID -WSPAPI -Nsp_GlobalCleanup(VOID); - -INT -WINAPI -Dns_NSPCleanup(IN LPGUID lpProviderId); - -INT -WINAPI -Dns_NSPSetService( - IN LPGUID lpProviderId, - IN LPWSASERVICECLASSINFOW lpServiceClassInfo, - IN LPWSAQUERYSETW lpqsRegInfo, - IN WSAESETSERVICEOP essOperation, - IN DWORD dwControlFlags -); - -INT -WINAPI -Dns_NSPInstallServiceClass( - IN LPGUID lpProviderId, - IN LPWSASERVICECLASSINFOW lpServiceClassInfo -); - -INT -WINAPI -Dns_NSPRemoveServiceClass( - IN LPGUID lpProviderId, - IN LPGUID lpServiceCallId -); - -INT -WINAPI -Dns_NSPGetServiceClassInfo( - IN LPGUID lpProviderId, - IN OUT LPDWORD lpdwBufSize, - IN OUT LPWSASERVICECLASSINFOW lpServiceClassInfo -); - -INT -WINAPI -Dns_NSPLookupServiceBegin( - LPGUID lpProviderId, - LPWSAQUERYSETW lpqsRestrictions, - LPWSASERVICECLASSINFOW lpServiceClassInfo, - DWORD dwControlFlags, - LPHANDLE lphLookup -); - -INT -WINAPI -Dns_NSPLookupServiceNext( - IN HANDLE hLookup, - IN DWORD dwControlFlags, - IN OUT LPDWORD lpdwBufferLength, - OUT LPWSAQUERYSETW lpqsResults -); - -INT -WINAPI -Dns_NSPLookupServiceEnd(IN HANDLE hLookup); - -INT -WINAPI -Dns_NSPStartup( - IN LPGUID lpProviderId, - IN OUT LPNSP_ROUTINE lpsnpRoutines -); - -/* Unchecked yet */ -#define ATM_ADDRESS_LENGTH 20 -#define WS2_INTERNAL_MAX_ALIAS 16 -#define MAX_HOSTNAME_LEN 256 -#define MAXADDRS 16 - -#endif - diff --git a/include/reactos/winsock/wsmobile.h b/include/reactos/winsock/wsmobile.h index 3bfce930837..1ce31b95328 100644 --- a/include/reactos/winsock/wsmobile.h +++ b/include/reactos/winsock/wsmobile.h @@ -82,87 +82,3 @@ WSM_NSPStartup( #endif -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS WinSock 2 NSP - * FILE: include/nsp_dns.h - * PURPOSE: WinSock 2 NSP Header - */ - -#ifndef __WSM_H -#define __WSM_H - -/* nsp.cpp */ -extern GUID gNLANamespaceGuid; - -/* - * nsp.cpp - */ -INT -WINAPI -WSM_NSPCleanup(IN LPGUID lpProviderId); - -INT -WINAPI -WSM_NSPSetService( - IN LPGUID lpProviderId, - IN LPWSASERVICECLASSINFOW lpServiceClassInfo, - IN LPWSAQUERYSETW lpqsRegInfo, - IN WSAESETSERVICEOP essOperation, - IN DWORD dwControlFlags -); - -INT -WINAPI -WSM_NSPInstallServiceClass( - IN LPGUID lpProviderId, - IN LPWSASERVICECLASSINFOW lpServiceClassInfo -); - -INT -WINAPI -WSM_NSPRemoveServiceClass( - IN LPGUID lpProviderId, - IN LPGUID lpServiceCallId -); - -INT -WINAPI -WSM_NSPGetServiceClassInfo( - IN LPGUID lpProviderId, - IN OUT LPDWORD lpdwBufSize, - IN OUT LPWSASERVICECLASSINFOW lpServiceClassInfo -); - -INT -WINAPI -WSM_NSPLookupServiceBegin( - LPGUID lpProviderId, - LPWSAQUERYSETW lpqsRestrictions, - LPWSASERVICECLASSINFOW lpServiceClassInfo, - DWORD dwControlFlags, - LPHANDLE lphLookup -); - -INT -WINAPI -WSM_NSPLookupServiceNext( - IN HANDLE hLookup, - IN DWORD dwControlFlags, - IN OUT LPDWORD lpdwBufferLength, - OUT LPWSAQUERYSETW lpqsResults -); - -INT -WINAPI -WSM_NSPLookupServiceEnd(IN HANDLE hLookup); - -INT -WINAPI -WSM_NSPStartup( - IN LPGUID lpProviderId, - IN OUT LPNSP_ROUTINE lpsnpRoutines -); - -#endif - -- 2.17.1