Zebediah Figura : kernelbase: Implement GetOverlappedResultEx().
Alexandre Julliard
julliard at winehq.org
Fri Nov 29 13:17:28 CST 2019
Module: wine
Branch: master
Commit: 216530f230d270c6bc86f9254f37ed58b843e44d
URL: https://source.winehq.org/git/wine.git/?a=commit;h=216530f230d270c6bc86f9254f37ed58b843e44d
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Thu Nov 28 18:19:21 2019 -0600
kernelbase: Implement GetOverlappedResultEx().
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=38830
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
.../api-ms-win-core-io-l1-1-1.spec | 2 +-
dlls/kernel32/kernel32.spec | 1 +
dlls/kernel32/tests/pipe.c | 54 ++++++++++++++++++++++
dlls/kernelbase/file.c | 23 +++++++--
dlls/kernelbase/kernelbase.spec | 2 +-
include/winbase.h | 1 +
6 files changed, 78 insertions(+), 5 deletions(-)
diff --git a/dlls/api-ms-win-core-io-l1-1-1/api-ms-win-core-io-l1-1-1.spec b/dlls/api-ms-win-core-io-l1-1-1/api-ms-win-core-io-l1-1-1.spec
index 907c0b4a97..87039aef0c 100644
--- a/dlls/api-ms-win-core-io-l1-1-1/api-ms-win-core-io-l1-1-1.spec
+++ b/dlls/api-ms-win-core-io-l1-1-1/api-ms-win-core-io-l1-1-1.spec
@@ -4,7 +4,7 @@
@ stdcall CreateIoCompletionPort(long long long long) kernel32.CreateIoCompletionPort
@ stdcall DeviceIoControl(long long ptr long ptr long ptr ptr) kernel32.DeviceIoControl
@ stdcall GetOverlappedResult(long ptr ptr long) kernel32.GetOverlappedResult
-@ stub GetOverlappedResultEx
+@ stdcall GetOverlappedResultEx(long ptr ptr long long) kernel32.GetOverlappedResultEx
@ stdcall GetQueuedCompletionStatus(long ptr ptr ptr long) kernel32.GetQueuedCompletionStatus
@ stdcall GetQueuedCompletionStatusEx(ptr ptr long ptr long long) kernel32.GetQueuedCompletionStatusEx
@ stdcall PostQueuedCompletionStatus(long long ptr ptr) kernel32.PostQueuedCompletionStatus
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index 82e10850a8..172be2a6e2 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -760,6 +760,7 @@
@ stdcall GetNumberOfConsoleMouseButtons(ptr)
@ stdcall -import GetOEMCP()
@ stdcall -import GetOverlappedResult(long ptr ptr long)
+@ stdcall -import GetOverlappedResultEx(long ptr ptr long long)
@ stdcall GetUserPreferredUILanguages(long ptr ptr ptr)
@ stdcall GetPackageFullName(long ptr ptr)
@ stdcall -import GetPhysicallyInstalledSystemMemory(ptr)
diff --git a/dlls/kernel32/tests/pipe.c b/dlls/kernel32/tests/pipe.c
index d8d5726f1a..20f3450c6d 100644
--- a/dlls/kernel32/tests/pipe.c
+++ b/dlls/kernel32/tests/pipe.c
@@ -42,6 +42,7 @@ static BOOL (WINAPI *pGetNamedPipeClientProcessId)(HANDLE,ULONG*);
static BOOL (WINAPI *pGetNamedPipeServerProcessId)(HANDLE,ULONG*);
static BOOL (WINAPI *pGetNamedPipeClientSessionId)(HANDLE,ULONG*);
static BOOL (WINAPI *pGetNamedPipeServerSessionId)(HANDLE,ULONG*);
+static BOOL (WINAPI *pGetOverlappedResultEx)(HANDLE,OVERLAPPED *,DWORD *,DWORD,BOOL);
static BOOL user_apc_ran;
static void CALLBACK user_apc(ULONG_PTR param)
@@ -4065,6 +4066,57 @@ static void test_nowait(DWORD pipe_type)
ok(CloseHandle(pipewrite), "CloseHandle for the write pipe failed\n");
}
+static void test_GetOverlappedResultEx(void)
+{
+ HANDLE client, server;
+ OVERLAPPED ovl;
+ char buffer[8000];
+ DWORD ret_size;
+ BOOL ret;
+
+ if (!pGetOverlappedResultEx)
+ {
+ win_skip("GetOverlappedResultEx() is not available\n");
+ return;
+ }
+
+ create_overlapped_pipe(PIPE_TYPE_BYTE, &client, &server);
+
+ overlapped_write_async(client, buffer, sizeof(buffer), &ovl);
+
+ user_apc_ran = FALSE;
+ QueueUserAPC(user_apc, GetCurrentThread(), 0);
+
+ SetLastError(0xdeadbeef);
+ ret = pGetOverlappedResultEx(client, &ovl, &ret_size, 0, FALSE);
+ ok(!ret, "expected failure\n");
+ ok(GetLastError() == ERROR_IO_INCOMPLETE, "wrong error %u\n", GetLastError());
+ ok(!user_apc_ran, "APC should not have run\n");
+
+ SetLastError(0xdeadbeef);
+ ret = pGetOverlappedResultEx(client, &ovl, &ret_size, 0, TRUE);
+ ok(!ret, "expected failure\n");
+ ok(GetLastError() == ERROR_IO_INCOMPLETE, "wrong error %u\n", GetLastError());
+ ok(!user_apc_ran, "APC should not have run\n");
+
+ SetLastError(0xdeadbeef);
+ ret = pGetOverlappedResultEx(client, &ovl, &ret_size, 10, FALSE);
+ ok(!ret, "expected failure\n");
+ ok(GetLastError() == WAIT_TIMEOUT, "wrong error %u\n", GetLastError());
+ ok(!user_apc_ran, "APC should not have run\n");
+
+ SetLastError(0xdeadbeef);
+ ret = pGetOverlappedResultEx(client, &ovl, &ret_size, 10, TRUE);
+ ok(!ret, "expected failure\n");
+ ok(GetLastError() == WAIT_IO_COMPLETION, "wrong error %u\n", GetLastError());
+ ok(user_apc_ran, "APC should have run\n");
+
+ CloseHandle(ovl.hEvent);
+
+ CloseHandle(client);
+ CloseHandle(server);
+}
+
START_TEST(pipe)
{
char **argv;
@@ -4080,6 +4132,7 @@ START_TEST(pipe)
pGetNamedPipeServerProcessId = (void *) GetProcAddress(hmod, "GetNamedPipeServerProcessId");
pGetNamedPipeClientSessionId = (void *) GetProcAddress(hmod, "GetNamedPipeClientSessionId");
pGetNamedPipeServerSessionId = (void *) GetProcAddress(hmod, "GetNamedPipeServerSessionId");
+ pGetOverlappedResultEx = (void *)GetProcAddress(hmod, "GetOverlappedResultEx");
argc = winetest_get_mainargs(&argv);
@@ -4134,4 +4187,5 @@ START_TEST(pipe)
test_wait_pipe();
test_nowait(PIPE_TYPE_BYTE);
test_nowait(PIPE_TYPE_MESSAGE);
+ test_GetOverlappedResultEx();
}
diff --git a/dlls/kernelbase/file.c b/dlls/kernelbase/file.c
index aa2ebfcc69..77a7398580 100644
--- a/dlls/kernelbase/file.c
+++ b/dlls/kernelbase/file.c
@@ -2002,21 +2002,38 @@ DWORD WINAPI DECLSPEC_HOTPATCH GetFileType( HANDLE file )
*/
BOOL WINAPI DECLSPEC_HOTPATCH GetOverlappedResult( HANDLE file, LPOVERLAPPED overlapped,
LPDWORD result, BOOL wait )
+{
+ return GetOverlappedResultEx( file, overlapped, result, wait ? INFINITE : 0, FALSE );
+}
+
+
+/***********************************************************************
+ * GetOverlappedResultEx (kernelbase.@)
+ */
+BOOL WINAPI DECLSPEC_HOTPATCH GetOverlappedResultEx( HANDLE file, OVERLAPPED *overlapped,
+ DWORD *result, DWORD timeout, BOOL alertable )
{
NTSTATUS status;
+ DWORD ret;
- TRACE( "(%p %p %p %x)\n", file, overlapped, result, wait );
+ TRACE( "(%p %p %p %u %d)\n", file, overlapped, result, timeout, alertable );
status = overlapped->Internal;
if (status == STATUS_PENDING)
{
- if (!wait)
+ if (!timeout)
{
SetLastError( ERROR_IO_INCOMPLETE );
return FALSE;
}
- if (WaitForSingleObject( overlapped->hEvent ? overlapped->hEvent : file, INFINITE ) == WAIT_FAILED)
+ ret = WaitForSingleObjectEx( overlapped->hEvent ? overlapped->hEvent : file, timeout, alertable );
+ if (ret == WAIT_FAILED)
return FALSE;
+ else if (ret)
+ {
+ SetLastError( ret );
+ return FALSE;
+ }
status = overlapped->Internal;
if (status == STATUS_PENDING) status = STATUS_SUCCESS;
diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec
index 14ee402089..ed5d1f73f8 100644
--- a/dlls/kernelbase/kernelbase.spec
+++ b/dlls/kernelbase/kernelbase.spec
@@ -584,7 +584,7 @@
# @ stub GetOsManufacturingMode
# @ stub GetOsSafeBootMode
@ stdcall GetOverlappedResult(long ptr ptr long)
-# @ stub GetOverlappedResultEx
+@ stdcall GetOverlappedResultEx(long ptr ptr long long)
# @ stub GetPackageApplicationContext
# @ stub GetPackageApplicationIds
# @ stub GetPackageApplicationProperty
diff --git a/include/winbase.h b/include/winbase.h
index 8b30c5a69a..2d01dcb606 100644
--- a/include/winbase.h
+++ b/include/winbase.h
@@ -2215,6 +2215,7 @@ WINBASEAPI BOOL WINAPI GetNumaProximityNodeEx(ULONG,PUSHORT);
WINADVAPI BOOL WINAPI GetNumberOfEventLogRecords(HANDLE,PDWORD);
WINADVAPI BOOL WINAPI GetOldestEventLogRecord(HANDLE,PDWORD);
WINBASEAPI BOOL WINAPI GetOverlappedResult(HANDLE,LPOVERLAPPED,LPDWORD,BOOL);
+WINBASEAPI BOOL WINAPI GetOverlappedResultEx(HANDLE,OVERLAPPED*,DWORD*,DWORD,BOOL);
WINBASEAPI DWORD WINAPI GetPriorityClass(HANDLE);
WINADVAPI BOOL WINAPI GetPrivateObjectSecurity(PSECURITY_DESCRIPTOR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,DWORD,PDWORD);
WINBASEAPI UINT WINAPI GetPrivateProfileIntA(LPCSTR,LPCSTR,INT,LPCSTR);
More information about the wine-cvs
mailing list