00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 #ifndef _PROVIDER_H_
00019 #define _PROVIDER_H_ 
00020 
00021 #ifndef _PSDK_BLD
00022 #include <nt.h>
00023 #include <ntrtl.h>
00024 #include <nturtl.h>
00025 #endif
00026 
00027 #include <ws2spi.h>
00028 #include <mswsock.h>
00029 #include <ws2tcpip.h>
00030 #include <mstcpip.h>
00031 
00032 #ifndef _PSDK_BLD
00033 #include <lspcommon.h>
00034 #else
00035 #include "..\common\lspcommon.h"
00036 #endif
00037 
00038 #define WM_SOCKET ( WM_USER + 321 )     // Message for our async window events
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 typedef struct _SOCK_INFO
00047 {
00048     SOCKET ProviderSocket;      
00049     SOCKET LayeredSocket;       
00050     DWORD  dwOutstandingAsync;  
00051     BOOL   bClosing;            
00052 
00053     volatile LONG  RefCount;    
00054 
00055     ULONGLONG  BytesSent;       
00056     ULONGLONG  BytesRecv;
00057     HANDLE     hIocp;           
00058     
00059     int    LastError;           
00060 
00061     HWND   hWnd;                
00062     UINT   uMsg;                
00063 
00064     CRITICAL_SECTION   SockCritSec; 
00065 
00066     PROVIDER          *Provider;
00067 
00068     LIST_ENTRY         Link;
00069 
00070 } SOCK_INFO;
00071 
00072 
00073 
00074 
00075 typedef struct _FD_MAP
00076 {
00077     SOCKET      ClientSocket;       
00078     SOCKET      ProvSocket;         
00079     SOCK_INFO  *Context;            
00080 } FD_MAP;
00081 
00082 
00083 
00084 
00085 
00086 
00087 
00088 
00089 
00090 typedef struct _ACCEPTEXARGS
00091 {
00092     SOCKET       sAcceptSocket,
00093                  sProviderAcceptSocket;
00094     PVOID        lpOutputBuffer;
00095     DWORD        dwReceiveDataLength,
00096                  dwLocalAddressLength,
00097                  dwRemoteAddressLength;
00098     DWORD        dwBytesReceived;
00099 } ACCEPTEXARGS;
00100 
00101 
00102 typedef struct _TRANSMITFILEARGS
00103 {
00104     HANDLE        hFile;
00105     DWORD         nNumberOfBytesToWrite,
00106                   nNumberOfBytesPerSend;
00107     LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers;
00108     DWORD         dwFlags;
00109 } TRANSMITFILEARGS;
00110 
00111 
00112 typedef struct _CONNECTEXARGS
00113 {
00114     SOCKET           s;
00115     SOCKADDR_STORAGE name;
00116     int              namelen;
00117     PVOID            lpSendBuffer;
00118     DWORD            dwSendDataLength;
00119     DWORD            dwBytesSent;
00120 } CONNECTEXARGS;
00121 
00122 
00123 typedef struct _TRANSMITPACKETSARGS
00124 {
00125     SOCKET          s;
00126     LPTRANSMIT_PACKETS_ELEMENT lpPacketArray;
00127     DWORD           nElementCount;
00128     DWORD           nSendSize;
00129     DWORD           dwFlags;
00130 } TRANSMITPACKETSARGS;
00131 
00132 
00133 typedef struct _DISCONNECTEXARGS
00134 {
00135     SOCKET          s;
00136     DWORD           dwFlags;
00137     DWORD           dwReserved;
00138 } DISCONNECTEXARGS;
00139 
00140 
00141 typedef struct _WSARECVMSGARGS
00142 {
00143     SOCKET          s;
00144     LPWSAMSG        lpMsg;
00145     DWORD           dwNumberOfBytesRecvd;
00146 } WSARECVMSGARGS;
00147 
00148 
00149 typedef struct _RECVARGS
00150 {
00151     LPWSABUF       lpBuffers;
00152     DWORD          dwBufferCount;
00153     DWORD          dwNumberOfBytesRecvd,
00154                    dwFlags;
00155 } RECVARGS;
00156 
00157 
00158 typedef struct _RECVFROMARGS
00159 {
00160     LPWSABUF       lpBuffers;
00161     DWORD          dwBufferCount;
00162     DWORD          dwNumberOfBytesRecvd,
00163                    dwFlags;
00164     LPSOCKADDR     lpFrom;
00165     LPINT          lpFromLen;
00166 } RECVFROMARGS;
00167 
00168 
00169 typedef struct _SENDARGS
00170 {
00171     LPWSABUF       lpBuffers;
00172     DWORD          dwBufferCount;
00173     DWORD          dwNumberOfBytesSent;
00174     DWORD          dwFlags;
00175 } SENDARGS;
00176 
00177 
00178 typedef struct _SENDTOARGS
00179 {
00180     LPWSABUF         lpBuffers;
00181     DWORD            dwBufferCount;
00182     DWORD            dwNumberOfBytesSent;
00183     DWORD            dwFlags;
00184     SOCKADDR_STORAGE To;
00185     int              iToLen;
00186 } SENDTOARGS;
00187 
00188 
00189 typedef struct _IOCTLARGS
00190 {
00191     DWORD          dwIoControlCode;
00192     LPVOID         lpvInBuffer;
00193     DWORD          cbInBuffer;
00194     LPVOID         lpvOutBuffer;
00195     DWORD          cbOutBuffer;
00196     DWORD          cbBytesReturned;
00197 } IOCTLARGS;
00198 
00199 
00200 typedef enum
00201 {
00202     LSP_OP_IOCTL         = 1,
00203     LSP_OP_RECV,
00204     LSP_OP_RECVFROM,
00205     LSP_OP_SEND,
00206     LSP_OP_SENDTO,
00207     LSP_OP_TRANSMITFILE,
00208     LSP_OP_ACCEPTEX,
00209     LSP_OP_CONNECTEX,
00210     LSP_OP_DISCONNECTEX,
00211     LSP_OP_TRANSMITPACKETS,
00212     LSP_OP_WSARECVMSG
00213 } LspOperation;
00214 
00215 
00216 
00217 
00218 
00219 
00220 
00221 
00222 
00223 
00224 typedef struct _WSAOVERLAPPEDPLUS
00225 {
00226     WSAOVERLAPPED   ProviderOverlapped;     
00227     PROVIDER       *Provider;               
00228     SOCK_INFO      *SockInfo;               
00229     SOCKET          CallerSocket;           
00230     SOCKET          ProviderSocket;         
00231     HANDLE          Iocp;                   
00232     int             Error;                  
00233 
00234     BOOL            CloseThread;            
00235 
00236     union 
00237     {
00238         
00239         ACCEPTEXARGS        AcceptExArgs;
00240         TRANSMITFILEARGS    TransmitFileArgs;
00241         CONNECTEXARGS       ConnectExArgs;
00242         TRANSMITPACKETSARGS TransmitPacketsArgs;
00243         DISCONNECTEXARGS    DisconnectExArgs;
00244         WSARECVMSGARGS      WSARecvMsgArgs;
00245         RECVARGS            RecvArgs;
00246         RECVFROMARGS        RecvFromArgs;
00247         SENDARGS            SendArgs;
00248         SENDTOARGS          SendToArgs;
00249         IOCTLARGS           IoctlArgs;
00250     };
00251 
00252     LspOperation            Operation;              
00253     WSATHREADID             CallerThreadId;         
00254     LPWSAOVERLAPPED         lpCallerOverlapped;     
00255     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCallerCompletionRoutine;   
00256 
00257     LIST_ENTRY              Link;           
00258 
00259 } WSAOVERLAPPEDPLUS, * LPWSAOVERLAPPEDPLUS;
00260 
00261 
00262 
00263 
00264 
00265 
00266 
00267 
00268 HWND 
00269 GetWorkerWindow(
00270     );
00271 
00272 
00273 int 
00274 StopAsyncWindowManager(
00275     );
00276 
00277 
00278 
00279 
00280 
00281 
00282 
00283 
00284 
00285 
00286 
00287 
00288 SOCKET WSPAPI 
00289 WSPAccept(
00290     SOCKET          s,                      
00291     struct sockaddr FAR * addr,  
00292     LPINT           addrlen,                 
00293     LPCONDITIONPROC lpfnCondition,  
00294     DWORD_PTR       dwCallbackData,          
00295     LPINT           lpErrno
00296     );
00297 
00298 int WSPAPI 
00299 WSPAddressToString(
00300     LPSOCKADDR          lpsaAddress,            
00301     DWORD               dwAddressLength,               
00302     LPWSAPROTOCOL_INFOW lpProtocolInfo,   
00303     LPWSTR              lpszAddressString,            
00304     LPDWORD             lpdwAddressStringLength,   
00305     LPINT               lpErrno
00306     );
00307 
00308 int WSPAPI 
00309 WSPAsyncSelect(
00310     SOCKET       s,
00311     HWND         hWnd,
00312     unsigned int wMsg,
00313     long         lEvent,
00314     LPINT        lpErrno
00315     );
00316 
00317 int WSPAPI 
00318 WSPBind(
00319     SOCKET                s,
00320     const struct sockaddr FAR * name,
00321     int                   namelen,
00322     LPINT                 lpErrno
00323     );
00324 
00325 int WSPAPI 
00326 WSPCancelBlockingCall(
00327     LPINT lpErrno
00328     );
00329 
00330 int WSPAPI 
00331 WSPCleanup(
00332     LPINT lpErrno  
00333     );
00334 
00335 int WSPAPI 
00336 WSPCloseSocket(  
00337     SOCKET s,        
00338     LPINT  lpErrno
00339     );
00340 
00341 int WSPAPI 
00342 WSPConnect(
00343     SOCKET                s,
00344     const struct sockaddr FAR * name,
00345     int                   namelen,
00346     LPWSABUF              lpCallerData,
00347     LPWSABUF              lpCalleeData,
00348     LPQOS                 lpSQOS,
00349     LPQOS                 lpGQOS,
00350     LPINT                 lpErrno
00351     );
00352 
00353 int WSPAPI 
00354 WSPDuplicateSocket(
00355     SOCKET              s,
00356     DWORD               dwProcessId,                      
00357     LPWSAPROTOCOL_INFOW lpProtocolInfo,   
00358     LPINT               lpErrno
00359     );
00360 
00361 int WSPAPI 
00362 WSPEnumNetworkEvents(  
00363     SOCKET             s,
00364     WSAEVENT           hEventObject,
00365     LPWSANETWORKEVENTS lpNetworkEvents,
00366     LPINT              lpErrno
00367     );
00368 
00369 int WSPAPI 
00370 WSPEventSelect(
00371     SOCKET   s,
00372     WSAEVENT hEventObject,
00373     long     lNetworkEvents,
00374     LPINT    lpErrno
00375     );
00376 
00377 BOOL WSPAPI 
00378 WSPGetOverlappedResult(
00379     SOCKET          s,
00380     LPWSAOVERLAPPED lpOverlapped,
00381     LPDWORD         lpcbTransfer,
00382     BOOL            fWait,
00383     LPDWORD         lpdwFlags,
00384     LPINT           lpErrno
00385     );
00386 
00387 int WSPAPI 
00388 WSPGetPeerName(  
00389     SOCKET          s,
00390     struct sockaddr FAR * name,
00391     LPINT           namelen,
00392     LPINT           lpErrno
00393     );
00394 
00395 int WSPAPI 
00396 WSPGetSockName(
00397     SOCKET          s,
00398     struct sockaddr FAR * name,
00399     LPINT           namelen,
00400     LPINT           lpErrno
00401     );
00402 
00403 int WSPAPI 
00404 WSPGetSockOpt(
00405     SOCKET     s,
00406     int        level,
00407     int        optname,
00408     char FAR * optval,
00409     LPINT      optlen,
00410     LPINT      lpErrno
00411     );
00412 
00413 BOOL WSPAPI 
00414 WSPGetQOSByName(
00415     SOCKET   s,
00416     LPWSABUF lpQOSName,
00417     LPQOS    lpQOS,
00418     LPINT    lpErrno
00419     );
00420 
00421 int WSPAPI 
00422 WSPIoctl(
00423     SOCKET          s,
00424     DWORD           dwIoControlCode,
00425     LPVOID          lpvInBuffer,
00426     DWORD           cbInBuffer,
00427     LPVOID          lpvOutBuffer,
00428     DWORD           cbOutBuffer,
00429     LPDWORD         lpcbBytesReturned,
00430     LPWSAOVERLAPPED lpOverlapped,
00431     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
00432     LPWSATHREADID   lpThreadId,
00433     LPINT           lpErrno
00434     );
00435 
00436 SOCKET WSPAPI 
00437 WSPJoinLeaf(
00438     SOCKET       s,
00439     const struct sockaddr FAR * name,
00440     int          namelen,
00441     LPWSABUF     lpCallerData,
00442     LPWSABUF     lpCalleeData,
00443     LPQOS        lpSQOS,
00444     LPQOS        lpGQOS,
00445     DWORD        dwFlags,
00446     LPINT        lpErrno
00447     );
00448 
00449 int WSPAPI 
00450 WSPListen(
00451     SOCKET s,        
00452     int    backlog,     
00453     LPINT  lpErrno
00454     );
00455 
00456 int WSPAPI 
00457 WSPRecv(
00458     SOCKET          s,
00459     LPWSABUF        lpBuffers,
00460     DWORD           dwBufferCount,
00461     LPDWORD         lpNumberOfBytesRecvd,
00462     LPDWORD         lpFlags,
00463     LPWSAOVERLAPPED lpOverlapped,
00464     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
00465     LPWSATHREADID   lpThreadId,
00466     LPINT           lpErrno
00467     );
00468 
00469 int WSPAPI 
00470 WSPRecvDisconnect(
00471     SOCKET   s,
00472     LPWSABUF lpInboundDisconnectData,
00473     LPINT    lpErrno
00474     );
00475 
00476 int WSPAPI 
00477 WSPRecvFrom(
00478     SOCKET          s,
00479     LPWSABUF        lpBuffers,
00480     DWORD           dwBufferCount,
00481     LPDWORD         lpNumberOfBytesRecvd,
00482     LPDWORD         lpFlags,
00483     struct sockaddr FAR * lpFrom,
00484     LPINT           lpFromLen,
00485     LPWSAOVERLAPPED lpOverlapped,
00486     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
00487     LPWSATHREADID   lpThreadId,
00488     LPINT           lpErrno
00489     );
00490 
00491 int WSPAPI 
00492 WSPSelect(
00493     int          nfds,
00494     fd_set FAR * readfds,
00495     fd_set FAR * writefds,
00496     fd_set FAR * exceptfds,
00497     const struct timeval FAR * timeout,
00498     LPINT        lpErrno
00499     );
00500 
00501 int WSPAPI 
00502 WSPSend(
00503     SOCKET          s,
00504     LPWSABUF        lpBuffers,
00505     DWORD           dwBufferCount,
00506     LPDWORD         lpNumberOfBytesSent,
00507     DWORD           dwFlags,
00508     LPWSAOVERLAPPED lpOverlapped,                             
00509     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,   
00510     LPWSATHREADID   lpThreadId,                                 
00511     LPINT           lpErrno                                             
00512     );
00513 
00514 int WSPAPI 
00515 WSPSendDisconnect(
00516     SOCKET   s,
00517     LPWSABUF lpOutboundDisconnectData,
00518     LPINT    lpErrno
00519     );
00520 
00521 int WSPAPI 
00522 WSPSendTo(
00523     SOCKET          s,
00524     LPWSABUF        lpBuffers,
00525     DWORD           dwBufferCount,
00526     LPDWORD         lpNumberOfBytesSent,
00527     DWORD           dwFlags,
00528     const struct sockaddr FAR * lpTo,
00529     int             iToLen,
00530     LPWSAOVERLAPPED lpOverlapped,
00531     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
00532     LPWSATHREADID   lpThreadId,
00533     LPINT           lpErrno
00534     );
00535 
00536 int WSPAPI 
00537 WSPSetSockOpt(
00538     SOCKET     s,
00539     int        level,
00540     int        optname,
00541     const char FAR * optval,   
00542     int        optlen,
00543     LPINT      lpErrno
00544     );
00545 
00546 int WSPAPI 
00547 WSPShutdown (
00548     SOCKET s,
00549     int    how,
00550     LPINT  lpErrno
00551     );
00552 
00553 int WSPAPI 
00554 WSPStringToAddress(
00555     LPWSTR              AddressString,
00556     INT                 AddressFamily,
00557     LPWSAPROTOCOL_INFOW lpProtocolInfo,   
00558     LPSOCKADDR          lpAddress,
00559     LPINT               lpAddressLength,
00560     LPINT               lpErrno
00561     );
00562 
00563 SOCKET WSPAPI 
00564 WSPSocket(
00565     int                 af,
00566     int                 type,
00567     int                 protocol,
00568     __in LPWSAPROTOCOL_INFOW lpProtocolInfo,
00569     GROUP               g,
00570     DWORD               dwFlags,
00571     LPINT               lpErrno
00572     );
00573 
00574 
00575 void 
00576 CopyOffset(
00577     WSAOVERLAPPED  *ProviderOverlapped, 
00578     WSAOVERLAPPED  *UserOverlapped
00579     );
00580 
00581 
00582 WSABUF *
00583 CopyWSABuf(
00584     WSABUF *BufferArray, 
00585     DWORD   BufferCount,
00586     int    *lpErrno
00587     );
00588 
00589 
00590 void 
00591 FreeWSABuf(
00592     WSABUF *BufferArray
00593     );
00594 
00595 
00596 
00597 
00598 
00599 
00600 
00601 
00602 int 
00603 InitOverlappedManager(
00604     );
00605 
00606 
00607 int 
00608 StopOverlappedManager(
00609     );
00610 
00611 
00612 int 
00613 QueueOverlappedOperation(
00614     WSAOVERLAPPEDPLUS  *lpOverlapped, 
00615     SOCK_INFO          *Context
00616     );
00617 
00618 
00619 WSAOVERLAPPEDPLUS *
00620 PrepareOverlappedOperation(
00621     SOCK_INFO                         *SocketContext,
00622     LspOperation                       operation,
00623     WSABUF                            *lpBuffers,
00624     DWORD                              dwBufferCount,
00625     LPWSAOVERLAPPED                    lpOverlapped,
00626     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
00627     LPWSATHREADID                      lpThreadId,
00628     int                               *lpErrno
00629     );
00630 
00631 
00632 void CALLBACK 
00633 IntermediateCompletionRoutine(
00634     DWORD           dwError, 
00635     DWORD           cbTransferred,
00636     LPWSAOVERLAPPED lpOverlapped, 
00637     DWORD           dwFlags
00638     );
00639 
00640 
00641 void
00642 UndoOverlappedOperation( 
00643     SOCK_INFO         *SocketContext,
00644     WSAOVERLAPPEDPLUS *ProviderOverlapped
00645     );
00646 
00647 
00648 void
00649 FreeOverlappedLookasideList(
00650     );
00651 
00652 
00653 
00654 
00655 
00656 
00657 
00658 SOCK_INFO *
00659 GetCallerSocket(
00660     PROVIDER   *provider, 
00661     SOCKET      ProviderSocket
00662     );
00663 
00664 
00665 SOCK_INFO *
00666 CreateSockInfo(
00667     PROVIDER   *Provider, 
00668     SOCKET      ProviderSocket, 
00669     SOCK_INFO  *Inherit, 
00670     BOOL        Insert,
00671     int        *lpErrno
00672     );
00673 
00674 
00675 SOCK_INFO *
00676 FindAndRefSocketContext(
00677     SOCKET  s, 
00678     int    *err
00679     );
00680 
00681 
00682 void 
00683 DerefSocketContext(
00684     SOCK_INFO  *context, 
00685     int        *err
00686     );
00687 
00688 
00689 void 
00690 FreeSockInfo(
00691     SOCK_INFO *info
00692     );
00693 
00694 
00695 void 
00696 InsertSocketInfo(
00697     PROVIDER   *provider, 
00698     SOCK_INFO  *sock
00699     );
00700 
00701 
00702 void 
00703 RemoveSocketInfo(
00704     PROVIDER   *provider, 
00705     SOCK_INFO  *sock
00706     );
00707 
00708 
00709 void 
00710 AcquireSocketLock(
00711     SOCK_INFO  *SockInfo
00712     );
00713 
00714 
00715 void 
00716 ReleaseSocketLock(
00717     SOCK_INFO  *SockInfo
00718     );
00719 
00720 
00721 void 
00722 CloseAndFreeSocketInfo(
00723     PROVIDER   *provider,
00724     BOOL        processDetach
00725     );
00726 
00727 
00728 
00729 
00730 
00731 
00732 
00733 
00734 BOOL PASCAL FAR 
00735 ExtTransmitFile (
00736     IN SOCKET hSocket,
00737     IN HANDLE hFile,
00738     IN DWORD nNumberOfBytesToWrite,
00739     IN DWORD nNumberOfBytesPerSend,
00740     IN LPOVERLAPPED lpOverlapped,
00741     IN LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,
00742     IN DWORD dwReserved
00743     );
00744 
00745 BOOL PASCAL FAR 
00746 ExtAcceptEx(
00747     IN SOCKET sListenSocket,
00748     IN SOCKET sAcceptSocket,
00749     IN PVOID lpOutputBuffer,
00750     IN DWORD dwReceiveDataLength,
00751     IN DWORD dwLocalAddressLength,
00752     IN DWORD dwRemoteAddressLength,
00753     OUT LPDWORD lpdwBytesReceived,
00754     IN LPOVERLAPPED lpOverlapped
00755     );
00756 
00757 BOOL PASCAL FAR 
00758 ExtConnectEx(
00759     IN SOCKET s,
00760     IN const struct sockaddr FAR *name,
00761     IN int namelen,
00762     IN PVOID lpSendBuffer OPTIONAL,
00763     IN DWORD dwSendDataLength,
00764     OUT LPDWORD lpdwBytesSent,
00765     IN LPOVERLAPPED lpOverlapped
00766     );
00767 
00768 BOOL PASCAL FAR 
00769 ExtTransmitPackets(
00770     SOCKET hSocket,
00771     LPTRANSMIT_PACKETS_ELEMENT lpPacketArray,
00772     DWORD nElementCount,
00773     DWORD nSendSize,
00774     LPOVERLAPPED lpOverlapped,
00775     DWORD dwFlags
00776     );
00777 
00778 BOOL PASCAL FAR 
00779 ExtDisconnectEx(
00780     IN SOCKET s,
00781     IN LPOVERLAPPED lpOverlapped,
00782     IN DWORD  dwFlags,
00783     IN DWORD  dwReserved
00784     );
00785 
00786 INT PASCAL FAR 
00787 ExtWSARecvMsg(
00788     IN SOCKET s,
00789     IN OUT LPWSAMSG lpMsg,
00790     OUT LPDWORD lpdwNumberOfBytesRecvd,
00791     IN LPWSAOVERLAPPED lpOverlapped,
00792     IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
00793     );
00794 
00795 
00796 BOOL
00797 LoadExtensionFunction(
00798     FARPROC   **func,
00799     GUID        ExtensionGuid,
00800     LPWSPIOCTL  fnIoctl,
00801     SOCKET      s
00802     );
00803 
00804 
00805 
00806 
00807 
00808 
00809 
00810 extern HINSTANCE        gDllInstance;       
00811 extern CRITICAL_SECTION gCriticalSection,   
00812                                             
00813                         gOverlappedCS;      
00814 extern INT              gLayerCount;        
00815 extern PROVIDER        *gBaseInfo;          
00816 extern HANDLE           gAddContextEvent,   
00817                                             
00818                         gIocp;              
00819 extern WSPUPCALLTABLE   gMainUpCallTable;   
00820 extern GUID             gProviderGuid;      
00821 
00822 #endif