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
32 IN OUT LPWSABUF lpBuffers,
33 IN DWORD dwBufferCount,
34 OUT LPDWORD lpNumberOfBytesRecvd,
35 IN OUT LPDWORD lpFlags,
36 IN LPWSAOVERLAPPED lpOverlapped,
37 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
38 IN LPWSATHREADID lpThreadId,
41 PFILE_REQUEST_RECV Request;
42 FILE_REPLY_RECV Reply;
47 AFD_DbgPrint(MAX_TRACE, ("Called.\n"));
49 Size = dwBufferCount * sizeof(WSABUF);
51 Request = (PFILE_REQUEST_RECV)HeapAlloc(
52 GlobalHeap, 0, sizeof(FILE_REQUEST_RECV) + Size);
54 AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
55 *lpErrno = WSAENOBUFS;
59 /* Put buffer pointers after request structure */
60 Request->Buffers = (LPWSABUF)(Request + 1);
61 Request->BufferCount = dwBufferCount;
62 Request->Flags = lpFlags;
64 RtlCopyMemory(Request->Buffers, lpBuffers, Size);
66 Status = NtDeviceIoControlFile(
74 sizeof(FILE_REQUEST_RECV) + Size,
76 sizeof(FILE_REPLY_RECV));
78 HeapFree(GlobalHeap, 0, Request);
80 if (Status == STATUS_PENDING) {
81 AFD_DbgPrint(MAX_TRACE, ("Waiting on transport.\n"));
82 /* FIXME: Wait only for blocking sockets */
83 Status = NtWaitForSingleObject((HANDLE)s, FALSE, NULL);
86 if (!NT_SUCCESS(Status)) {
87 AFD_DbgPrint(MAX_TRACE, ("Status (0x%X).\n", Status));
88 *lpErrno = WSAENOBUFS;
92 AFD_DbgPrint(MAX_TRACE, ("Receive successful (0x%X).\n",
93 Reply.NumberOfBytesRecvd));
95 *lpNumberOfBytesRecvd = Reply.NumberOfBytesRecvd;
106 OUT LPWSABUF lpInboundDisconnectData,
118 IN OUT LPWSABUF lpBuffers,
119 IN DWORD dwBufferCount,
120 OUT LPDWORD lpNumberOfBytesRecvd,
121 IN OUT LPDWORD lpFlags,
122 OUT LPSOCKADDR lpFrom,
123 IN OUT LPINT lpFromLen,
124 IN LPWSAOVERLAPPED lpOverlapped,
125 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
126 IN LPWSATHREADID lpThreadId,
129 PFILE_REQUEST_RECVFROM Request;
130 FILE_REPLY_RECVFROM Reply;
131 IO_STATUS_BLOCK Iosb;
135 AFD_DbgPrint(MAX_TRACE, ("Called.\n"));
137 Size = dwBufferCount * sizeof(WSABUF);
139 Request = (PFILE_REQUEST_RECVFROM)HeapAlloc(
140 GlobalHeap, 0, sizeof(FILE_REQUEST_RECVFROM) + Size);
142 AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
143 *lpErrno = WSAENOBUFS;
147 /* Put buffer pointers after request structure */
148 Request->Buffers = (LPWSABUF)(Request + 1);
149 Request->BufferCount = dwBufferCount;
150 Request->Flags = lpFlags;
151 Request->From = lpFrom;
152 Request->FromLen = lpFromLen;
154 RtlCopyMemory(Request->Buffers, lpBuffers, Size);
156 Status = NtDeviceIoControlFile(
164 sizeof(FILE_REQUEST_RECVFROM) + Size,
166 sizeof(FILE_REPLY_RECVFROM));
168 HeapFree(GlobalHeap, 0, Request);
170 if (Status == STATUS_PENDING) {
171 AFD_DbgPrint(MAX_TRACE, ("Waiting on transport.\n"));
172 /* FIXME: Wait only for blocking sockets */
173 Status = NtWaitForSingleObject((HANDLE)s, FALSE, NULL);
176 if (!NT_SUCCESS(Status)) {
177 AFD_DbgPrint(MAX_TRACE, ("Status (0x%X).\n", Status));
178 *lpErrno = WSAENOBUFS;
182 AFD_DbgPrint(MAX_TRACE, ("Receive successful (0x%X).\n",
183 Reply.NumberOfBytesRecvd));
185 *lpNumberOfBytesRecvd = Reply.NumberOfBytesRecvd;
187 ((PSOCKADDR_IN)lpFrom)->sin_family = AF_INET;
188 ((PSOCKADDR_IN)lpFrom)->sin_port = 0;
189 ((PSOCKADDR_IN)lpFrom)->sin_addr.S_un.S_addr = 0x0100007F;
190 *lpFromLen = sizeof(SOCKADDR_IN);
200 IN LPWSABUF lpBuffers,
201 IN DWORD dwBufferCount,
202 OUT LPDWORD lpNumberOfBytesSent,
204 IN LPWSAOVERLAPPED lpOverlapped,
205 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
206 IN LPWSATHREADID lpThreadId,
209 PFILE_REQUEST_SENDTO Request;
210 FILE_REPLY_SENDTO Reply;
211 IO_STATUS_BLOCK Iosb;
215 AFD_DbgPrint(MAX_TRACE, ("Called.\n"));
217 Size = dwBufferCount * sizeof(WSABUF);
219 Request = (PFILE_REQUEST_SENDTO)HeapAlloc(
220 GlobalHeap, 0, sizeof(FILE_REQUEST_SEND) + Size);
222 *lpErrno = WSAENOBUFS;
226 /* Put buffer pointers after request structure */
227 Request->Buffers = (LPWSABUF)(Request + 1);
228 Request->BufferCount = dwBufferCount;
229 Request->Flags = dwFlags;
231 RtlCopyMemory(Request->Buffers, lpBuffers, Size);
233 Status = NtDeviceIoControlFile(
241 sizeof(FILE_REQUEST_SEND) + Size,
243 sizeof(FILE_REPLY_SEND));
245 HeapFree(GlobalHeap, 0, Request);
247 if (Status == STATUS_PENDING) {
248 AFD_DbgPrint(MAX_TRACE, ("Waiting on transport.\n"));
249 /* FIXME: Wait only for blocking sockets */
250 Status = NtWaitForSingleObject((HANDLE)s, FALSE, NULL);
253 if (!NT_SUCCESS(Status)) {
254 AFD_DbgPrint(MAX_TRACE, ("Status (0x%X).\n", Status));
255 *lpErrno = WSAENOBUFS;
259 AFD_DbgPrint(MAX_TRACE, ("Send successful.\n"));
269 IN LPWSABUF lpOutboundDisconnectData,
282 IN LPWSABUF lpBuffers,
283 IN DWORD dwBufferCount,
284 OUT LPDWORD lpNumberOfBytesSent,
286 IN CONST LPSOCKADDR lpTo,
288 IN LPWSAOVERLAPPED lpOverlapped,
289 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
290 IN LPWSATHREADID lpThreadId,
293 PFILE_REQUEST_SENDTO Request;
294 FILE_REPLY_SENDTO Reply;
295 IO_STATUS_BLOCK Iosb;
299 AFD_DbgPrint(MAX_TRACE, ("Called.\n"));
301 Size = dwBufferCount * sizeof(WSABUF);
303 Request = (PFILE_REQUEST_SENDTO)HeapAlloc(
304 GlobalHeap, 0, sizeof(FILE_REQUEST_SENDTO) + Size);
306 *lpErrno = WSAENOBUFS;
310 /* Put buffer pointers after request structure */
311 Request->Buffers = (LPWSABUF)(Request + 1);
312 Request->BufferCount = dwBufferCount;
313 Request->Flags = dwFlags;
314 Request->ToLen = iToLen;
316 RtlCopyMemory(&Request->To, lpTo, sizeof(SOCKADDR));
318 RtlCopyMemory(Request->Buffers, lpBuffers, Size);
320 Status = NtDeviceIoControlFile(
328 sizeof(FILE_REQUEST_SENDTO) + Size,
330 sizeof(FILE_REPLY_SENDTO));
332 HeapFree(GlobalHeap, 0, Request);
334 if (Status == STATUS_PENDING) {
335 AFD_DbgPrint(MAX_TRACE, ("Waiting on transport.\n"));
336 /* FIXME: Wait only for blocking sockets */
337 Status = NtWaitForSingleObject((HANDLE)s, FALSE, NULL);
340 if (!NT_SUCCESS(Status)) {
341 AFD_DbgPrint(MAX_TRACE, ("Status (0x%X).\n", Status));
342 *lpErrno = WSAENOBUFS;
346 AFD_DbgPrint(MAX_TRACE, ("Send successful.\n"));