Zebediah Figura : ws2_32: Use IOCTL_AFD_WINE_SHUTDOWN in WS2_DisconnectEx().

Alexandre Julliard julliard at winehq.org
Wed May 19 14:55:12 CDT 2021


Module: wine
Branch: master
Commit: 89e1cf3d44ff5670e67e3f5e5caf50d7fa551e17
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=89e1cf3d44ff5670e67e3f5e5caf50d7fa551e17

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Tue May 18 22:35:50 2021 -0500

ws2_32: Use IOCTL_AFD_WINE_SHUTDOWN in WS2_DisconnectEx().

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ws2_32/socket.c     | 29 ++++++++++++++-------
 dlls/ws2_32/tests/sock.c | 65 +++++++++++++++++++++---------------------------
 2 files changed, 49 insertions(+), 45 deletions(-)

diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index aad92d5d4df..0110d53ab48 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -3110,23 +3110,34 @@ static BOOL WINAPI WS2_ConnectEx( SOCKET s, const struct WS_sockaddr *name, int
     return !status;
 }
 
-/***********************************************************************
- *             DisconnectEx
- */
-static BOOL WINAPI WS2_DisconnectEx( SOCKET s, LPOVERLAPPED ov, DWORD flags, DWORD reserved )
+
+static BOOL WINAPI WS2_DisconnectEx( SOCKET s, OVERLAPPED *overlapped, DWORD flags, DWORD reserved )
 {
-    TRACE( "socket %04lx, ov %p, flags 0x%x, reserved 0x%x\n", s, ov, flags, reserved );
+    IO_STATUS_BLOCK iosb, *piosb = &iosb;
+    void *cvalue = NULL;
+    int how = SD_SEND;
+    HANDLE event = 0;
+    NTSTATUS status;
+
+    TRACE( "socket %#lx, overlapped %p, flags %#x, reserved %#x\n", s, overlapped, flags, reserved );
 
     if (flags & TF_REUSE_SOCKET)
         FIXME( "Reusing socket not supported yet\n" );
 
-    if (ov)
+    if (overlapped)
     {
-        ov->Internal = STATUS_PENDING;
-        ov->InternalHigh = 0;
+        piosb = (IO_STATUS_BLOCK *)overlapped;
+        if (!((ULONG_PTR)overlapped->hEvent & 1)) cvalue = overlapped;
+        event = overlapped->hEvent;
+        overlapped->Internal = STATUS_PENDING;
+        overlapped->InternalHigh = 0;
     }
 
-    return !WS_shutdown( s, SD_BOTH );
+    status = NtDeviceIoControlFile( (HANDLE)s, event, NULL, cvalue, piosb,
+                                    IOCTL_AFD_WINE_SHUTDOWN, &how, sizeof(how), NULL, 0 );
+    if (!status && overlapped) status = STATUS_PENDING;
+    SetLastError( NtStatusToWSAError( status ) );
+    return !status;
 }
 
 /***********************************************************************
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 5028a4e749e..2c1f0e6142a 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -6732,7 +6732,7 @@ static void test_DisconnectEx(void)
     WSASetLastError(0xdeadbeef);
     ret = pDisconnectEx(client, &overlapped, 0, 0);
     ok(!ret, "expected failure\n");
-    todo_wine ok(WSAGetLastError() == WSAENOTCONN, "got error %u\n", WSAGetLastError());
+    ok(WSAGetLastError() == WSAENOTCONN, "got error %u\n", WSAGetLastError());
 
     ret = connect(client, (struct sockaddr *)&server_addr, sizeof(server_addr));
     ok(!ret, "failed to connect, error %u\n", WSAGetLastError());
@@ -6741,18 +6741,15 @@ static void test_DisconnectEx(void)
 
     WSASetLastError(0xdeadbeef);
     ret = pDisconnectEx(client, &overlapped, 0, 0);
-    todo_wine ok(!ret, "expected failure\n");
-    todo_wine ok(WSAGetLastError() == ERROR_IO_PENDING, "got error %u\n", WSAGetLastError());
+    ok(!ret, "expected failure\n");
+    ok(WSAGetLastError() == ERROR_IO_PENDING, "got error %u\n", WSAGetLastError());
 
-    if (WSAGetLastError() == ERROR_IO_PENDING)
-    {
-        ret = WaitForSingleObject(overlapped.hEvent, 1000);
-        ok(!ret, "wait timed out\n");
-        size = 0xdeadbeef;
-        ret = GetOverlappedResult((HANDLE)client, &overlapped, &size, FALSE);
-        ok(ret, "got error %u\n", GetLastError());
-        ok(!size, "got size %u\n", size);
-    }
+    ret = WaitForSingleObject(overlapped.hEvent, 1000);
+    ok(!ret, "wait timed out\n");
+    size = 0xdeadbeef;
+    ret = GetOverlappedResult((HANDLE)client, &overlapped, &size, FALSE);
+    ok(ret, "got error %u\n", GetLastError());
+    ok(!size, "got size %u\n", size);
 
     ret = connect(client, (struct sockaddr *)&server_addr, sizeof(server_addr));
     ok(ret == -1, "expected failure\n");
@@ -6805,8 +6802,8 @@ static void test_DisconnectEx(void)
 
     WSASetLastError(0xdeadbeef);
     ret = pDisconnectEx(client, NULL, 0, 0);
-    todo_wine ok(ret, "expected success\n");
-    todo_wine ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
+    ok(ret, "expected success\n");
+    ok(!WSAGetLastError() || WSAGetLastError() == 0xdeadbeef /* < 7 */, "got error %u\n", WSAGetLastError());
 
     ret = connect(client, (struct sockaddr *)&server_addr, sizeof(server_addr));
     ok(ret == -1, "expected failure\n");
