|
|
/*++
Copyright (C) Microsoft Corporation, 1996 - 1999
Module Name:
wswrap.hxx
Abstract:
Wrapper to avoid loading winsock until really needed. This allows RPC applications to listen on winsock without pulling in all the winsock DLLs.
Author:
Mario Goertzel [MarioGo]
Revision History:
MarioGo 3/21/1996 Bits 'n pieces
--*/
#ifndef _WSWRAP_HXX_
#define _WSWRAP_HXX_
// For debugging only
// #define NOWRAP
extern BOOL fWinsockLoaded; extern BOOL RPC_WSAStartup(void);
typedef INT (APIENTRY *LPFN_SETSERVICEW)(IN DWORD dwNameSpace, IN DWORD dwOperation, IN DWORD dwFlags, IN LPSERVICE_INFO lpServiceInfo, IN LPSERVICE_ASYNC_INFO lpServiceAsyncInfo, IN OUT LPDWORD lpdwStatusFlags );
typedef INT (APIENTRY * LPFN_GETADDRESSBYNAMEA)(IN DWORD dwNameSpace, IN LPGUID lpServiceType, IN LPSTR lpServiceName OPTIONAL, IN LPINT lpiProtocols OPTIONAL, IN DWORD dwResolution, IN LPSERVICE_ASYNC_INFO lpServiceAsyncInfo OPTIONAL, IN OUT LPVOID lpCsaddrBuffer, IN OUT LPDWORD lpdwBufferLength, IN OUT LPSTR lpAliasBuffer OPTIONAL, IN OUT LPDWORD lpdwAliasBufferLength OPTIONAL );
typedef INT (APIENTRY * LPFN_GETADDRESSBYNAMEW)(IN DWORD dwNameSpace, IN LPGUID lpServiceType, IN LPWSTR lpServiceName OPTIONAL, IN LPINT lpiProtocols OPTIONAL, IN DWORD dwResolution, IN LPSERVICE_ASYNC_INFO lpServiceAsyncInfo OPTIONAL, IN OUT LPVOID lpCsaddrBuffer, IN OUT LPDWORD lpdwBufferLength, IN OUT LPWSTR lpAliasBuffer OPTIONAL, IN OUT LPDWORD lpdwAliasBufferLength OPTIONAL );
// N.B. The typedef for this should ultimately be in the Winsock headers
typedef int (WSAAPI * LPFN_GETNAMEINFO)( IN const struct sockaddr FAR * sa, IN socklen_t salen, OUT char FAR * host, IN DWORD hostlen, OUT char FAR * serv, IN DWORD servlen, IN int flags );
struct WINSOCK_FUNCTION_TABLE { LPFN_SOCKET psocket; LPFN_BIND pbind; LPFN_CLOSESOCKET pclosesocket; LPFN_GETSOCKNAME pgetsockname; LPFN_CONNECT pconnect; LPFN_LISTEN plisten; LPFN_SEND psend; LPFN_RECV precv; LPFN_SENDTO psendto; LPFN_RECVFROM precvfrom; LPFN_SETSOCKOPT psetsockopt; LPFN_GETSOCKOPT pgetsockopt; LPFN_INET_NTOA pinet_ntoa; LPFN_GETHOSTBYNAME pgethostbyname; LPFN_GETADDRESSBYNAMEA pGetAddressByNameA; LPFN_WSASOCKETW pWSASocket; LPFN_WSARECV pWSARecv; LPFN_WSARECVFROM pWSARecvFrom; LPFN_WSASEND pWSASend; LPFN_WSASENDTO pWSASendTo; LPFN_WSAPROVIDERCONFIGCHANGE pWSAProviderConfigChange; LPFN_WSAENUMPROTOCOLSW pWSAEnumProtocols; LPFN_WSAIOCTL pWSAIoctl; LPFN_GETADDRINFO pgetaddrinfo; LPFN_FREEADDRINFO pfreeaddrinfo; LPFN_GETNAMEINFO pgetnameinfo; LPFN_WSAGETOVERLAPPEDRESULT pWSAGetOverlappedResult;
// these pointers must be at the end!
// they will be filled in dynamically after the rest
LPFN_WSARECVMSG pWSARecvMsg; };
extern struct WINSOCK_FUNCTION_TABLE WFT;
#ifndef NOWRAP
#define socket(a,t,p) (WFT.psocket)((a),(t),(p))
#define bind(s,sa,l) (WFT.pbind)((s),(sa),(l))
#define getsockname(s,sa,l) (WFT.pgetsockname)((s),(sa),(l))
#define connect(s,sa,l) (WFT.pconnect)((s),(sa),(l))
#define listen(s,b) (WFT.plisten)((s),(b))
#define send(s,b,l,f) (WFT.psend)((s),(b),(l),(f))
#define recv(s,b,l,f) (WFT.precv)((s),(b),(l),(f))
#define sendto(s,b,l,f,t,tl) (WFT.psendto)((s),(b),(l),(f),(t),(tl))
#define recvfrom(s,b,l,fg,sa,fl) (WFT.precvfrom)((s),(b),(l),(fg),(sa),(fl))
#define setsockopt(s,l,on,ov,ol) (WFT.psetsockopt)((s),(l),(on),(ov),(ol))
#define getsockopt(s,l,on,ov,ol) (WFT.pgetsockopt)((s),(l),(on),(ov),(ol))
#define inet_ntoa(i) (WFT.pinet_ntoa)((i))
#define gethostbyname(x) (WFT.pgethostbyname)(x)
#define GetAddressByNameA(ns,st,sn,p,r,si,b,bl,ab,abl) (WFT.pGetAddressByNameA)((ns),(st),(sn),(p),(r),(si),(b),(bl),(ab),(abl))
#define AcceptEx(sl,sa,b,l1,l2,l3,l4,o) (WFT.pAcceptEx)((sl),(sa),(b),(l1),(l2),(l3),(l4),(o))
#define GetAcceptExSockaddrs(b,dl,lal,ral,lsa,ll,rsa,rl) (WFT.pGetAcceptExSockaddrs)((b),(dl),(lal),(ral),(lsa),(ll),(rsa),(rl))
#define WSASocketT(a,t,p,pi,g,f) (WFT.pWSASocket)((a),(t),(p),(pi),(g),(f))
#define WSARecv(s,bf,c,pb,pf,ol,cr) (WFT.pWSARecv)((s),(bf),(c),(pb),(pf),(ol),(cr))
#define WSARecvFrom(s,bf,c,pb,pf,sa,fl,ol,cr) (WFT.pWSARecvFrom((s),(bf),(c),(pb),(pf),(sa),(fl),(ol),(cr)))
#define WSARecvMsg(s,m,pb,ol,cr) (WFT.pWSARecvMsg((s),(m),(pb),(ol),(cr)))
#define WSASend(s,bf,c,b,f,ol,cr) (WFT.pWSASend((s),(bf),(c),(b),(f),(ol),(cr)))
#define WSASendTo(s,bf,c,pb,pf,sa,fl,ol,cr) (WFT.pWSASendTo((s),(bf),(c),(pb),(pf),(sa),(fl),(ol),(cr)))
#define WSAEnumProtocolsT(p,i,s) (WFT.pWSAEnumProtocols((p),(i),(s)))
#define WSAProviderConfigChange(n,o,c) (WFT.pWSAProviderConfigChange((n),(o),(c)))
#define WSAIoctl(s,i,ib,is,ob,os,oas,o,c) (WFT.pWSAIoctl((s),(i),(ib),(is),(ob),(os),(oas),(o),(c)))
#define getaddrinfo(n, s, h, r) (WFT.pgetaddrinfo((n), (s), (h), (r)))
#define freeaddrinfo(a) (WFT.pfreeaddrinfo((a)))
#define getnameinfo(so, l, h, hl, sv, sl, f) (WFT.pgetnameinfo((so), (l), (h), (hl), (sv), (sl), (f)))
#define WSAGetOverlappedResult(s, o, t, w, f) (WFT.pWSAGetOverlappedResult((s), (o), (t), (w), (f)))
extern LONG TriedUsingAfd; extern void TryUsingAfdProc(void); #define TryUsingAfd() if (InterlockedCompareExchange(&TriedUsingAfd, 1, 0) == 0) TryUsingAfdProc()
#if DBG
#define closesocket(s) { \
int retval = (WFT.pclosesocket)((s)); \ if (retval == SOCKET_ERROR) { \ TransDbgPrint((DPFLTR_RPCPROXY_ID, \ DPFLTR_WARNING_LEVEL, \ RPCTRANS "Close socket %d failed %p\n", \ (s), \ GetLastError())); \ } \ } #else
#define closesocket(s) (WFT.pclosesocket)((s))
#endif
#define WSAGetLastError() GetLastError()
//
// Little endian dependency.
//
#define htons(s) RpcpByteSwapShort(s)
#define ntohs(s) RpcpByteSwapShort(s)
#define htonl(l) RpcpByteSwapLong(l)
#define ntohl(l) RpcpByteSwapLong(l)
//
// Direct to AFD wrappers
//
int WSAAPI AFD_SendTo( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD dwFlags, const struct sockaddr FAR * lpTo, int iTolen, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine );
int WSAAPI AFD_RecvFrom( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags, struct sockaddr FAR * lpFrom, LPINT lpFromlen, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine );
#endif // NOWRAP
#endif // _WSWRAP_HXX_
|