ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

event.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.