65 PVOID HelperDLLContext;
73 TRACE(
"Creating Socket, getting TDI Name - AddressFamily (%d) SocketType (%d) Protocol (%d).\n",
129 TRACE(
"Unknown Protocol (%d). We will try SOCK_STREAM.\n",
Protocol);
149 TRACE(
"Unknown SocketType (%d). We will try IPPROTO_TCP.\n",
SocketType);
169 ERR(
"SockGetTdiName: Status %x\n",
Status);
223 TRACE(
"Connectionless socket\n");
363 ERR(
"Failed to open socket. Status 0x%08x\n",
Status);
416 TRACE(
"Success %x\n", Sock);
527 lpProtocolInfo->dwServiceFlags3 =
HandleToUlong(hDuplicatedSharedData);
528 lpProtocolInfo->dwServiceFlags4 =
HandleToUlong(hDuplicatedHandle);
608 ERR(
"MSAFD: Unhandled NTSTATUS value: 0x%x\n",
Status);
646 LONG LingerWait = -1;
670 ERR(
"WSHNotify failed. Error 0x%#x\n",
Status);
671 if (lpErrno) *lpErrno =
Status;
679 WARN(
"Socket is closing.\n");
692 ERR(
"NtCreateEvent failed: 0x%08x\n",
Status);
709 ULONG SendsInProgress;
734 if (!SendsInProgress)
748 WARN(
"Would block!\n");
763 LingerWait -= SleepWait;
785 sizeof(DisconnectInfo),
815 while (CurrentSocket->NextSocket)
817 if (CurrentSocket->NextSocket == Socket)
819 CurrentSocket->
NextSocket = CurrentSocket->NextSocket->NextSocket;
823 CurrentSocket = CurrentSocket->NextSocket;
861 const struct sockaddr *SocketAddress,
862 int SocketAddressLength,
885 if (!SocketAddress || SocketAddressLength < Socket->SharedData->SizeOfLocalAddress)
928 SocketAddressLength -
sizeof(SocketAddress->
sa_family));
988 if (lpErrno) *lpErrno =
Status;
1071 if (lpErrno) *lpErrno =
Status;
1093 ULONG PollBufferSize;
1106 if (readfds !=
NULL)
1108 for (
i = 0;
i < readfds->fd_count;
i++)
1110 FD_SET(readfds->fd_array[
i], &selectfds);
1113 if (writefds !=
NULL)
1115 for (
i = 0;
i < writefds->fd_count;
i++)
1117 FD_SET(writefds->fd_array[
i], &selectfds);
1120 if (exceptfds !=
NULL)
1122 for (
i = 0;
i < exceptfds->fd_count;
i++)
1124 FD_SET(exceptfds->fd_array[
i], &selectfds);
1145 Timeout.u.HighPart = 0x7FFFFFFF;
1146 TRACE(
"Infinite timeout\n");
1161 TRACE(
"Timeout: Orig %d.%06d kernel %d\n",
1177 ERR(
"NtCreateEvent failed, 0x%08x\n",
Status);
1204 if (readfds !=
NULL) {
1205 for (
i = 0;
i < readfds->fd_count;
i++)
1223 ERR(
"Invalid socket handle provided in readfds %d\n", readfds->fd_array[
i]);
1238 if (writefds !=
NULL)
1240 for (
i = 0;
i < writefds->fd_count;
i++)
1258 ERR(
"Invalid socket handle provided in writefds %d\n", writefds->fd_array[
i]);
1270 if (exceptfds !=
NULL)
1272 for (
i = 0;
i < exceptfds->fd_count;
i++)
1290 TRACE(
"Invalid socket handle provided in exceptfds %d\n", exceptfds->fd_array[
i]);
1344 for(
x = 1;
x;
x<<=1)
1349 TRACE(
"Invalid socket handle found %d\n",
Handle);
1362 TRACE(
"Event %x on handle %x\n",
1373 TRACE(
"Event %x on handle %x\n",
1380 TRACE(
"Event %x on handle %x\n",
1387 TRACE(
"Event %x on handle %x\n",
1396 TRACE(
"Event %x on handle %x\n",
1421 TRACE(
"*lpErrno = %x\n", *lpErrno);
1425 (writefds && writefds != readfds ? writefds->fd_count : 0) +
1426 (exceptfds && exceptfds != readfds && exceptfds != writefds ? exceptfds->fd_count : 0);
1436 SYSTEMTIME st1970 = { 1970, 1, 0, 1, 0, 0, 0, 0 };
1445 return (
DWORD)((
Time.ll - u1970.ll) / 10000000ULL);
1469 ULONG PendingDataLength = 0;
1470 PVOID CalleeDataBuffer;
1471 WSABUF CallerData, CalleeID, CallerID, CalleeData;
1477 UCHAR ReceiveBuffer[0x1A];
1492 if ((SocketAddress && !SocketAddressLength) ||
1493 (SocketAddressLength && !SocketAddress) ||
1494 (SocketAddressLength && *SocketAddressLength <
sizeof(
SOCKADDR)))
1546 0xA +
sizeof(*ListenReceiveData));
1561 if (lpfnCondition !=
NULL)
1577 sizeof(PendingAcceptData),
1579 sizeof(PendingAcceptData));
1597 if (PendingDataLength)
1617 sizeof(PendingAcceptData),
1658 CallerID.
len =
sizeof(*RemoteAddress);
1661 CallerData.
buf = PendingData;
1662 CallerData.
len = PendingDataLength;
1669 if (!CalleeDataBuffer) {
1672 CalleeData.
buf = CalleeDataBuffer;
1673 CalleeData.
len = 4096;
1683 CallBack = (lpfnCondition)(&CallerID,
1692 if (((CallBack ==
CF_ACCEPT) && GroupID) != 0)
1796 if (!AcceptSocketInfo)
1813 if( SocketAddressLength )
1814 *SocketAddressLength =
sizeof(*RemoteAddress);
1834 if (lpErrno) *lpErrno =
Status;
1902 const struct sockaddr * SocketAddress,
1903 int SocketAddressLength,
1916 ULONG ConnectDataLength;
1917 ULONG InConnectDataLength;
1919 int SocketDataLength;
1937 INT BindAddressLength;
1950 &BindAddressLength);
1952 BindError =
WSPBind(
Handle, BindAddress, BindAddressLength, lpErrno);
1967 if (lpCallerData !=
NULL)
1969 ConnectDataLength = lpCallerData->
len;
1998 if (connectionInfoSize > 128)
2024 if (lpCalleeData !=
NULL)
2026 InConnectDataLength = lpCalleeData->
len;
2033 &InConnectDataLength,
2034 sizeof(InConnectDataLength),
2050 ConnectInfo->
Root = 0;
2060 ERR(
"Not enough memory for APC Context\n");
2158 if (lpErrno) *lpErrno = Errno;
2172 if (lpErrno) *lpErrno = Errno;
2185 _In_ int SocketAddressLength,
2196 int SocketDataLength;
2205 if (!lpSendBuffer && dwSendDataLength)
2245 SocketAddress->sa_data,
2339 sizeof(DisconnectInfo),
2367 ULONG TdiAddressSize;
2382 if (!
Name || !NameLength)
2402 if ( TdiAddress ==
NULL )
2409 SocketAddress = &TdiAddress->
Address;
2441 TRACE(
"NameLength %d Address: %x Port %x\n",
2469 ULONG TdiAddressSize;
2489 if (!
Name || !NameLength)
2508 if ( SocketAddress ==
NULL )
2545 TRACE(
"NameLength %d Address: %x Port %x\n",
2626 NeedsCompletion =
FALSE;
2634 cbRet =
sizeof(
ULONG);
2638 if (cbOutBuffer <
sizeof(
ULONG))
2643 NeedsCompletion =
FALSE;
2647 cbRet =
sizeof(
ULONG);
2654 cbRet =
sizeof(
BOOL);
2658 if (cbOutBuffer <
sizeof(
BOOL))
2674 cbRet =
sizeof(
BOOL);
2679 if (cbOutBuffer == 0)
2681 cbRet =
sizeof(
PVOID);
2686 if (cbInBuffer <
sizeof(
GUID) ||
2687 cbOutBuffer <
sizeof(
PVOID))
2695 GUID ConnectExGUID = WSAID_CONNECTEX;
2696 GUID DisconnectExGUID = WSAID_DISCONNECTEX;
2702 cbRet =
sizeof(
PVOID);
2706 else if (
IsEqualGUID(&ConnectExGUID, lpvInBuffer))
2709 cbRet =
sizeof(
PVOID);
2713 else if (
IsEqualGUID(&DisconnectExGUID, lpvInBuffer))
2716 cbRet =
sizeof(
PVOID);
2720 else if (
IsEqualGUID(&GetAcceptExSockaddrsGUID, lpvInBuffer))
2723 cbRet =
sizeof(
PVOID);
2729 ERR(
"SIO_GET_EXTENSION_FUNCTION_POINTER UNIMPLEMENTED\n");
2734 ERR(
"Querying unknown extension function: %x\n", ((
GUID*)lpvInBuffer)->Data1);
2747 if (cbOutBuffer <
sizeof(
INT))
2781 lpCompletionRoutine,
2792 if (lpCompletionRoutine !=
NULL)
2806 if (lpcbBytesReturned)
2807 *lpcbBytesReturned = cbRet;
2837 if (!OptionLength || !OptionValue)
2955 DbgPrint(
"MSAFD: Get unknown optname %x\n", OptionName);
2983 (
LPINT)OptionLength);
2984 if (lpErrno) *lpErrno = Errno;
3032 sizeof(SharedData));
3055 sizeof(HandleData));
3118 if (!optval && optlen)
3131 if (optlen <
sizeof(
BOOL))
3140 if (optlen <
sizeof(
BOOL))
3149 if (optlen <
sizeof(
BOOL))
3158 if (optlen <
sizeof(
BOOL))
3167 if (optlen <
sizeof(
BOOL))
3176 if (optlen <
sizeof(
struct linger))
3187 if (optlen <
sizeof(
ULONG))
3211 if (optlen <
sizeof(
ULONG))
3218 if (*(
PULONG)optval > 0x2000)
3219 *(
PULONG)optval = 0x2000;
3238 case SO_UPDATE_CONNECT_CONTEXT:
3242 if (optlen <
sizeof(
INT))
3254 if (optlen <
sizeof(
DWORD))
3266 if (optlen <
sizeof(
DWORD))
3284 ERR(
"MSAFD: Set unknown optname %x\n", optname);
3298 if (lpErrno) *lpErrno = Errno;
3325 if (((
LOBYTE(wVersionRequested) == 2) && (
HIBYTE(wVersionRequested) < 2)) ||
3326 (
LOBYTE(wVersionRequested) < 2))
3328 ERR(
"WSPStartup NOT SUPPORTED for version 0x%X\n", wVersionRequested);
3341 lpProcTable->lpWSPBind =
WSPBind;
3354 lpProcTable->lpWSPIoctl =
WSPIoctl;
3357 lpProcTable->lpWSPRecv =
WSPRecv;
3361 lpProcTable->lpWSPSend =
WSPSend;
3368 lpWSPData->wVersion =
MAKEWORD(2, 2);
3369 lpWSPData->wHighVersion =
MAKEWORD(2, 2);
3392 if (!lpsaAddress || !lpszAddressString || !lpdwAddressStringLength)
3398 switch (lpsaAddress->sa_family)
3408 (
unsigned int)(
ntohl(((
SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr) >> 24 & 0xff),
3409 (
unsigned int)(
ntohl(((
SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr) >> 16 & 0xff),
3410 (
unsigned int)(
ntohl(((
SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr) >> 8 & 0xff),
3411 (
unsigned int)(
ntohl(((
SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr) & 0xff),
3427 if (*lpdwAddressStringLength <
size)
3429 *lpdwAddressStringLength =
size;
3434 *lpdwAddressStringLength =
size;
3450 LONG inetaddr = 0, ip_part;
3454 if (!lpAddressLength || !lpAddress || !AddressString)
3463 if (lpProtocolInfo !=
NULL)
3465 sockaddr->sin_family = lpProtocolInfo->iAddressFamily;
3484 bp = &AddressString;
3487 while (*bp < &AddressString[
wcslen(AddressString)])
3489 ip_part =
wcstol(*bp, bp, 10);
3491 if (ip_part < 0 || ip_part > 255)
3496 inetaddr = (inetaddr << 8) + ip_part;
3498 if ((*bp)[0] == 0 || (*bp)[0] ==
L':')
3501 if ((*bp)[0] !=
L'.')
3520 if ((*bp)[0] ==
L':')
3525 if ((*bp)[0] <
L'0' || (*bp)[0] >
L'9')
3540 *lpAddressLength =
sizeof(*sockaddr);
3543 sockaddr->sin_addr.s_addr = inetaddr;
3548 if (lpErrno && !*lpErrno)
3568 TRACE(
"Leaving.\n");
3587 if (
Context->lpCompletionRoutine)
3598 ULONG AfdInformationClass,
3646 TRACE(
"Opened without flag WSA_FLAG_OVERLAPPED. Do nothing.\n");
3655 ERR(
"Not enough memory for APC Context\n");
3666 Event = Overlapped->hEvent;
3701 if (LargeInteger !=
NULL)
3705 if (Boolean !=
NULL)
3724 ULONG AfdInformationClass,
3763 if (LargeInteger !=
NULL)
3767 if (Boolean !=
NULL)
3786 TRACE(
"Opened without flag WSA_FLAG_OVERLAPPED. Do nothing.\n");
3795 ERR(
"Not enough memory for APC Context\n");
3806 Event = Overlapped->hEvent;
3852 while (CurrentSocket)
3857 return CurrentSocket;
3902 sizeof(ContextData),
3921 DWORD AsyncThreadId;
3942 ERR(
"Failed to create completion port: 0x%08x\n",
Status);
3951 sizeof(HandleFlags));
3993 (
PVOID*)&AsyncCompletionRoutine,
4000 (*AsyncCompletionRoutine)(AsyncContext, &IOSB);
4057 sizeof(CompletionInfo),
4067 sizeof(HandleFlags));
4098 for (
x = 1;
x;
x<<=1)
4207 ULONG lNetworkEvents;
4232 if (lNetworkEvents &
FD_OOB)
4253 if (lNetworkEvents &
FD_QOS)
4306 FreeContext =
FALSE;
4327 if (!(Socket->SharedData->AsyncDisabledEvents &
Event))
4333 Socket->SharedData->AsyncDisabledEvents &=
~Event;
4336 if ((Socket->SharedData->AsyncEvents & (~Socket->SharedData->AsyncDisabledEvents)) == 0 )
4343 if (!AsyncData)
return;
4349 Socket->SharedData->SequenceNumber++;
4377 TRACE(
"Loading MSAFD.DLL \n");
4392 TRACE(
"MSAFD.DLL has been loaded\n");
4410 TRACE(
"DllMain of msafd.dll (leaving)\n");
#define InterlockedIncrement
#define InterlockedDecrement
#define UlongToHandle(ul)
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
#define STATUS_NOT_IMPLEMENTED
#define NT_SUCCESS(StatCode)
BOOL WINAPI DllMain(HINSTANCE hDLLInst, DWORD fdwReason, LPVOID lpvReserved)
#define ERROR_INVALID_PARAMETER
#define DLL_THREAD_DETACH
#define DLL_PROCESS_ATTACH
#define DLL_PROCESS_DETACH
#define INVALID_HANDLE_VALUE
#define GetCurrentProcess()
#define HeapFree(x, y, z)
#define DLL_THREAD_ATTACH
BOOL WINAPI DuplicateHandle(IN HANDLE hSourceProcessHandle, IN HANDLE hSourceHandle, IN HANDLE hTargetProcessHandle, OUT LPHANDLE lpTargetHandle, IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN DWORD dwOptions)
BOOL WINAPI DisableThreadLibraryCalls(IN HMODULE hLibModule)
HANDLE WINAPI OpenProcess(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN DWORD dwProcessId)
BOOL WINAPI SetThreadPriority(IN HANDLE hThread, IN int nPriority)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
VOID WINAPI GetSystemTimeAsFileTime(OUT PFILETIME lpFileTime)
BOOL WINAPI SystemTimeToFileTime(IN CONST SYSTEMTIME *lpSystemTime, OUT LPFILETIME lpFileTime)
#define IS_INTRESOURCE(x)
int SockGetTdiName(PINT AddressFamily, PINT SocketType, PINT Protocol, GROUP Group, DWORD Flags, PUNICODE_STRING TransportName, PVOID *HelperDllContext, PHELPER_DATA *HelperDllData, PDWORD Events)
static VOID NTAPI MsafdInfoAPC(_In_ PVOID ApcContext, _In_ PIO_STATUS_BLOCK IoStatusBlock, _In_ ULONG Reserved)
INT WSPAPI WSPAddressToString(IN LPSOCKADDR lpsaAddress, IN DWORD dwAddressLength, IN LPWSAPROTOCOL_INFOW lpProtocolInfo, OUT LPWSTR lpszAddressString, IN OUT LPDWORD lpdwAddressStringLength, OUT LPINT lpErrno)
int WSPAPI WSPListen(SOCKET Handle, int Backlog, LPINT lpErrno)
INT WSPAPI WSPSetSockOpt(IN SOCKET s, IN INT level, IN INT optname, IN CONST CHAR FAR *optval, IN INT optlen, OUT LPINT lpErrno)
BOOL WSPAPI WSPConnectEx(_In_ SOCKET Handle, _In_ const struct sockaddr *SocketAddress, _In_ int SocketAddressLength, _In_ PVOID lpSendBuffer, _In_ DWORD dwSendDataLength, _Out_ LPDWORD lpdwBytesSent, _Inout_ LPOVERLAPPED lpOverlapped)
VOID SockAsyncSelectCompletionRoutine(PVOID Context, PIO_STATUS_BLOCK IoStatusBlock)
INT WSPAPI WSPCleanup(OUT LPINT lpErrno)
int GetSocketInformation(PSOCKET_INFORMATION Socket, ULONG AfdInformationClass, PBOOLEAN Boolean OPTIONAL, PULONG Ulong OPTIONAL, PLARGE_INTEGER LargeInteger OPTIONAL, LPWSAOVERLAPPED Overlapped OPTIONAL, LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine OPTIONAL)
int WSPAPI WSPConnect(SOCKET Handle, const struct sockaddr *SocketAddress, int SocketAddressLength, LPWSABUF lpCallerData, LPWSABUF lpCalleeData, LPQOS lpSQOS, LPQOS lpGQOS, LPINT lpErrno)
INT WSPAPI WSPGetSockOpt(IN SOCKET Handle, IN INT Level, IN INT OptionName, OUT CHAR FAR *OptionValue, IN OUT LPINT OptionLength, OUT LPINT lpErrno)
HANDLE SockAsyncCompletionPort
INT WSPAPI WSPBind(SOCKET Handle, const struct sockaddr *SocketAddress, int SocketAddressLength, LPINT lpErrno)
BOOLEAN SockCreateOrReferenceAsyncThread(VOID)
VOID SockProcessAsyncSelect(PSOCKET_INFORMATION Socket, PASYNC_DATA AsyncData)
LIST_ENTRY SockHelpersListHead
HANDLE SockAsyncHelperAfdHandle
VOID MsafdWaitForAlert(_In_ HANDLE hObject)
DWORD GetCurrentTimeInSeconds(VOID)
PSOCKET_INFORMATION GetSocketStructure(SOCKET Handle)
INT WSPAPI WSPGetPeerName(IN SOCKET s, OUT LPSOCKADDR Name, IN OUT LPINT NameLength, OUT LPINT lpErrno)
int WSPAPI WSPSelect(IN int nfds, IN OUT fd_set *readfds OPTIONAL, IN OUT fd_set *writefds OPTIONAL, IN OUT fd_set *exceptfds OPTIONAL, IN const struct timeval *timeout OPTIONAL, OUT LPINT lpErrno)
int CreateContext(PSOCKET_INFORMATION Socket)
VOID SockProcessQueuedAsyncSelect(PVOID Context, PIO_STATUS_BLOCK IoStatusBlock)
int SetSocketInformation(PSOCKET_INFORMATION Socket, ULONG AfdInformationClass, PBOOLEAN Boolean OPTIONAL, PULONG Ulong OPTIONAL, PLARGE_INTEGER LargeInteger OPTIONAL, LPWSAOVERLAPPED Overlapped OPTIONAL, LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine OPTIONAL)
INT WSPAPI WSPDuplicateSocket(IN SOCKET Handle, IN DWORD dwProcessId, OUT LPWSAPROTOCOL_INFOW lpProtocolInfo, OUT LPINT lpErrno)
ULONG NTAPI SockAsyncThread(PVOID ThreadParam)
int WSPAPI WSPShutdown(SOCKET Handle, int HowTo, LPINT lpErrno)
INT WSPAPI WSPStringToAddress(IN LPWSTR AddressString, IN INT AddressFamily, IN LPWSAPROTOCOL_INFOW lpProtocolInfo, OUT LPSOCKADDR lpAddress, IN OUT LPINT lpAddressLength, OUT LPINT lpErrno)
_Must_inspect_result_ int WSPAPI WSPStartup(_In_ WORD wVersionRequested, _In_ LPWSPDATA lpWSPData, _In_ LPWSAPROTOCOL_INFOW lpProtocolInfo, _In_ WSPUPCALLTABLE UpcallTable, _Out_ LPWSPPROC_TABLE lpProcTable)
INT WSPAPI WSPIoctl(IN SOCKET Handle, IN DWORD dwIoControlCode, IN LPVOID lpvInBuffer, IN DWORD cbInBuffer, OUT LPVOID lpvOutBuffer, IN DWORD cbOutBuffer, OUT LPDWORD lpcbBytesReturned, IN LPWSAOVERLAPPED lpOverlapped, IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, IN LPWSATHREADID lpThreadId, OUT LPINT lpErrno)
ULONG SockAsyncThreadRefCount
INT WSPAPI WSPCloseSocket(IN SOCKET Handle, OUT LPINT lpErrno)
INT TranslateNtStatusError(NTSTATUS Status)
_Must_inspect_result_ SOCKET WSPAPI WSPAccept(_In_ SOCKET Handle, _Out_writes_bytes_to_opt_(*addrlen, *addrlen) struct sockaddr FAR *SocketAddress, _Inout_opt_ LPINT SocketAddressLength, _In_opt_ LPCONDITIONPROC lpfnCondition, _In_opt_ DWORD_PTR dwCallbackData, _Out_ LPINT lpErrno)
SOCKET WSPAPI WSPSocket(int AddressFamily, int SocketType, int Protocol, LPWSAPROTOCOL_INFOW lpProtocolInfo, GROUP g, DWORD dwFlags, LPINT lpErrno)
static VOID NTAPI MsafdConnectAPC(_In_ PVOID ApcContext, _In_ PIO_STATUS_BLOCK IoStatusBlock, _In_ ULONG Reserved)
static INT NTAPI MsafdUpdateConnectionContext(_In_ SOCKET Handle, _Out_ LPINT lpErrno)
INT WSPAPI WSPGetSockName(IN SOCKET Handle, OUT LPSOCKADDR Name, IN OUT LPINT NameLength, OUT LPINT lpErrno)
BOOLEAN SockAsyncSelectCalled
VOID SockReenableAsyncSelectEvent(IN PSOCKET_INFORMATION Socket, IN ULONG Event)
BOOLEAN SockGetAsyncSelectHelperAfdHandle(VOID)
PSOCKET_INFORMATION SocketListHead
CRITICAL_SECTION SocketListLock
LPWPUCOMPLETEOVERLAPPEDREQUEST lpWPUCompleteOverlappedRequest
INT WSPAPI WSPEnumNetworkEvents(IN SOCKET Handle, IN WSAEVENT hEventObject, OUT LPWSANETWORKEVENTS lpNetworkEvents, OUT LPINT lpErrno)
int WSPAPI WSPEventSelect(IN SOCKET Handle, IN WSAEVENT hEventObject, IN long lNetworkEvents, OUT LPINT lpErrno)
INT WSPAPI WSPCancelBlockingCall(OUT LPINT lpErrno)
BOOL WSPAPI WSPAcceptEx(IN SOCKET sListenSocket, IN SOCKET sAcceptSocket, OUT PVOID lpOutputBuffer, IN DWORD dwReceiveDataLength, IN DWORD dwLocalAddressLength, IN DWORD dwRemoteAddressLength, OUT LPDWORD lpdwBytesReceived, IN OUT LPOVERLAPPED lpOverlapped)
VOID WSPAPI WSPGetAcceptExSockaddrs(IN PVOID lpOutputBuffer, IN DWORD dwReceiveDataLength, IN DWORD dwLocalAddressLength, IN DWORD dwRemoteAddressLength, OUT struct sockaddr **LocalSockaddr, OUT LPINT LocalSockaddrLength, OUT struct sockaddr **RemoteSockaddr, OUT LPINT RemoteSockaddrLength)
BOOL WSPAPI WSPDisconnectEx(IN SOCKET hSocket, IN LPOVERLAPPED lpOverlapped, IN DWORD dwFlags, IN DWORD reserved)
SOCKET WSPAPI WSPJoinLeaf(IN SOCKET s, IN CONST SOCKADDR *name, IN INT namelen, IN LPWSABUF lpCallerData, OUT LPWSABUF lpCalleeData, IN LPQOS lpSQOS, IN LPQOS lpGQOS, IN DWORD dwFlags, OUT LPINT lpErrno)
BOOL WSPAPI WSPGetQOSByName(IN SOCKET s, IN OUT LPWSABUF lpQOSName, OUT LPQOS lpQOS, OUT LPINT lpErrno)
FORCEINLINE DWORD MsafdReturnWithErrno(_In_ NTSTATUS Status, _Out_opt_ LPINT Errno, _In_ DWORD Received, _Out_opt_ LPDWORD ReturnedBytes)
VOID(* PASYNC_COMPLETION_ROUTINE)(PVOID Context, PIO_STATUS_BLOCK IoStatusBlock)
_ACRTIMP __msvcrt_long __cdecl wcstol(const wchar_t *, wchar_t **, int)
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
#define SO_SYNCHRONOUS_NONALERT
struct _IO_STATUS_BLOCK * PIO_STATUS_BLOCK
#define InitializeListHead(ListHead)
#define STATUS_ACCESS_VIOLATION
@ FileCompletionInformation
struct _FILE_FULL_EA_INFORMATION FILE_FULL_EA_INFORMATION
GLint GLint GLint GLint GLint x
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
#define OBJ_CASE_INSENSITIVE
NTSYSAPI LONGLONG WINAPI RtlConvertLongToLargeInteger(LONG)
@ ObjectHandleFlagInformation
NTSYSAPI LONGLONG WINAPI RtlEnlargedIntegerMultiply(INT, INT)
#define PROCESS_DUP_HANDLE
NTSTATUS NTAPI NtSetIoCompletion(IN HANDLE IoCompletionPortHandle, IN PVOID CompletionKey, IN PVOID CompletionContext, IN NTSTATUS CompletionStatus, IN ULONG CompletionInformation)
NTSTATUS NTAPI NtRemoveIoCompletion(IN HANDLE IoCompletionHandle, OUT PVOID *KeyContext, OUT PVOID *ApcContext, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER Timeout OPTIONAL)
NTSTATUS NTAPI NtCreateIoCompletion(OUT PHANDLE IoCompletionHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN ULONG NumberOfConcurrentThreads)
BOOL WINAPI PostQueuedCompletionStatus(IN HANDLE CompletionHandle, IN DWORD dwNumberOfBytesTransferred, IN ULONG_PTR dwCompletionKey, IN LPOVERLAPPED lpOverlapped)
_In_ BOOL _In_ HANDLE hProcess
#define IO_COMPLETION_ALL_ACCESS
#define InitializeObjectAttributes(p, n, a, r, s)
static PLARGE_INTEGER Time
#define WSAID_GETACCEPTEXSOCKADDRS
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED lpOverlapped
IN PCO_ADDRESS_FAMILY AddressFamily
_In_opt_ HANDLE _In_opt_ PIO_APC_ROUTINE _In_opt_ PVOID ApcContext
#define AFD_SHARE_WILDCARD
#define AFD_SHARE_EXCLUSIVE
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
#define _Must_inspect_result_
#define _Out_writes_bytes_to_opt_(s, c)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI NTSTATUS NTAPI NtSetInformationFile(IN HANDLE hFile, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN PVOID FileInformationBuffer, IN ULONG FileInformationBufferLength, IN FILE_INFORMATION_CLASS FileInfoClass)
NTSYSAPI NTSTATUS NTAPI NtDeviceIoControlFile(IN HANDLE hFile, IN HANDLE hEvent OPTIONAL, IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL, IN PVOID IoApcContext OPTIONAL, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG DeviceIoControlCode, IN PVOID InBuffer OPTIONAL, IN ULONG InBufferLength, OUT PVOID OutBuffer OPTIONAL, IN ULONG OutBufferLength)
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
NTSTATUS NTAPI NtCreateFile(OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes, IN ULONG ShareAccess, IN ULONG CreateDisposition, IN ULONG CreateOptions, IN PVOID EaBuffer OPTIONAL, IN ULONG EaLength)
VOID(* PIO_APC_ROUTINE)(IN PVOID ApcContext, IN PIO_STATUS_BLOCK IoStatusBlock, IN ULONG Reserved)
static OUT PIO_STATUS_BLOCK IoStatusBlock
NTSTATUS NTAPI NtCreateEvent(OUT PHANDLE EventHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN EVENT_TYPE EventType, IN BOOLEAN InitialState)
#define STATUS_INVALID_ADDRESS
#define STATUS_NETWORK_UNREACHABLE
#define STATUS_ADDRESS_ALREADY_EXISTS
#define STATUS_FILE_CLOSED
#define STATUS_HOST_UNREACHABLE
#define STATUS_REMOTE_DISCONNECT
#define STATUS_INVALID_CONNECTION
#define STATUS_REMOTE_NOT_LISTENING
#define STATUS_LOCAL_DISCONNECT
#define STATUS_PROTOCOL_NOT_SUPPORTED
NTSTATUS NTAPI NtSetInformationObject(IN HANDLE ObjectHandle, IN OBJECT_INFORMATION_CLASS ObjectInformationClass, IN PVOID ObjectInformation, IN ULONG Length)
#define IsEqualGUID(rguid1, rguid2)
#define AFD_INFO_SEND_WINDOW_SIZE
#define IOCTL_AFD_GET_TDI_HANDLES
#define AFD_INFO_RECEIVE_WINDOW_SIZE
struct _AFD_POLL_INFO * PAFD_POLL_INFO
#define AFD_DISCONNECT_RECV
struct _AFD_CREATE_PACKET * PAFD_CREATE_PACKET
#define IOCTL_AFD_SET_INFO
struct _AFD_CONNECT_INFO * PAFD_CONNECT_INFO
#define AFD_INFO_RECEIVE_CONTENT_SIZE
#define IOCTL_AFD_WAIT_FOR_LISTEN
#define AFD_PACKET_COMMAND_LENGTH
#define IOCTL_AFD_GET_SOCK_NAME
#define IOCTL_AFD_DEFER_ACCEPT
#define IOCTL_AFD_START_LISTEN
#define AFD_EVENT_OOB_RECEIVE
#define AFD_EVENT_CONNECT_FAIL
#define AFD_EVENT_RECEIVE
struct _AFD_RECEIVED_ACCEPT_DATA * PAFD_RECEIVED_ACCEPT_DATA
#define IOCTL_AFD_GET_CONTEXT
struct _AFD_HANDLE_ AFD_HANDLE
#define AFD_DISCONNECT_ABORT
#define AFD_EVENT_DISCONNECT
#define AFD_ENDPOINT_D_ROOT
#define AFD_INFO_BLOCKING_MODE
#define AFD_ENDPOINT_MULTIPOINT
#define IOCTL_AFD_GET_INFO
#define IOCTL_AFD_SET_CONNECT_DATA
#define AFD_CONNECTION_HANDLE
#define IOCTL_AFD_CONNECT
struct _AFD_SUPER_CONNECT_INFO * PAFD_SUPER_CONNECT_INFO
#define IOCTL_AFD_DISCONNECT
#define AFD_ENDPOINT_MESSAGE_ORIENTED
struct _AFD_CREATE_PACKET AFD_CREATE_PACKET
#define AFD_ADDRESS_HANDLE
#define AFD_INFO_SENDS_IN_PROGRESS
#define IOCTL_AFD_SUPER_CONNECT
#define AFD_ENDPOINT_CONNECTIONLESS
#define IOCTL_AFD_GET_PENDING_CONNECT_DATA
#define AFD_EVENT_CONNECT
#define AFD_EVENT_GROUP_QOS
#define IOCTL_AFD_SET_CONNECT_DATA_SIZE
#define IOCTL_AFD_GET_PEER_NAME
#define IOCTL_AFD_SET_CONTEXT
#define AFD_ENDPOINT_C_ROOT
#define AFD_INFO_GROUP_ID_TYPE
#define IOCTL_AFD_GET_CONNECT_DATA
#define AFD_DISCONNECT_SEND
#define STATUS_END_OF_FILE
#define STATUS_BUFFER_TOO_SMALL
#define STATUS_BUFFER_OVERFLOW
INT WSPAPI WSPSendDisconnect(IN SOCKET s, IN LPWSABUF lpOutboundDisconnectData, OUT LPINT lpErrno)
int WSPAPI WSPRecvFrom(SOCKET Handle, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesRead, LPDWORD ReceiveFlags, struct sockaddr *SocketAddress, int *SocketAddressLength, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, LPWSATHREADID lpThreadId, LPINT lpErrno)
BOOL WSPAPI WSPGetOverlappedResult(IN SOCKET Handle, IN LPWSAOVERLAPPED lpOverlapped, OUT LPDWORD lpdwBytes, IN BOOL fWait, OUT LPDWORD lpdwFlags, OUT LPINT lpErrno)
INT WSPAPI WSPAsyncSelect(IN SOCKET Handle, IN HWND hWnd, IN UINT wMsg, IN LONG lEvent, OUT LPINT lpErrno)
int WSPAPI WSPSendTo(SOCKET Handle, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD iFlags, const struct sockaddr *SocketAddress, int SocketAddressLength, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, LPWSATHREADID lpThreadId, LPINT lpErrno)
int WSPAPI WSPSend(SOCKET Handle, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD iFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, LPWSATHREADID lpThreadId, LPINT lpErrno)
int WSPAPI WSPRecv(SOCKET Handle, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesRead, LPDWORD ReceiveFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, LPWSATHREADID lpThreadId, LPINT lpErrno)
INT WSPAPI WSPRecvDisconnect(IN SOCKET s, OUT LPWSABUF lpInboundDisconnectData, OUT LPINT lpErrno)
PULONG MinorVersion OPTIONAL
TRANSPORT_ADDRESS Address
TRANSPORT_ADDRESS RemoteAddress
DWORD SizeOfTransportName
union _AFD_INFO::@3563 Information
LARGE_INTEGER LargeInteger
BOOLEAN UseDelayedAcceptance
TRANSPORT_ADDRESS Address
TRANSPORT_ADDRESS RemoteAddress
HANDLE TdiConnectionHandle
AFD_POLL_INFO AsyncSelectInfo
PSOCKET_INFORMATION ParentSocket
IO_STATUS_BLOCK IoStatusBlock
BOOLEAN UseDelayedAcceptance
PWSH_GET_SOCKADDR_TYPE WSHGetSockaddrType
PWSH_GET_SOCKET_INFORMATION WSHGetSocketInformation
PWSH_SET_SOCKET_INFORMATION WSHSetSocketInformation
PWSH_GET_WILDCARD_SOCKADDR WSHGetWildcardSockaddr
IO_STATUS_BLOCK IoStatusBlock
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
LPWSAOVERLAPPED lpOverlapped
SOCKADDR_ADDRESS_INFO AddressInfo
SOCKADDR_ENDPOINT_INFO EndpointInfo
SOCK_SHARED_INFO SharedData
BOOLEAN ExclusiveAddressUse
BOOLEAN UseDelayedAcceptance
TRANSPORT_ADDRESS Address
LPWPUMODIFYIFSHANDLE lpWPUModifyIFSHandle
LPWPUPOSTMESSAGE lpWPUPostMessage
SOCKET fd_array[FD_SETSIZE]
DWORD WINAPI SleepEx(IN DWORD dwMilliseconds, IN BOOL bAlertable)
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
DWORD WINAPI WaitForSingleObjectEx(IN HANDLE hHandle, IN DWORD dwMilliseconds, IN BOOL bAlertable)
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
struct _TRANSPORT_ADDRESS TRANSPORT_ADDRESS
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define STATUS_ACCESS_DENIED
#define STATUS_INVALID_PARAMETER
#define STATUS_INSUFFICIENT_RESOURCES
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
_In_ WDFREQUEST _In_opt_ PFN_WDF_REQUEST_COMPLETION_ROUTINE CompletionRoutine
DWORD WINAPI GetLastError(void)
#define CreateFileMapping
HANDLE WINAPI GetCurrentThread(void)
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
#define WAIT_IO_COMPLETION
#define FILE_MAP_ALL_ACCESS
#define THREAD_PRIORITY_ABOVE_NORMAL
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
_Reserved_ PVOID Reserved
_In_ DWORD dwIoControlCode
#define WSAVERNOTSUPPORTED
#define WSA_FLAG_MULTIPOINT_D_LEAF
#define XP1_MULTIPOINT_DATA_PLANE
#define XP1_CONNECTIONLESS
#define WSA_FLAG_MULTIPOINT_C_ROOT
#define WSA_OPERATION_ABORTED
#define XP1_SUPPORT_MULTIPOINT
#define XP1_QOS_SUPPORTED
#define XP1_PSEUDO_STREAM
#define XP1_MULTIPOINT_CONTROL_PLANE
void(CALLBACK * LPWSAOVERLAPPED_COMPLETION_ROUTINE)(IN DWORD dwError, IN DWORD cbTransferred, IN LPWSAOVERLAPPED lpOverlapped, IN DWORD dwFlags)
#define XP1_MESSAGE_ORIENTED
#define WSA_FLAG_MULTIPOINT_D_ROOT
#define SO_PROTOCOL_INFOW
#define WSA_FLAG_MULTIPOINT_C_LEAF
int(CALLBACK * LPCONDITIONPROC)(IN LPWSABUF lpCallerId, IN LPWSABUF lpCallerData, IN OUT LPQOS lpSQOS, IN OUT LPQOS lpGQOS, IN LPWSABUF lpCalleeId, IN LPWSABUF lpCalleeData, OUT GROUP FAR *g, IN DWORD_PTR dwCallbackData)
struct sockaddr_in SOCKADDR_IN
#define WSAMAKESELECTREPLY(e, error)
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR Level
#define SO_CONDITIONAL_ACCEPT
#define SO_EXCLUSIVEADDRUSE
#define SIO_ADDRESS_LIST_QUERY
struct _SOCKET_ADDRESS_LIST SOCKET_ADDRESS_LIST
#define SO_GROUP_PRIORITY
#define SIO_GET_EXTENSION_FUNCTION_POINTER
int(WSPAPI * LPWPUCOMPLETEOVERLAPPEDREQUEST)(_In_ SOCKET s, _Inout_ LPWSAOVERLAPPED lpOverlapped, _In_ DWORD dwError, _In_ DWORD cbTransferred, _Out_ LPINT lpErrno)
#define WSH_NOTIFY_LISTEN
@ SockaddrEndpointInfoWildcard
@ SockaddrAddressInfoBroadcast
#define WSH_NOTIFY_CONNECT_ERROR
#define WSH_NOTIFY_ACCEPT
#define WSH_NOTIFY_CONNECT
enum _SOCKET_STATE SOCKET_STATE
_Must_inspect_result_ _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR _In_opt_ PWSK_SOCKET AcceptSocket
_Must_inspect_result_ _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR RemoteAddress
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
#define DUPLICATE_SAME_ACCESS