mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 08:53:02 +00:00
Added WSPEnumNetworkEvents, some reformatting.
Will be modified by alex_ionescu shortly. svn path=/trunk/; revision=11810
This commit is contained in:
parent
773d644b11
commit
c350a8df8c
4 changed files with 138 additions and 57 deletions
|
@ -54,7 +54,7 @@ typedef struct _AFD_HANDLE_ {
|
||||||
typedef struct _AFD_POLL_INFO {
|
typedef struct _AFD_POLL_INFO {
|
||||||
LARGE_INTEGER Timeout;
|
LARGE_INTEGER Timeout;
|
||||||
ULONG HandleCount;
|
ULONG HandleCount;
|
||||||
BOOLEAN Exclusive;
|
ULONG Exclusive;
|
||||||
AFD_HANDLE Handles[1];
|
AFD_HANDLE Handles[1];
|
||||||
} AFD_POLL_INFO, *PAFD_POLL_INFO;
|
} AFD_POLL_INFO, *PAFD_POLL_INFO;
|
||||||
|
|
||||||
|
@ -325,7 +325,6 @@ typedef struct _FILE_REPLY_SENDTO {
|
||||||
DWORD NumberOfBytesSent;
|
DWORD NumberOfBytesSent;
|
||||||
} FILE_REPLY_SENDTO, *PFILE_REPLY_SENDTO;
|
} FILE_REPLY_SENDTO, *PFILE_REPLY_SENDTO;
|
||||||
|
|
||||||
|
|
||||||
typedef struct _FILE_REQUEST_RECVFROM {
|
typedef struct _FILE_REQUEST_RECVFROM {
|
||||||
LPWSABUF Buffers;
|
LPWSABUF Buffers;
|
||||||
DWORD BufferCount;
|
DWORD BufferCount;
|
||||||
|
@ -339,29 +338,6 @@ typedef struct _FILE_REPLY_RECVFROM {
|
||||||
DWORD NumberOfBytesRecvd;
|
DWORD NumberOfBytesRecvd;
|
||||||
} FILE_REPLY_RECVFROM, *PFILE_REPLY_RECVFROM;
|
} FILE_REPLY_RECVFROM, *PFILE_REPLY_RECVFROM;
|
||||||
|
|
||||||
|
|
||||||
typedef struct _FILE_REQUEST_SELECT {
|
|
||||||
LPFD_SET ReadFDSet;
|
|
||||||
LPFD_SET WriteFDSet;
|
|
||||||
LPFD_SET ExceptFDSet;
|
|
||||||
TIMEVAL Timeout;
|
|
||||||
} FILE_REQUEST_SELECT, *PFILE_REQUEST_SELECT;
|
|
||||||
|
|
||||||
typedef struct _FILE_REPLY_SELECT {
|
|
||||||
INT Status;
|
|
||||||
DWORD SocketCount;
|
|
||||||
} FILE_REPLY_SELECT, *PFILE_REPLY_SELECT;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct _FILE_REQUEST_EVENTSELECT {
|
|
||||||
WSAEVENT hEventObject;
|
|
||||||
LONG lNetworkEvents;
|
|
||||||
} FILE_REQUEST_EVENTSELECT, *PFILE_REQUEST_EVENTSELECT;
|
|
||||||
|
|
||||||
typedef struct _FILE_REPLY_EVENTSELECT {
|
|
||||||
INT Status;
|
|
||||||
} FILE_REPLY_EVENTSELECT, *PFILE_REPLY_EVENTSELECT;
|
|
||||||
|
|
||||||
typedef struct _FILE_REQUEST_RECV {
|
typedef struct _FILE_REQUEST_RECV {
|
||||||
LPWSABUF Buffers;
|
LPWSABUF Buffers;
|
||||||
DWORD BufferCount;
|
DWORD BufferCount;
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
* Alex 16/07/2004 - Complete Rewrite
|
* Alex 16/07/2004 - Complete Rewrite
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <roscfg.h>
|
||||||
#include <msafd.h>
|
#include <msafd.h>
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -97,17 +98,25 @@ WSPEventSelect(
|
||||||
NULL,
|
NULL,
|
||||||
0);
|
0);
|
||||||
|
|
||||||
|
AFD_DbgPrint(MID_TRACE,("AFD: %x\n", Status));
|
||||||
|
|
||||||
/* Wait for return */
|
/* Wait for return */
|
||||||
if (Status == STATUS_PENDING) {
|
if (Status == STATUS_PENDING) {
|
||||||
WaitForSingleObject(SockEvent, 0);
|
WaitForSingleObject(SockEvent, INFINITE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AFD_DbgPrint(MID_TRACE,("Waited\n"));
|
||||||
|
|
||||||
NtClose( SockEvent );
|
NtClose( SockEvent );
|
||||||
|
|
||||||
|
AFD_DbgPrint(MID_TRACE,("Closed event\n"));
|
||||||
|
|
||||||
/* Set Socket Data*/
|
/* Set Socket Data*/
|
||||||
Socket->EventObject = hEventObject;
|
Socket->EventObject = hEventObject;
|
||||||
Socket->NetworkEvents = lNetworkEvents;
|
Socket->NetworkEvents = lNetworkEvents;
|
||||||
|
|
||||||
|
AFD_DbgPrint(MID_TRACE,("Leaving\n"));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -115,11 +124,104 @@ WSPEventSelect(
|
||||||
INT
|
INT
|
||||||
WSPAPI
|
WSPAPI
|
||||||
WSPEnumNetworkEvents(
|
WSPEnumNetworkEvents(
|
||||||
IN SOCKET s,
|
IN SOCKET Handle,
|
||||||
IN WSAEVENT hEventObject,
|
IN WSAEVENT hEventObject,
|
||||||
OUT LPWSANETWORKEVENTS lpNetworkEvents,
|
OUT LPWSANETWORKEVENTS lpNetworkEvents,
|
||||||
OUT LPINT lpErrno)
|
OUT LPINT lpErrno)
|
||||||
{
|
{
|
||||||
|
AFD_ENUM_NETWORK_EVENTS_INFO EnumReq;
|
||||||
|
IO_STATUS_BLOCK IOSB;
|
||||||
|
PSOCKET_INFORMATION Socket = NULL;
|
||||||
|
NTSTATUS Status;
|
||||||
|
HANDLE SockEvent;
|
||||||
|
|
||||||
|
AFD_DbgPrint(MID_TRACE,("Called (lpNetworkEvents %x)\n", lpNetworkEvents));
|
||||||
|
|
||||||
|
Status = NtCreateEvent( &SockEvent, GENERIC_READ | GENERIC_WRITE,
|
||||||
|
NULL, 1, FALSE );
|
||||||
|
|
||||||
|
if( !NT_SUCCESS(Status) ) {
|
||||||
|
AFD_DbgPrint(MID_TRACE,("Could not make an event %x\n", Status));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the Socket Structure associate to this Socket*/
|
||||||
|
Socket = GetSocketStructure(Handle);
|
||||||
|
|
||||||
|
EnumReq.Event = hEventObject;
|
||||||
|
|
||||||
|
/* Send IOCTL */
|
||||||
|
Status = NtDeviceIoControlFile((HANDLE)Handle,
|
||||||
|
SockEvent,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
&IOSB,
|
||||||
|
IOCTL_AFD_ENUM_NETWORK_EVENTS,
|
||||||
|
&EnumReq,
|
||||||
|
sizeof(EnumReq),
|
||||||
|
NULL,
|
||||||
|
0);
|
||||||
|
|
||||||
|
AFD_DbgPrint(MID_TRACE,("AFD: %x\n", Status));
|
||||||
|
|
||||||
|
/* Wait for return */
|
||||||
|
if (Status == STATUS_PENDING) {
|
||||||
|
WaitForSingleObject(SockEvent, INFINITE);
|
||||||
|
Status = STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
AFD_DbgPrint(MID_TRACE,("Waited\n"));
|
||||||
|
|
||||||
|
NtClose( SockEvent );
|
||||||
|
|
||||||
|
AFD_DbgPrint(MID_TRACE,("Closed event\n"));
|
||||||
|
AFD_DbgPrint(MID_TRACE,("About to touch struct at %x (%d)\n",
|
||||||
|
lpNetworkEvents, sizeof(*lpNetworkEvents)));
|
||||||
|
|
||||||
|
lpNetworkEvents->lNetworkEvents = 0;
|
||||||
|
|
||||||
|
AFD_DbgPrint(MID_TRACE,("Zeroed struct\n"));
|
||||||
|
|
||||||
|
/* Set Events to wait for */
|
||||||
|
if (EnumReq.PollEvents & AFD_EVENT_RECEIVE) {
|
||||||
|
lpNetworkEvents->lNetworkEvents |= FD_READ;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (EnumReq.PollEvents & AFD_EVENT_SEND) {
|
||||||
|
lpNetworkEvents->lNetworkEvents |= FD_WRITE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (EnumReq.PollEvents & AFD_EVENT_OOB_RECEIVE) {
|
||||||
|
lpNetworkEvents->lNetworkEvents |= FD_OOB;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (EnumReq.PollEvents & AFD_EVENT_ACCEPT) {
|
||||||
|
lpNetworkEvents->lNetworkEvents |= FD_ACCEPT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (EnumReq.PollEvents &
|
||||||
|
(AFD_EVENT_CONNECT | AFD_EVENT_CONNECT_FAIL)) {
|
||||||
|
lpNetworkEvents->lNetworkEvents |= FD_CONNECT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (EnumReq.PollEvents &
|
||||||
|
(AFD_EVENT_DISCONNECT | AFD_EVENT_ABORT)) {
|
||||||
|
lpNetworkEvents->lNetworkEvents |= FD_CLOSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (EnumReq.PollEvents & AFD_EVENT_QOS) {
|
||||||
|
lpNetworkEvents->lNetworkEvents |= FD_QOS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (EnumReq.PollEvents & AFD_EVENT_GROUP_QOS) {
|
||||||
|
lpNetworkEvents->lNetworkEvents |= FD_GROUP_QOS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( NT_SUCCESS(Status) ) *lpErrno = 0;
|
||||||
|
else *lpErrno = WSAEINVAL;
|
||||||
|
|
||||||
|
AFD_DbgPrint(MID_TRACE,("Leaving\n"));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -142,8 +142,9 @@ SockGetTdiName(
|
||||||
|
|
||||||
/* Return the Helper Pointers */
|
/* Return the Helper Pointers */
|
||||||
*HelperDllData = HelperData;
|
*HelperDllData = HelperData;
|
||||||
HeapFree(GlobalHeap, 0, Transports);
|
/* We actually cache these ... the can't be freed yet */
|
||||||
HeapFree(GlobalHeap, 0, Mapping);
|
/*HeapFree(GlobalHeap, 0, Transports);*/
|
||||||
|
/*HeapFree(GlobalHeap, 0, Mapping);*/
|
||||||
return NO_ERROR;
|
return NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,8 @@
|
||||||
* CSH 01/09-2000 Created
|
* CSH 01/09-2000 Created
|
||||||
* Alex 16/07/2004 - Complete Rewrite
|
* Alex 16/07/2004 - Complete Rewrite
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <roscfg.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <msafd.h>
|
#include <msafd.h>
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue