Module: wine Branch: master Commit: ef2471ec0f817b1bb57d4888ed2f5fdf78022e75 URL: https://source.winehq.org/git/wine.git/?a=commit;h=ef2471ec0f817b1bb57d4888e...
Author: Zebediah Figura z.figura12@gmail.com Date: Sun Sep 30 16:59:47 2018 -0500
ntdll: Implement NtRemoveIoCompletionEx().
Signed-off-by: Zebediah Figura z.figura12@gmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/ntdll.spec | 2 ++ dlls/ntdll/sync.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+)
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 5e7c463..b7cbff3 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) @@ -1243,6 +1244,7 @@ @ stub ZwReleaseProcessMutant @ stdcall -private ZwReleaseSemaphore(long long ptr) NtReleaseSemaphore @ stdcall -private ZwRemoveIoCompletion(ptr ptr ptr ptr ptr) NtRemoveIoCompletion +@ stdcall -private ZwRemoveIoCompletionEx(ptr ptr long ptr ptr long) NtRemoveIoCompletionEx # @ stub ZwRemoveProcessDebug @ stdcall -private ZwRenameKey(long ptr) NtRenameKey @ stdcall -private ZwReplaceKey(ptr long ptr) NtReplaceKey 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.@) *