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