windows-nt/Source/XPSP1/NT/com/rpc/runtime/trans/common/wswrap.hxx
2020-09-26 16:20:57 +08:00

214 lines
8 KiB
C++

/*++
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_