2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Ancillary Function Driver DLL
5 * PURPOSE: Send/receive routines
6 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
8 * CSH 01/09-2000 Created
31 IN OUT LPWSABUF lpBuffers
,
32 IN DWORD dwBufferCount
,
33 OUT LPDWORD lpNumberOfBytesRecvd
,
34 IN OUT LPDWORD lpFlags
,
35 IN LPWSAOVERLAPPED lpOverlapped
,
36 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
37 IN LPWSATHREADID lpThreadId
,
50 OUT LPWSABUF lpInboundDisconnectData
,
62 IN OUT LPWSABUF lpBuffers
,
63 IN DWORD dwBufferCount
,
64 OUT LPDWORD lpNumberOfBytesRecvd
,
65 IN OUT LPDWORD lpFlags
,
66 OUT LPSOCKADDR lpFrom
,
67 IN OUT LPINT lpFromLen
,
68 IN LPWSAOVERLAPPED lpOverlapped
,
69 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
70 IN LPWSATHREADID lpThreadId
,
73 PFILE_REQUEST_RECVFROM Request
;
74 FILE_REPLY_RECVFROM Reply
;
79 AFD_DbgPrint(MAX_TRACE
, ("Called.\n"));
81 Size
= dwBufferCount
* sizeof(WSABUF
);
83 Request
= (PFILE_REQUEST_RECVFROM
)HeapAlloc(
84 GlobalHeap
, 0, sizeof(FILE_REQUEST_RECVFROM
) + Size
);
86 AFD_DbgPrint(MIN_TRACE
, ("Insufficient resources.\n"));
87 *lpErrno
= WSAENOBUFS
;
91 /* Put buffer pointers after request structure */
92 Request
->Buffers
= (LPWSABUF
)(Request
+ sizeof(FILE_REQUEST_RECVFROM
));
93 Request
->BufferCount
= dwBufferCount
;
94 Request
->Flags
= lpFlags
;
95 Request
->From
= lpFrom
;
96 Request
->FromLen
= lpFromLen
;
98 RtlCopyMemory(Request
->Buffers
, lpBuffers
, Size
);
100 Status
= NtDeviceIoControlFile((HANDLE
)s
,
107 sizeof(FILE_REQUEST_RECVFROM
) + Size
,
109 sizeof(FILE_REPLY_RECVFROM
));
111 HeapFree(GlobalHeap
, 0, Request
);
113 if (Status
== STATUS_PENDING
) {
114 AFD_DbgPrint(MAX_TRACE
, ("Waiting on transport.\n"));
115 /* FIXME: Wait only for blocking sockets */
116 if (!NT_SUCCESS(NtWaitForSingleObject((HANDLE
)s
, FALSE
, NULL
))) {
117 AFD_DbgPrint(MIN_TRACE
, ("Wait failed.\n"));
118 /* FIXME: What error code should be returned? */
119 *lpErrno
= WSAENOBUFS
;
124 if (!NT_SUCCESS(Status
)) {
125 AFD_DbgPrint(MAX_TRACE
, ("Status (0x%X).\n", Status
));
126 *lpErrno
= WSAENOBUFS
;
130 AFD_DbgPrint(MAX_TRACE
, ("Receive successful.\n"));
140 IN LPWSABUF lpBuffers
,
141 IN DWORD dwBufferCount
,
142 OUT LPDWORD lpNumberOfBytesSent
,
144 IN LPWSAOVERLAPPED lpOverlapped
,
145 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
146 IN LPWSATHREADID lpThreadId
,
159 IN LPWSABUF lpOutboundDisconnectData
,
172 IN LPWSABUF lpBuffers
,
173 IN DWORD dwBufferCount
,
174 OUT LPDWORD lpNumberOfBytesSent
,
176 IN CONST LPSOCKADDR lpTo
,
178 IN LPWSAOVERLAPPED lpOverlapped
,
179 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
,
180 IN LPWSATHREADID lpThreadId
,
183 PFILE_REQUEST_SENDTO Request
;
184 FILE_REPLY_SENDTO Reply
;
185 IO_STATUS_BLOCK Iosb
;
189 AFD_DbgPrint(MAX_TRACE
, ("Called.\n"));
191 Size
= dwBufferCount
* sizeof(WSABUF
);
193 Request
= (PFILE_REQUEST_SENDTO
)HeapAlloc(
194 GlobalHeap
, 0, sizeof(FILE_REQUEST_SENDTO
) + Size
);
196 AFD_DbgPrint(MIN_TRACE
, ("Insufficient resources.\n"));
197 *lpErrno
= WSAENOBUFS
;
201 /* Put buffer pointers after request structure */
202 Request
->Buffers
= (LPWSABUF
)(Request
+ sizeof(FILE_REQUEST_SENDTO
));
203 Request
->BufferCount
= dwBufferCount
;
204 Request
->Flags
= dwFlags
;
205 Request
->ToLen
= iToLen
;
207 RtlCopyMemory(&Request
->To
, lpTo
, sizeof(SOCKADDR
));
209 RtlCopyMemory(Request
->Buffers
, lpBuffers
, Size
);
211 Status
= NtDeviceIoControlFile((HANDLE
)s
,
218 sizeof(FILE_REQUEST_SENDTO
) + Size
,
220 sizeof(FILE_REPLY_SENDTO
));
222 HeapFree(GlobalHeap
, 0, Request
);
224 if (Status
== STATUS_PENDING
) {
225 AFD_DbgPrint(MAX_TRACE
, ("Waiting on transport.\n"));
226 /* FIXME: Wait only for blocking sockets */
227 if (!NT_SUCCESS(NtWaitForSingleObject((HANDLE
)s
, FALSE
, NULL
))) {
228 AFD_DbgPrint(MAX_TRACE
, ("Wait failed.\n"));
229 /* FIXME: What error code should be returned? */
230 *lpErrno
= WSAENOBUFS
;
235 if (!NT_SUCCESS(Status
)) {
236 AFD_DbgPrint(MAX_TRACE
, ("Status (0x%X).\n", Status
));
237 *lpErrno
= WSAENOBUFS
;
241 AFD_DbgPrint(MAX_TRACE
, ("Send successful.\n"));