00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "lspdef.h"
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 BOOL
00035 LoadExtensionFunction(
00036 FARPROC **func,
00037 GUID ExtensionGuid,
00038 LPWSPIOCTL fnIoctl,
00039 SOCKET s
00040 )
00041 {
00042 DWORD dwBytes;
00043 int rc,
00044 error;
00045
00046
00047 rc = fnIoctl(
00048 s,
00049 SIO_GET_EXTENSION_FUNCTION_POINTER,
00050 &ExtensionGuid,
00051 sizeof(GUID),
00052 func,
00053 sizeof(FARPROC),
00054 &dwBytes,
00055 NULL,
00056 NULL,
00057 NULL,
00058 &error
00059 );
00060 if ( SOCKET_ERROR == rc )
00061 {
00062 dbgprint("LoadExtensionFunction: WSAIoctl (SIO_GET_EXTENSION_FUNCTION) failed: %d",
00063 error);
00064 return FALSE;
00065 }
00066 else
00067 {
00068 return TRUE;
00069 }
00070 }
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082 BOOL PASCAL FAR
00083 ExtConnectEx(
00084 IN SOCKET s,
00085 IN const struct sockaddr FAR *name,
00086 IN int namelen,
00087 IN PVOID lpSendBuffer OPTIONAL,
00088 IN DWORD dwSendDataLength,
00089 OUT LPDWORD lpdwBytesSent,
00090 IN LPOVERLAPPED lpOverlapped
00091 )
00092 {
00093 SOCKET_CONTEXT *sockContext = NULL;
00094 SOCKADDR *proxyAddr = NULL;
00095 int Errno = NO_ERROR,
00096 proxyLen = 0,
00097 rc = FALSE;
00098
00099 sockContext = FindSocketContext( s );
00100 if ( NULL == sockContext )
00101 {
00102 dbgprint("ExtConnectEx: FindSocketContext failed!");
00103 Errno = WSAENOTSOCK;
00104 goto cleanup;
00105 }
00106
00107
00108 if ( NULL == sockContext->Provider->NextProcTableExt.lpfnConnectEx )
00109 {
00110 GUID guidConnectEx = WSAID_CONNECTEX;
00111
00112 rc = LoadExtensionFunction(
00113 (FARPROC **)&sockContext->Provider->NextProcTableExt.lpfnConnectEx,
00114 guidConnectEx,
00115 sockContext->Provider->NextProcTable.lpWSPIoctl,
00116 s
00117 );
00118 if ( FALSE == rc )
00119 {
00120 dbgprint("Next proc table ConnectEx == NULL!");
00121 Errno = WSAEFAULT;
00122 goto cleanup;
00123 }
00124 }
00125
00126
00127 FindDestinationAddress( sockContext, name, namelen, &proxyAddr, &proxyLen );
00128
00129 rc = sockContext->Provider->NextProcTableExt.lpfnConnectEx(
00130 s,
00131 proxyAddr,
00132 proxyLen,
00133 lpSendBuffer,
00134 dwSendDataLength,
00135 lpdwBytesSent,
00136 lpOverlapped
00137 );
00138
00139 cleanup:
00140
00141 return rc;
00142 }