[PATCH v2 6/8] ntdll: Implement NtRemoveIoCompletionEx().

Zebediah Figura z.figura12 at gmail.com
Sat Sep 29 23:29:19 CDT 2018


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/ntdll/ntdll.spec |  1 +
 dlls/ntdll/sync.c     | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 49 insertions(+)

diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index 5e7c463..37e4e8e 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -308,6 +308,7 @@
 @ stub NtReleaseProcessMutant
 @ stdcall NtReleaseSemaphore(long long ptr)
 @ stdcall NtRemoveIoCompletion(ptr ptr ptr ptr ptr)
+@ stdcall NtRemoveIoCompletionEx(ptr ptr long ptr ptr long)
 # @ stub NtRemoveProcessDebug
 @ stdcall NtRenameKey(long ptr)
 @ stdcall NtReplaceKey(ptr long ptr)
diff --git a/dlls/ntdll/sync.c b/dlls/ntdll/sync.c
index bb462f2..4ae8e36 100644
--- a/dlls/ntdll/sync.c
+++ b/dlls/ntdll/sync.c
@@ -1334,6 +1334,54 @@ NTSTATUS WINAPI NtRemoveIoCompletion( HANDLE CompletionPort, PULONG_PTR Completi
 }
 
 /******************************************************************
+ *              NtRemoveIoCompletionEx (NTDLL.@)
+ *              ZwRemoveIoCompletionEx (NTDLL.@)
+ */
+NTSTATUS WINAPI NtRemoveIoCompletionEx( HANDLE port, FILE_IO_COMPLETION_INFORMATION *info, ULONG count,
+                                        ULONG *written, LARGE_INTEGER *timeout, BOOLEAN alertable )
+{
+    NTSTATUS ret;
+    ULONG i = 0;
+
+    TRACE("%p %p %u %p %p %u\n", port, info, count, written, timeout, alertable);
+
+    for (;;)
+    {
+        for (;;)
+        {
+            SERVER_START_REQ( remove_completion )
+            {
+                req->handle = wine_server_obj_handle( port );
+                if (!(ret = wine_server_call( req )))
+                {
+                    info[i].CompletionKey             = reply->ckey;
+                    info[i].CompletionValue           = reply->cvalue;
+                    info[i].IoStatusBlock.Information = reply->information;
+                    info[i].IoStatusBlock.u.Status    = reply->status;
+                }
+            }
+            SERVER_END_REQ;
+
+            if (ret != STATUS_SUCCESS) break;
+
+            if (i++ >= count) break;
+        }
+
+        if (i && ret == STATUS_PENDING)
+        {
+            ret = STATUS_SUCCESS;
+            break;
+        }
+
+        ret = NtWaitForSingleObject( port, alertable, timeout );
+        if (ret != WAIT_OBJECT_0) break;
+    }
+
+    *written = i ? i : 1;
+    return ret;
+}
+
+/******************************************************************
  *              NtOpenIoCompletion (NTDLL.@)
  *              ZwOpenIoCompletion (NTDLL.@)
  *
-- 
2.7.4




More information about the wine-devel mailing list