cosmopolitan/libc/nt/winsock.h

578 lines
24 KiB
C

#ifndef COSMOPOLITAN_LIBC_NT_WINSOCK_H_
#define COSMOPOLITAN_LIBC_NT_WINSOCK_H_
#include "libc/nt/struct/guid.h"
#include "libc/nt/struct/overlapped.h"
#include "libc/nt/struct/pollfd.h"
#include "libc/sock/sock.h"
#if 0
/* ░▓█████████████████████████████████████████████▓▒
░█▓░░░░░░░░░▓██▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓██▓▒░
░█▓░ ░▒▒▒▒ ▓██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██▓▒▒
░█▓░ ░▓▓▓▒ ▓██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██▓▒▒
░█▓░ ░▓██▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓██▓▒▒
░███████████████████████████████████████████████▓▒▒
░█▓░ ▒█▓▒▒
░█▓░ ▒█▓▒▒
░█▓░ ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░ ▒█▓▒▒
░█▓░ ░▒░ ▒█▓░ ▒█▓▒▒
░█▓░ ░░░░ ░░░░░░░░ ▒▓▓▓▒░ ▒█▓▒▒
░█▓░ ░░░░ ░░░░░▒▒▓███▓░░░░░░░░▒▓▓▓▓▒ ▒█▓▒▒
░█▓░ ░▒▒ ░░░░░░░▒▒████▓░░░░░░░░░░▒██▓ ▒█▓▒▒
░█▓░ ░▒▒ ░░░░░░░▒▒▓▓▓▓▓░░░░░░░░░▒▒██▓ ▒█▓▒▒
░█▓░ ░▒▒ ░░▒▒▒▒░░░░░ ░▒▒▒▒░░░░░▒▒██▓ ▒█▓▒▒
░█▓░ ░▒▒ ░░▒▓█▓░░░░░░░▒▓██▓░░░░▒▒██▓ ▒█▓▒▒
░█▓░ ░▒▒ ░░▒▓█▓░░░░░░░▒▓██▓░░░░▒▒██▓ ▒█▓▒▒
░█▓░ ░▒▒ ░░▒▓█▓░░░░░░░▒▓██▓░░░░▒▒██▓ ░▓█▓▒▒▒▒
░█▓░ ░▒▒ ░░▒▓█▓░░░░░░░▒▓██▓░░░░░▒██▓ ░████▓▒░
░█▓░ ░░░░░░░░▒▒░░░░░░░░░▒▒░░░▒▒▓▓▒░░ ░░▓███▓▒░
░█▓░ ░░░░░░░░░░░░░░░░░░░░░░▒▓▓▓▒░ ▒████▓▒░░░░░░
░█▓░ ░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░ ░▓▓▓▓██▒░░░░░░░░
░█▓░ ▒█████████████████▒ ▓█▓▒░ ▒█▓ ░█▓ ░▓▓░
░█▓░ ░▓████▒░ ▒█▓▒░ ░░░░░░░ ▓█▓░
░█▓░ ░▓████▒░ ░▒░ ░░░░░░░░░░░ ░█▓
░█▓ ▒███▓▒▒░ ░░░░░░░░░░░░░░░ ▒▓▓
░██████████████████████████████████████▓▒▓█▓░ ░░░░░░░░░░░░░░░░░░ ▒█▓
▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░ ░░░░░░░░░░░░░░░░░░░░▒█▓
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▒██▒▒▒░░░░░░░░░░░░░░░░░░░░░▒█▓
░██▒▒▒▒▒░░░░░░░░░░░░░░░░░░░▒█▓
░▓▓▓▒▒▒▒▒▒░░░░░░░░░░░░░░░░▒▓█▓
░▓▓▓▒▒▒▒▒▒░░░░░░░░░░░▒▒▒▒▓▓▒
░██▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ░█▓
▒█▓▒▒▒▒▒▒▒▒▒▒▒██▓▒░ ░█▓
▒█████████████▓▒▒░ ░██▒
╔────────────────────────────────────────────────────────────────▀▀▀▀───▀▀▀▀─│─╗
│ cosmopolitan § new technology » winsock ─╬─│┼
╚────────────────────────────────────────────────────────────────────────────│*/
#endif
#define kNtWsaFlagOverlapped 0x01
#define kNtWsaFlagNoHandleInherit 0x80
#define kNtTfDisconnect 0x01
#define kNtTfReuseSocket 0x02
#define kNtTfWriteBehind 0x04
#define kNtTfUseDefaultWorker 0x00
#define kNtTfUseSystemThread 0x10
#define kNtTfUseKernelApc 0x20
#define kNtSoConnectTime 0x700C
#define kNtSoUpdateAcceptContext 0x700B
#define kNtSoUpdateConnectContext 0x7010
#define kNtSioAddressListChange 0x28000017u
#define kNtSioAddressListQuery 0x48000016u
#define kNtSioAddressListSort 0xC8000019u
#define kNtSioAssociateHandle 0x88000001u
#define kNtSioEnableCircularQueueing 0x28000002u
#define kNtSioFindRoute 0x48000003u
#define kNtSioFlush 0x28000004u
#define kNtSioGetBroadcastAddress 0x48000005u
#define kNtSioGetExtensionFunctionPointer 0xC8000006u
#define kNtSioGetGroupQos 0xC8000008u
#define kNtSioGetQos 0xC8000007u
#define kNtSioMulticastScope 0x8800000Au
#define kNtSioMultipointLoopback 0x88000009u
#define kNtSioQueryRssProcessorInfo 0x48000025u
#define kNtSioQueryTargetPnpHandle 0x48000018u
#define kNtSioReserved1 0x8800001Au
#define kNtSioReserved2 0x88000021u
#define kNtSioRoutingInterfaceChange 0x88000015u
#define kNtSioRoutingInterfaceQuery 0xC8000014u
#define kNtSioSetGroupQos 0x8800000Cu
#define kNtSioSetQos 0x8800000Bu
#define kNtSioSocketCloseNotify 0x9800000Du
#define kNtSioTranslateHandle 0xC800000Du
#define kNtSioUdpConnreset 0x9800000Cu
#define kNtSioUdpNetreset 0x9800000Fu
#if !(__ASSEMBLER__ + __LINKER__ + 0)
COSMOPOLITAN_C_START_
#define kNtWsaidAcceptex \
{ \
0xB5367DF1, 0xCBAC, 0x11CF, { \
0x95, 0xCA, 0x00, 0x80, 0x5F, 0x48, 0xA1, 0x92 \
} \
}
#define kNtWsaidConnectex \
{ \
0x25A207B9, 0xDDF3, 0x4660, { \
0x8E, 0xE9, 0x76, 0xE5, 0x8C, 0x74, 0x06, 0x3E \
} \
}
#define kNtWsaidDisconnectex \
{ \
0x7FDA2E11, 0x8630, 0x436F, { \
0xA0, 0x31, 0xF5, 0x36, 0xA6, 0xEE, 0xC1, 0x57 \
} \
}
#define kNtWsaidTransmitfile \
{ \
0xB5367DF0, 0xCBAC, 0x11CF, { \
0x95, 0xCA, 0x00, 0x80, 0x5F, 0x48, 0xA1, 0x92 \
} \
}
enum NtWsaEComparator { COMP_EQUAL, COMP_NOTLESS };
enum NtWsaCompletionType {
kNtNspNotifyImmediately = 0,
kNtNspNotifyHwnd,
kNtNspNotifyEvent,
kNtNspNotifyPort,
kNtNspNotifyApc,
};
struct timeval$nt {
int32_t tv_sec; /* [sic] */
int32_t tv_usec;
};
struct iovec$nt {
uint32_t len;
char *buf;
};
struct msghdr$nt {
struct sockaddr *name;
int32_t namelen;
struct iovec$nt *lpBuffers;
uint32_t dwBufferCount;
struct iovec$nt Control;
uint32_t dwFlags;
};
struct NtWsaData {
uint16_t wVersion;
uint16_t wHighVersion;
uint16_t iMaxSockets;
uint16_t iMaxUdpDg;
char *lpVendorInfo;
char szDescription[257];
char szSystemStatus[129];
};
struct NtSocketAddress {
struct sockaddr *lpSockaddr;
int32_t iSockaddrLength;
};
struct NtSocketAddressList {
int32_t iAddressCount;
struct NtSocketAddress Address[1];
};
struct NtAddrInfoEx { /* win8+ */
int32_t ai_flags; /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */
int32_t ai_family; /* PF_XXX */
int32_t ai_socktype; /* SOCK_XXX */
int32_t ai_protocol;
uint64_t ai_addrlen;
char16_t *ai_canonname;
struct sockaddr *ai_addr;
void *ai_blob;
uint64_t ai_bloblen;
struct NtGuid *ai_provider;
struct NtAddrInfoEx *ai_next;
int32_t ai_version; /* v2 */
char16_t *ai_fqdn; /* v2 */
int32_t ai_interfaceindex; /* v3 */
int64_t ai_resolutionhandle; /* v4 */
};
struct NtWsaProtocolChain {
int32_t ChainLen;
uint32_t ChainEntries[7];
};
struct NtWsaProtocolInfo {
uint32_t dwServiceFlags1;
uint32_t dwServiceFlags2;
uint32_t dwServiceFlags3;
uint32_t dwServiceFlags4;
uint32_t dwProviderFlags;
struct NtGuid ProviderId;
uint32_t dwCatalogEntryId;
struct NtWsaProtocolChain ProtocolChain;
int32_t iVersion;
int32_t iAddressFamily;
int32_t iMaxSockAddr;
int32_t iMinSockAddr;
int32_t iSocketType;
int32_t iProtocol;
int32_t iProtocolMaxOffset;
int32_t iNetworkByteOrder;
int32_t iSecurityScheme;
uint32_t dwMessageSize;
uint32_t dwProviderReserved;
char16_t szProtocol[256];
};
struct NtFlowSpec {
uint32_t TokenRate; /* bytes/sec */
uint32_t TokenBucketSize; /* bytes */
uint32_t PeakBandwidth; /* bytes/sec */
uint32_t Latency; /* µs */
uint32_t DelayVariation; /* µs */
uint32_t ServiceType; /* kNtServicetypeXxx */
uint32_t MaxSduSize; /* bytes */
uint32_t MinimumPolicedSize; /* bytes */
};
struct NtQos {
struct NtFlowSpec SendingFlowspec;
struct NtFlowSpec ReceivingFlowspec;
struct iovec$nt ProviderSpecific;
};
struct NtWsaVersion {
uint32_t dwVersion;
enum NtWsaEComparator ecHow;
};
struct NtAfProtocols {
int32_t iAddressFamily;
int32_t iProtocol;
};
struct NtBlob {
uint32_t cbSize;
uint8_t pBlobData;
};
struct NtCsAddrInfo {
struct NtSocketAddress LocalAddr;
struct NtSocketAddress RemoteAddr;
int32_t iSocketType;
int32_t iProtocol;
};
struct NtWsaQuerySet {
uint32_t dwSize; /* of this */
char16_t *lpszServiceInstanceName;
struct NtGuid *lpServiceClassId;
struct NtWsaVersion *lpVersion;
char16_t *lpszComment;
uint32_t dwNameSpace;
struct NtGuid *lpNSProviderId;
char16_t *lpszContext;
uint32_t dwNumberOfProtocols;
struct NtAfProtocols *lpafpProtocols /*[dwNumberOfProtocols]*/;
char16_t *lpszQueryString;
uint32_t dwNumberOfCsAddrs;
struct NtCsAddrInfo *lpcsaBuffer /*[dwNumberOfCsAddrs]*/;
uint32_t dwOutputFlags;
struct NtBlob *lpBlob;
};
struct NtWsaNamespaceInfoEx {
struct NtGuid NSProviderId;
uint32_t dwNameSpace;
bool32 fActive;
uint32_t dwVersion;
char16_t *lpszIdentifier;
struct NtBlob *ProviderSpecific;
};
struct NtWsansClassInfo {
char16_t *lpszName;
uint32_t dwNameSpace;
uint32_t dwValueType;
uint32_t dwValueSize;
void *lpValue;
};
struct NtWsaServiceClassInfo {
struct NtGuid *lpServiceClassId;
char16_t *lpszServiceClassName;
uint32_t dwCount;
struct NtWsansClassInfo *lpClassInfos;
};
struct NtWsaNetworkEvents {
int32_t lNetworkEvents;
int32_t iErrorCode[10];
};
struct NtTransmitFileBuffers {
void *Head;
uint32_t HeadLength;
void *Tail;
uint32_t TailLength;
};
typedef int (*NtConditionProc)(
const struct iovec$nt *lpCallerId, const struct iovec$nt *lpCallerData,
struct NtQos *inout_lpSQOS, struct NtQos *inout_lpGQOS,
const struct iovec$nt *lpCalleeId, const struct iovec$nt *lpCalleeData,
uint32_t *out_group, const uint32_t *dwCallbackData);
typedef void (*NtWsaOverlappedCompletionRoutine)(
uint32_t dwError, uint32_t cbTransferred,
const struct NtOverlapped *lpOverlapped, uint32_t dwFlags);
struct NtWsaCompletion {
enum NtWsaCompletionType Type;
union {
struct {
int64_t hWnd;
uint32_t uMsg;
uintptr_t context;
} WindowMessage;
struct {
struct NtOverlapped *lpOverlapped;
} Event;
struct {
struct NtOverlapped *lpOverlapped;
NtWsaOverlappedCompletionRoutine lpfnCompletionProc;
} Apc;
struct {
struct NtOverlapped *lpOverlapped;
int64_t hPort;
uint32_t Key;
} Port;
} Parameters;
};
/**
* Winsock2 prototypes.
*
* @note Some of the functions exported by WS2_32.DLL, e.g. bind(),
* overlap with the names used by System V. Prototypes for these
* functions are declared within their respective wrappers.
*/
int32_t WSAStartup(uint16_t wVersionRequested, struct NtWsaData *lpWSAData)
paramsnonnull() nodiscard;
int WSACleanup(void);
int WSAGetLastError(void);
void WSASetLastError(int);
int __bind$nt(uint64_t, const void *, int);
int __closesocket$nt(uint64_t);
int __getpeername$nt(uint64_t, void *, uint32_t *);
int __getsockname$nt(uint64_t, void *, uint32_t *);
int __getsockopt$nt(uint64_t, int, int, void *, uint32_t *);
int __ioctlsocket$nt(uint64_t, int32_t, uint32_t *);
int __listen$nt(uint64_t, int);
int __setsockopt$nt(uint64_t, int, int, const void *, int);
int __shutdown$nt(uint64_t, int);
uint64_t WSASocket(int af, int type, int protocol,
const struct NtWsaProtocolInfo *opt_lpProtocolInfo,
const uint32_t opt_group, uint32_t dwFlags) nodiscard;
int WSAConnect(uint64_t s, const struct sockaddr *name, const int namelen,
const struct iovec$nt *opt_lpCallerData,
struct iovec$nt *opt_out_lpCalleeData,
const struct NtQos *opt_lpSQOS, const struct NtQos *opt_lpGQOS)
paramsnonnull((2));
bool32 WSAConnectByName(uint64_t s, const char16_t *nodename,
const char16_t *servicename,
uint32_t *opt_inout_LocalAddressLength,
struct sockaddr *out_LocalAddress,
uint32_t *opt_inout_RemoteAddressLength,
struct sockaddr *out_RemoteAddress,
const struct timeval$nt *opt_timeout,
struct NtOverlapped *__Reserved) paramsnonnull((2, 3));
bool32 WSAConnectByList(uint64_t s,
const struct NtSocketAddressList *SocketAddress,
uint32_t *opt_inout_LocalAddressLength,
struct sockaddr *out_LocalAddress,
uint32_t *opt_inout_RemoteAddressLength,
struct sockaddr *out_RemoteAddress,
const struct timeval$nt *opt_timeout,
struct NtOverlapped *__Reserved) paramsnonnull((2));
int64_t WSAAccept(uint64_t s, struct sockaddr *out_addr,
int32_t *opt_inout_addrlen,
const NtConditionProc opt_lpfnCondition,
const uint32_t *opt_dwCallbackData)
paramsnonnull((2)) nodiscard;
int WSASend(uint64_t s, const struct iovec$nt *lpBuffers,
uint32_t dwBufferCount, uint32_t *opt_out_lpNumberOfBytesSent,
uint32_t dwFlags, struct NtOverlapped *opt_inout_lpOverlapped,
const NtWsaOverlappedCompletionRoutine opt_lpCompletionRoutine)
paramsnonnull((2));
int WSASendMsg(int64_t Handle, const struct msghdr$nt *lpMsg, uint32_t dwFlags,
uint32_t *opt_out_lpNumberOfBytesSent,
struct NtOverlapped *opt_inout_lpOverlapped,
const NtWsaOverlappedCompletionRoutine opt_lpCompletionRoutine)
paramsnonnull((2));
int WSASendTo(uint64_t s, const struct iovec$nt *lpBuffers,
uint32_t dwBufferCount,
uint32_t *opt_out_lpNumberOfBytesSent /* opt if !overlapped */,
uint32_t dwFlags, const void *opt_tosockaddr,
int32_t tosockaddrlen,
struct NtOverlapped *opt_inout_lpOverlapped,
const NtWsaOverlappedCompletionRoutine opt_lpCompletionRoutine)
paramsnonnull((2));
int WSAPoll(struct pollfd$nt *inout_fdArray, uint32_t nfds, signed timeout_ms)
paramsnonnull();
int WSARecv(uint64_t s, const struct iovec$nt *out_lpBuffers,
uint32_t dwBufferCount, uint32_t *opt_out_lpNumberOfBytesRecvd,
uint32_t *inout_lpFlags,
struct NtOverlapped *opt_inout_lpOverlapped,
const NtWsaOverlappedCompletionRoutine opt_lpCompletionRoutine)
paramsnonnull((2, 5));
int WSARecvFrom(uint64_t s, const struct iovec$nt *out_lpBuffers,
uint32_t dwBufferCount, uint32_t *opt_out_lpNumberOfBytesRecvd,
uint32_t *inout_lpFlags, void *out_fromsockaddr,
uint32_t *inout_fromsockaddrlen,
struct NtOverlapped *opt_inout_lpOverlapped,
const NtWsaOverlappedCompletionRoutine opt_lpCompletionRoutine)
paramsnonnull((2, 5, 6, 7));
int WSARecvDisconnect(uint64_t s,
const struct iovec$nt *opt_lpInboundDisconnectData);
int WSADuplicateSocket(uint64_t s, uint32_t dwProcessId,
struct NtWsaProtocolInfo *out_lpProtocolInfo)
paramsnonnull((3));
int WSAIoctl(uint64_t s, uint32_t dwIoControlCode, const void *lpvInBuffer,
uint32_t cbInBuffer, void *out_lpvOutBuffer, uint32_t cbOutBuffer,
uint32_t *out_lpcbBytesReturned,
struct NtOverlapped *opt_inout_lpOverlapped,
const NtWsaOverlappedCompletionRoutine opt_lpCompletionRoutine)
paramsnonnull((3, 5, 7));
int WSANSPIoctl(int64_t hLookup, uint32_t dwControlCode,
const void *lpvInBuffer, uint32_t cbInBuffer,
void *out_lpvOutBuffer, uint32_t cbOutBuffer,
uint32_t *out_lpcbBytesReturned,
const struct NtWsaCompletion *opt_lpCompletion)
paramsnonnull((3, 5, 7));
int64_t WSACreateEvent(void) nodiscard;
bool32 WSACloseEvent(const int64_t hEvent);
bool32 WSAResetEvent(const int64_t hEvent);
bool32 WSASetEvent(const int64_t hEvent);
int WSAEventSelect(uint64_t s, const int64_t opt_hEventObject,
long lNetworkEvents);
uint32_t WSAWaitForMultipleEvents(uint32_t cEvents, const int64_t *lphEvents,
bool32 fWaitAll, uint32_t dwTimeout_ms,
bool32 fAlertable) paramsnonnull();
int WSAEnumNetworkEvents(uint64_t s, const int64_t hEventObject,
struct NtWsaNetworkEvents *out_lpNetworkEvents)
paramsnonnull();
bool32 WSAGetOverlappedResult(uint64_t s,
const struct NtOverlapped *lpOverlapped,
uint32_t *out_lpcbTransfer, bool32 fWait,
uint32_t *out_lpdwFlags) paramsnonnull();
int WSAEnumProtocols(const int32_t *opt_lpiProtocols,
struct NtWsaProtocolInfo *out_lpProtocolBuffer,
uint32_t *inout_lpdwBufferLength) paramsnonnull();
bool32 WSAGetQOSByName(uint64_t s, const struct iovec$nt *lpQOSName,
struct NtQos *out_lpQOS) paramsnonnull();
uint64_t WSAJoinLeaf(uint64_t s, const struct sockaddr *name, const int namelen,
const struct iovec$nt *opt_lpCallerData,
struct iovec$nt *opt_out_lpCalleeData,
const struct NtQos *opt_lpSQOS,
const struct NtQos *opt_lpGQOS, uint32_t dwFlags)
paramsnonnull((2, 4));
int WSALookupServiceBegin(const struct NtWsaQuerySet *lpqsRestrictions,
uint32_t dwControlFlags, int64_t *out_lphLookup)
paramsnonnull();
int WSALookupServiceNext(const int64_t hLookup, uint32_t dwControlFlags,
uint32_t *inout_lpdwBufferLength,
struct NtWsaQuerySet *out_lpqsResults) paramsnonnull();
int WSALookupServiceEnd(int64_t hLookup);
int WSAAddressToString(const struct sockaddr *lpsaAddress,
uint32_t dwAddressLength,
const struct NtWsaProtocolInfo *opt_lpProtocolInfo,
char16_t *out_lpszAddressString,
uint32_t *inout_lpdwAddressStringLength)
paramsnonnull((1, 4, 5));
int WSAStringToAddress(const char16_t *AddressString, int AddressFamily,
const struct NtWsaProtocolInfo *opt_lpProtocolInfo,
struct sockaddr *out_lpAddress,
int *inout_lpAddressLength) paramsnonnull((1, 3, 4));
int WSAEnumNameSpaceProvidersEx(uint32_t *inout_lpdwBufferLength,
struct NtWsaNamespaceInfoEx *out_lpnspBuffer)
paramsnonnull();
int WSAProviderConfigChange(
int64_t *inout_lpNotificationHandle,
struct NtOverlapped *opt_inout_lpOverlapped,
NtWsaOverlappedCompletionRoutine opt_lpCompletionRoutine)
paramsnonnull((1));
int WSAInstallServiceClass(
const struct NtWsaServiceClassInfo *lpServiceClassInfo) paramsnonnull();
int WSARemoveServiceClass(const struct NtGuid *lpServiceClassId)
paramsnonnull();
int WSAGetServiceClassInfo(const struct NtGuid *lpProviderId,
const struct NtGuid *lpServiceClassId,
uint32_t *inout_lpdwBufSize,
struct NtWsaServiceClassInfo *out_lpServiceClassInfo)
paramsnonnull((1, 2, 3));
int WSASetService(const struct NtWsaQuerySet *lpqsRegInfo, int essoperation,
uint32_t dwControlFlags) paramsnonnull();
int /* success==0 */ WSAGetServiceClassNameByClassId(
const struct NtGuid *lpServiceClassId, char16_t *out_lpszServiceClassName,
uint32_t *inout_lpdwBufferLength) paramsnonnull();
bool32 TransmitFile(int64_t hSocket, int64_t hFile,
uint32_t opt_nNumberOfBytesToWrite,
uint32_t opt_nNumberOfBytesPerSend,
struct NtOverlapped *opt_inout_lpOverlapped,
const struct NtTransmitFileBuffers *opt_lpTransmitBuffers,
uint32_t dwReserved);
bool32 AcceptEx(int64_t sListenSocket, int64_t sAcceptSocket,
void *out_lpOutputBuffer /*[recvlen+local+remoteaddrlen]*/,
uint32_t dwReceiveDataLength, uint32_t dwLocalAddressLength,
uint32_t dwRemoteAddressLength, uint32_t *out_lpdwBytesReceived,
struct NtOverlapped inout_lpOverlapped);
void GetAcceptExSockaddrs(
const void *lpOutputBuffer /*[recvsize+addrsize+addrlen]*/,
uint32_t dwReceiveDataLength, uint32_t dwLocalAddressLength,
uint32_t dwRemoteAddressLength,
struct sockaddr **out_LocalSockaddr /*[*LocalSockaddrLength]*/,
int *out_LocalSockaddrLength,
struct sockaddr **out_RemoteSockaddr /*[*RemoteSockaddrLength]*/,
int *out_RemoteSockaddrLength);
bool32 ConnectEx(int64_t s, const struct sockaddr *name, int namelen,
const void *opt_lpSendBuffer, uint32_t dwSendDataLength,
uint32_t *out_lpdwBytesSent,
struct NtOverlapped *inout_lpOverlapped);
bool32 DisconnectEx(int64_t s, struct NtOverlapped *inout_opt_lpOverlapped,
uint32_t dwFlags, uint32_t dwReserved);
COSMOPOLITAN_C_END_
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#endif /* COSMOPOLITAN_LIBC_NT_WINSOCK_H_ */