Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenevent.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS Ancillary Function Driver DLL 00004 * FILE: misc/event.c 00005 * PURPOSE: Event handling 00006 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net) 00007 * Alex Ionescu (alex@relsoft.net) 00008 * REVISIONS: 00009 * CSH 15/06-2001 Created 00010 * Alex 16/07/2004 - Complete Rewrite 00011 */ 00012 00013 #include <msafd.h> 00014 00015 int 00016 WSPAPI 00017 WSPEventSelect( 00018 SOCKET Handle, 00019 WSAEVENT hEventObject, 00020 long lNetworkEvents, 00021 LPINT lpErrno) 00022 { 00023 IO_STATUS_BLOCK IOSB; 00024 AFD_EVENT_SELECT_INFO EventSelectInfo; 00025 PSOCKET_INFORMATION Socket = NULL; 00026 NTSTATUS Status; 00027 BOOLEAN BlockMode; 00028 HANDLE SockEvent; 00029 00030 Status = NtCreateEvent( &SockEvent, GENERIC_READ | GENERIC_WRITE, 00031 NULL, 1, FALSE ); 00032 00033 if( !NT_SUCCESS(Status) ) return -1; 00034 00035 /* Get the Socket Structure associate to this Socket*/ 00036 Socket = GetSocketStructure(Handle); 00037 if (!Socket) 00038 { 00039 NtClose(SockEvent); 00040 *lpErrno = WSAENOTSOCK; 00041 return SOCKET_ERROR; 00042 } 00043 00044 /* Set Socket to Non-Blocking */ 00045 BlockMode = TRUE; 00046 SetSocketInformation(Socket, AFD_INFO_BLOCKING_MODE, &BlockMode, NULL, NULL); 00047 Socket->SharedData.NonBlocking = TRUE; 00048 00049 /* Deactivate Async Select if there is one */ 00050 if (Socket->EventObject) { 00051 Socket->SharedData.hWnd = NULL; 00052 Socket->SharedData.wMsg = 0; 00053 Socket->SharedData.AsyncEvents = 0; 00054 Socket->SharedData.SequenceNumber++; // This will kill Async Select after the next completion 00055 } 00056 00057 /* Set Structure Info */ 00058 EventSelectInfo.EventObject = hEventObject; 00059 EventSelectInfo.Events = 0; 00060 00061 /* Set Events to wait for */ 00062 if (lNetworkEvents & FD_READ) { 00063 EventSelectInfo.Events |= AFD_EVENT_RECEIVE; 00064 } 00065 00066 if (lNetworkEvents & FD_WRITE) { 00067 EventSelectInfo.Events |= AFD_EVENT_SEND; 00068 } 00069 00070 if (lNetworkEvents & FD_OOB) { 00071 EventSelectInfo.Events |= AFD_EVENT_OOB_RECEIVE; 00072 } 00073 00074 if (lNetworkEvents & FD_ACCEPT) { 00075 EventSelectInfo.Events |= AFD_EVENT_ACCEPT; 00076 } 00077 00078 if (lNetworkEvents & FD_CONNECT) { 00079 EventSelectInfo.Events |= AFD_EVENT_CONNECT | AFD_EVENT_CONNECT_FAIL; 00080 } 00081 00082 if (lNetworkEvents & FD_CLOSE) { 00083 EventSelectInfo.Events |= AFD_EVENT_DISCONNECT | AFD_EVENT_ABORT | AFD_EVENT_CLOSE; 00084 } 00085 00086 if (lNetworkEvents & FD_QOS) { 00087 EventSelectInfo.Events |= AFD_EVENT_QOS; 00088 } 00089 00090 if (lNetworkEvents & FD_GROUP_QOS) { 00091 EventSelectInfo.Events |= AFD_EVENT_GROUP_QOS; 00092 } 00093 00094 /* Send IOCTL */ 00095 Status = NtDeviceIoControlFile((HANDLE)Handle, 00096 SockEvent, 00097 NULL, 00098 NULL, 00099 &IOSB, 00100 IOCTL_AFD_EVENT_SELECT, 00101 &EventSelectInfo, 00102 sizeof(EventSelectInfo), 00103 NULL, 00104 0); 00105 00106 AFD_DbgPrint(MID_TRACE,("AFD: %x\n", Status)); 00107 00108 /* Wait for return */ 00109 if (Status == STATUS_PENDING) { 00110 WaitForSingleObject(SockEvent, INFINITE); 00111 Status = IOSB.Status; 00112 } 00113 00114 AFD_DbgPrint(MID_TRACE,("Waited\n")); 00115 00116 NtClose( SockEvent ); 00117 00118 if (Status != STATUS_SUCCESS) 00119 return MsafdReturnWithErrno(Status, lpErrno, 0, NULL); 00120 00121 AFD_DbgPrint(MID_TRACE,("Closed event\n")); 00122 00123 /* Set Socket Data*/ 00124 Socket->EventObject = hEventObject; 00125 Socket->NetworkEvents = lNetworkEvents; 00126 00127 AFD_DbgPrint(MID_TRACE,("Leaving\n")); 00128 00129 return 0; 00130 } 00131 00132 00133 INT 00134 WSPAPI 00135 WSPEnumNetworkEvents( 00136 IN SOCKET Handle, 00137 IN WSAEVENT hEventObject, 00138 OUT LPWSANETWORKEVENTS lpNetworkEvents, 00139 OUT LPINT lpErrno) 00140 { 00141 AFD_ENUM_NETWORK_EVENTS_INFO EnumReq; 00142 IO_STATUS_BLOCK IOSB; 00143 PSOCKET_INFORMATION Socket = NULL; 00144 NTSTATUS Status; 00145 HANDLE SockEvent; 00146 00147 AFD_DbgPrint(MID_TRACE,("Called (lpNetworkEvents %x)\n", lpNetworkEvents)); 00148 00149 Status = NtCreateEvent( &SockEvent, GENERIC_READ | GENERIC_WRITE, 00150 NULL, 1, FALSE ); 00151 00152 if( !NT_SUCCESS(Status) ) { 00153 AFD_DbgPrint(MID_TRACE,("Could not make an event %x\n", Status)); 00154 return -1; 00155 } 00156 00157 /* Get the Socket Structure associate to this Socket*/ 00158 Socket = GetSocketStructure(Handle); 00159 if (!Socket) 00160 { 00161 NtClose(SockEvent); 00162 *lpErrno = WSAENOTSOCK; 00163 return SOCKET_ERROR; 00164 } 00165 00166 EnumReq.Event = hEventObject; 00167 00168 /* Send IOCTL */ 00169 Status = NtDeviceIoControlFile((HANDLE)Handle, 00170 SockEvent, 00171 NULL, 00172 NULL, 00173 &IOSB, 00174 IOCTL_AFD_ENUM_NETWORK_EVENTS, 00175 &EnumReq, 00176 sizeof(EnumReq), 00177 NULL, 00178 0); 00179 00180 AFD_DbgPrint(MID_TRACE,("AFD: %x\n", Status)); 00181 00182 /* Wait for return */ 00183 if (Status == STATUS_PENDING) { 00184 WaitForSingleObject(SockEvent, INFINITE); 00185 Status = IOSB.Status; 00186 } 00187 00188 AFD_DbgPrint(MID_TRACE,("Waited\n")); 00189 00190 NtClose( SockEvent ); 00191 00192 if (Status != STATUS_SUCCESS) 00193 return MsafdReturnWithErrno(Status, lpErrno, 0, NULL); 00194 00195 AFD_DbgPrint(MID_TRACE,("Closed event\n")); 00196 AFD_DbgPrint(MID_TRACE,("About to touch struct at %x (%d)\n", 00197 lpNetworkEvents, sizeof(*lpNetworkEvents))); 00198 00199 lpNetworkEvents->lNetworkEvents = 0; 00200 00201 AFD_DbgPrint(MID_TRACE,("Zeroed struct\n")); 00202 00203 /* Set Events to wait for */ 00204 if (EnumReq.PollEvents & AFD_EVENT_RECEIVE) { 00205 lpNetworkEvents->lNetworkEvents |= FD_READ; 00206 lpNetworkEvents->iErrorCode[FD_READ_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_READ_BIT]); 00207 } 00208 00209 if (EnumReq.PollEvents & AFD_EVENT_SEND) { 00210 lpNetworkEvents->lNetworkEvents |= FD_WRITE; 00211 lpNetworkEvents->iErrorCode[FD_WRITE_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_WRITE_BIT]); 00212 } 00213 00214 if (EnumReq.PollEvents & AFD_EVENT_OOB_RECEIVE) { 00215 lpNetworkEvents->lNetworkEvents |= FD_OOB; 00216 lpNetworkEvents->iErrorCode[FD_OOB_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_OOB_BIT]); 00217 } 00218 00219 if (EnumReq.PollEvents & AFD_EVENT_ACCEPT) { 00220 lpNetworkEvents->lNetworkEvents |= FD_ACCEPT; 00221 lpNetworkEvents->iErrorCode[FD_ACCEPT_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_ACCEPT_BIT]); 00222 } 00223 00224 if (EnumReq.PollEvents & 00225 (AFD_EVENT_CONNECT | AFD_EVENT_CONNECT_FAIL)) { 00226 lpNetworkEvents->lNetworkEvents |= FD_CONNECT; 00227 lpNetworkEvents->iErrorCode[FD_CONNECT_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_CONNECT_BIT]); 00228 } 00229 00230 if (EnumReq.PollEvents & 00231 (AFD_EVENT_DISCONNECT | AFD_EVENT_ABORT | AFD_EVENT_CLOSE)) { 00232 lpNetworkEvents->lNetworkEvents |= FD_CLOSE; 00233 lpNetworkEvents->iErrorCode[FD_CLOSE_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_CLOSE_BIT]); 00234 } 00235 00236 if (EnumReq.PollEvents & AFD_EVENT_QOS) { 00237 lpNetworkEvents->lNetworkEvents |= FD_QOS; 00238 lpNetworkEvents->iErrorCode[FD_QOS_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_QOS_BIT]); 00239 } 00240 00241 if (EnumReq.PollEvents & AFD_EVENT_GROUP_QOS) { 00242 lpNetworkEvents->lNetworkEvents |= FD_GROUP_QOS; 00243 lpNetworkEvents->iErrorCode[FD_GROUP_QOS_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_GROUP_QOS_BIT]); 00244 } 00245 00246 AFD_DbgPrint(MID_TRACE,("Leaving\n")); 00247 00248 return MsafdReturnWithErrno(STATUS_SUCCESS, lpErrno, 0, NULL); 00249 } 00250 00251 /* EOF */ Generated on Sat May 26 2012 04:23:19 for ReactOS by
1.7.6.1
|