Compare commits

...

18 Commits
v2.4 ... v2.5

Author SHA1 Message Date
Sebastian Lackner
25bd49ecb6 Release 2.5. 2017-04-09 19:53:42 +02:00
Sebastian Lackner
7a2c0d03d7 Added patch for dummy apiset in PEB struct. 2017-04-09 16:14:41 +02:00
Sebastian Lackner
c081ded2be Added patch to add missing initialization in create_glyphrunanalysis. 2017-04-09 16:14:41 +02:00
Sebastian Lackner
c372796653 kernel32-SetFileCompletionNotificationModes: Update patchset for server-side named pipes. 2017-04-09 16:14:41 +02:00
Sebastian Lackner
8568fe0a24 oleaut32-OleLoadPicture: Update patchset and fix a regression. 2017-04-09 16:14:41 +02:00
Sebastian Lackner
6897c8b67b Added patch to implement and use hash links when looking up LDR module. 2017-04-09 16:14:41 +02:00
Sebastian Lackner
0844f36738 Added patch to implement stub for ntdll.RtlGetUnloadEventTraceEx. 2017-04-09 16:14:41 +02:00
Sebastian Lackner
b9a9f51c59 Added patch to implement NtSuspendProcess and NtResumeProcess. 2017-04-09 16:14:41 +02:00
Sebastian Lackner
2dd39323aa Added patch to implement more stub classes in NtQueryInformationJobObject. 2017-04-09 16:14:41 +02:00
Sebastian Lackner
4f7c521e11 Added patch to implement FileNameInformation in NtQueryInformationFile for named pipes. 2017-04-09 16:14:41 +02:00
Sebastian Lackner
a16c4ffd33 Added patch to return failure when handling http redirect without hostname. 2017-04-09 16:14:41 +02:00
Sebastian Lackner
35d020002f README.md: Update link to installation instructions. 2017-04-09 16:14:41 +02:00
Sebastian Lackner
a781d341a5 Rebase against 64e4a03a92498abea428dc567372f3996fa9dc3a. 2017-04-09 16:14:41 +02:00
Sebastian Lackner
3a8de0f3f4 Rebase against 63bcfa3354edd910ee52b8134af191f7a774b701. 2017-04-09 16:14:41 +02:00
Sebastian Lackner
e2750d967a Rebase against 42ed54b5d8e67aeb647d5a4fc8af7c8962285c7f. 2017-04-09 16:14:41 +02:00
Sebastian Lackner
a127f84245 patchupdate.py: Add support to exclude individual files. 2017-04-09 16:14:41 +02:00
Sebastian Lackner
e3753add9b Rebase against ec8485ec10e3c27b89ec5f1289bc8a3cdad5f3f6. 2017-04-09 16:14:41 +02:00
Sebastian Lackner
55ab42ece0 Rebase against 5b4f8a385b46a8a8a8b09b8ca6578aa7b7995a1e. 2017-04-09 16:14:41 +02:00
55 changed files with 2555 additions and 2918 deletions

View File

