Index: dll/win32/msafd/misc/dllmain.c =================================================================== --- dll/win32/msafd/misc/dllmain.c (revision 72898) +++ dll/win32/msafd/misc/dllmain.c (working copy) @@ -61,7 +61,7 @@ ULONG SizeOfEA; PAFD_CREATE_PACKET AfdPacket; HANDLE Sock; - PSOCKET_INFORMATION Socket = NULL; + PSOCKET_INFORMATION Socket = NULL, DuplicatedSocket = NULL; PFILE_FULL_EA_INFORMATION EABuffer = NULL; PHELPER_DATA HelperData; PVOID HelperDLLContext; @@ -74,6 +74,29 @@ TRACE("Creating Socket, getting TDI Name - AddressFamily (%d) SocketType (%d) Protocol (%d).\n", AddressFamily, SocketType, Protocol); + if (lpProtocolInfo && lpProtocolInfo->dwServiceFlags3 != 0 && lpProtocolInfo->dwServiceFlags4 != 0) + { + DuplicatedSocket = GetSocketStructure(lpProtocolInfo->dwServiceFlags4); + if (!DuplicatedSocket) + { + if (lpErrno) + *lpErrno = WSAENOTSOCK; + return SOCKET_ERROR; + } + Socket = HeapAlloc(GlobalHeap, 0, sizeof(*Socket)); + if (!Socket) + return MsafdReturnWithErrno(STATUS_INSUFFICIENT_RESOURCES, lpErrno, 0, NULL); + RtlCopyMemory(Socket, DuplicatedSocket, sizeof(*Socket)); + RtlCopyMemory(&Socket->ProtocolInfo, &DuplicatedSocket->ProtocolInfo, sizeof(Socket->ProtocolInfo)); + Sock = (HANDLE)lpProtocolInfo->dwServiceFlags3; + Socket->Handle = lpProtocolInfo->dwServiceFlags3; + Socket->LocalAddress = &Socket->SharedData->WSLocalAddress; + Socket->RemoteAddress = &Socket->SharedData->WSRemoteAddress; + Socket->SanData = NULL; + InterlockedIncrement(&Socket->SharedData->RefCount); + goto ok; + } + if (AddressFamily == AF_UNSPEC && SocketType == 0 && Protocol == 0) return WSAEINVAL; @@ -118,39 +141,46 @@ Socket = HeapAlloc(GlobalHeap, 0, sizeof(*Socket)); if (!Socket) return MsafdReturnWithErrno(STATUS_INSUFFICIENT_RESOURCES, lpErrno, 0, NULL); + RtlZeroMemory(Socket, sizeof(*Socket)); + Socket->SharedData = HeapAlloc(GlobalHeap, 0, sizeof(*Socket->SharedData)); + if (!Socket->SharedData) + { + HeapFree(GlobalHeap, 0, Socket); + return MsafdReturnWithErrno(STATUS_INSUFFICIENT_RESOURCES, lpErrno, 0, NULL); + } - RtlZeroMemory(Socket, sizeof(*Socket)); - Socket->RefCount = 2; Socket->Handle = -1; - Socket->SharedData.Listening = FALSE; - Socket->SharedData.State = SocketOpen; - Socket->SharedData.AddressFamily = AddressFamily; - Socket->SharedData.SocketType = SocketType; - Socket->SharedData.Protocol = Protocol; + RtlZeroMemory(Socket->SharedData, sizeof(*Socket->SharedData)); + Socket->SharedData->RefCount = 1L; + Socket->SharedData->Listening = FALSE; + Socket->State = SocketOpen; + Socket->SharedData->AddressFamily = AddressFamily; + Socket->SharedData->SocketType = SocketType; + Socket->SharedData->Protocol = Protocol; Socket->HelperContext = HelperDLLContext; Socket->HelperData = HelperData; Socket->HelperEvents = HelperEvents; - Socket->LocalAddress = &Socket->WSLocalAddress; - Socket->SharedData.SizeOfLocalAddress = HelperData->MaxWSAddressLength; - Socket->RemoteAddress = &Socket->WSRemoteAddress; - Socket->SharedData.SizeOfRemoteAddress = HelperData->MaxWSAddressLength; - Socket->SharedData.UseDelayedAcceptance = HelperData->UseDelayedAcceptance; - Socket->SharedData.CreateFlags = dwFlags; - Socket->SharedData.ServiceFlags1 = lpProtocolInfo->dwServiceFlags1; - Socket->SharedData.ProviderFlags = lpProtocolInfo->dwProviderFlags; - Socket->SharedData.GroupID = g; - Socket->SharedData.GroupType = 0; - Socket->SharedData.UseSAN = FALSE; - Socket->SharedData.NonBlocking = FALSE; /* Sockets start blocking */ + Socket->LocalAddress = &Socket->SharedData->WSLocalAddress; + Socket->SharedData->SizeOfLocalAddress = HelperData->MaxWSAddressLength; + Socket->RemoteAddress = &Socket->SharedData->WSRemoteAddress; + Socket->SharedData->SizeOfRemoteAddress = HelperData->MaxWSAddressLength; + Socket->SharedData->UseDelayedAcceptance = HelperData->UseDelayedAcceptance; + Socket->SharedData->CreateFlags = dwFlags; + Socket->SharedData->ServiceFlags1 = lpProtocolInfo->dwServiceFlags1; + Socket->SharedData->ProviderFlags = lpProtocolInfo->dwProviderFlags; + Socket->SharedData->GroupID = g; + Socket->SharedData->GroupType = 0; + Socket->SharedData->UseSAN = FALSE; + Socket->SharedData->NonBlocking = FALSE; /* Sockets start blocking */ Socket->SanData = NULL; RtlCopyMemory(&Socket->ProtocolInfo, lpProtocolInfo, sizeof(Socket->ProtocolInfo)); /* Ask alex about this */ - if( Socket->SharedData.SocketType == SOCK_DGRAM || - Socket->SharedData.SocketType == SOCK_RAW ) + if( Socket->SharedData->SocketType == SOCK_DGRAM || + Socket->SharedData->SocketType == SOCK_RAW ) { TRACE("Connectionless socket\n"); - Socket->SharedData.ServiceFlags1 |= XP1_CONNECTIONLESS; + Socket->SharedData->ServiceFlags1 |= XP1_CONNECTIONLESS; } /* Packet Size */ @@ -182,7 +212,7 @@ AfdPacket->GroupID = g; /* Set up Endpoint Flags */ - if ((Socket->SharedData.ServiceFlags1 & XP1_CONNECTIONLESS) != 0) + if ((Socket->SharedData->ServiceFlags1 & XP1_CONNECTIONLESS) != 0) { if ((SocketType != SOCK_DGRAM) && (SocketType != SOCK_RAW)) { @@ -192,11 +222,11 @@ AfdPacket->EndpointFlags |= AFD_ENDPOINT_CONNECTIONLESS; } - if ((Socket->SharedData.ServiceFlags1 & XP1_MESSAGE_ORIENTED) != 0) + if ((Socket->SharedData->ServiceFlags1 & XP1_MESSAGE_ORIENTED) != 0) { if (SocketType == SOCK_STREAM) { - if ((Socket->SharedData.ServiceFlags1 & XP1_PSEUDO_STREAM) == 0) + if ((Socket->SharedData->ServiceFlags1 & XP1_PSEUDO_STREAM) == 0) { /* The Provider doesn't actually support Message Oriented Streams */ goto error; @@ -212,7 +242,7 @@ WSA_FLAG_MULTIPOINT_D_ROOT | WSA_FLAG_MULTIPOINT_D_LEAF)) { - if ((Socket->SharedData.ServiceFlags1 & XP1_SUPPORT_MULTIPOINT) == 0) + if ((Socket->SharedData->ServiceFlags1 & XP1_SUPPORT_MULTIPOINT) == 0) { /* The Provider doesn't actually support Multipoint */ goto error; @@ -221,7 +251,7 @@ if (dwFlags & WSA_FLAG_MULTIPOINT_C_ROOT) { - if (((Socket->SharedData.ServiceFlags1 & XP1_MULTIPOINT_CONTROL_PLANE) == 0) + if (((Socket->SharedData->ServiceFlags1 & XP1_MULTIPOINT_CONTROL_PLANE) == 0) || ((dwFlags & WSA_FLAG_MULTIPOINT_C_LEAF) != 0)) { /* The Provider doesn't support Control Planes, or you already gave a leaf */ @@ -232,7 +262,7 @@ if (dwFlags & WSA_FLAG_MULTIPOINT_D_ROOT) { - if (((Socket->SharedData.ServiceFlags1 & XP1_MULTIPOINT_DATA_PLANE) == 0) + if (((Socket->SharedData->ServiceFlags1 & XP1_MULTIPOINT_DATA_PLANE) == 0) || ((dwFlags & WSA_FLAG_MULTIPOINT_D_LEAF) != 0)) { /* The Provider doesn't support Data Planes, or you already gave a leaf */ @@ -283,8 +313,8 @@ if (g != 0) { GetSocketInformation(Socket, AFD_INFO_GROUP_ID_TYPE, NULL, NULL, &GroupData); - Socket->SharedData.GroupID = GroupData.u.LowPart; - Socket->SharedData.GroupType = GroupData.u.HighPart; + Socket->SharedData->GroupID = GroupData.u.LowPart; + Socket->SharedData->GroupType = GroupData.u.HighPart; } /* Get Window Sizes and Save them */ @@ -291,15 +321,15 @@ GetSocketInformation (Socket, AFD_INFO_SEND_WINDOW_SIZE, NULL, - &Socket->SharedData.SizeOfSendBuffer, + &Socket->SharedData->SizeOfSendBuffer, NULL); GetSocketInformation (Socket, AFD_INFO_RECEIVE_WINDOW_SIZE, NULL, - &Socket->SharedData.SizeOfRecvBuffer, + &Socket->SharedData->SizeOfRecvBuffer, NULL); - +ok: /* Save in Process Sockets List */ EnterCriticalSection(&SocketListLock); Socket->NextSocket = SocketListHead; @@ -332,7 +362,59 @@ return INVALID_SOCKET; } + INT +WSPAPI +WSPDuplicateSocket( + IN SOCKET Handle, + IN DWORD dwProcessId, + OUT LPWSAPROTOCOL_INFOW lpProtocolInfo, + OUT LPINT lpErrno) +{ + HANDLE hProcess, NewSocket; + PSOCKET_INFORMATION Socket; + BOOL bDuplicated; + + if (Handle == INVALID_SOCKET) + return MsafdReturnWithErrno(STATUS_INVALID_PARAMETER, lpErrno, 0, NULL); + Socket = GetSocketStructure(Handle); + if (!Socket) + { + if (lpErrno) + *lpErrno = WSAENOTSOCK; + return SOCKET_ERROR; + } + if (!(hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, dwProcessId))) + return MsafdReturnWithErrno(STATUS_INVALID_PARAMETER, lpErrno, 0, NULL); + + bDuplicated = DuplicateHandle(GetCurrentProcess(), + (HANDLE)Handle, + hProcess, + (LPHANDLE)&NewSocket, + 0, + FALSE, + DUPLICATE_SAME_ACCESS); + CloseHandle(hProcess); + if (!bDuplicated) + return MsafdReturnWithErrno(STATUS_ACCESS_DENIED, lpErrno, 0, NULL); + if (!lpProtocolInfo) + return MsafdReturnWithErrno(STATUS_ACCESS_VIOLATION, lpErrno, 0, NULL); + + RtlCopyMemory(lpProtocolInfo, &Socket->ProtocolInfo, sizeof(*lpProtocolInfo)); + + lpProtocolInfo->iAddressFamily = Socket->SharedData->AddressFamily; + lpProtocolInfo->iProtocol = Socket->SharedData->Protocol; + lpProtocolInfo->iSocketType = Socket->SharedData->SocketType; + lpProtocolInfo->dwServiceFlags3 = (DWORD)NewSocket; + lpProtocolInfo->dwServiceFlags4 = Socket->Handle; + + if( lpErrno ) + *lpErrno = NO_ERROR; + + return NO_ERROR; +} + +INT TranslateNtStatusError(NTSTATUS Status) { switch (Status) @@ -423,6 +505,7 @@ AFD_DISCONNECT_INFO DisconnectInfo; SOCKET_STATE OldState; LONG LingerWait = -1; + DWORD References; /* Create the Wait Event */ Status = NtCreateEvent(&SockEvent, @@ -463,7 +546,7 @@ } /* If a Close is already in Process, give up */ - if (Socket->SharedData.State == SocketClosed) + if (Socket->State == SocketClosed) { WARN("Socket is closing.\n"); NtClose(SockEvent); @@ -470,14 +553,18 @@ *lpErrno = WSAENOTSOCK; return SOCKET_ERROR; } - /* Set the state to close */ - OldState = Socket->SharedData.State; - Socket->SharedData.State = SocketClosed; + OldState = Socket->State; + Socket->State = SocketClosed; + /* Decrement reference count on SharedData */ + References = InterlockedDecrement(&Socket->SharedData->RefCount); + if (References) + goto ok; + /* If SO_LINGER is ON and the Socket is connected, we need to disconnect */ /* FIXME: Should we do this on Datagram Sockets too? */ - if ((OldState == SocketConnected) && (Socket->SharedData.LingerData.l_onoff)) + if ((OldState == SocketConnected) && (Socket->SharedData->LingerData.l_onoff)) { ULONG SendsInProgress; ULONG SleepWait; @@ -484,7 +571,7 @@ /* We need to respect the timeout */ SleepWait = 100; - LingerWait = Socket->SharedData.LingerData.l_linger * 1000; + LingerWait = Socket->SharedData->LingerData.l_linger * 1000; /* Loop until no more sends are pending, within the timeout */ while (LingerWait) @@ -514,11 +601,11 @@ * go on since asyncronous operation is expected * and we cannot offer it */ - if (Socket->SharedData.NonBlocking) + if (Socket->SharedData->NonBlocking) { WARN("Would block!\n"); NtClose(SockEvent); - Socket->SharedData.State = OldState; + Socket->State = OldState; *lpErrno = WSAEWOULDBLOCK; return SOCKET_ERROR; } @@ -542,8 +629,8 @@ DisconnectInfo.Timeout = RtlConvertLongToLargeInteger(0); DisconnectInfo.DisconnectType = LingerWait < 0 ? AFD_DISCONNECT_SEND : AFD_DISCONNECT_ABORT; - if (((DisconnectInfo.DisconnectType & AFD_DISCONNECT_SEND) && (!Socket->SharedData.SendShutdown)) || - ((DisconnectInfo.DisconnectType & AFD_DISCONNECT_ABORT) && (!Socket->SharedData.ReceiveShutdown))) + if (((DisconnectInfo.DisconnectType & AFD_DISCONNECT_SEND) && (!Socket->SharedData->SendShutdown)) || + ((DisconnectInfo.DisconnectType & AFD_DISCONNECT_ABORT) && (!Socket->SharedData->ReceiveShutdown))) { /* Send IOCTL */ Status = NtDeviceIoControlFile((HANDLE)Handle, @@ -569,12 +656,12 @@ /* Cleanup Time! */ Socket->HelperContext = NULL; - Socket->SharedData.AsyncDisabledEvents = -1; + Socket->SharedData->AsyncDisabledEvents = -1; NtClose(Socket->TdiAddressHandle); Socket->TdiAddressHandle = NULL; NtClose(Socket->TdiConnectionHandle); Socket->TdiConnectionHandle = NULL; - +ok: EnterCriticalSection(&SocketListLock); if (SocketListHead == Socket) { @@ -600,6 +687,7 @@ NtClose((HANDLE)Handle); NtClose(SockEvent); + if (!References) HeapFree(GlobalHeap, 0, Socket->SharedData); HeapFree(GlobalHeap, 0, Socket); return MsafdReturnWithErrno(Status, lpErrno, 0, NULL); } @@ -671,7 +759,7 @@ &SocketInfo); /* Set the Share Type */ - if (Socket->SharedData.ExclusiveAddressUse) + if (Socket->SharedData->ExclusiveAddressUse) { BindData->ShareType = AFD_SHARE_EXCLUSIVE; } @@ -679,7 +767,7 @@ { BindData->ShareType = AFD_SHARE_WILDCARD; } - else if (Socket->SharedData.ReuseAddresses) + else if (Socket->SharedData->ReuseAddresses) { BindData->ShareType = AFD_SHARE_REUSE; } @@ -696,9 +784,9 @@ &IOSB, IOCTL_AFD_BIND, BindData, - 0xA + Socket->SharedData.SizeOfLocalAddress, /* Can't figure out a way to calculate this in C*/ + 0xA + Socket->SharedData->SizeOfLocalAddress, /* Can't figure out a way to calculate this in C*/ BindData, - 0xA + Socket->SharedData.SizeOfLocalAddress); /* Can't figure out a way to calculate this C */ + 0xA + Socket->SharedData->SizeOfLocalAddress); /* Can't figure out a way to calculate this C */ /* Wait for return */ if (Status == STATUS_PENDING) @@ -714,7 +802,7 @@ return MsafdReturnWithErrno ( Status, lpErrno, 0, NULL ); /* Set up Socket Data */ - Socket->SharedData.State = SocketBound; + Socket->State = SocketBound; Socket->TdiAddressHandle = (HANDLE)IOSB.Information; if (Socket->HelperEvents & WSH_NOTIFY_BIND) @@ -755,7 +843,7 @@ return SOCKET_ERROR; } - if (Socket->SharedData.Listening) + if (Socket->SharedData->Listening) return 0; Status = NtCreateEvent(&SockEvent, @@ -769,7 +857,7 @@ /* Set Up Listen Structure */ ListenData.UseSAN = FALSE; - ListenData.UseDelayedAcceptance = Socket->SharedData.UseDelayedAcceptance; + ListenData.UseDelayedAcceptance = Socket->SharedData->UseDelayedAcceptance; ListenData.Backlog = Backlog; /* Send IOCTL */ @@ -797,7 +885,7 @@ return MsafdReturnWithErrno ( Status, lpErrno, 0, NULL ); /* Set to Listening */ - Socket->SharedData.Listening = TRUE; + Socket->SharedData->Listening = TRUE; if (Socket->HelperEvents & WSH_NOTIFY_LISTEN) { @@ -890,6 +978,8 @@ if(!NT_SUCCESS(Status)) { + if (lpErrno) + *lpErrno = WSAEFAULT; ERR("NtCreateEvent failed, 0x%08x\n", Status); return SOCKET_ERROR; } @@ -1154,7 +1244,7 @@ if (lpfnCondition != NULL) { - if ((Socket->SharedData.ServiceFlags1 & XP1_CONNECT_DATA) != 0) + if ((Socket->SharedData->ServiceFlags1 & XP1_CONNECT_DATA) != 0) { /* Find out how much data is pending */ PendingAcceptData.SequenceNumber = ListenReceiveData->SequenceNumber; @@ -1230,7 +1320,7 @@ } } - if ((Socket->SharedData.ServiceFlags1 & XP1_QOS_SUPPORTED) != 0) + if ((Socket->SharedData->ServiceFlags1 & XP1_QOS_SUPPORTED) != 0) { /* I don't support this yet */ } @@ -1237,7 +1327,7 @@ /* Build Callee ID */ CalleeID.buf = (PVOID)Socket->LocalAddress; - CalleeID.len = Socket->SharedData.SizeOfLocalAddress; + CalleeID.len = Socket->SharedData->SizeOfLocalAddress; RemoteAddress = HeapAlloc(GlobalHeap, 0, sizeof(*RemoteAddress)); if (!RemoteAddress) @@ -1260,7 +1350,7 @@ CallerData.len = PendingDataLength; /* Check if socket supports Conditional Accept */ - if (Socket->SharedData.UseDelayedAcceptance != 0) + if (Socket->SharedData->UseDelayedAcceptance != 0) { /* Allocate Buffer for Callee Data */ CalleeDataBuffer = HeapAlloc(GlobalHeap, 0, 4096); @@ -1295,7 +1385,7 @@ if (CallBack == CF_ACCEPT) { - if ((Socket->SharedData.ServiceFlags1 & XP1_QOS_SUPPORTED) != 0) + if ((Socket->SharedData->ServiceFlags1 & XP1_QOS_SUPPORTED) != 0) { /* I don't support this yet */ } @@ -1351,12 +1441,12 @@ } /* Create a new Socket */ - AcceptSocket = WSPSocket (Socket->SharedData.AddressFamily, - Socket->SharedData.SocketType, - Socket->SharedData.Protocol, + AcceptSocket = WSPSocket (Socket->SharedData->AddressFamily, + Socket->SharedData->SocketType, + Socket->SharedData->Protocol, &Socket->ProtocolInfo, GroupID, - Socket->SharedData.CreateFlags, + Socket->SharedData->CreateFlags, lpErrno); if (AcceptSocket == INVALID_SOCKET) return INVALID_SOCKET; @@ -1401,7 +1491,7 @@ return INVALID_SOCKET; } - AcceptSocketInfo->SharedData.State = SocketConnected; + AcceptSocketInfo->State = SocketConnected; /* Return Address in SOCKADDR FORMAT */ if( SocketAddress ) @@ -1485,7 +1575,7 @@ } /* Bind us First */ - if (Socket->SharedData.State == SocketOpen) + if (Socket->State == SocketOpen) { /* Get the Wildcard Address */ BindAddressLength = Socket->HelperData->MaxWSAddressLength; @@ -1555,9 +1645,9 @@ * at the end of this function right after the Async Thread disables it. * This should only happen at the *next* WSPConnect */ - if (Socket->SharedData.AsyncEvents & FD_CONNECT) + if (Socket->SharedData->AsyncEvents & FD_CONNECT) { - Socket->SharedData.AsyncDisabledEvents |= FD_CONNECT | FD_WRITE; + Socket->SharedData->AsyncDisabledEvents |= FD_CONNECT | FD_WRITE; } /* Tell AFD that we want Connection Data back, have it allocate a buffer */ @@ -1592,7 +1682,7 @@ ConnectInfo->Unknown = 0; /* FIXME: Handle Async Connect */ - if (Socket->SharedData.NonBlocking) + if (Socket->SharedData->NonBlocking) { ERR("Async Connect UNIMPLEMENTED!\n"); } @@ -1618,7 +1708,7 @@ if (Status != STATUS_SUCCESS) goto notify; - Socket->SharedData.State = SocketConnected; + Socket->State = SocketConnected; Socket->TdiConnectionHandle = (HANDLE)IOSB.Information; /* Get any pending connect data */ @@ -1724,16 +1814,16 @@ { case SD_RECEIVE: DisconnectInfo.DisconnectType = AFD_DISCONNECT_RECV; - Socket->SharedData.ReceiveShutdown = TRUE; + Socket->SharedData->ReceiveShutdown = TRUE; break; case SD_SEND: DisconnectInfo.DisconnectType= AFD_DISCONNECT_SEND; - Socket->SharedData.SendShutdown = TRUE; + Socket->SharedData->SendShutdown = TRUE; break; case SD_BOTH: DisconnectInfo.DisconnectType = AFD_DISCONNECT_RECV | AFD_DISCONNECT_SEND; - Socket->SharedData.ReceiveShutdown = TRUE; - Socket->SharedData.SendShutdown = TRUE; + Socket->SharedData->ReceiveShutdown = TRUE; + Socket->SharedData->SendShutdown = TRUE; break; } @@ -1808,7 +1898,7 @@ /* Allocate a buffer for the address */ TdiAddressSize = - sizeof(TRANSPORT_ADDRESS) + Socket->SharedData.SizeOfLocalAddress; + sizeof(TRANSPORT_ADDRESS) + Socket->SharedData->SizeOfLocalAddress; TdiAddress = HeapAlloc(GlobalHeap, 0, TdiAddressSize); if ( TdiAddress == NULL ) @@ -1843,13 +1933,13 @@ if (NT_SUCCESS(Status)) { - if (*NameLength >= Socket->SharedData.SizeOfLocalAddress) + if (*NameLength >= Socket->SharedData->SizeOfLocalAddress) { Name->sa_family = SocketAddress->Address[0].AddressType; RtlCopyMemory (Name->sa_data, SocketAddress->Address[0].Address, SocketAddress->Address[0].AddressLength); - *NameLength = Socket->SharedData.SizeOfLocalAddress; + *NameLength = Socket->SharedData->SizeOfLocalAddress; TRACE("NameLength %d Address: %x Port %x\n", *NameLength, ((struct sockaddr_in *)Name)->sin_addr.s_addr, ((struct sockaddr_in *)Name)->sin_port); @@ -1902,7 +1992,7 @@ return SOCKET_ERROR; } - if (Socket->SharedData.State != SocketConnected) + if (Socket->State != SocketConnected) { NtClose(SockEvent); *lpErrno = WSAENOTCONN; @@ -1917,7 +2007,7 @@ } /* Allocate a buffer for the address */ - TdiAddressSize = sizeof(TRANSPORT_ADDRESS) + Socket->SharedData.SizeOfRemoteAddress; + TdiAddressSize = sizeof(TRANSPORT_ADDRESS) + Socket->SharedData->SizeOfRemoteAddress; SocketAddress = HeapAlloc(GlobalHeap, 0, TdiAddressSize); if ( SocketAddress == NULL ) @@ -1950,13 +2040,13 @@ if (NT_SUCCESS(Status)) { - if (*NameLength >= Socket->SharedData.SizeOfRemoteAddress) + if (*NameLength >= Socket->SharedData->SizeOfRemoteAddress) { Name->sa_family = SocketAddress->Address[0].AddressType; RtlCopyMemory (Name->sa_data, SocketAddress->Address[0].Address, SocketAddress->Address[0].AddressLength); - *NameLength = Socket->SharedData.SizeOfRemoteAddress; + *NameLength = Socket->SharedData->SizeOfRemoteAddress; TRACE("NameLength %d Address: %x Port %x\n", *NameLength, ((struct sockaddr_in *)Name)->sin_addr.s_addr, ((struct sockaddr_in *)Name)->sin_port); @@ -2019,7 +2109,7 @@ return SOCKET_ERROR; } NonBlocking = *((PULONG)lpvInBuffer) ? TRUE : FALSE; - Socket->SharedData.NonBlocking = NonBlocking ? 1 : 0; + Socket->SharedData->NonBlocking = NonBlocking ? 1 : 0; *lpErrno = SetSocketInformation(Socket, AFD_INFO_BLOCKING_MODE, &NonBlocking, NULL, NULL); if (*lpErrno != NO_ERROR) return SOCKET_ERROR; @@ -2109,56 +2199,56 @@ switch (OptionName) { case SO_TYPE: - Buffer = &Socket->SharedData.SocketType; + Buffer = &Socket->SharedData->SocketType; BufferSize = sizeof(INT); break; case SO_RCVBUF: - Buffer = &Socket->SharedData.SizeOfRecvBuffer; + Buffer = &Socket->SharedData->SizeOfRecvBuffer; BufferSize = sizeof(INT); break; case SO_SNDBUF: - Buffer = &Socket->SharedData.SizeOfSendBuffer; + Buffer = &Socket->SharedData->SizeOfSendBuffer; BufferSize = sizeof(INT); break; case SO_ACCEPTCONN: - BoolBuffer = Socket->SharedData.Listening; + BoolBuffer = Socket->SharedData->Listening; Buffer = &BoolBuffer; BufferSize = sizeof(BOOL); break; case SO_BROADCAST: - BoolBuffer = Socket->SharedData.Broadcast; + BoolBuffer = Socket->SharedData->Broadcast; Buffer = &BoolBuffer; BufferSize = sizeof(BOOL); break; case SO_DEBUG: - BoolBuffer = Socket->SharedData.Debug; + BoolBuffer = Socket->SharedData->Debug; Buffer = &BoolBuffer; BufferSize = sizeof(BOOL); break; case SO_DONTLINGER: - BoolBuffer = (Socket->SharedData.LingerData.l_onoff == 0); + BoolBuffer = (Socket->SharedData->LingerData.l_onoff == 0); Buffer = &BoolBuffer; BufferSize = sizeof(BOOL); break; case SO_LINGER: - if (Socket->SharedData.SocketType == SOCK_DGRAM) + if (Socket->SharedData->SocketType == SOCK_DGRAM) { *lpErrno = WSAENOPROTOOPT; return SOCKET_ERROR; } - Buffer = &Socket->SharedData.LingerData; + Buffer = &Socket->SharedData->LingerData; BufferSize = sizeof(struct linger); break; case SO_OOBINLINE: - BoolBuffer = (Socket->SharedData.OobInline != 0); + BoolBuffer = (Socket->SharedData->OobInline != 0); Buffer = &BoolBuffer; BufferSize = sizeof(BOOL); break; @@ -2169,19 +2259,19 @@ goto SendToHelper; case SO_CONDITIONAL_ACCEPT: - BoolBuffer = (Socket->SharedData.UseDelayedAcceptance != 0); + BoolBuffer = (Socket->SharedData->UseDelayedAcceptance != 0); Buffer = &BoolBuffer; BufferSize = sizeof(BOOL); break; case SO_REUSEADDR: - BoolBuffer = (Socket->SharedData.ReuseAddresses != 0); + BoolBuffer = (Socket->SharedData->ReuseAddresses != 0); Buffer = &BoolBuffer; BufferSize = sizeof(BOOL); break; case SO_EXCLUSIVEADDRUSE: - BoolBuffer = (Socket->SharedData.ExclusiveAddressUse != 0); + BoolBuffer = (Socket->SharedData->ExclusiveAddressUse != 0); Buffer = &BoolBuffer; BufferSize = sizeof(BOOL); break; @@ -2195,11 +2285,11 @@ BufferSize = sizeof(INT); break; case SO_SNDTIMEO: - Buffer = &Socket->SharedData.SendTimeout; + Buffer = &Socket->SharedData->SendTimeout; BufferSize = sizeof(DWORD); break; case SO_RCVTIMEO: - Buffer = &Socket->SharedData.RecvTimeout; + Buffer = &Socket->SharedData->RecvTimeout; BufferSize = sizeof(DWORD); break; case SO_PROTOCOL_INFOW: @@ -2276,7 +2366,7 @@ *lpErrno = WSAEFAULT; return SOCKET_ERROR; } - Socket->SharedData.Broadcast = (*optval != 0) ? 1 : 0; + Socket->SharedData->Broadcast = (*optval != 0) ? 1 : 0; return 0; case SO_DONTLINGER: @@ -2285,7 +2375,7 @@ *lpErrno = WSAEFAULT; return SOCKET_ERROR; } - Socket->SharedData.LingerData.l_onoff = (*optval != 0) ? 0 : 1; + Socket->SharedData->LingerData.l_onoff = (*optval != 0) ? 0 : 1; return 0; case SO_REUSEADDR: @@ -2294,7 +2384,7 @@ *lpErrno = WSAEFAULT; return SOCKET_ERROR; } - Socket->SharedData.ReuseAddresses = (*optval != 0) ? 1 : 0; + Socket->SharedData->ReuseAddresses = (*optval != 0) ? 1 : 0; return 0; case SO_EXCLUSIVEADDRUSE: @@ -2303,7 +2393,7 @@ *lpErrno = WSAEFAULT; return SOCKET_ERROR; } - Socket->SharedData.ExclusiveAddressUse = (*optval != 0) ? 1 : 0; + Socket->SharedData->ExclusiveAddressUse = (*optval != 0) ? 1 : 0; return 0; case SO_LINGER: @@ -2312,7 +2402,7 @@ *lpErrno = WSAEFAULT; return SOCKET_ERROR; } - RtlCopyMemory(&Socket->SharedData.LingerData, + RtlCopyMemory(&Socket->SharedData->LingerData, optval, sizeof(struct linger)); return 0; @@ -2335,7 +2425,7 @@ return SOCKET_ERROR; } - RtlCopyMemory(&Socket->SharedData.SendTimeout, + RtlCopyMemory(&Socket->SharedData->SendTimeout, optval, sizeof(DWORD)); return 0; @@ -2347,7 +2437,7 @@ return SOCKET_ERROR; } - RtlCopyMemory(&Socket->SharedData.RecvTimeout, + RtlCopyMemory(&Socket->SharedData->RecvTimeout, optval, sizeof(DWORD)); return 0; @@ -2792,14 +2882,14 @@ return -1; /* Create Context */ - ContextData.SharedData = Socket->SharedData; + ContextData.SharedData = *Socket->SharedData; ContextData.SizeOfHelperData = 0; RtlCopyMemory (&ContextData.LocalAddress, Socket->LocalAddress, - Socket->SharedData.SizeOfLocalAddress); + Socket->SharedData->SizeOfLocalAddress); RtlCopyMemory (&ContextData.RemoteAddress, Socket->RemoteAddress, - Socket->SharedData.SizeOfRemoteAddress); + Socket->SharedData->SizeOfRemoteAddress); /* Send IOCTL */ Status = NtDeviceIoControlFile((HANDLE)Socket->Handle, @@ -2991,7 +3081,7 @@ Socket = AsyncData->ParentSocket; /* Check if the Sequence Number Changed behind our back */ - if (AsyncData->SequenceNumber != Socket->SharedData.SequenceNumber ) + if (AsyncData->SequenceNumber != Socket->SharedData->SequenceNumber ) { return; } @@ -3008,44 +3098,44 @@ switch (AsyncData->AsyncSelectInfo.Handles[0].Events & x) { case AFD_EVENT_RECEIVE: - if (0 != (Socket->SharedData.AsyncEvents & FD_READ) && - 0 == (Socket->SharedData.AsyncDisabledEvents & FD_READ)) + if (0 != (Socket->SharedData->AsyncEvents & FD_READ) && + 0 == (Socket->SharedData->AsyncDisabledEvents & FD_READ)) { /* Make the Notifcation */ - (Upcalls.lpWPUPostMessage)(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, + (Upcalls.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; + Socket->SharedData->AsyncDisabledEvents |= FD_READ; } break; case AFD_EVENT_OOB_RECEIVE: - if (0 != (Socket->SharedData.AsyncEvents & FD_OOB) && - 0 == (Socket->SharedData.AsyncDisabledEvents & FD_OOB)) + if (0 != (Socket->SharedData->AsyncEvents & FD_OOB) && + 0 == (Socket->SharedData->AsyncDisabledEvents & FD_OOB)) { /* Make the Notifcation */ - (Upcalls.lpWPUPostMessage)(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, + (Upcalls.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; + Socket->SharedData->AsyncDisabledEvents |= FD_OOB; } break; case AFD_EVENT_SEND: - if (0 != (Socket->SharedData.AsyncEvents & FD_WRITE) && - 0 == (Socket->SharedData.AsyncDisabledEvents & FD_WRITE)) + if (0 != (Socket->SharedData->AsyncEvents & FD_WRITE) && + 0 == (Socket->SharedData->AsyncDisabledEvents & FD_WRITE)) { /* Make the Notifcation */ - (Upcalls.lpWPUPostMessage)(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, + (Upcalls.lpWPUPostMessage)(Socket->SharedData->hWnd, + Socket->SharedData->wMsg, Socket->Handle, WSAMAKESELECTREPLY(FD_WRITE, 0)); /* Disable this event until the next write(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_WRITE; + Socket->SharedData->AsyncDisabledEvents |= FD_WRITE; } break; @@ -3052,30 +3142,30 @@ /* FIXME: THIS IS NOT RIGHT!!! HACK HACK HACK! */ case AFD_EVENT_CONNECT: case AFD_EVENT_CONNECT_FAIL: - if (0 != (Socket->SharedData.AsyncEvents & FD_CONNECT) && - 0 == (Socket->SharedData.AsyncDisabledEvents & FD_CONNECT)) + if (0 != (Socket->SharedData->AsyncEvents & FD_CONNECT) && + 0 == (Socket->SharedData->AsyncDisabledEvents & FD_CONNECT)) { /* Make the Notifcation */ - (Upcalls.lpWPUPostMessage)(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, + (Upcalls.lpWPUPostMessage)(Socket->SharedData->hWnd, + Socket->SharedData->wMsg, Socket->Handle, WSAMAKESELECTREPLY(FD_CONNECT, 0)); /* Disable this event forever; */ - Socket->SharedData.AsyncDisabledEvents |= FD_CONNECT; + Socket->SharedData->AsyncDisabledEvents |= FD_CONNECT; } break; case AFD_EVENT_ACCEPT: - if (0 != (Socket->SharedData.AsyncEvents & FD_ACCEPT) && - 0 == (Socket->SharedData.AsyncDisabledEvents & FD_ACCEPT)) + if (0 != (Socket->SharedData->AsyncEvents & FD_ACCEPT) && + 0 == (Socket->SharedData->AsyncDisabledEvents & FD_ACCEPT)) { /* Make the Notifcation */ - (Upcalls.lpWPUPostMessage)(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, + (Upcalls.lpWPUPostMessage)(Socket->SharedData->hWnd, + Socket->SharedData->wMsg, Socket->Handle, WSAMAKESELECTREPLY(FD_ACCEPT, 0)); /* Disable this event until the next accept(); */ - Socket->SharedData.AsyncDisabledEvents |= FD_ACCEPT; + Socket->SharedData->AsyncDisabledEvents |= FD_ACCEPT; } break; @@ -3082,16 +3172,16 @@ case AFD_EVENT_DISCONNECT: case AFD_EVENT_ABORT: case AFD_EVENT_CLOSE: - if (0 != (Socket->SharedData.AsyncEvents & FD_CLOSE) && - 0 == (Socket->SharedData.AsyncDisabledEvents & FD_CLOSE)) + if (0 != (Socket->SharedData->AsyncEvents & FD_CLOSE) && + 0 == (Socket->SharedData->AsyncDisabledEvents & FD_CLOSE)) { /* Make the Notifcation */ - (Upcalls.lpWPUPostMessage)(Socket->SharedData.hWnd, - Socket->SharedData.wMsg, + (Upcalls.lpWPUPostMessage)(Socket->SharedData->hWnd, + Socket->SharedData->wMsg, Socket->Handle, WSAMAKESELECTREPLY(FD_CLOSE, 0)); /* Disable this event forever; */ - Socket->SharedData.AsyncDisabledEvents |= FD_CLOSE; + Socket->SharedData->AsyncDisabledEvents |= FD_CLOSE; } break; /* FIXME: Support QOS */ @@ -3099,7 +3189,7 @@ } /* Check if there are any events left for us to check */ - if ((Socket->SharedData.AsyncEvents & (~Socket->SharedData.AsyncDisabledEvents)) == 0 ) + if ((Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents)) == 0 ) { return; } @@ -3124,7 +3214,7 @@ AsyncData->AsyncSelectInfo.Handles[0].Events = 0; /* Remove unwanted events */ - lNetworkEvents = Socket->SharedData.AsyncEvents & (~Socket->SharedData.AsyncDisabledEvents); + lNetworkEvents = Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents); /* Set Events to wait for */ if (lNetworkEvents & FD_READ) @@ -3202,13 +3292,13 @@ Socket = AsyncData->ParentSocket; /* If someone closed it, stop the function */ - if (Socket->SharedData.State != SocketClosed) + if (Socket->State != SocketClosed) { /* Check if the Sequence Number changed by now, in which case quit */ - if (AsyncData->SequenceNumber == Socket->SharedData.SequenceNumber) + if (AsyncData->SequenceNumber == Socket->SharedData->SequenceNumber) { /* Do the actuall select, if needed */ - if ((Socket->SharedData.AsyncEvents & (~Socket->SharedData.AsyncDisabledEvents))) + if ((Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents))) { SockProcessAsyncSelect(Socket, AsyncData); FreeContext = FALSE; @@ -3232,16 +3322,16 @@ PASYNC_DATA AsyncData; /* Make sure the event is actually disabled */ - if (!(Socket->SharedData.AsyncDisabledEvents & Event)) + if (!(Socket->SharedData->AsyncDisabledEvents & Event)) { return; } /* Re-enable it */ - Socket->SharedData.AsyncDisabledEvents &= ~Event; + Socket->SharedData->AsyncDisabledEvents &= ~Event; /* Return if no more events are being polled */ - if ((Socket->SharedData.AsyncEvents & (~Socket->SharedData.AsyncDisabledEvents)) == 0 ) + if ((Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents)) == 0 ) { return; } @@ -3254,11 +3344,11 @@ SockCreateOrReferenceAsyncThread(); /* Increase the sequence number to stop anything else */ - Socket->SharedData.SequenceNumber++; + Socket->SharedData->SequenceNumber++; /* Set up the Async Data */ AsyncData->ParentSocket = Socket; - AsyncData->SequenceNumber = Socket->SharedData.SequenceNumber; + AsyncData->SequenceNumber = Socket->SharedData->SequenceNumber; /* Begin Async Select by using I/O Completion */ NtSetIoCompletion(SockAsyncCompletionPort, Index: dll/win32/msafd/misc/event.c =================================================================== --- dll/win32/msafd/misc/event.c (revision 72898) +++ dll/win32/msafd/misc/event.c (working copy) @@ -47,14 +47,14 @@ /* Set Socket to Non-Blocking */ BlockMode = TRUE; SetSocketInformation(Socket, AFD_INFO_BLOCKING_MODE, &BlockMode, NULL, NULL); - Socket->SharedData.NonBlocking = TRUE; + Socket->SharedData->NonBlocking = TRUE; /* Deactivate Async Select if there is one */ if (Socket->EventObject) { - Socket->SharedData.hWnd = NULL; - Socket->SharedData.wMsg = 0; - Socket->SharedData.AsyncEvents = 0; - Socket->SharedData.SequenceNumber++; // This will kill Async Select after the next completion + Socket->SharedData->hWnd = NULL; + Socket->SharedData->wMsg = 0; + Socket->SharedData->AsyncEvents = 0; + Socket->SharedData->SequenceNumber++; // This will kill Async Select after the next completion } /* Set Structure Info */ Index: dll/win32/msafd/misc/sndrcv.c =================================================================== --- dll/win32/msafd/misc/sndrcv.c (revision 72898) +++ dll/win32/msafd/misc/sndrcv.c (working copy) @@ -46,10 +46,10 @@ /* Change the Socket to Non Blocking */ BlockMode = TRUE; SetSocketInformation(Socket, AFD_INFO_BLOCKING_MODE, &BlockMode, NULL, NULL); - Socket->SharedData.NonBlocking = TRUE; + Socket->SharedData->NonBlocking = TRUE; /* Deactive WSPEventSelect */ - if (Socket->SharedData.AsyncEvents) + if (Socket->SharedData->AsyncEvents) { if (WSPEventSelect(Handle, NULL, 0, lpErrno) == SOCKET_ERROR) { @@ -65,14 +65,14 @@ SockGetAsyncSelectHelperAfdHandle(); /* Store Socket Data */ - Socket->SharedData.hWnd = hWnd; - Socket->SharedData.wMsg = wMsg; - Socket->SharedData.AsyncEvents = lEvent; - Socket->SharedData.AsyncDisabledEvents = 0; - Socket->SharedData.SequenceNumber++; + Socket->SharedData->hWnd = hWnd; + Socket->SharedData->wMsg = wMsg; + Socket->SharedData->AsyncEvents = lEvent; + Socket->SharedData->AsyncDisabledEvents = 0; + Socket->SharedData->SequenceNumber++; /* Return if there are no more Events */ - if ((Socket->SharedData.AsyncEvents & (~Socket->SharedData.AsyncDisabledEvents)) == 0) + if ((Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents)) == 0) { HeapFree(GetProcessHeap(), 0, AsyncData); return 0; @@ -80,7 +80,7 @@ /* Set up the Async Data */ AsyncData->ParentSocket = Socket; - AsyncData->SequenceNumber = Socket->SharedData.SequenceNumber; + AsyncData->SequenceNumber = Socket->SharedData->SequenceNumber; /* Begin Async Select by using I/O Completion */ NtSetIoCompletion(SockAsyncCompletionPort, @@ -136,7 +136,7 @@ RecvInfo.BufferArray = (PAFD_WSABUF)lpBuffers; RecvInfo.BufferCount = dwBufferCount; RecvInfo.TdiFlags = 0; - RecvInfo.AfdFlags = Socket->SharedData.NonBlocking ? AFD_IMMEDIATE : 0; + RecvInfo.AfdFlags = Socket->SharedData->NonBlocking ? AFD_IMMEDIATE : 0; /* Set the TDI Flags */ if (*ReceiveFlags == 0) @@ -281,7 +281,7 @@ return SOCKET_ERROR; } - if (!(Socket->SharedData.ServiceFlags1 & XP1_CONNECTIONLESS)) + if (!(Socket->SharedData->ServiceFlags1 & XP1_CONNECTIONLESS)) { /* Call WSPRecv for a non-datagram socket */ return WSPRecv(Handle, @@ -295,6 +295,22 @@ lpErrno); } + /* Bind us First */ + if (Socket->State == SocketOpen) + { +#if 0 + Socket->HelperData->WSHGetWildcardSockaddr(Socket->HelperContext, + SocketAddress, + SocketAddressLength); + /* Bind it */ + if (WSPBind(Handle, SocketAddress, *SocketAddressLength, lpErrno) == SOCKET_ERROR) + return SOCKET_ERROR; +#else + *lpErrno = WSAEINVAL; + return SOCKET_ERROR; +#endif + } + Status = NtCreateEvent( &SockEvent, EVENT_ALL_ACCESS, NULL, 1, FALSE ); @@ -305,7 +321,7 @@ RecvInfo.BufferArray = (PAFD_WSABUF)lpBuffers; RecvInfo.BufferCount = dwBufferCount; RecvInfo.TdiFlags = 0; - RecvInfo.AfdFlags = Socket->SharedData.NonBlocking ? AFD_IMMEDIATE : 0; + RecvInfo.AfdFlags = Socket->SharedData->NonBlocking ? AFD_IMMEDIATE : 0; RecvInfo.AddressLength = SocketAddressLength; RecvInfo.Address = SocketAddress; @@ -457,7 +473,7 @@ SendInfo.BufferArray = (PAFD_WSABUF)lpBuffers; SendInfo.BufferCount = dwBufferCount; SendInfo.TdiFlags = 0; - SendInfo.AfdFlags = Socket->SharedData.NonBlocking ? AFD_IMMEDIATE : 0; + SendInfo.AfdFlags = Socket->SharedData->NonBlocking ? AFD_IMMEDIATE : 0; /* Set the TDI Flags */ if (iFlags) @@ -574,7 +590,7 @@ return SOCKET_ERROR; } - if (!(Socket->SharedData.ServiceFlags1 & XP1_CONNECTIONLESS)) + if (!(Socket->SharedData->ServiceFlags1 & XP1_CONNECTIONLESS)) { /* Use WSPSend for connection-oriented sockets */ return WSPSend(Handle, @@ -589,7 +605,7 @@ } /* Bind us First */ - if (Socket->SharedData.State == SocketOpen) + if (Socket->State == SocketOpen) { /* Get the Wildcard Address */ BindAddressLength = Socket->HelperData->MaxWSAddressLength; @@ -639,7 +655,7 @@ /* Set up Structure */ SendInfo.BufferArray = (PAFD_WSABUF)lpBuffers; - SendInfo.AfdFlags = Socket->SharedData.NonBlocking ? AFD_IMMEDIATE : 0; + SendInfo.AfdFlags = Socket->SharedData->NonBlocking ? AFD_IMMEDIATE : 0; SendInfo.BufferCount = dwBufferCount; SendInfo.TdiConnection.RemoteAddress = RemoteAddress; SendInfo.TdiConnection.RemoteAddressLength = Socket->HelperData->MaxTDIAddressLength; Index: dll/win32/msafd/misc/stubs.c =================================================================== --- dll/win32/msafd/misc/stubs.c (revision 72898) +++ dll/win32/msafd/misc/stubs.c (working copy) @@ -24,20 +24,6 @@ } -INT -WSPAPI -WSPDuplicateSocket( - IN SOCKET s, - IN DWORD dwProcessId, - OUT LPWSAPROTOCOL_INFOW lpProtocolInfo, - OUT LPINT lpErrno) -{ - UNIMPLEMENTED; - - return SOCKET_ERROR; -} - - BOOL WSPAPI WSPGetOverlappedResult( Index: dll/win32/msafd/msafd.h =================================================================== --- dll/win32/msafd/msafd.h (revision 72898) +++ dll/win32/msafd/msafd.h (working copy) @@ -46,7 +46,7 @@ } SOCKET_STATE, *PSOCKET_STATE; typedef struct _SOCK_SHARED_INFO { - SOCKET_STATE State; + LONG RefCount; INT AddressFamily; INT SocketType; INT Protocol; @@ -84,12 +84,14 @@ UINT wMsg; LONG AsyncEvents; LONG AsyncDisabledEvents; + SOCKADDR WSLocalAddress; + SOCKADDR WSRemoteAddress; } SOCK_SHARED_INFO, *PSOCK_SHARED_INFO; typedef struct _SOCKET_INFORMATION { - ULONG RefCount; SOCKET Handle; - SOCK_SHARED_INFO SharedData; + SOCKET_STATE State; + PSOCK_SHARED_INFO SharedData; DWORD HelperEvents; PHELPER_DATA HelperData; PVOID HelperContext; @@ -103,8 +105,6 @@ CRITICAL_SECTION Lock; PVOID SanData; BOOL TrySAN; - SOCKADDR WSLocalAddress; - SOCKADDR WSRemoteAddress; WSAPROTOCOL_INFOW ProtocolInfo; struct _SOCKET_INFORMATION *NextSocket; } SOCKET_INFORMATION, *PSOCKET_INFORMATION;