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 }