[PATCH 3/5] server: Implement IOCTL_AFD_EVENT_SELECT.

Zebediah Figura z.figura12 at gmail.com
Mon Jun 14 00:41:49 CDT 2021


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/ntdll/unix/socket.c | 11 +++++++++
 include/wine/afd.h       | 19 ++++++++++++++
 server/sock.c            | 53 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 83 insertions(+)

diff --git a/dlls/ntdll/unix/socket.c b/dlls/ntdll/unix/socket.c
index c1cd319ccf9..088f29f85ff 100644
--- a/dlls/ntdll/unix/socket.c
+++ b/dlls/ntdll/unix/socket.c
@@ -1170,6 +1170,17 @@ NTSTATUS sock_ioctl( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc
             break;
         }
 
+        case IOCTL_AFD_EVENT_SELECT:
+        {
+            const struct afd_event_select_params *params = in_buffer;
+
+            TRACE( "event %p, mask %#x\n", params->event, params->mask );
+            if (out_size) FIXME( "unexpected output size %u\n", out_size );
+
+            status = STATUS_BAD_DEVICE_TYPE;
+            break;
+        }
+
         case IOCTL_AFD_RECV:
         {
             const struct afd_recv_params *params = in_buffer;
diff --git a/include/wine/afd.h b/include/wine/afd.h
index c4a15d6688c..2eb3e6f12a9 100644
--- a/include/wine/afd.h
+++ b/include/wine/afd.h
@@ -35,6 +35,7 @@
 #define IOCTL_AFD_LISTEN                    CTL_CODE(FILE_DEVICE_BEEP, 0x802, METHOD_NEITHER,  FILE_ANY_ACCESS)
 #define IOCTL_AFD_RECV                      CTL_CODE(FILE_DEVICE_BEEP, 0x805, METHOD_NEITHER,  FILE_ANY_ACCESS)
 #define IOCTL_AFD_POLL                      CTL_CODE(FILE_DEVICE_BEEP, 0x809, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_AFD_EVENT_SELECT              CTL_CODE(FILE_DEVICE_BEEP, 0x821, METHOD_NEITHER,  FILE_ANY_ACCESS)
 
 enum afd_poll_bit
 {
@@ -106,6 +107,24 @@ struct afd_poll_params
 };
 #include <poppack.h>
 
+struct afd_event_select_params
+{
+    HANDLE event;
+    int mask;
+};
+
+struct afd_event_select_params_64
+{
+    ULONGLONG event;
+    int mask;
+};
+
+struct afd_event_select_params_32
+{
+    ULONG event;
+    int mask;
+};
+
 #define IOCTL_AFD_WINE_CREATE               CTL_CODE(FILE_DEVICE_NETWORK, 200, METHOD_BUFFERED, FILE_ANY_ACCESS)
 #define IOCTL_AFD_WINE_ACCEPT               CTL_CODE(FILE_DEVICE_NETWORK, 201, METHOD_BUFFERED, FILE_ANY_ACCESS)
 #define IOCTL_AFD_WINE_ACCEPT_INTO          CTL_CODE(FILE_DEVICE_NETWORK, 202, METHOD_BUFFERED, FILE_ANY_ACCESS)
diff --git a/server/sock.c b/server/sock.c
index 026188e79af..3556ee21aa3 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -2011,6 +2011,59 @@ static int sock_ioctl( struct fd *fd, ioctl_code_t code, struct async *async )
         }
         return 1;
 
+    case IOCTL_AFD_EVENT_SELECT:
+    {
+        struct event *event = NULL;
+        obj_handle_t event_handle;
+        int mask;
+
+        if (is_machine_64bit( current->process->machine ))
+        {
+            const struct afd_event_select_params_64 *params = get_req_data();
+
+            if (get_req_data_size() < sizeof(params))
+            {
+                set_error( STATUS_INVALID_PARAMETER );
+                return 1;
+            }
+
+            event_handle = params->event;
+            mask = params->mask;
+        }
+        else
+        {
+            const struct afd_event_select_params_32 *params = get_req_data();
+
+            if (get_req_data_size() < sizeof(params))
+            {
+                set_error( STATUS_INVALID_PARAMETER );
+                return 1;
+            }
+
+            event_handle = params->event;
+            mask = params->mask;
+        }
+
+        if ((event_handle || mask) &&
+            !(event = get_event_obj( current->process, event_handle, EVENT_MODIFY_STATE )))
+        {
+            set_error( STATUS_INVALID_PARAMETER );
+            return 1;
+        }
+
+        if (sock->event) release_object( sock->event );
+        sock->event = event;
+        sock->mask = mask;
+        sock->window = 0;
+        sock->message = 0;
+        sock->wparam = 0;
+        sock->nonblocking = 1;
+
+        sock_reselect( sock );
+
+        return 1;
+    }
+
     default:
         set_error( STATUS_NOT_SUPPORTED );
         return 0;
-- 
2.30.2




More information about the wine-devel mailing list