@@ -13,7 +13,7 @@ Installation
Ready-to-use packages for Wine Staging are available for a variety of Linux
distributions and for Mac OS X. Just follow the
[installation instructions](https://github.com/wine-compholio/wine-staging/wiki/Installation)
[installation instructions](https://wine-staging.com/installation.html)
for your operating system.
On most distributions the `wine-staging` package is installed to

View File

@@ -1,4 +1,4 @@
From fdc085e009942fa89ef5f0cd4104ab78c9d80b1b Mon Sep 17 00:00:00 2001
From bee5e0baac722c66ad8c1034a65a2cecfe74716e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Sun, 5 Mar 2017 23:50:06 +0100
Subject: advapi32: Implement LsaLookupPrivilegeName.
@@ -12,20 +12,20 @@ Subject: advapi32: Implement LsaLookupPrivilegeName.
5 files changed, 60 insertions(+), 10 deletions(-)
diff --git a/dlls/advapi32/advapi32.spec b/dlls/advapi32/advapi32.spec
index 3000973265c..2c599c8bd92 100644
index 078bb8fc25..124f527282 100644
--- a/dlls/advapi32/advapi32.spec
+++ b/dlls/advapi32/advapi32.spec
@@ -446,7 +446,7 @@
@ stdcall LsaLookupNames2(ptr long long ptr ptr ptr)
@@ -469,7 +469,7 @@
@ stdcall LsaLookupNames(long long ptr ptr ptr)
@ stdcall LsaLookupNames2(ptr long long ptr ptr ptr)
@ stub LsaLookupPrivilegeDisplayName
-# @ stub LsaLookupPrivilegeName
+@ stdcall LsaLookupPrivilegeName(long ptr ptr)
# @ stub LsaLookupPrivilegeValue
@ stdcall LsaLookupSids(ptr long ptr ptr ptr)
# @ stub LsaManageSidNameMapping
# @ stub LsaLookupSids2
diff --git a/dlls/advapi32/advapi32_misc.h b/dlls/advapi32/advapi32_misc.h
index d116ecb836e..ecb07f635a6 100644
index d116ecb836..ecb07f635a 100644
--- a/dlls/advapi32/advapi32_misc.h
+++ b/dlls/advapi32/advapi32_misc.h
@@ -68,4 +68,6 @@ static inline WCHAR *strdupAW( const char *src )
@@ -36,10 +36,10 @@ index d116ecb836e..ecb07f635a6 100644
+
#endif /* __WINE_ADVAPI32MISC_H */
diff --git a/dlls/advapi32/lsa.c b/dlls/advapi32/lsa.c
index 0f2167d19ab..6a7a69a9eb7 100644
index 479201bfc1..ceb3b05c05 100644
--- a/dlls/advapi32/lsa.c
+++ b/dlls/advapi32/lsa.c
@@ -1012,3 +1012,41 @@ NTSTATUS WINAPI LsaUnregisterPolicyChangeNotification(
@@ -973,3 +973,41 @@ NTSTATUS WINAPI LsaUnregisterPolicyChangeNotification(
FIXME("(%d,%p) stub\n", class, event);
return STATUS_SUCCESS;
}
@@ -82,7 +82,7 @@ index 0f2167d19ab..6a7a69a9eb7 100644
+ return STATUS_SUCCESS;
+}
diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c
index b0b368d6abf..24ec3099713 100644
index e36792cff4..3bc8f48b19 100644
--- a/dlls/advapi32/security.c
+++ b/dlls/advapi32/security.c
@@ -1840,7 +1840,7 @@ static const WCHAR SE_IMPERSONATE_NAME_W[] =
@@ -146,7 +146,7 @@ index b0b368d6abf..24ec3099713 100644
}
}
diff --git a/include/ntsecapi.h b/include/ntsecapi.h
index 2bb3d312e43..0bf0eca43ed 100644
index 2bb3d312e4..0bf0eca43e 100644
--- a/include/ntsecapi.h
+++ b/include/ntsecapi.h
@@ -370,6 +370,7 @@ NTSTATUS WINAPI LsaLookupNames(LSA_HANDLE,ULONG,PLSA_UNICODE_STRING,PLSA_REFEREN

View File

@@ -1,4 +1,4 @@
From 01efac6b4fa338715ad775c147a6bfc42e0bc38e Mon Sep 17 00:00:00 2001
From 63d642a1af3ccc579123cb8fd13959ab5e9136dd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Mon, 6 Mar 2017 00:01:53 +0100
Subject: advapi32: Add stub for LsaLookupPrivilegeDisplayName.
@@ -9,23 +9,23 @@ Subject: advapi32: Add stub for LsaLookupPrivilegeDisplayName.
2 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/dlls/advapi32/advapi32.spec b/dlls/advapi32/advapi32.spec
index 2c599c8bd92..ce1838d8c5a 100644
index 124f527282..0b03cec3f5 100644
--- a/dlls/advapi32/advapi32.spec
+++ b/dlls/advapi32/advapi32.spec
@@ -445,7 +445,7 @@
@@ -468,7 +468,7 @@
# @ stub LsaICLookupSidsWithCreds
@ stdcall LsaLookupNames2(ptr long long ptr ptr ptr)
@ stdcall LsaLookupNames(long long ptr ptr ptr)
@ stdcall LsaLookupNames2(ptr long long ptr ptr ptr)
-@ stub LsaLookupPrivilegeDisplayName
+@ stdcall LsaLookupPrivilegeDisplayName(long ptr ptr ptr)
@ stdcall LsaLookupPrivilegeName(long ptr ptr)
# @ stub LsaLookupPrivilegeValue
@ stdcall LsaLookupSids(ptr long ptr ptr ptr)
diff --git a/dlls/advapi32/lsa.c b/dlls/advapi32/lsa.c
index 6a7a69a9eb7..fdb238f74b2 100644
index ceb3b05c05..c2e02fb462 100644
--- a/dlls/advapi32/lsa.c
+++ b/dlls/advapi32/lsa.c
@@ -45,6 +45,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(advapi);
@@ -44,6 +44,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(advapi);
return FailureCode; \
}
@@ -38,7 +38,7 @@ index 6a7a69a9eb7..fdb238f74b2 100644
static void dumpLsaAttributes(const LSA_OBJECT_ATTRIBUTES *oa)
{
if (oa)
@@ -1050,3 +1056,18 @@ NTSTATUS WINAPI LsaLookupPrivilegeName(
@@ -1011,3 +1017,18 @@ NTSTATUS WINAPI LsaLookupPrivilegeName(
*name = priv_unicode;
return STATUS_SUCCESS;
}

View File

@@ -1,65 +0,0 @@
From 97744349e9a23aa024910d87a89bd94652db4914 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Fri, 15 Jan 2016 13:07:09 +0100
Subject: api-ms-win-core-quirks-l1-1-0: Add dll.
---
configure.ac | 1 +
dlls/api-ms-win-core-quirks-l1-1-0/Makefile.in | 1 +
.../api-ms-win-core-quirks-l1-1-0.spec | 8 ++++++++
tools/make_specfiles | 4 ++++
4 files changed, 14 insertions(+)
create mode 100644 dlls/api-ms-win-core-quirks-l1-1-0/Makefile.in
create mode 100644 dlls/api-ms-win-core-quirks-l1-1-0/api-ms-win-core-quirks-l1-1-0.spec
diff --git a/configure.ac b/configure.ac
index 84316f9..e826dd0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2720,6 +2720,7 @@ WINE_CONFIG_DLL(api-ms-win-core-processthreads-l1-1-2)
WINE_CONFIG_DLL(api-ms-win-core-profile-l1-1-0)
WINE_CONFIG_DLL(api-ms-win-core-psapi-l1-1-0)
WINE_CONFIG_DLL(api-ms-win-core-psapi-obsolete-l1-1-0)
+WINE_CONFIG_DLL(api-ms-win-core-quirks-l1-1-0)
WINE_CONFIG_DLL(api-ms-win-core-realtime-l1-1-0)
WINE_CONFIG_DLL(api-ms-win-core-registry-l1-1-0)
WINE_CONFIG_DLL(api-ms-win-core-registryuserspecific-l1-1-0)
diff --git a/dlls/api-ms-win-core-quirks-l1-1-0/Makefile.in b/dlls/api-ms-win-core-quirks-l1-1-0/Makefile.in
new file mode 100644
index 0000000..9486e8b
--- /dev/null
+++ b/dlls/api-ms-win-core-quirks-l1-1-0/Makefile.in
@@ -0,0 +1 @@
+MODULE = api-ms-win-core-quirks-l1-1-0.dll
diff --git a/dlls/api-ms-win-core-quirks-l1-1-0/api-ms-win-core-quirks-l1-1-0.spec b/dlls/api-ms-win-core-quirks-l1-1-0/api-ms-win-core-quirks-l1-1-0.spec
new file mode 100644
index 0000000..54ce373
--- /dev/null
+++ b/dlls/api-ms-win-core-quirks-l1-1-0/api-ms-win-core-quirks-l1-1-0.spec
@@ -0,0 +1,8 @@
+@ stub QuirkGetData
+@ stub QuirkGetData2
+@ stdcall QuirkIsEnabled(ptr) kernelbase.QuirkIsEnabled
+@ stub QuirkIsEnabled2
+@ stub QuirkIsEnabled3
+@ stub QuirkIsEnabledForPackage
+@ stub QuirkIsEnabledForPackage2
+@ stub QuirkIsEnabledForProcess
diff --git a/tools/make_specfiles b/tools/make_specfiles
index eba8548..609f7a0 100755
--- a/tools/make_specfiles
+++ b/tools/make_specfiles
@@ -239,6 +239,10 @@ my @dll_groups =
"api-ms-win-core-bem-l1-1-0",
],
[
+ "kernelbase",
+ "api-ms-win-core-quirks-l1-1-0",
+ ],
+ [
"ole32",
"api-ms-win-downlevel-ole32-l1-1-0",
"api-ms-win-core-com-l1-1-0",
--
2.9.0

View File

@@ -1,58 +0,0 @@
From d0688788458f243ccef2c337d7ab8f59ead75a3b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Thu, 4 Feb 2016 06:19:57 +0100
Subject: kernelbase: Add stub for QuirkIsEnabled3.
---
.../api-ms-win-core-quirks-l1-1-0.spec | 2 +-
dlls/kernelbase/kernelbase.spec | 2 +-
dlls/kernelbase/misc.c | 10 ++++++++++
3 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/dlls/api-ms-win-core-quirks-l1-1-0/api-ms-win-core-quirks-l1-1-0.spec b/dlls/api-ms-win-core-quirks-l1-1-0/api-ms-win-core-quirks-l1-1-0.spec
index 54ce373..1485512 100644
--- a/dlls/api-ms-win-core-quirks-l1-1-0/api-ms-win-core-quirks-l1-1-0.spec
+++ b/dlls/api-ms-win-core-quirks-l1-1-0/api-ms-win-core-quirks-l1-1-0.spec
@@ -2,7 +2,7 @@
@ stub QuirkGetData2
@ stdcall QuirkIsEnabled(ptr) kernelbase.QuirkIsEnabled
@ stub QuirkIsEnabled2
-@ stub QuirkIsEnabled3
+@ stdcall QuirkIsEnabled3(ptr ptr) kernelbase.QuirkIsEnabled3
@ stub QuirkIsEnabledForPackage
@ stub QuirkIsEnabledForPackage2
@ stub QuirkIsEnabledForProcess
diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec
index 8fdb80d..c0b2594 100644
--- a/dlls/kernelbase/kernelbase.spec
+++ b/dlls/kernelbase/kernelbase.spec
@@ -1189,7 +1189,7 @@
@ stub QuirkGetData2
@ stdcall QuirkIsEnabled(ptr)
@ stub QuirkIsEnabled2
-@ stub QuirkIsEnabled3
+@ stdcall QuirkIsEnabled3(ptr ptr)
@ stub QuirkIsEnabledForPackage
@ stub QuirkIsEnabledForPackage2
@ stub QuirkIsEnabledForPackage3
diff --git a/dlls/kernelbase/misc.c b/dlls/kernelbase/misc.c
index be1591a..e703e6d 100644
--- a/dlls/kernelbase/misc.c
+++ b/dlls/kernelbase/misc.c
@@ -35,3 +35,13 @@ BOOL WINAPI QuirkIsEnabled(void *arg)
FIXME("(%p): stub\n", arg);
return FALSE;
}
+
+/***********************************************************************
+ * QuirkIsEnabled3 (KERNELBASE.@)
+ */
+BOOL WINAPI QuirkIsEnabled3(void *arg1, void *arg2)
+{
+ static int once;
+ if (!once++) FIXME("(%p, %p): stub\n", arg1, arg2);
+ return FALSE;
+}
--
2.7.1

View File

@@ -1,17 +1,17 @@
From aefdbc0fabb66052164ecd45fecfb0b947a130ac Mon Sep 17 00:00:00 2001
From b9d73e9b13df905bfab65d07babae2f40469c405 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Tue, 12 Apr 2016 01:02:34 +0200
Subject: uiautomationcore: Add dll and stub some functions.
---
dlls/uiautomationcore/Makefile.in | 1 +
dlls/uiautomationcore/uia_main.c | 89 ++++++++++++++++++++++++++++-
dlls/uiautomationcore/uiautomationcore.spec | 14 +++--
include/uiautomationcoreapi.h | 16 ++++++
4 files changed, 114 insertions(+), 6 deletions(-)
dlls/uiautomationcore/uia_main.c | 65 +++++++++++++++++++++++++----
dlls/uiautomationcore/uiautomationcore.spec | 8 +++-
include/uiautomationcoreapi.h | 10 +++--
4 files changed, 72 insertions(+), 12 deletions(-)
diff --git a/dlls/uiautomationcore/Makefile.in b/dlls/uiautomationcore/Makefile.in
index 78d6254a015..029fc2e4995 100644
index 78d6254a01..029fc2e499 100644
--- a/dlls/uiautomationcore/Makefile.in
+++ b/dlls/uiautomationcore/Makefile.in
@@ -1,4 +1,5 @@
@@ -21,7 +21,7 @@ index 78d6254a015..029fc2e4995 100644
C_SRCS = \
uia_main.c
diff --git a/dlls/uiautomationcore/uia_main.c b/dlls/uiautomationcore/uia_main.c
index 994d8e6080b..f1429faeff9 100644
index af986810f5..0f1e84450c 100644
--- a/dlls/uiautomationcore/uia_main.c
+++ b/dlls/uiautomationcore/uia_main.c
@@ -1,4 +1,5 @@
@@ -30,20 +30,15 @@ index 994d8e6080b..f1429faeff9 100644
* Copyright 2017 Jacek Caban for CodeWeavers
*
* This library is free software; you can redistribute it and/or
@@ -16,7 +17,11 @@
@@ -16,6 +17,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include "uiautomationcore.h"
+#include <stdarg.h>
+#include "windef.h"
+#include "winbase.h"
+#define COBJMACROS
+#include "uiautomationcoreapi.h"
#include "uiautomation.h"
#include "wine/debug.h"
@@ -37,11 +42,91 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, void *lpv)
@@ -37,12 +39,61 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, void *lpv)
return TRUE;
}
@@ -87,37 +82,6 @@ index 994d8e6080b..f1429faeff9 100644
+static IUnknown dummy = { &dummy_Vtbl };
+
+/***********************************************************************
+ * UiaLookupId (uiautomationcore.@)
+ */
+int WINAPI UiaLookupId(AutomationIdentifierType type, const GUID *guid)
+{
+ FIXME("(%d, %s)\n", type, debugstr_guid(guid));
+ return 1;
+}
+
+/***********************************************************************
+ * UiaGetReservedMixedAttributeValue (uiautomationcore.@)
+ */
+HRESULT WINAPI UiaGetReservedMixedAttributeValue(IUnknown **value)
+{
+ FIXME("(%p): stub\n", value);
+
+ *value = &dummy;
+ return S_OK;
+}
+
+/***********************************************************************
+ * UiaGetReservedNotSupportedValue (uiautomationcore.@)
+ */
+HRESULT WINAPI UiaGetReservedNotSupportedValue(IUnknown **value)
+{
+ FIXME("(%p): stub\n", value);
+
+ *value = &dummy;
+ return S_OK;
+}
+
+/***********************************************************************
+ * UiaReturnRawElementProvider (uiautomationcore.@)
+ */
+LRESULT WINAPI UiaReturnRawElementProvider(HWND hwnd, WPARAM wparam, LPARAM lparam,
@@ -136,11 +100,44 @@ index 994d8e6080b..f1429faeff9 100644
+ FIXME("(): stub\n");
return FALSE;
}
@@ -51,8 +102,8 @@ BOOL WINAPI UiaClientsAreListening(void)
*/
HRESULT WINAPI UiaGetReservedMixedAttributeValue(IUnknown **value)
{
- FIXME("(%p) stub!\n", value);
- *value = NULL;
+ FIXME("(%p): stub!\n", value);
+ *value = &dummy;
return S_OK;
}
@@ -61,16 +112,16 @@ HRESULT WINAPI UiaGetReservedMixedAttributeValue(IUnknown **value)
*/
HRESULT WINAPI UiaGetReservedNotSupportedValue(IUnknown **value)
{
- FIXME("(%p) stub!\n", value);
- *value = NULL;
+ FIXME("(%p): stub!\n", value);
+ *value = &dummy;
return S_OK;
}
/***********************************************************************
* UiaLookupId (uiautomationcore.@)
*/
-int WINAPI UiaLookupId(enum AutomationIdentifierType type, const GUID *guid)
+int WINAPI UiaLookupId(AutomationIdentifierType type, const GUID *guid)
{
- FIXME("(%d, %s) stub!\n", type, debugstr_guid(guid));
+ FIXME("(%d, %s): stub!\n", type, debugstr_guid(guid));
return 1;
}
diff --git a/dlls/uiautomationcore/uiautomationcore.spec b/dlls/uiautomationcore/uiautomationcore.spec
index 3026001b6b7..221711c41d2 100644
index ddf84f63c0..221711c41d 100644
--- a/dlls/uiautomationcore/uiautomationcore.spec
+++ b/dlls/uiautomationcore/uiautomationcore.spec
@@ -53,14 +53,16 @@
@@ -53,6 +53,8 @@
@ stub TransformPattern_Rotate
@ stub UiaAddEvent
@ stdcall UiaClientsAreListening()
@@ -149,26 +146,14 @@ index 3026001b6b7..221711c41d2 100644
@ stub UiaEventAddWindow
@ stub UiaEventRemoveWindow
@ stub UiaFind
@ stub UiaGetErrorDescription
@ stub UiaGetPatternProvider
@ stub UiaGetPropertyValue
-@ stub UiaGetReservedMixedAttributeValue
-@ stub UiaGetReservedNotSupportedValue
+@ stdcall UiaGetReservedMixedAttributeValue(ptr)
+@ stdcall UiaGetReservedNotSupportedValue(ptr)
@ stub UiaGetRootNode
@ stub UiaGetRuntimeId
@ stub UiaGetUpdatedCache
@@ -69,7 +71,8 @@
@@ -69,6 +71,7 @@
@ stub UiaHUiaNodeFromVariant
@ stub UiaHasServerSideProvider
@ stub UiaHostProviderFromHwnd
-@ stub UiaLookupId
+@ stub UiaIAccessibleFromProvider
+@ stdcall UiaLookupId(long ptr)
@ stdcall UiaLookupId(long ptr)
@ stub UiaNavigate
@ stub UiaNodeFromFocus
@ stub UiaNodeFromHandle
@@ -77,13 +80,16 @@
@ stub UiaNodeFromProvider
@ stub UiaNodeRelease
@@ -188,42 +173,32 @@ index 3026001b6b7..221711c41d2 100644
@ stub UiaTextRangeRelease
@ stub ValuePattern_SetValue
diff --git a/include/uiautomationcoreapi.h b/include/uiautomationcoreapi.h
index 340f5005db4..b9107ceb792 100644
index fbe47ad184..8d13a16c53 100644
--- a/include/uiautomationcoreapi.h
+++ b/include/uiautomationcoreapi.h
@@ -19,6 +19,8 @@
#ifndef _INC_UIAUTOMATIONCOREAPI
#define _INC_UIAUTOMATIONCOREAPI
+#include "uiautomationcore.h"
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -34,6 +36,16 @@ extern "C" {
#define UiaAppendRuntimeId 3
#define UiaRootObjectId -25
@@ -39,20 +39,22 @@ DECLARE_HANDLE(HUIAPATTERNOBJECT);
DECLARE_HANDLE(HUIATEXTRANGE);
DECLARE_HANDLE(HUIAEVENT);
-enum AutomationIdentifierType
+typedef enum AutomationIdentifierType
+{
+ AutomationIdentifierType_Property,
+ AutomationIdentifierType_Pattern,
+ AutomationIdentifierType_Event,
+ AutomationIdentifierType_ControlType,
{
AutomationIdentifierType_Property,
AutomationIdentifierType_Pattern,
AutomationIdentifierType_Event,
AutomationIdentifierType_ControlType,
- AutomationIdentifierType_TextAttribute
-};
+ AutomationIdentifierType_TextAttribute,
+ AutomationIdentifierType_LandmarkType,
+} AutomationIdentifierType;
+
DECLARE_HANDLE(HUIANODE);
DECLARE_HANDLE(HUIAPATTERNOBJECT);
DECLARE_HANDLE(HUIATEXTRANGE);
@@ -41,6 +53,10 @@ DECLARE_HANDLE(HUIAEVENT);
HRESULT WINAPI UiaGetReservedMixedAttributeValue(IUnknown **value);
HRESULT WINAPI UiaGetReservedNotSupportedValue(IUnknown **value);
-int WINAPI UiaLookupId(enum AutomationIdentifierType type, const GUID *guid);
+int WINAPI UiaLookupId(AutomationIdentifierType type, const GUID *guid);
BOOL WINAPI UiaPatternRelease(HUIAPATTERNOBJECT hobj);
BOOL WINAPI UiaTextRangeRelease(HUIATEXTRANGE hobj);
+int WINAPI UiaLookupId(AutomationIdentifierType type, const GUID *guid);
+HRESULT WINAPI UiaGetReservedMixedAttributeValue(IUnknown **value);
+HRESULT WINAPI UiaGetReservedNotSupportedValue(IUnknown **value);
+LRESULT WINAPI UiaReturnRawElementProvider(HWND hwnd, WPARAM wparam, LPARAM lparam, IRawElementProviderSimple *provider);
#ifdef __cplusplus

View File

@@ -1,4 +1,4 @@
From b02ee3d1c5dc1fd3040f81d87d3b17f5148fe2c5 Mon Sep 17 00:00:00 2001
From 4ce7612fe0c6fd65f89403c8703e5395fbb4a85d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Tue, 28 Jul 2015 17:26:09 +0200
Subject: d3dx9_36: Return dummy skininfo interface in D3DXLoadSkinMeshFromXof
@@ -11,18 +11,18 @@ Subject: d3dx9_36: Return dummy skininfo interface in D3DXLoadSkinMeshFromXof
3 files changed, 30 insertions(+), 1 deletion(-)
diff --git a/dlls/d3dx9_36/d3dx9_private.h b/dlls/d3dx9_36/d3dx9_private.h
index a0e62f1..e9f7187 100644
index abb3114e89..4c6d642b7e 100644
--- a/dlls/d3dx9_36/d3dx9_private.h
+++ b/dlls/d3dx9_36/d3dx9_private.h
@@ -198,4 +198,6 @@ HRESULT d3dx_evaluate_parameter(struct d3dx_param_eval *peval,
HRESULT d3dx_param_eval_set_shader_constants(struct IDirect3DDevice9 *device,
struct d3dx_param_eval *peval) DECLSPEC_HIDDEN;
@@ -241,4 +241,6 @@ HRESULT d3dx_param_eval_set_shader_constants(struct IDirect3DDevice9 *device,
struct d3dx_param_eval *peval, BOOL update_all) DECLSPEC_HIDDEN;
BOOL is_param_eval_input_dirty(struct d3dx_param_eval *peval) DECLSPEC_HIDDEN;
+HRESULT create_dummy_skin(ID3DXSkinInfo **iface) DECLSPEC_HIDDEN;
+
#endif /* __WINE_D3DX9_PRIVATE_H */
diff --git a/dlls/d3dx9_36/mesh.c b/dlls/d3dx9_36/mesh.c
index 3204ea7..61dd203 100644
index c26aa7271f..b70f4dcaa4 100644
--- a/dlls/d3dx9_36/mesh.c
+++ b/dlls/d3dx9_36/mesh.c
@@ -3332,6 +3332,13 @@ static HRESULT parse_mesh(ID3DXFileData *filedata, struct mesh_data *mesh_data,
@@ -40,7 +40,7 @@ index 3204ea7..61dd203 100644
end:
diff --git a/dlls/d3dx9_36/skin.c b/dlls/d3dx9_36/skin.c
index f197d33..bed4b9f 100644
index f197d33582..bed4b9f49d 100644
--- a/dlls/d3dx9_36/skin.c
+++ b/dlls/d3dx9_36/skin.c
@@ -94,7 +94,7 @@ static ULONG WINAPI d3dx9_skin_info_Release(ID3DXSkinInfo *iface)
@@ -77,5 +77,5 @@ index f197d33..bed4b9f 100644
+ return D3D_OK;
+}
--
2.7.1
2.11.0

View File

@@ -1,4 +1,4 @@
From caafb5926a24065e96350fc255ea92c0863c2730 Mon Sep 17 00:00:00 2001
From 9b4d4c9b2097f3134cc276dedfe8804475dcdfa6 Mon Sep 17 00:00:00 2001
From: Christian Costa <titan.costa@gmail.com>
Date: Fri, 19 Dec 2014 22:31:46 +0100
Subject: d3dx9_36: Implement ID3DXEffect_FindNextValidTechnique + add tests.
@@ -9,10 +9,10 @@ Subject: d3dx9_36: Implement ID3DXEffect_FindNextValidTechnique + add tests.
2 files changed, 91 insertions(+), 3 deletions(-)
diff --git a/dlls/d3dx9_36/effect.c b/dlls/d3dx9_36/effect.c
index 42f5aea966b..7c1d1787bf1 100644
index 76580417e9..fd9c4bd1aa 100644
--- a/dlls/d3dx9_36/effect.c
+++ b/dlls/d3dx9_36/effect.c
@@ -3538,13 +3538,41 @@ static HRESULT WINAPI ID3DXEffectImpl_ValidateTechnique(ID3DXEffect* iface, D3DX
@@ -3631,13 +3631,41 @@ static HRESULT WINAPI ID3DXEffectImpl_ValidateTechnique(ID3DXEffect* iface, D3DX
return D3D_OK;
}
@@ -58,10 +58,10 @@ index 42f5aea966b..7c1d1787bf1 100644
static BOOL walk_parameter_dep(struct d3dx_parameter *param, walk_parameter_dep_func param_func,
diff --git a/dlls/d3dx9_36/tests/effect.c b/dlls/d3dx9_36/tests/effect.c
index 56d9fe627be..1b9bea6a55c 100644
index 54f5377106..bcf4f68a57 100644
--- a/dlls/d3dx9_36/tests/effect.c
+++ b/dlls/d3dx9_36/tests/effect.c
@@ -4413,6 +4413,65 @@ static void test_effect_out_of_bounds_selector(IDirect3DDevice9 *device)
@@ -4957,6 +4957,65 @@ static void test_effect_commitchanges(IDirect3DDevice9 *device)
effect->lpVtbl->Release(effect);
}
@@ -127,10 +127,10 @@ index 56d9fe627be..1b9bea6a55c 100644
START_TEST(effect)
{
HWND wnd;
@@ -4457,6 +4516,7 @@ START_TEST(effect)
test_effect_preshader_ops(device);
@@ -5002,6 +5061,7 @@ START_TEST(effect)
test_effect_isparameterused(device);
test_effect_out_of_bounds_selector(device);
test_effect_commitchanges(device);
+ test_effect_technique_validation(device);
count = IDirect3DDevice9_Release(device);

View File

@@ -0,0 +1,26 @@
From cc25929d3a152ee70f0f779091d82da88010f2ae Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov@codeweavers.com>
Date: Mon, 3 Apr 2017 08:14:08 +0300
Subject: dwrite: Added missing max bitmap size initialization.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
---
dlls/dwrite/font.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index e89d0a825a..4e35ceab2e 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -5203,6 +5203,7 @@ HRESULT create_glyphrunanalysis(const struct glyphrunanalysis_desc *desc, IDWrit
analysis->flags = 0;
analysis->bitmap = NULL;
+ analysis->max_glyph_bitmap_size = 0;
analysis->ppdip = desc->ppdip;
analysis->origin.x = desc->origin_x * desc->ppdip;
analysis->origin.y = desc->origin_y * desc->ppdip;
--
2.11.0

View File

@@ -1,4 +1,4 @@
From 594e57c855592fe07e73003926c09520bc357416 Mon Sep 17 00:00:00 2001
From d8b434940cd2206dd8c6c731c1ce2d331e0b0d50 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Thu, 2 Feb 2017 20:49:15 +0100
Subject: kernel32: Add stub for GetPackageFullName.
@@ -11,7 +11,7 @@ Subject: kernel32: Add stub for GetPackageFullName.
4 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/dlls/api-ms-win-appmodel-runtime-l1-1-1/api-ms-win-appmodel-runtime-l1-1-1.spec b/dlls/api-ms-win-appmodel-runtime-l1-1-1/api-ms-win-appmodel-runtime-l1-1-1.spec
index 50f8594785f..4d2edd60f5a 100644
index 50f8594785..4d2edd60f5 100644
--- a/dlls/api-ms-win-appmodel-runtime-l1-1-1/api-ms-win-appmodel-runtime-l1-1-1.spec
+++ b/dlls/api-ms-win-appmodel-runtime-l1-1-1/api-ms-win-appmodel-runtime-l1-1-1.spec
@@ -10,7 +10,7 @@
@@ -24,7 +24,7 @@ index 50f8594785f..4d2edd60f5a 100644
@ stub GetPackageInfo
@ stub GetPackagePath
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index 2668386bf84..f2fcf109715 100644
index 819b52dbb9..4dcc40ea5d 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -761,6 +761,7 @@
@@ -36,7 +36,7 @@ index 2668386bf84..f2fcf109715 100644
@ stdcall GetPriorityClass(long)
@ stdcall GetPrivateProfileIntA(str str long str)
diff --git a/dlls/kernel32/version.c b/dlls/kernel32/version.c
index 5a233efe56f..3cca2ae68ee 100644
index 5a233efe56..3cca2ae68e 100644
--- a/dlls/kernel32/version.c
+++ b/dlls/kernel32/version.c
@@ -228,3 +228,12 @@ LONG WINAPI GetCurrentPackageFullName(UINT32 *length, PWSTR name)
@@ -53,18 +53,18 @@ index 5a233efe56f..3cca2ae68ee 100644
+ return APPMODEL_ERROR_NO_PACKAGE;
+}
diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec
index 12f36c5ede3..daba198bec5 100644
index 9fba5803b2..d040ba00a8 100644
--- a/dlls/kernelbase/kernelbase.spec
+++ b/dlls/kernelbase/kernelbase.spec
@@ -569,7 +569,7 @@
@ stub GetPackageContext
@ stub GetPackageFamilyName
@ stub GetPackageFamilyNameFromToken
-@ stub GetPackageFullName
@@ -593,7 +593,7 @@
# @ stub GetPackageContext
# @ stub GetPackageFamilyName
# @ stub GetPackageFamilyNameFromToken
-# @ stub GetPackageFullName
+@ stdcall GetPackageFullName(long ptr ptr) kernel32.GetPackageFullName
@ stub GetPackageFullNameFromToken
@ stub GetPackageId
@ stub GetPackageInfo
# @ stub GetPackageFullNameFromToken
# @ stub GetPackageId
# @ stub GetPackageInfo
--
2.11.0

View File

@@ -1,4 +1,4 @@
From 32d3c69ae680a7b6f71e203ca33f882eb0b69c47 Mon Sep 17 00:00:00 2001
From a469c846c5e2abc7a0a4c478b33aeaa83e53f6bb Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Fri, 15 Aug 2014 23:06:06 +0200
Subject: ntdll: Move logic to check for broken pipe into a separate function.
@@ -8,10 +8,10 @@ Subject: ntdll: Move logic to check for broken pipe into a separate function.
1 file changed, 39 insertions(+), 36 deletions(-)
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index a20c3e8..8de4b98 100644
index 41dd1ae877..03864b7239 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -411,6 +411,31 @@ NTSTATUS FILE_GetNtStatus(void)
@@ -490,6 +490,31 @@ NTSTATUS FILE_GetNtStatus(void)
}
}
@@ -43,9 +43,9 @@ index a20c3e8..8de4b98 100644
/* helper function for NtReadFile and FILE_AsyncReadService */
static NTSTATUS read_unix_fd(int fd, char *buf, ULONG *total, ULONG length,
enum server_fd_type type, BOOL avail_mode)
@@ -1557,44 +1582,22 @@ NTSTATUS WINAPI NtFsControlFile(HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc
if ((status = server_get_unix_fd( handle, FILE_READ_DATA, &fd, &needs_close, NULL, NULL )))
@@ -1719,44 +1744,22 @@ NTSTATUS WINAPI NtFsControlFile(HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc
break;
}
-#ifdef FIONREAD
- if (ioctl( fd, FIONREAD, &avail ) != 0)
@@ -103,5 +103,5 @@ index a20c3e8..8de4b98 100644
}
if (needs_close) close( fd );
--
2.1.3
2.11.0

View File

@@ -1,4 +1,4 @@
From a6015c0c962802b44e1bf918e454745f1cc377b8 Mon Sep 17 00:00:00 2001
From 104443cbb9a1087ec753af2462ccf41ba26eb444 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Mon, 4 Aug 2014 05:01:11 +0200
Subject: server: Use SOCK_SEQPACKET socket in combination with SO_PEEK_OFF to
@@ -27,16 +27,16 @@ Changes in v6:
* When running on an older kernel make sure that ntdll doesn't try to use message mode features.
---
dlls/kernel32/sync.c | 2 +-
dlls/kernel32/tests/pipe.c | 17 ++-----
dlls/ntdll/file.c | 106 ++++++++++++++++++++++++++++++++++------
server/named_pipe.c | 117 ++++++++++++++++++++++++++++++++++++---------
dlls/kernel32/tests/pipe.c | 17 ++------
dlls/ntdll/file.c | 106 ++++++++++++++++++++++++++++++++++++++-------
server/named_pipe.c | 103 ++++++++++++++++++++++++++++++++++++-------
server/sock.c | 4 +-
server/sock.h | 26 ++++++++++
6 files changed, 219 insertions(+), 53 deletions(-)
server/sock.h | 26 +++++++++++
6 files changed, 212 insertions(+), 46 deletions(-)
create mode 100644 server/sock.h
diff --git a/dlls/kernel32/sync.c b/dlls/kernel32/sync.c
index 494db9c1a31..38aaccfa55c 100644
index 494db9c1a3..38aaccfa55 100644
--- a/dlls/kernel32/sync.c
+++ b/dlls/kernel32/sync.c
@@ -1475,7 +1475,7 @@ BOOL WINAPI PeekNamedPipe( HANDLE hPipe, LPVOID lpvBuffer, DWORD cbBuffer,
@@ -49,7 +49,7 @@ index 494db9c1a31..38aaccfa55c 100644
}
else SetLastError( RtlNtStatusToDosError(status) );
diff --git a/dlls/kernel32/tests/pipe.c b/dlls/kernel32/tests/pipe.c
index e7cfce4c00e..71d75be90e8 100644
index e7cfce4c00..71d75be90e 100644
--- a/dlls/kernel32/tests/pipe.c
+++ b/dlls/kernel32/tests/pipe.c
@@ -294,7 +294,6 @@ static void test_CreateNamedPipe(int pipemode)
@@ -149,7 +149,7 @@ index e7cfce4c00e..71d75be90e8 100644
ret = RpcReadFile(hnp, ibuf + 8, sizeof(ibuf), &readden, NULL);
ok(ret, "RpcReadFile 10\n");
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index af582ecfdb0..42b81fb3fbb 100644
index 41d44c9af4..1b0eff02f2 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -96,6 +96,10 @@
@@ -329,7 +329,7 @@ index af582ecfdb0..42b81fb3fbb 100644
if (needs_close) close( fd );
}
diff --git a/server/named_pipe.c b/server/named_pipe.c
index c75a7379283..6c6a8b40bd1 100644
index b215816650..74a9a44dcf 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -42,6 +42,10 @@
@@ -351,7 +351,7 @@ index c75a7379283..6c6a8b40bd1 100644
#include "handle.h"
#include "thread.h"
#include "request.h"
@@ -761,14 +766,43 @@ static int named_pipe_link_name( struct object *obj, struct object_name *name, s
@@ -804,14 +809,43 @@ static int named_pipe_link_name( struct object *obj, struct object_name *name, s
return 1;
}
@@ -396,19 +396,26 @@ index c75a7379283..6c6a8b40bd1 100644
if (!(server = find_available_server( pipe )))
{
@@ -787,7 +821,10 @@ static struct object *named_pipe_open_file( struct object *obj, unsigned int acc
@@ -830,6 +864,9 @@ static struct object *named_pipe_open_file( struct object *obj, unsigned int acc
if ((client = create_pipe_client( options, pipe->flags )))
if ((client = create_pipe_client( options, pipe->flags, pipe->outsize )))
{
- if (!socketpair( PF_UNIX, SOCK_STREAM, 0, fds ))
+ type = ((pipe->flags & NAMED_PIPE_MESSAGE_STREAM_WRITE) && is_messagemode_supported()) ?
+ SOCK_SEQPACKET : SOCK_STREAM;
+
+ if (!socketpair( PF_UNIX, type, 0, fds ))
if (use_server_io( &server->pipe_end ))
{
client->pipe_end.fd = alloc_pseudo_fd( &pipe_client_fd_ops, &client->pipe_end.obj, options );
@@ -845,7 +882,7 @@ static struct object *named_pipe_open_file( struct object *obj, unsigned int acc
client = NULL;
}
}
- else if (!socketpair( PF_UNIX, SOCK_STREAM, 0, fds ))
+ else if (!socketpair( PF_UNIX, type, 0, fds ))
{
assert( !server->pipe_end.fd );
@@ -797,32 +834,55 @@ static struct object *named_pipe_open_file( struct object *obj, unsigned int acc
@@ -855,25 +892,48 @@ static struct object *named_pipe_open_file( struct object *obj, unsigned int acc
if (is_overlapped( options )) fcntl( fds[1], F_SETFL, O_NONBLOCK );
if (is_overlapped( server->options )) fcntl( fds[0], F_SETFL, O_NONBLOCK );
@@ -445,14 +452,7 @@ index c75a7379283..6c6a8b40bd1 100644
+ if (type != SOCK_SEQPACKET || (setsockopt( fds[0], SOL_SOCKET, SO_PEEK_OFF, &zero, sizeof(zero) ) != -1 &&
+ setsockopt( fds[1], SOL_SOCKET, SO_PEEK_OFF, &zero, sizeof(zero) ) != -1))
{
- allow_fd_caching( client->pipe_end.fd );
- allow_fd_caching( server->pipe_end.fd );
- fd_copy_completion( server->ioctl_fd, server->pipe_end.fd );
- if (server->state == ps_wait_open)
- fd_async_wake_up( server->ioctl_fd, ASYNC_TYPE_WAIT, STATUS_SUCCESS );
- set_server_state( server, ps_connected_server );
- server->client = client;
- client->server = server;
+ #ifdef __linux__
+ fcntl( fds[0], F_SETSIG, messagemode_flags( server->pipe_end.flags ) );
+ fcntl( fds[1], F_SETSIG, messagemode_flags( client->pipe_end.flags ) );
@@ -462,14 +462,7 @@ index c75a7379283..6c6a8b40bd1 100644
+ server->pipe_end.fd = create_anonymous_fd( &pipe_server_fd_ops, fds[0], &server->pipe_end.obj, server->options );
+ if (client->pipe_end.fd && server->pipe_end.fd)
+ {
+ allow_fd_caching( client->pipe_end.fd );
+ allow_fd_caching( server->pipe_end.fd );
+ fd_copy_completion( server->ioctl_fd, server->pipe_end.fd );
+ if (server->state == ps_wait_open)
+ fd_async_wake_up( server->ioctl_fd, ASYNC_TYPE_WAIT, STATUS_SUCCESS );
+ set_server_state( server, ps_connected_server );
+ server->client = client;
+ client->server = server;
+ }
+ else
+ {
@@ -483,7 +476,7 @@ index c75a7379283..6c6a8b40bd1 100644
release_object( client );
client = NULL;
}
@@ -907,7 +967,7 @@ DECL_HANDLER(create_named_pipe)
@@ -970,7 +1030,7 @@ DECL_HANDLER(create_named_pipe)
return;
}
@@ -492,7 +485,7 @@ index c75a7379283..6c6a8b40bd1 100644
if (!name.len) /* pipes need a root directory even without a name */
{
@@ -1010,6 +1070,9 @@ DECL_HANDLER(set_named_pipe_info)
@@ -1073,6 +1133,9 @@ DECL_HANDLER(set_named_pipe_info)
{
struct pipe_server *server;
struct pipe_client *client = NULL;
@@ -502,7 +495,7 @@ index c75a7379283..6c6a8b40bd1 100644
server = get_pipe_server_obj( current->process, req->handle, FILE_WRITE_ATTRIBUTES );
if (!server)
@@ -1036,10 +1099,20 @@ DECL_HANDLER(set_named_pipe_info)
@@ -1099,10 +1162,20 @@ DECL_HANDLER(set_named_pipe_info)
else if (client)
{
client->pipe_end.flags = server->pipe->flags | req->flags;
@@ -524,7 +517,7 @@ index c75a7379283..6c6a8b40bd1 100644
if (client)
diff --git a/server/sock.c b/server/sock.c
index d6b4fb2fa5c..49b6d3d5758 100644
index d6b4fb2fa5..49b6d3d575 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -61,6 +61,7 @@
@@ -554,7 +547,7 @@ index d6b4fb2fa5c..49b6d3d5758 100644
}
diff --git a/server/sock.h b/server/sock.h
new file mode 100644
index 00000000000..21551b42b1c
index 0000000000..21551b42b1
--- /dev/null
+++ b/server/sock.h
@@ -0,0 +1,26 @@

View File

@@ -1,4 +1,4 @@
From 260d35bbb99549c5ebf8447f6f1bf0680f6e3943 Mon Sep 17 00:00:00 2001
From bb9a6f2fb4431cb18e2a835808c02156bbd9d709 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Sat, 6 Jun 2015 01:21:05 +0200
Subject: server: Return correct error codes for NtWriteFile when pipes are
@@ -12,7 +12,7 @@ Subject: server: Return correct error codes for NtWriteFile when pipes are
4 files changed, 46 insertions(+), 3 deletions(-)
diff --git a/dlls/kernel32/tests/pipe.c b/dlls/kernel32/tests/pipe.c
index ba365ed666e..23f1a5f5f55 100644
index ba365ed666..23f1a5f5f5 100644
--- a/dlls/kernel32/tests/pipe.c
+++ b/dlls/kernel32/tests/pipe.c
@@ -1917,7 +1917,7 @@ static void test_CloseHandle(void)
@@ -25,7 +25,7 @@ index ba365ed666e..23f1a5f5f55 100644
CloseHandle(hfile);
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index ab34d99d5b6..d0662d9ae59 100644
index 98a699e48f..25f59761cf 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -1235,6 +1235,9 @@ static NTSTATUS write_unix_fd(int fd, const char *buf, ULONG *total, ULONG lengt
@@ -39,10 +39,19 @@ index ab34d99d5b6..d0662d9ae59 100644
}
}
diff --git a/server/named_pipe.c b/server/named_pipe.c
index 6c6a8b40bd1..47a88790fa3 100644
index d310740165..2775fcab51 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -150,6 +150,7 @@ static const struct object_ops named_pipe_ops =
@@ -129,6 +129,8 @@ struct named_pipe_device
struct namespace *pipes; /* named pipe namespace */
};
+static inline int messagemode_flags( int flags );
+
static void named_pipe_dump( struct object *obj, int verbose );
static unsigned int named_pipe_map_access( struct object *obj, unsigned int access );
static int named_pipe_link_name( struct object *obj, struct object_name *name, struct object *parent );
@@ -167,6 +169,7 @@ static void pipe_end_reselect_async( struct fd *fd, struct async_queue *queue );
/* server end functions */
static void pipe_server_dump( struct object *obj, int verbose );
static struct fd *pipe_server_get_fd( struct object *obj );
@@ -50,7 +59,7 @@ index 6c6a8b40bd1..47a88790fa3 100644
static void pipe_server_destroy( struct object *obj);
static obj_handle_t pipe_server_flush( struct fd *fd, struct async *async, int blocking );
static enum server_fd_type pipe_server_get_fd_type( struct fd *fd );
@@ -175,7 +176,7 @@ static const struct object_ops pipe_server_ops =
@@ -192,7 +195,7 @@ static const struct object_ops pipe_server_ops =
NULL, /* unlink_name */
no_open_file, /* open_file */
no_alloc_handle, /* alloc_handle */
@@ -59,15 +68,15 @@ index 6c6a8b40bd1..47a88790fa3 100644
pipe_server_destroy /* destroy */
};
@@ -196,6 +197,7 @@ static const struct fd_ops pipe_server_fd_ops =
@@ -213,6 +216,7 @@ static const struct fd_ops pipe_server_fd_ops =
static void pipe_client_dump( struct object *obj, int verbose );
static int pipe_client_signaled( struct object *obj, struct wait_queue_entry *entry );
static struct fd *pipe_client_get_fd( struct object *obj );
+static int pipe_client_close_handle( struct object *obj, struct process *process, obj_handle_t handle );
static void pipe_client_destroy( struct object *obj );
static obj_handle_t pipe_client_flush( struct fd *fd, struct async *async, int blocking );
static enum server_fd_type pipe_client_get_fd_type( struct fd *fd );
@@ -219,7 +221,7 @@ static const struct object_ops pipe_client_ops =
static obj_handle_t pipe_client_ioctl( struct fd *fd, ioctl_code_t code, struct async *async,
@@ -238,7 +242,7 @@ static const struct object_ops pipe_client_ops =
NULL, /* unlink_name */
no_open_file, /* open_file */
no_alloc_handle, /* alloc_handle */
@@ -76,17 +85,8 @@ index 6c6a8b40bd1..47a88790fa3 100644
pipe_client_destroy /* destroy */
};
@@ -284,6 +286,8 @@ static const struct fd_ops named_pipe_device_fd_ops =
default_fd_reselect_async /* reselect_async */
};
+static inline int messagemode_flags( int flags );
+
static void named_pipe_dump( struct object *obj, int verbose )
{
fputs( "Named pipe\n", stderr );
@@ -393,6 +397,23 @@ static void do_disconnect( struct pipe_server *server )
server->pipe_end.fd = NULL;
@@ -482,6 +486,23 @@ static void pipe_end_destroy( struct pipe_end *pipe_end )
free_async_queue( pipe_end->write_q );
}
+static int pipe_server_close_handle( struct object *obj, struct process *process, obj_handle_t handle )
@@ -109,7 +109,7 @@ index 6c6a8b40bd1..47a88790fa3 100644
static void pipe_server_destroy( struct object *obj)
{
struct pipe_server *server = (struct pipe_server *)obj;
@@ -419,6 +440,24 @@ static void pipe_server_destroy( struct object *obj)
@@ -511,6 +532,24 @@ static void pipe_server_destroy( struct object *obj)
release_object( server->pipe );
}
@@ -135,10 +135,10 @@ index 6c6a8b40bd1..47a88790fa3 100644
{
struct pipe_client *client = (struct pipe_client *)obj;
diff --git a/server/protocol.def b/server/protocol.def
index e7a55d7a2d8..f1e7af1d568 100644
index 341a6f6085..9769bb9e7b 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -2427,6 +2427,7 @@ enum message_type
@@ -2431,6 +2431,7 @@ enum message_type
#define NAMED_PIPE_MESSAGE_STREAM_WRITE 0x0001
#define NAMED_PIPE_MESSAGE_STREAM_READ 0x0002
#define NAMED_PIPE_NONBLOCKING_MODE 0x0004

View File

@@ -1,92 +1,39 @@
From 7fce25b8259f816e1cc8c2c40b6a73379f2fb4ef Mon Sep 17 00:00:00 2001
From 657d43d3027ea116d3348542eac23d1d915258f0 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Wed, 24 Feb 2016 15:45:09 +0100
Subject: server: Do not allow to queue async operation for broken pipes.
---
server/named_pipe.c | 34 ++++++++++++++++++++++++++++++++--
1 file changed, 32 insertions(+), 2 deletions(-)
server/named_pipe.c | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/server/named_pipe.c b/server/named_pipe.c
index 47a88790fa3..e5c5c4968c4 100644
index 2775fcab51..3542c91b4a 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -156,6 +156,7 @@ static obj_handle_t pipe_server_flush( struct fd *fd, struct async *async, int b
static enum server_fd_type pipe_server_get_fd_type( struct fd *fd );
static obj_handle_t pipe_server_ioctl( struct fd *fd, ioctl_code_t code, struct async *async,
int blocking );
+static void pipe_server_queue_async( struct fd *fd, struct async *async, int type, int count );
static const struct object_ops pipe_server_ops =
@@ -811,8 +811,20 @@ static obj_handle_t pipe_end_write( struct fd *fd, struct async *async, int bloc
static void pipe_end_queue_async( struct fd *fd, struct async *async, int type, int count )
{
@@ -189,7 +190,7 @@ static const struct fd_ops pipe_server_fd_ops =
no_fd_write, /* write */
pipe_server_flush, /* flush */
pipe_server_ioctl, /* ioctl */
- default_fd_queue_async, /* queue_async */
+ pipe_server_queue_async, /* queue_async */
default_fd_reselect_async /* reselect_async */
};
@@ -201,6 +202,7 @@ static int pipe_client_close_handle( struct object *obj, struct process *process
static void pipe_client_destroy( struct object *obj );
static obj_handle_t pipe_client_flush( struct fd *fd, struct async *async, int blocking );
static enum server_fd_type pipe_client_get_fd_type( struct fd *fd );
+static void pipe_client_queue_async( struct fd *fd, struct async *async, int type, int count );
static const struct object_ops pipe_client_ops =
{
@@ -234,7 +236,7 @@ static const struct fd_ops pipe_client_fd_ops =
no_fd_write, /* write */
pipe_client_flush, /* flush */
default_fd_ioctl, /* ioctl */
- default_fd_queue_async, /* queue_async */
+ pipe_client_queue_async, /* queue_async */
default_fd_reselect_async /* reselect_async */
};
@@ -630,6 +632,20 @@ static obj_handle_t pipe_client_flush( struct fd *fd, struct async *async, int b
return 0;
}
+static void pipe_client_queue_async( struct fd *fd, struct async *async, int type, int count )
+{
+ struct pipe_client *client = get_fd_user( fd );
+ struct pipe_server *server = client->server;
struct pipe_end *pipe_end = get_fd_user( fd );
- if (use_server_io( pipe_end )) no_fd_queue_async( fd, async, type, count );
- else default_fd_queue_async( fd, async, type, count );
+
+ if (!server || !server->pipe_end.fd)
+ if (use_server_io( pipe_end ))
+ {
+ no_fd_queue_async( fd, async, type, count );
+ return;
+ }
+
+ if (!pipe_end->connection)
+ {
+ set_error( STATUS_PIPE_BROKEN );
+ return;
+ }
+
+ default_fd_queue_async( fd, async, type, count );
+}
+
static inline int is_overlapped( unsigned int options )
{
return !(options & (FILE_SYNCHRONOUS_IO_ALERT | FILE_SYNCHRONOUS_IO_NONALERT));
@@ -714,6 +730,20 @@ static obj_handle_t pipe_server_ioctl( struct fd *fd, ioctl_code_t code, struct
}
}
+static void pipe_server_queue_async( struct fd *fd, struct async *async, int type, int count )
+{
+ struct pipe_server *server = get_fd_user( fd );
+ struct pipe_client *client = server->client;
+
+ if (!client || !client->pipe_end.fd)
+ {
+ set_error( STATUS_PIPE_BROKEN );
+ return;
+ }
+
+ default_fd_queue_async( fd, async, type, count );
+}
+
static struct pipe_server *get_pipe_server_obj( struct process *process,
obj_handle_t handle, unsigned int access )
{
static void pipe_end_reselect_async( struct fd *fd, struct async_queue *queue )
--
2.11.0

View File

@@ -3,3 +3,4 @@ Fixes: Improve ReadDataAvailable handling in FilePipeLocalInformation class
Fixes: Set NamedPipeState to FILE_PIPE_CLOSING_STATE on broken pipe in NtQueryInformationFile
FIxes: Return proper status codes when NtReadFile/NtWriteFile is called on closed (but not disconnected) pipe
Depends: server-Desktop_Refcount
Disabled: true

View File

@@ -1,4 +1,4 @@
From c4b5a58889e427b710e64566c2c90c4da8806cee Mon Sep 17 00:00:00 2001
From bb531528ac5096ece43d100dc11fcc39f744d498 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Sat, 4 Feb 2017 16:31:59 +0100
Subject: kernel32: Add stub for SetThreadIdealProcessorEx.
@@ -12,7 +12,7 @@ Subject: kernel32: Add stub for SetThreadIdealProcessorEx.
5 files changed, 37 insertions(+), 11 deletions(-)
diff --git a/dlls/api-ms-win-core-processthreads-l1-1-1/api-ms-win-core-processthreads-l1-1-1.spec b/dlls/api-ms-win-core-processthreads-l1-1-1/api-ms-win-core-processthreads-l1-1-1.spec
index 9d321af7240..04329650096 100644
index 9d321af724..0432965009 100644
--- a/dlls/api-ms-win-core-processthreads-l1-1-1/api-ms-win-core-processthreads-l1-1-1.spec
+++ b/dlls/api-ms-win-core-processthreads-l1-1-1/api-ms-win-core-processthreads-l1-1-1.spec
@@ -47,7 +47,7 @@
@@ -25,7 +25,7 @@ index 9d321af7240..04329650096 100644
@ stdcall SetThreadPriorityBoost(long long) kernel32.SetThreadPriorityBoost
@ stdcall SetThreadStackGuarantee(ptr) kernel32.SetThreadStackGuarantee
diff --git a/dlls/api-ms-win-core-processthreads-l1-1-2/api-ms-win-core-processthreads-l1-1-2.spec b/dlls/api-ms-win-core-processthreads-l1-1-2/api-ms-win-core-processthreads-l1-1-2.spec
index 0e30f18e52d..7a729a50040 100644
index 0e30f18e52..7a729a5004 100644
--- a/dlls/api-ms-win-core-processthreads-l1-1-2/api-ms-win-core-processthreads-l1-1-2.spec
+++ b/dlls/api-ms-win-core-processthreads-l1-1-2/api-ms-win-core-processthreads-l1-1-2.spec
@@ -53,7 +53,7 @@
@@ -38,10 +38,10 @@ index 0e30f18e52d..7a729a50040 100644
@ stdcall SetThreadPriority(long long) kernel32.SetThreadPriority
@ stdcall SetThreadPriorityBoost(long long) kernel32.SetThreadPriorityBoost
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index 8348621136f..75d9e229cc2 100644
index 62a91a03f1..f512cb4fd3 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -1476,7 +1476,7 @@
@@ -1448,7 +1448,7 @@
@ stdcall SetThreadExecutionState(long)
@ stdcall SetThreadGroupAffinity(long ptr ptr)
@ stdcall SetThreadIdealProcessor(long long)
@@ -51,7 +51,7 @@ index 8348621136f..75d9e229cc2 100644
@ stdcall SetThreadPreferredUILanguages(long ptr ptr)
@ stdcall SetThreadPriority(long long)
diff --git a/dlls/kernel32/thread.c b/dlls/kernel32/thread.c
index fd4f299acb7..bd699831bdb 100644
index c8dd94bbea..0a0b0e4bd6 100644
--- a/dlls/kernel32/thread.c
+++ b/dlls/kernel32/thread.c
@@ -462,6 +462,28 @@ DWORD_PTR WINAPI SetThreadAffinityMask( HANDLE hThread, DWORD_PTR dwThreadAffini
@@ -111,16 +111,16 @@ index fd4f299acb7..bd699831bdb 100644
/***********************************************************************
* GetThreadSelectorEntry (KERNEL32.@)
diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec
index bdfc067cf6d..db1dbeeb0e1 100644
index 9fba5803b2..17ef35cb59 100644
--- a/dlls/kernelbase/kernelbase.spec
+++ b/dlls/kernelbase/kernelbase.spec
@@ -1445,7 +1445,7 @@
@@ -1482,7 +1482,7 @@
@ stdcall SetThreadErrorMode(long ptr) kernel32.SetThreadErrorMode
@ stdcall SetThreadGroupAffinity(long ptr ptr) kernel32.SetThreadGroupAffinity
@ stdcall SetThreadIdealProcessor(long long) kernel32.SetThreadIdealProcessor
-@ stub SetThreadIdealProcessorEx
-# @ stub SetThreadIdealProcessorEx
+@ stdcall SetThreadIdealProcessorEx(long ptr ptr) kernel32.SetThreadIdealProcessorEx
@ stub SetThreadInformation
# @ stub SetThreadInformation
@ stdcall SetThreadLocale(long) kernel32.SetThreadLocale
@ stdcall SetThreadPreferredUILanguages(long ptr ptr) kernel32.SetThreadPreferredUILanguages
--

View File

@@ -0,0 +1,105 @@
From 6a640e583277b35e4dd1ba2edffb45c379e4fd7e Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Sun, 9 Apr 2017 01:58:49 +0200
Subject: ntdll/tests: Add more tests for
FileIoCompletionNotificationInformation.
---
dlls/ntdll/tests/pipe.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 74 insertions(+)
diff --git a/dlls/ntdll/tests/pipe.c b/dlls/ntdll/tests/pipe.c
index e242cb4c0f..fa0ca2da00 100644
--- a/dlls/ntdll/tests/pipe.c
+++ b/dlls/ntdll/tests/pipe.c
@@ -331,6 +331,77 @@ static void test_overlapped(void)
CloseHandle(hEvent);
}
+static void test_completion(void)
+{
+ static const char buf[] = "testdata";
+ FILE_IO_COMPLETION_NOTIFICATION_INFORMATION info;
+ HANDLE port, pipe, client;
+ IO_STATUS_BLOCK iosb;
+ OVERLAPPED ov, *pov;
+ IO_STATUS_BLOCK io;
+ NTSTATUS status;
+ DWORD num_bytes;
+ ULONG_PTR key;
+ DWORD dwret;
+ BOOL ret;
+
+ memset(&ov, 0, sizeof(ov));
+ ov.hEvent = CreateEventA(NULL, TRUE, FALSE, NULL);
+ ok(ov.hEvent != INVALID_HANDLE_VALUE, "CreateEvent failed, error %u\n", GetLastError());
+
+ status = create_pipe(&pipe, FILE_SHARE_READ | FILE_SHARE_WRITE, 0 /* OVERLAPPED */);
+ ok(!status, "NtCreateNamedPipeFile returned %x\n", status);
+ status = listen_pipe(pipe, ov.hEvent, &iosb, FALSE);
+ ok(status == STATUS_PENDING, "NtFsControlFile returned %x\n", status);
+
+ client = CreateFileW(testpipe, GENERIC_READ | GENERIC_WRITE, 0, 0,
+ OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
+ ok(client != INVALID_HANDLE_VALUE, "CreateFile failed, error %u\n", GetLastError());
+ dwret = WaitForSingleObject(ov.hEvent, 0);
+ ok(dwret == WAIT_OBJECT_0, "expected WAIT_OBJECT_0, got %u\n", dwret);
+
+ port = CreateIoCompletionPort(client, NULL, 0xdeadbeef, 0);
+ ok(port != NULL, "CreateIoCompletionPort failed, error %u\n", GetLastError());
+
+ ret = WriteFile(client, buf, sizeof(buf), &num_bytes, &ov);
+ ok(ret, "WriteFile failed, error %u\n", GetLastError());
+ ok(num_bytes == sizeof(buf), "expected sizeof(buf), got %u\n", num_bytes);
+
+ key = 0;
+ pov = NULL;
+ ret = GetQueuedCompletionStatus(port, &num_bytes, &key, &pov, 1000);
+ ok(ret, "GetQueuedCompletionStatus failed, error %u\n", GetLastError());
+ ok(key == 0xdeadbeef, "expected 0xdeadbeef, got %lx\n", key);
+ ok(pov == &ov, "expected %p, got %p\n", &ov, pov);
+
+ info.Flags = FILE_SKIP_COMPLETION_PORT_ON_SUCCESS;
+ status = pNtSetInformationFile(client, &io, &info, sizeof(info), FileIoCompletionNotificationInformation);
+ ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %08x\n", status);
+
+ info.Flags = 0;
+ status = pNtQueryInformationFile(client, &io, &info, sizeof(info), FileIoCompletionNotificationInformation);
+ todo_wine
+ ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %08x\n", status);
+ todo_wine
+ ok((info.Flags & FILE_SKIP_COMPLETION_PORT_ON_SUCCESS) != 0, "got %08x\n", info.Flags);
+
+ ret = WriteFile(client, buf, sizeof(buf), &num_bytes, &ov);
+ ok(ret, "WriteFile failed, error %u\n", GetLastError());
+ ok(num_bytes == sizeof(buf), "expected sizeof(buf), got %u\n", num_bytes);
+
+ pov = (void *)0xdeadbeef;
+ ret = GetQueuedCompletionStatus(port, &num_bytes, &key, &pov, 1000);
+ todo_wine
+ ok(!ret, "GetQueuedCompletionStatus succeeded\n");
+ todo_wine
+ ok(pov == NULL, "expected NULL, got %p\n", pov);
+
+ CloseHandle(ov.hEvent);
+ CloseHandle(client);
+ CloseHandle(pipe);
+ CloseHandle(port);
+}
+
static BOOL userapc_called;
static void CALLBACK userapc(ULONG_PTR dwParam)
{
@@ -1086,6 +1157,9 @@ START_TEST(pipe)
trace("starting overlapped tests\n");
test_overlapped();
+ trace("starting completion tests\n");
+ test_completion();
+
trace("starting FILE_PIPE_INFORMATION tests\n");
test_filepipeinfo();
--
2.11.0

View File

@@ -0,0 +1,42 @@
From 652431398236beda32c5d3239451dbc46fbf1937 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Sun, 9 Apr 2017 02:01:25 +0200
Subject: ntdll: Do not require unix fd for
FileIoCompletionNotificationInformation.
---
dlls/ntdll/file.c | 3 ++-
dlls/ntdll/tests/pipe.c | 2 --
2 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index 4e6051a42d..5e21ecc662 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -2440,7 +2440,8 @@ NTSTATUS WINAPI NtQueryInformationFile( HANDLE hFile, PIO_STATUS_BLOCK io,
if (len < info_sizes[class])
return io->u.Status = STATUS_INFO_LENGTH_MISMATCH;
- if (class != FilePipeInformation && class != FilePipeLocalInformation)
+ if (class != FilePipeInformation && class != FilePipeLocalInformation &&
+ class != FileIoCompletionNotificationInformation)
{
if ((io->u.Status = server_get_unix_fd( hFile, 0, &fd, &needs_close, NULL, NULL )))
{
diff --git a/dlls/ntdll/tests/pipe.c b/dlls/ntdll/tests/pipe.c
index fa0ca2da00..013eb2b39f 100644
--- a/dlls/ntdll/tests/pipe.c
+++ b/dlls/ntdll/tests/pipe.c
@@ -380,9 +380,7 @@ static void test_completion(void)
info.Flags = 0;
status = pNtQueryInformationFile(client, &io, &info, sizeof(info), FileIoCompletionNotificationInformation);
- todo_wine
ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %08x\n", status);
- todo_wine
ok((info.Flags & FILE_SKIP_COMPLETION_PORT_ON_SUCCESS) != 0, "got %08x\n", info.Flags);
ret = WriteFile(client, buf, sizeof(buf), &num_bytes, &ov);
--
2.11.0

View File

@@ -0,0 +1,121 @@
From 714b2b8a22566f7c6c0d92ed74bd9886062fb16e Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Sun, 9 Apr 2017 03:13:25 +0200
Subject: server: Skip async completion when possible.
---
dlls/ntdll/tests/pipe.c | 2 --
server/async.c | 12 +++++++++++-
server/fd.c | 4 ++++
server/file.h | 1 +
4 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/dlls/ntdll/tests/pipe.c b/dlls/ntdll/tests/pipe.c
index 013eb2b39f..631013c755 100644
--- a/dlls/ntdll/tests/pipe.c
+++ b/dlls/ntdll/tests/pipe.c
@@ -389,9 +389,7 @@ static void test_completion(void)
pov = (void *)0xdeadbeef;
ret = GetQueuedCompletionStatus(port, &num_bytes, &key, &pov, 1000);
- todo_wine
ok(!ret, "GetQueuedCompletionStatus succeeded\n");
- todo_wine
ok(pov == NULL, "expected NULL, got %p\n", pov);
CloseHandle(ov.hEvent);
diff --git a/server/async.c b/server/async.c
index e113681bb0..5a64565d5f 100644
--- a/server/async.c
+++ b/server/async.c
@@ -45,6 +45,7 @@ struct async
struct timeout_user *timeout;
unsigned int timeout_status; /* status to report upon timeout */
int signaled;
+ int skip_completion; /* skip completion */
struct event *event;
async_data_t data; /* data for async I/O call */
struct iosb *iosb; /* I/O status block */
@@ -165,6 +166,14 @@ static void async_queue_destroy( struct object *obj )
if (async_queue->completion) release_object( async_queue->completion );
}
+void async_skip_completion( struct async *async, int comp_flags )
+{
+ if (!async->data.callback) return;
+ if (!(comp_flags & COMPLETION_SKIP_ON_SUCCESS)) return;
+ async->skip_completion = (async->status == STATUS_SUCCESS ||
+ async->status == STATUS_ALERTED);
+}
+
/* notifies client thread of new status of its async request */
void async_terminate( struct async *async, unsigned int status )
{
@@ -263,6 +272,7 @@ struct async *create_async( struct thread *thread, const async_data_t *data, str
async->timeout = NULL;
async->queue = NULL;
async->signaled = 0;
+ async->skip_completion = 0;
if (iosb) async->iosb = (struct iosb *)grab_object( iosb );
else async->iosb = NULL;
@@ -328,7 +338,7 @@ void async_set_result( struct object *obj, unsigned int status, apc_param_t tota
async->status = status;
if (status == STATUS_MORE_PROCESSING_REQUIRED) return; /* don't report the completion */
- if (async->queue && async->data.cvalue)
+ if (async->queue && async->data.cvalue && !async->skip_completion)
add_async_completion( async->queue, async->data.cvalue, status, total );
if (apc)
{
diff --git a/server/fd.c b/server/fd.c
index 9617fa1279..e0c2ee4f26 100644
--- a/server/fd.c
+++ b/server/fd.c
@@ -2381,6 +2381,7 @@ DECL_HANDLER(flush)
if (async)
{
reply->event = fd->fd_ops->flush( fd, async, req->blocking );
+ async_skip_completion( async, fd->comp_flags );
release_object( async );
}
release_object( fd );
@@ -2461,6 +2462,7 @@ DECL_HANDLER(read)
{
reply->wait = fd->fd_ops->read( fd, async, req->blocking, req->pos );
reply->options = fd->options;
+ async_skip_completion( async, fd->comp_flags );
release_object( async );
}
release_object( iosb );
@@ -2484,6 +2486,7 @@ DECL_HANDLER(write)
{
reply->wait = fd->fd_ops->write( fd, async, req->blocking, req->pos );
reply->options = fd->options;
+ async_skip_completion( async, fd->comp_flags );
release_object( async );
}
release_object( iosb );
@@ -2507,6 +2510,7 @@ DECL_HANDLER(ioctl)
{
reply->wait = fd->fd_ops->ioctl( fd, req->code, async, req->blocking );
reply->options = fd->options;
+ async_skip_completion( async, fd->comp_flags );
release_object( async );
}
release_object( iosb );
diff --git a/server/file.h b/server/file.h
index 398733c460..19bc3cbfe4 100644
--- a/server/file.h
+++ b/server/file.h
@@ -182,6 +182,7 @@ extern void async_set_result( struct object *obj, unsigned int status,
apc_param_t total, client_ptr_t apc, client_ptr_t apc_arg );
extern int async_queued( struct async_queue *queue );
extern int async_waiting( struct async_queue *queue );
+extern void async_skip_completion( struct async *async, int comp_flags );
extern void async_terminate( struct async *async, unsigned int status );
extern void async_wake_up( struct async_queue *queue, unsigned int status );
extern struct completion *fd_get_completion( struct fd *fd, apc_param_t *p_key );
--
2.11.0

Some files were not shown because too many files have changed in this diff Show More