2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Ancillary Function Driver DLL
5 * PURPOSE: Event handling
6 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
7 * Alex Ionescu (alex@relsoft.net)
9 * CSH 15/06-2001 Created
10 * Alex 16/07/2004 - Complete Rewrite
19 WSAEVENT hEventObject
,
24 AFD_EVENT_SELECT_INFO EventSelectInfo
;
25 PSOCKET_INFORMATION Socket
= NULL
;
30 Status
= NtCreateEvent( &SockEvent
, GENERIC_READ
| GENERIC_WRITE
,
33 if( !NT_SUCCESS(Status
) ) return -1;
35 /* Get the Socket Structure associate to this Socket*/
36 Socket
= GetSocketStructure(Handle
);
38 /* Set Socket to Non-Blocking */
40 SetSocketInformation(Socket
, AFD_INFO_BLOCKING_MODE
, &BlockMode
, NULL
);
41 Socket
->SharedData
.NonBlocking
= TRUE
;
43 /* Deactivate Async Select if there is one */
44 if (Socket
->EventObject
) {
45 //SockAsyncSelect(Socket, NULL, 0, 0);
48 /* Set Structure Info */
49 EventSelectInfo
.EventObject
= hEventObject
;
50 EventSelectInfo
.Events
= 0;
52 /* Set Events to wait for */
53 if (lNetworkEvents
& FD_READ
) {
54 EventSelectInfo
.Events
|= AFD_EVENT_RECEIVE
;
57 if (lNetworkEvents
& FD_WRITE
) {
58 EventSelectInfo
.Events
|= AFD_EVENT_SEND
;
61 if (lNetworkEvents
& FD_OOB
) {
62 EventSelectInfo
.Events
|= AFD_EVENT_OOB_RECEIVE
;
65 if (lNetworkEvents
& FD_ACCEPT
) {
66 EventSelectInfo
.Events
|= AFD_EVENT_ACCEPT
;
69 if (lNetworkEvents
& FD_CONNECT
) {
70 EventSelectInfo
.Events
|= AFD_EVENT_CONNECT
| AFD_EVENT_CONNECT_FAIL
;
73 if (lNetworkEvents
& FD_CLOSE
) {
74 EventSelectInfo
.Events
|= AFD_EVENT_DISCONNECT
| AFD_EVENT_ABORT
;
77 if (lNetworkEvents
& FD_QOS
) {
78 EventSelectInfo
.Events
|= AFD_EVENT_QOS
;
81 if (lNetworkEvents
& FD_GROUP_QOS
) {
82 EventSelectInfo
.Events
|= AFD_EVENT_GROUP_QOS
;
86 Status
= NtDeviceIoControlFile((HANDLE
)Handle
,
91 IOCTL_AFD_EVENT_SELECT
,
93 sizeof(EventSelectInfo
),
98 if (Status
== STATUS_PENDING
) {
99 WaitForSingleObject(SockEvent
, 0);
102 NtClose( SockEvent
);
105 Socket
->EventObject
= hEventObject
;
106 Socket
->NetworkEvents
= lNetworkEvents
;
114 WSPEnumNetworkEvents(
116 IN WSAEVENT hEventObject
,
117 OUT LPWSANETWORKEVENTS lpNetworkEvents
,