214 lines
8 KiB
C++
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_
|
|
|