// // Function: WSPConnect // // Description: // This routine establishes a connection on a socket. For the LSP it first // determines if the destination is to be proxied to a different address. // Once the "correct" destination is determined, the connect call is passed // to the lower provider. // int WSPAPI WSPConnect( SOCKET s, const struct sockaddr FAR * name, int namelen, LPWSABUF lpCallerData, LPWSABUF lpCalleeData, LPQOS lpSQOS, LPQOS lpGQOS, LPINT lpErrno ) { SOCKET_CONTEXT *sockContext = NULL; SOCKADDR *proxyAddr = NULL; int proxyLen = 0, rc = SOCKET_ERROR; // Find the socket context sockContext = FindSocketContext( s ); if ( NULL == sockContext ) { *lpErrno = WSAENOTSOCK; goto cleanup; } ASSERT( sockContext->Provider->NextProcTable.lpWSPConnect ); FindDestinationAddress( sockContext, name, namelen, &proxyAddr, &proxyLen ); rc = sockContext->Provider->NextProcTable.lpWSPConnect( s, proxyAddr, proxyLen, lpCallerData, lpCalleeData, lpSQOS, lpGQOS, lpErrno ); cleanup: return rc; }
// // Function: ExtConnectEx // // Description: // This is our provider's ConnectEx function. When an app calls WSAIoctl // to request the function pointer to ConnectEx, we intercept the call // and return a pointer to our extension function instead. This ConnectEx // implementation needs to perform the same proxying check that WSPConnect // does. // BOOL PASCAL FAR ExtConnectEx( IN SOCKET s, IN const struct sockaddr FAR *name, IN int namelen, IN PVOID lpSendBuffer OPTIONAL, IN DWORD dwSendDataLength, OUT LPDWORD lpdwBytesSent, IN LPOVERLAPPED lpOverlapped ) { SOCKET_CONTEXT *sockContext = NULL; SOCKADDR *proxyAddr = NULL; int Errno = NO_ERROR, proxyLen = 0, rc = FALSE; sockContext = FindSocketContext( s ); if ( NULL == sockContext ) { dbgprint("ExtConnectEx: FindSocketContext failed!"); Errno = WSAENOTSOCK; goto cleanup; } // Make sure we already have the extension function if ( NULL == sockContext->Provider->NextProcTableExt.lpfnConnectEx ) { GUID guidConnectEx = WSAID_CONNECTEX; rc = LoadExtensionFunction( (FARPROC **)&sockContext->Provider->NextProcTableExt.lpfnConnectEx, guidConnectEx, sockContext->Provider->NextProcTable.lpWSPIoctl, s ); if ( FALSE == rc ) { dbgprint("Next proc table ConnectEx == NULL!"); Errno = WSAEFAULT; goto cleanup; } } // See if the connect needs to be proxied FindDestinationAddress( sockContext, name, namelen, &proxyAddr, &proxyLen ); rc = sockContext->Provider->NextProcTableExt.lpfnConnectEx( s, proxyAddr, proxyLen, lpSendBuffer, dwSendDataLength, lpdwBytesSent, lpOverlapped ); cleanup: return rc; }