@@ -8552,18 +8549,16 @@ static void test_shutdown_completion_port(void)
 
     SetLastError(0xdeadbeef);
     ret = pDisconnectEx(client, &overlapped, 0, 0);
-    todo_wine ok(!ret, "expected failure\n");
-    todo_wine ok(GetLastError() == ERROR_IO_PENDING, "got error %u\n", GetLastError());
-    if (GetLastError() == ERROR_IO_PENDING)
-    {
-        ret = WaitForSingleObject(overlapped.hEvent, 1000);
-        ok(!ret, "wait failed\n");
+    ok(!ret, "expected failure\n");
+    ok(GetLastError() == ERROR_IO_PENDING, "got error %u\n", GetLastError());
 
-        size = 0xdeadbeef;
-        ret = GetOverlappedResult((HANDLE)client, &overlapped, &size, TRUE);
-        ok(ret, "got error %u\n", GetLastError());
-        ok(!size, "got %u bytes\n", size);
-    }
+    ret = WaitForSingleObject(overlapped.hEvent, 1000);
+    ok(!ret, "wait failed\n");
+
+    size = 0xdeadbeef;
+    ret = GetOverlappedResult((HANDLE)client, &overlapped, &size, TRUE);
+    ok(ret, "got error %u\n", GetLastError());
+    ok(!size, "got %u bytes\n", size);
 
     size = 0xdeadbeef;
     key = 0xdeadbeef;
@@ -8617,18 +8612,16 @@ static void test_shutdown_completion_port(void)
 
     SetLastError(0xdeadbeef);
     ret = pDisconnectEx(client, &overlapped, 0, 0);
-    todo_wine ok(!ret, "expected failure\n");
-    todo_wine ok(GetLastError() == ERROR_IO_PENDING, "got error %u\n", GetLastError());
-    if (GetLastError() == ERROR_IO_PENDING)
-    {
-        ret = WaitForSingleObject(overlapped.hEvent, 1000);
-        ok(!ret, "wait failed\n");
+    ok(!ret, "expected failure\n");
+    ok(GetLastError() == ERROR_IO_PENDING, "got error %u\n", GetLastError());
 
-        size = 0xdeadbeef;
-        ret = GetOverlappedResult((HANDLE)client, &overlapped, &size, TRUE);
-        ok(ret, "got error %u\n", GetLastError());
-        ok(!size, "got %u bytes\n", size);
-    }
+    ret = WaitForSingleObject(overlapped.hEvent, 1000);
+    ok(!ret, "wait failed\n");
+
+    size = 0xdeadbeef;
+    ret = GetOverlappedResult((HANDLE)client, &overlapped, &size, TRUE);
+    ok(ret, "got error %u\n", GetLastError());
+    ok(!size, "got %u bytes\n", size);
 
     ret = GetQueuedCompletionStatus(port, &size, &key, &overlapped_ptr, 0);
     ok(!ret, "expected failure\n");




More information about the wine-cvs mailing list