191 if (
Context->lpCompletionRoutine)
212 if (
Context->lpCompletionRoutine)
240 DWORD NumberOfBytesRead;
265 memset(&RecvInfo, 0,
sizeof(RecvInfo));
282 if (!ReceiveFlags || *ReceiveFlags == 0)
318 TRACE(
"Opened without flag WSA_FLAG_OVERLAPPED. Do nothing.\n");
324 if (lpCompletionRoutine)
331 ERR(
"Not enough memory for APC Context\n");
388 TRACE(
"Leaving (Pending)\n");
415 if (ReceiveFlags && (*ReceiveFlags &
MSG_OOB))
424 TRACE(
"Leaving (%lx %ld)\n",
Status, NumberOfBytesRead);
436 int *SocketAddressLength,
451 DWORD NumberOfBytesRead;
495 SocketAddressLength);
500 memset(&RecvInfo, 0,
sizeof(RecvInfo));
516 RecvInfo.
Address = SocketAddress;
519 if (!ReceiveFlags || *ReceiveFlags == 0)
555 TRACE(
"Opened without flag WSA_FLAG_OVERLAPPED. Do nothing.\n");
561 if (lpCompletionRoutine)
568 ERR(
"Not enough memory for APC Context\n");
644 TRACE(
"Leaving (Pending)\n");
652 if (ReceiveFlags && (*ReceiveFlags &
MSG_OOB))
661 TRACE(
"Leaving (%lx %ld)\n",
Status, NumberOfBytesRead);
687 DWORD NumberOfBytesSent;
706 memset(&SendInfo, 0,
sizeof(SendInfo));
749 TRACE(
"Opened without flag WSA_FLAG_OVERLAPPED. Do nothing.\n");
755 if (lpCompletionRoutine)
762 ERR(
"Not enough memory for APC Context\n");
793 if (lpCompletionRoutine)
828 TRACE(
"Leaving (Pending)\n");
837 TRACE(
"Leaving (%lx %ld)\n",
Status, NumberOfBytesSent);
848 const struct sockaddr *SocketAddress,
849 int SocketAddressLength,
865 DWORD NumberOfBytesSent;
902 INT BindAddressLength;
919 BindError =
WSPBind(
Handle, BindAddress, BindAddressLength, lpErrno);
967 TRACE(
"Opened without flag WSA_FLAG_OVERLAPPED. Do nothing.\n");
973 if (lpCompletionRoutine)
980 ERR(
"Not enough memory for APC Context\n");
1037 TRACE(
"Leaving (Pending)\n");
1046 TRACE(
"Leaving (%lx %ld)\n",
Status, NumberOfBytesSent);
#define NT_SUCCESS(StatCode)
#define HeapFree(x, y, z)
HANDLE SockAsyncCompletionPort
INT WSPAPI WSPBind(SOCKET Handle, const struct sockaddr *SocketAddress, int SocketAddressLength, LPINT lpErrno)
BOOLEAN SockCreateOrReferenceAsyncThread(VOID)
VOID MsafdWaitForAlert(_In_ HANDLE hObject)
PSOCKET_INFORMATION GetSocketStructure(SOCKET Handle)
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 TranslateNtStatusError(NTSTATUS Status)
VOID SockReenableAsyncSelectEvent(IN PSOCKET_INFORMATION Socket, IN ULONG Event)
BOOLEAN SockGetAsyncSelectHelperAfdHandle(VOID)
int WSPAPI WSPEventSelect(IN SOCKET Handle, IN WSAEVENT hEventObject, IN long lNetworkEvents, OUT LPINT lpErrno)
FORCEINLINE DWORD MsafdReturnWithErrno(_In_ NTSTATUS Status, _Out_opt_ LPINT Errno, _In_ DWORD Received, _Out_opt_ LPDWORD ReturnedBytes)
struct _MSAFD_RECV_APC_CONTEXT * PMSAFD_RECV_APC_CONTEXT
struct _MSAFD_SEND_APC_CONTEXT * PMSAFD_SEND_APC_CONTEXT
#define SO_SYNCHRONOUS_NONALERT
struct _IO_STATUS_BLOCK * PIO_STATUS_BLOCK
NTSTATUS NTAPI NtSetIoCompletion(IN HANDLE IoCompletionPortHandle, IN PVOID CompletionKey, IN PVOID CompletionContext, IN NTSTATUS CompletionStatus, IN ULONG CompletionInformation)
BOOL WINAPI GetOverlappedResult(IN HANDLE hFile, IN LPOVERLAPPED lpOverlapped, OUT LPDWORD lpNumberOfBytesTransferred, IN BOOL bWait)
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED lpOverlapped
_In_opt_ HANDLE _In_opt_ PIO_APC_ROUTINE _In_opt_ PVOID ApcContext
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)
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_RECEIVE_EXPEDITED
#define STATUS_RECEIVE_PARTIAL
#define STATUS_RECEIVE_PARTIAL_EXPEDITED
#define AFD_INFO_BLOCKING_MODE
#define IOCTL_AFD_SEND_DATAGRAM
struct _AFD_WSABUF * PAFD_WSABUF
#define IOCTL_AFD_RECV_DATAGRAM
INT WSPAPI WSPSendDisconnect(IN SOCKET s, IN LPWSABUF lpOutboundDisconnectData, OUT LPINT lpErrno)
static VOID NTAPI MsafdSendAPC(_In_ PVOID ApcContext, _In_ PIO_STATUS_BLOCK IoStatusBlock, _In_ ULONG Reserved)
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)
static VOID NTAPI MsafdRecvAPC(_In_ PVOID ApcContext, _In_ PIO_STATUS_BLOCK IoStatusBlock, _In_ ULONG Reserved)
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)
TDI_CONNECTION_INFORMATION TdiConnection
PSOCKET_INFORMATION ParentSocket
PWSH_GET_WILDCARD_SOCKADDR WSHGetWildcardSockaddr
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
LPWSAOVERLAPPED lpOverlapped
PSOCKET_INFORMATION lpSocket
LPWSAOVERLAPPED lpOverlapped
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
PSOCKET_INFORMATION lpSocket
PTRANSPORT_ADDRESS lpRemoteAddress
DWORD WINAPI SleepEx(IN DWORD dwMilliseconds, IN BOOL bAlertable)
#define TDI_SEND_EXPEDITED
#define TDI_RECEIVE_PARTIAL
#define TDI_RECEIVE_EXPEDITED
struct _TRANSPORT_ADDRESS * PTRANSPORT_ADDRESS
#define TDI_RECEIVE_NORMAL
#define RtlCopyMemory(Destination, Source, Length)
#define STATUS_INSUFFICIENT_RESOURCES
_Reserved_ PVOID Reserved
#define XP1_CONNECTIONLESS
#define WSA_IO_INCOMPLETE
void(CALLBACK * LPWSAOVERLAPPED_COMPLETION_ROUTINE)(IN DWORD dwError, IN DWORD cbTransferred, IN LPWSAOVERLAPPED lpOverlapped, IN DWORD dwFlags)
_Must_inspect_result_ _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR RemoteAddress