00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 #include "lspdef.h"
00030 #include <strsafe.h>
00031 
00032 #include <stdio.h>
00033 #include <stdlib.h>
00034 
00035 #pragma warning(disable:4127)       // Disable "conditional expression is constant" warning
00036 
00037 #define DEFAULT_PRINT_BUFFER    512
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 CRITICAL_SECTION    gCriticalSection;   
00046 WSPUPCALLTABLE      gMainUpCallTable;   
00047 LPPROVIDER          gLayerInfo = NULL;  
00048 int                 gLayerCount = 0;    
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 static BOOL gDetached = FALSE;      
00057 static int  gStartupCount = 0;      
00058 
00059 
00060 int
00061 FindUrl( 
00062         __in_ecount(buflen) char *buf,
00063         int buflen,
00064         __out char **start
00065         );
00066 
00067 
00068 
00069 
00070 
00071 
00072 
00073 
00074 
00075 
00076 
00077 
00078 
00079 
00080 BOOL WINAPI 
00081 DllMain(
00082         IN HINSTANCE hinstDll, 
00083         IN DWORD dwReason, 
00084         LPVOID lpvReserved
00085        )
00086 {
00087     UNREFERENCED_PARAMETER( hinstDll );
00088     UNREFERENCED_PARAMETER( lpvReserved );
00089 
00090     switch (dwReason)
00091     {
00092 
00093         case DLL_PROCESS_ATTACH:
00094             
00095             
00096             
00097             __try
00098             {
00099                 InitializeCriticalSection( &gCriticalSection );
00100                 InitializeCriticalSection( &gDebugCritSec );
00101             }
00102             __except( EXCEPTION_EXECUTE_HANDLER )
00103             {
00104                 goto cleanup;
00105             }
00106             break;
00107 
00108         case DLL_THREAD_ATTACH:
00109             break;
00110 
00111         case DLL_THREAD_DETACH:
00112             break;
00113 
00114         case DLL_PROCESS_DETACH:
00115             gDetached = TRUE;
00116 
00117             EnterCriticalSection( &gCriticalSection );
00118             if ( NULL != gLayerInfo )
00119             {
00120                 int Error;
00121 
00122                 
00123                 
00124                 FreeLspProviders( gLayerInfo, gLayerCount, &Error );
00125                 gLayerInfo = NULL;
00126                 gLayerCount = 0;
00127             }
00128             LeaveCriticalSection( &gCriticalSection );
00129 
00130             DeleteCriticalSection( &gCriticalSection );
00131             DeleteCriticalSection( &gDebugCritSec );
00132 
00133             break;
00134     }
00135 
00136     return TRUE;
00137 
00138 cleanup:
00139 
00140     return FALSE;
00141 }
00142 
00143 
00144 
00145 
00146 
00147 
00148 
00149 
00150 int WSPAPI 
00151 WSPCleanup(
00152         LPINT lpErrno  
00153         )
00154 {
00155     int        rc = SOCKET_ERROR;
00156 
00157     if ( gDetached )
00158     {
00159         rc = NO_ERROR;
00160         goto cleanup;
00161     }
00162 
00163     
00164     
00165     
00166     EnterCriticalSection( &gCriticalSection );
00167 
00168     
00169     if ( 0 == gStartupCount )
00170     {
00171         *lpErrno = WSANOTINITIALISED;
00172         goto cleanup;
00173     }
00174 
00175     
00176     gStartupCount--;
00177 
00178     if ( 0 == gStartupCount )
00179     {
00180         
00181         
00182         FreeLspProviders( gLayerInfo, gLayerCount, lpErrno );
00183         gLayerInfo = NULL;
00184         gLayerCount = 0;
00185     }
00186     
00187     rc = NO_ERROR;
00188 
00189 cleanup:
00190 
00191     LeaveCriticalSection( &gCriticalSection );
00192 
00193     return rc;
00194 }
00195 
00196 
00197 
00198 
00199 
00200 
00201 
00202 
00203 int WSPAPI
00204 WSPCloseSocket(
00205         SOCKET s,
00206         LPINT  lpErrno
00207         )
00208 {
00209     SOCKET_CONTEXT *sockContext = NULL;
00210     int             rc = SOCKET_ERROR;
00211 
00212     
00213     sockContext = FindSocketContext( s, TRUE );
00214     if ( NULL == sockContext )
00215     {
00216         *lpErrno = WSAENOTSOCK;
00217         goto cleanup;
00218     }
00219 
00220     ASSERT( sockContext->Provider->NextProcTable.lpWSPCloseSocket );
00221 
00222     
00223     rc = sockContext->Provider->NextProcTable.lpWSPCloseSocket(
00224             s,
00225             lpErrno
00226             );
00227 
00228     
00229     LspFree( sockContext );
00230 
00231 cleanup:
00232 
00233     return rc;
00234 }
00235 
00236 
00237 
00238 
00239 
00240 
00241 
00242 
00243 
00244 
00245 int WSPAPI 
00246 WSPConnect(
00247         SOCKET                s,
00248         const struct sockaddr FAR * name,
00249         int                   namelen,
00250         LPWSABUF              lpCallerData,
00251         LPWSABUF              lpCalleeData,
00252         LPQOS                 lpSQOS,
00253         LPQOS                 lpGQOS,
00254         LPINT                 lpErrno
00255         )
00256 {
00257     SOCKET_CONTEXT *sockContext = NULL;
00258     SOCKADDR       *proxyAddr = NULL;
00259     int             proxyLen = 0,
00260                     rc = SOCKET_ERROR;
00261 
00262     
00263     sockContext = FindSocketContext( s );
00264     if ( NULL == sockContext )
00265     {
00266         *lpErrno = WSAENOTSOCK;
00267         goto cleanup;
00268     }
00269 
00270     ASSERT( sockContext->Provider->NextProcTable.lpWSPConnect );
00271 
00272     FindDestinationAddress( sockContext, name, namelen, &proxyAddr, &proxyLen );
00273 
00274     rc = sockContext->Provider->NextProcTable.lpWSPConnect(
00275             s,
00276             proxyAddr, 
00277             proxyLen, 
00278             lpCallerData, 
00279             lpCalleeData,
00280             lpSQOS, 
00281             lpGQOS, 
00282             lpErrno
00283             );
00284 
00285 cleanup:
00286 
00287     return rc;
00288 }
00289 
00290 
00291 
00292 
00293 
00294 
00295 
00296 
00297 
00298 int WSPAPI 
00299 WSPGetPeerName(  
00300         SOCKET          s,
00301         struct sockaddr FAR * name,
00302         LPINT           namelen,
00303         LPINT           lpErrno
00304         )
00305 {
00306     SOCKET_CONTEXT *sockContext = NULL;
00307     int             rc = SOCKET_ERROR;
00308 
00309     
00310     
00311     
00312     sockContext = FindSocketContext( s );
00313     if ( NULL == sockContext )
00314     {
00315         *lpErrno = WSAENOTSOCK;
00316         goto cleanup;
00317     }
00318 
00319     
00320     
00321     if ( TRUE == sockContext->Proxied )
00322     {
00323         __try
00324         {
00325             
00326             if ( *namelen < sockContext->AddressLength )
00327             {
00328                 *namelen = sockContext->AddressLength;
00329                 *lpErrno = WSAEFAULT;
00330                 goto cleanup;
00331             }
00332 
00333             memcpy( name, &sockContext->OriginalAddress, *namelen );
00334             *namelen = sockContext->AddressLength;
00335         } 
00336         __except( EXCEPTION_EXECUTE_HANDLER )
00337         {
00338             *lpErrno = WSAEFAULT;
00339             goto cleanup;
00340         }
00341 
00342         return NO_ERROR;
00343     }
00344 
00345     ASSERT( sockContext->Provider->NextProcTable.lpWSPGetPeerName );
00346 
00347     rc = sockContext->Provider->NextProcTable.lpWSPGetPeerName(
00348             s,
00349             name,
00350             namelen, 
00351             lpErrno
00352             );
00353 
00354 cleanup:
00355 
00356     return rc;
00357 }
00358 
00359 
00360 
00361 
00362 
00363 
00364 
00365 int WSPAPI
00366 WSPGetSockOpt(
00367         SOCKET s,
00368         int level,
00369         int optname,
00370         __out_bcount(*optlen) char FAR * optval,
00371         __inout LPINT optlen,
00372         LPINT lpErrno
00373         )
00374 {
00375     SOCKET_CONTEXT *sockContext = NULL;
00376     int             rc = NO_ERROR;
00377 
00378     
00379     sockContext = FindSocketContext( s );
00380     if ( NULL == sockContext )
00381     {
00382         *lpErrno = WSAENOTSOCK;
00383         rc = SOCKET_ERROR;
00384         goto cleanup;
00385     }
00386 
00387     ASSERT( sockContext->Provider->NextProcTable.lpWSPGetSockOpt );
00388 
00389     if ( ( SOL_SOCKET == level ) && (
00390             ( SO_PROTOCOL_INFOA == optname ) ||
00391             ( SO_PROTOCOL_INFOW == optname )
00392          )
00393        )
00394     {
00395         __try
00396         {
00397             switch ( optname )
00398             {
00399                 case SO_PROTOCOL_INFOA:
00400                     if (  *optlen <= sizeof( WSAPROTOCOL_INFOA ) )
00401                     {
00402                         *optlen = sizeof( WSAPROTOCOL_INFOA );
00403                         *lpErrno = WSAEFAULT;
00404                         rc = SOCKET_ERROR;
00405                         goto cleanup;
00406                     }
00407 
00408                     *optlen = sizeof( WSAPROTOCOL_INFOA );
00409                     memcpy( optval, &sockContext->Provider->LayerProvider,
00410                             sizeof( WSAPROTOCOL_INFOA ) );
00411 
00412                     break;
00413 
00414                 case SO_PROTOCOL_INFOW:
00415                     if ( *optlen <= sizeof( WSAPROTOCOL_INFOW ) )
00416                     {
00417                         *optlen = sizeof( WSAPROTOCOL_INFOW );
00418                         *lpErrno = WSAEFAULT;
00419                         rc = SOCKET_ERROR;
00420                         goto cleanup;
00421                     }
00422 
00423                     *optlen = sizeof( WSAPROTOCOL_INFOW );
00424                     memcpy( optval, &sockContext->Provider->LayerProvider,
00425                             sizeof( WSAPROTOCOL_INFOW ) );
00426 
00427                     break;
00428 
00429             }
00430         }
00431         __except( EXCEPTION_EXECUTE_HANDLER )
00432         {
00433             *lpErrno = WSAEFAULT;
00434             rc = SOCKET_ERROR;
00435             goto cleanup;
00436         }
00437 
00438         if ( SO_PROTOCOL_INFOA == optname )
00439         {
00440             WideCharToMultiByte( 
00441                     CP_ACP, 
00442                     0,
00443                     sockContext->Provider->LayerProvider.szProtocol,
00444                     -1,
00445                     ( (WSAPROTOCOL_INFOA *)optval )->szProtocol,
00446                     WSAPROTOCOL_LEN+1,
00447                     NULL,
00448                     NULL
00449                     );
00450         }
00451     }
00452     else
00453     {
00454         rc = sockContext->Provider->NextProcTable.lpWSPGetSockOpt(
00455                 s,
00456                 level,
00457                 optname,
00458                 optval,
00459                 optlen,
00460                 lpErrno
00461                 );
00462     }
00463 
00464 cleanup:
00465 
00466     return rc;
00467 }
00468 
00469 
00470 
00471 
00472 
00473 
00474 
00475 
00476 
00477 int WSPAPI 
00478 WSPIoctl(
00479         SOCKET          s,
00480         DWORD           dwIoControlCode,
00481         LPVOID          lpvInBuffer,
00482         DWORD           cbInBuffer,
00483         LPVOID          lpvOutBuffer,
00484         DWORD           cbOutBuffer,
00485         LPDWORD         lpcbBytesReturned,
00486         LPWSAOVERLAPPED lpOverlapped,
00487         LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
00488         LPWSATHREADID   lpThreadId,
00489         LPINT           lpErrno
00490         )
00491 {
00492     SOCKET_CONTEXT *sockContext = NULL;
00493     GUID            ConnectExGuid = WSAID_CONNECTEX;
00494     int             rc = NO_ERROR;
00495 
00496     
00497     if ( SIO_GET_EXTENSION_FUNCTION_POINTER == dwIoControlCode )
00498     {
00499         if ( 0 == memcmp( lpvInBuffer, &ConnectExGuid, sizeof( GUID ) ) )
00500         {
00501             
00502             __try 
00503             {
00504                 if ( cbOutBuffer < sizeof( LPFN_CONNECTEX ) )
00505                 {
00506                     *lpcbBytesReturned = sizeof( LPFN_CONNECTEX );
00507                     *lpErrno = WSAEFAULT;
00508                     rc = SOCKET_ERROR;
00509                     goto cleanup;
00510                 }
00511                 *lpcbBytesReturned = sizeof( LPFN_CONNECTEX );
00512                 *((DWORD_PTR *)lpvOutBuffer) = (DWORD_PTR) ExtConnectEx;
00513             }
00514             __except( EXCEPTION_EXECUTE_HANDLER )
00515             {
00516                 *lpErrno = WSAEFAULT;
00517                 rc = SOCKET_ERROR;
00518             }
00519             return rc;
00520         }
00521     }
00522 
00523     
00524     sockContext = FindSocketContext( s );
00525     if ( NULL == sockContext )
00526     {
00527         *lpErrno = WSAENOTSOCK;
00528         rc = SOCKET_ERROR;
00529         goto cleanup;
00530     }
00531 
00532     ASSERT( sockContext->Provider->NextProcTable.lpWSPIoctl );
00533 
00534     
00535     rc = sockContext->Provider->NextProcTable.lpWSPIoctl(
00536             s,
00537             dwIoControlCode, 
00538             lpvInBuffer,
00539             cbInBuffer, 
00540             lpvOutBuffer, 
00541             cbOutBuffer, 
00542             lpcbBytesReturned, 
00543             lpOverlapped, 
00544             lpCompletionRoutine, 
00545             lpThreadId, 
00546             lpErrno
00547             );
00548 
00549 cleanup:
00550 
00551     return rc;
00552 }
00553 
00554 
00555 
00556 
00557 
00558 
00559 
00560 
00561 
00562 
00563 
00564 
00565 
00566 
00567 
00568 
00569 int WSPAPI
00570 WSPSend(
00571         SOCKET          s,
00572         LPWSABUF        lpBuffers,
00573         DWORD           dwBufferCount,
00574         LPDWORD         lpNumberOfBytesSent,
00575         DWORD           dwFlags,
00576         LPWSAOVERLAPPED lpOverlapped,
00577         LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
00578         LPWSATHREADID   lpThreadId,
00579         LPINT           lpErrno
00580        )
00581 {
00582     SOCKET_CONTEXT *sockContext = NULL;
00583     DWORD           i;
00584     char           *start = NULL,
00585                     urlstr[ DEFAULT_PRINT_BUFFER ];
00586     int             rc = SOCKET_ERROR,
00587                     len;
00588 
00589     
00590     
00591     
00592     sockContext = FindSocketContext( s );
00593     if ( NULL == sockContext )
00594     {
00595         *lpErrno = WSAENOTSOCK;
00596         goto cleanup;
00597     }
00598 
00599     
00600     __try
00601     {
00602         for(i=0; i < dwBufferCount ;i++)
00603         {
00604             len = FindUrl( lpBuffers[ i ].buf, lpBuffers[ i ].len, &start );
00605             if ( ( len > 0 ) && ( len+1 < DEFAULT_PRINT_BUFFER ) )
00606             {
00607                 if ( FAILED (StringCchCopyN( urlstr, DEFAULT_PRINT_BUFFER, start, len+1 ) ) )
00608                 {
00609                     *lpErrno = WSAEFAULT;
00610                     goto cleanup;
00611                 }
00612 
00613                 if ( len >= DEFAULT_PRINT_BUFFER )
00614                     urlstr[ DEFAULT_PRINT_BUFFER-1 ] = '\0';
00615                 else
00616                     urlstr[len] = '\0';
00617 
00618                 
00619                 dbgprint("Found URL: '%s'", urlstr );
00620             }
00621         }
00622     }
00623     __except( EXCEPTION_EXECUTE_HANDLER )
00624     {
00625         dbgprint("WSPSend: ***access violation ***");
00626         *lpErrno = WSAEFAULT;
00627         goto cleanup;
00628     }
00629 
00630     ASSERT( sockContext->Provider->NextProcTable.lpWSPSend );
00631 
00632     
00633     
00634     
00635     
00636     
00637     
00638 
00639     rc = sockContext->Provider->NextProcTable.lpWSPSend(
00640             s,
00641             lpBuffers,
00642             dwBufferCount, 
00643             lpNumberOfBytesSent,
00644             dwFlags,
00645             lpOverlapped,
00646             lpCompletionRoutine,
00647             lpThreadId,
00648             lpErrno
00649             );
00650 cleanup:
00651 
00652     return rc;
00653 }
00654 
00655 
00656 
00657 
00658 
00659 
00660 
00661 
00662 
00663 
00664 SOCKET WSPAPI 
00665 WSPSocket(
00666         int                 af,
00667         int                 type,
00668         int                 protocol,
00669         LPWSAPROTOCOL_INFOW lpProtocolInfo,
00670         GROUP               g,
00671         DWORD               dwFlags,
00672         LPINT               lpErrno
00673         )
00674 {
00675     WSAPROTOCOL_INFOW   InfoCopy = {0};
00676     SOCKET_CONTEXT     *sockContext = NULL;
00677     PROVIDER           *lowerProvider = NULL;
00678     SOCKET              nextProviderSocket = INVALID_SOCKET,
00679                         sret = INVALID_SOCKET;
00680     int                 rc;
00681 
00682     
00683     lowerProvider = FindMatchingLspEntryForProtocolInfo(
00684             lpProtocolInfo,
00685             gLayerInfo,
00686             gLayerCount
00687             );
00688     if ( NULL == lowerProvider )
00689     {
00690         dbgprint("WSPSocket: FindMatchingLspEntryForProtocolInfo failed!" );
00691         goto cleanup;
00692     }
00693 
00694     if ( 0 == lowerProvider->StartupCount ) 
00695     {
00696         rc = InitializeProvider( lowerProvider, MAKEWORD(2,2), lpProtocolInfo, 
00697                gMainUpCallTable, lpErrno );
00698         if ( SOCKET_ERROR == rc )
00699         {
00700             dbgprint("WSPSocket: InitializeProvider failed: %d", *lpErrno);
00701             goto cleanup;
00702         }
00703     }
00704 
00705     
00706     
00707     if ( BASE_PROTOCOL == lowerProvider->NextProvider.ProtocolChain.ChainLen )
00708     {
00709         memcpy( &InfoCopy, &lowerProvider->NextProvider, sizeof( InfoCopy ) );
00710         InfoCopy.dwProviderReserved = lpProtocolInfo->dwProviderReserved;
00711         lpProtocolInfo = &InfoCopy;
00712     }
00713 
00714     ASSERT( lowerProvider->NextProcTable.lpWSPSocket );
00715 
00716     
00717     
00718     
00719     nextProviderSocket = lowerProvider->NextProcTable.lpWSPSocket(
00720             af, 
00721             type, 
00722             protocol, 
00723             lpProtocolInfo,
00724             g, 
00725             dwFlags,
00726             lpErrno
00727             );
00728     if ( INVALID_SOCKET == nextProviderSocket )
00729     {
00730         dbgprint("WSPSocket: NextProcTable.WSPSocket failed: %d", *lpErrno);
00731         goto cleanup;
00732     }
00733 
00734     
00735     
00736     
00737     sockContext = CreateSocketContext(
00738             lowerProvider,
00739             nextProviderSocket,
00740             lpErrno
00741             );
00742     if ( NULL == sockContext )
00743     {
00744         dbgprint( "WSPSocket: CreateSocketContext failed: %d", *lpErrno );
00745         goto cleanup;
00746     }
00747 
00748     
00749     
00750     
00751     sret = gMainUpCallTable.lpWPUModifyIFSHandle(
00752             lowerProvider->LayerProvider.dwCatalogEntryId,
00753             nextProviderSocket,
00754             lpErrno
00755             );
00756     if ( INVALID_SOCKET == sret )
00757     {
00758         dbgprint( "WSPSocket: WPUModifyIFSHandle failed: %d", *lpErrno );
00759         goto cleanup;
00760     }
00761 
00762     ASSERT( sret == nextProviderSocket );
00763 
00764     return nextProviderSocket;
00765 
00766 cleanup:
00767 
00768     
00769     if ( ( NULL != sockContext ) && ( NULL != lowerProvider ) &&
00770          ( INVALID_SOCKET != nextProviderSocket ) )
00771     {
00772         rc = lowerProvider->NextProcTable.lpWSPCloseSocket(
00773                 nextProviderSocket,
00774                 lpErrno
00775                 );
00776         if ( SOCKET_ERROR == rc )
00777         {
00778             dbgprint( "WSPSocket: WSPCloseSocket failed: %d", *lpErrno );
00779         }
00780 
00781     }
00782     if ( ( NULL != sockContext ) && ( NULL != lowerProvider ) )
00783         FreeSocketContext( lowerProvider, sockContext );
00784 
00785     return INVALID_SOCKET;
00786 }
00787 
00788 
00789 
00790 
00791 
00792 
00793 
00794 
00795 
00796 
00797 SOCKET WSPAPI 
00798 WSPAccept(
00799         SOCKET               s,
00800         struct sockaddr FAR *addr,
00801         LPINT                addrlen,
00802         LPCONDITIONPROC      lpfnCondition,
00803         DWORD_PTR            dwCallbackData,
00804         LPINT                lpErrno
00805         )
00806 {
00807     SOCKET_CONTEXT     *sockContext = NULL,
00808                        *acceptContext = NULL;
00809     SOCKET              acceptProviderSocket = INVALID_SOCKET,
00810                         sret;
00811     int                 rc;
00812 
00813     sockContext = FindSocketContext( s );
00814     if ( NULL == sockContext )
00815     {
00816         *lpErrno = WSAENOTSOCK;
00817         goto cleanup;
00818     }
00819 
00820     ASSERT( sockContext->Provider->NextProcTable.lpWSPAccept );
00821 
00822     
00823     
00824     
00825     acceptProviderSocket = sockContext->Provider->NextProcTable.lpWSPAccept(
00826             s, 
00827             addr, 
00828             addrlen, 
00829             lpfnCondition,
00830             dwCallbackData,
00831             lpErrno
00832             );
00833     if ( INVALID_SOCKET == acceptProviderSocket )
00834     {
00835         dbgprint("WSPAccept: NextProcTable.WSPAccept failed: %d", *lpErrno);
00836         goto cleanup;
00837     }
00838 
00839     
00840     
00841     
00842     acceptContext = CreateSocketContext(
00843             sockContext->Provider,
00844             acceptProviderSocket,
00845             lpErrno
00846             );
00847     if ( NULL == sockContext )
00848     {
00849         dbgprint( "WSPAccept: CreateSocketContext failed: %d", *lpErrno );
00850         goto cleanup;
00851     }
00852 
00853     
00854     
00855     
00856     sret = gMainUpCallTable.lpWPUModifyIFSHandle(
00857             sockContext->Provider->LayerProvider.dwCatalogEntryId,
00858             acceptProviderSocket,
00859             lpErrno
00860             );
00861     if ( INVALID_SOCKET == sret )
00862     {
00863         dbgprint( "WSPAccept: WPUModifyIFSHandle failed: %d", *lpErrno );
00864         goto cleanup;
00865     }
00866 
00867     ASSERT( sret == acceptProviderSocket );
00868 
00869     return acceptProviderSocket;
00870 
00871 cleanup:
00872 
00873     
00874     if ( ( NULL != sockContext ) && ( NULL != acceptContext ) &&
00875          ( INVALID_SOCKET != acceptProviderSocket ) )
00876     {
00877         rc = sockContext->Provider->NextProcTable.lpWSPCloseSocket(
00878                 acceptProviderSocket,
00879                 lpErrno
00880                 );
00881         if ( SOCKET_ERROR == rc )
00882         {
00883             dbgprint( "WSPAccept: WSPCloseSocket failed: %d", *lpErrno );
00884         }
00885 
00886     }
00887     if ( ( NULL != sockContext ) && ( NULL != acceptContext ) )
00888         FreeSocketContext( sockContext->Provider, acceptContext );
00889 
00890     return INVALID_SOCKET;
00891 }
00892 
00893 
00894 
00895 
00896 
00897 
00898 
00899 
00900 
00901 
00902 
00903 
00904 
00905 
00906 
00907 
00908 
00909 
00910 
00911 
00912 
00913 
00914 
00915 
00916 
00917 
00918 
00919 
00920 
00921 
00922 
00923 
00924 
00925 
00926 
00927 
00928 
00929 
00930 
00931 int WSPAPI 
00932 WSPStartup(
00933     WORD                wVersion,
00934     LPWSPDATA           lpWSPData,
00935     LPWSAPROTOCOL_INFOW lpProtocolInfo,
00936     WSPUPCALLTABLE      UpCallTable,
00937     LPWSPPROC_TABLE     lpProcTable
00938     )
00939 {
00940     PROVIDER           *loadProvider = NULL;
00941     int                 Error = WSAEPROVIDERFAILEDINIT,
00942                         rc;
00943 
00944     EnterCriticalSection( &gCriticalSection );
00945 
00946     
00947     
00948     if ( 0 == gStartupCount )
00949     {
00950         
00951         rc = LspCreateHeap( &Error );
00952         if ( SOCKET_ERROR == rc )
00953         {
00954             dbgprint("WSPStartup: LspCreateHeap failed: %d", Error );
00955             goto cleanup;
00956         }
00957 
00958         
00959         rc = FindLspEntries( &gLayerInfo, &gLayerCount, &Error );
00960         if ( FALSE == rc )
00961         {
00962             dbgprint("WSPStartup: FindLspEntries failed: %d", Error );
00963             goto cleanup;
00964         }
00965 
00966         
00967         memcpy( &gMainUpCallTable, &UpCallTable, sizeof( gMainUpCallTable ) );
00968 
00969     }
00970 
00971     
00972     
00973     
00974     
00975     
00976     loadProvider = FindMatchingLspEntryForProtocolInfo(
00977             lpProtocolInfo,
00978             gLayerInfo,
00979             gLayerCount,
00980             TRUE
00981             );
00982     if ( NULL == loadProvider )
00983     {
00984         dbgprint("WSPStartup: FindMatchingLspEntryForProtocolInfo failed!");
00985         ASSERT( 0 );
00986         goto cleanup;
00987     }
00988 
00989     
00990     
00991     if ( 0 == loadProvider->StartupCount )
00992     {
00993 
00994         rc = InitializeProvider( loadProvider, wVersion, lpProtocolInfo, 
00995                 UpCallTable, &Error );
00996         if ( SOCKET_ERROR == rc )
00997         {
00998             dbgprint("WSPStartup: InitializeProvider failed: %d", Error );
00999             goto cleanup;
01000         }
01001 
01002     }
01003 
01004     gStartupCount++;
01005 
01006     
01007     memcpy( lpProcTable, &loadProvider->NextProcTable, sizeof( *lpProcTable ) );
01008 
01009     
01010     lpProcTable->lpWSPAccept        = WSPAccept;
01011     lpProcTable->lpWSPCleanup       = WSPCleanup;
01012     lpProcTable->lpWSPCloseSocket   = WSPCloseSocket;
01013     lpProcTable->lpWSPConnect       = WSPConnect;
01014     lpProcTable->lpWSPGetPeerName   = WSPGetPeerName;
01015     lpProcTable->lpWSPGetSockOpt    = WSPGetSockOpt;
01016     lpProcTable->lpWSPIoctl         = WSPIoctl;
01017     lpProcTable->lpWSPSend          = WSPSend;
01018     lpProcTable->lpWSPSocket        = WSPSocket;
01019 
01020     memcpy( lpWSPData, &loadProvider->WinsockVersion, sizeof( *lpWSPData ) );
01021 
01022     Error = NO_ERROR;
01023 
01024 cleanup:
01025 
01026     LeaveCriticalSection( &gCriticalSection );
01027 
01028     return Error;
01029 }
01030 
01031 
01032 
01033 
01034 
01035 
01036 
01037 
01038 
01039 
01040 
01041 
01042 
01043 
01044 
01045 
01046 
01047 
01048 void
01049 FindDestinationAddress( 
01050         SOCKET_CONTEXT *context, 
01051         const SOCKADDR *destAddr, 
01052         int             destLen,
01053         SOCKADDR      **proxyAddr, 
01054         int            *proxyLen
01055         )
01056 {
01057     UNREFERENCED_PARAMETER( context );
01058     UNREFERENCED_PARAMETER( destLen );
01059     UNREFERENCED_PARAMETER( proxyAddr );
01060     UNREFERENCED_PARAMETER( proxyLen );
01061 
01062     context->AddressLength = destLen;
01063 
01064     
01065     memcpy( &context->OriginalAddress, destAddr, context->AddressLength );
01066 
01067     *proxyAddr = (SOCKADDR *) &context->OriginalAddress;
01068     *proxyLen  = context->AddressLength;
01069 
01070     if ( destAddr->sa_family == AF_INET )
01071     {
01072         
01073         if ( ( (SOCKADDR_IN *)destAddr )->sin_addr.s_addr == inet_addr("157.56.236.201") )
01074         {
01075             memcpy( &context->ProxiedAddress, destAddr, context->AddressLength );
01076             ( (SOCKADDR_IN *)&context->ProxiedAddress )->sin_addr.s_addr = inet_addr(
01077                     "157.56.237.9"
01078                     );
01079 
01080             *proxyAddr = (SOCKADDR *) &context->ProxiedAddress;
01081 
01082             context->Proxied = TRUE;
01083         }
01084     }
01085     else if ( destAddr->sa_family == AF_INET6 )
01086     {
01087         
01088     }
01089 }
01090 
01091 
01092 
01093 
01094 
01095 
01096 
01097 void
01098 FreeLspProviders(
01099         PROVIDER   *lspProvider,
01100         int         lspProviderCount,
01101         int        *lpErrno
01102         )
01103 {
01104     int     i;
01105 
01106     if ( NULL == lspProvider )
01107         return;
01108 
01109     
01110     for(i=0; i < lspProviderCount ;i++)
01111     {
01112         while( 0 != lspProvider[ i ].StartupCount )
01113         {
01114             lspProvider[ i ].StartupCount--;
01115 
01116             lspProvider[ i ].NextProcTable.lpWSPCleanup( lpErrno );
01117         }
01118 
01119         if ( NULL != lspProvider[ i ].Module )
01120         {
01121             FreeLibrary( lspProvider[ i ].Module );
01122             lspProvider[ i ].Module = NULL;
01123         }
01124     }
01125 
01126     for(i=0; i < lspProviderCount ;i++)
01127     {
01128         FreeSocketContextList( &lspProvider[ i ] );
01129         
01130         DeleteCriticalSection( &lspProvider[ i ].ProviderCritSec );
01131     }
01132 
01133     LspFree( lspProvider );
01134 }
01135 
01136 
01137 
01138 
01139 
01140 
01141 
01142 
01143 int
01144 FindUrl( 
01145         __in_ecount(buflen) char   *buf,
01146         int     buflen,
01147         __out char  **start
01148         )
01149 {
01150     char   *subptr = NULL, *substart = NULL;
01151     int     subidx,
01152             idx;
01153 
01154     *start = NULL;
01155 
01156     
01157     idx = 0;
01158     while ( idx < buflen )
01159     {
01160         substart = buf;
01161         subidx   = idx;
01162         subptr   = "GET";
01163 
01164         
01165         
01166         
01167         
01168         while ( ( subidx < buflen ) && ( *subptr != '\0' ) && ( *subptr == *substart ) )
01169         {
01170             subptr++;
01171             substart++;
01172             subidx++;
01173         }
01174 
01175         
01176         if ( *subptr == '\0' )
01177         {
01178             
01179             idx = subidx + 1;
01180             
01181             
01182             if ( idx >= buflen )
01183             {
01184                 
01185                 return 0;
01186             }
01187 
01188             *start = substart + 1;  
01189 
01190             substart++;
01191             subidx = idx;
01192 
01193             
01194             while ( ( subidx < buflen ) && ( *substart != ' ' ) )
01195             {
01196                 substart++;
01197                 subidx++;
01198             }
01199 
01200             
01201             
01202             if ( *substart == ' ' )
01203             {
01204                 return subidx - idx;
01205             }
01206             else
01207             {
01208                 
01209                 return 0;
01210             }
01211         }
01212 
01213         
01214         
01215         buf++;
01216         idx++;
01217     }
01218 
01219     return 0;
01220 }