Example #1
0
//
// 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;
}
Example #2
0
//
// 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;
}