Compare commits

..

40 Commits

Author SHA1 Message Date
Alistair Leslie-Hughes
23960d9862 Release v5.0-rc5 2020-01-12 08:48:00 +11:00
Alistair Leslie-Hughes
bca3c546d2 Added dsound-SRW patchset 2020-01-11 17:30:43 +11:00
Alistair Leslie-Hughes
1e3eb08c69 Added dinput-DIPROP_BUFFERSIZE patchset 2020-01-11 17:07:24 +11:00
Alistair Leslie-Hughes
bd8f35fad1 Rebase against 4f0212c4fd35ac4b03a082cab27e629130ac1b13 2020-01-10 10:35:41 +11:00
Alistair Leslie-Hughes
ccd0bc4ccd Updated user32-rawinput-nolegacy patchset
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48433
2020-01-10 08:45:05 +11:00
Paul Gofman
89af635b94 Updated ntdll-ForceBottomUpAlloc patchset
Fixes hang on start in Far Cry 5.
2020-01-09 15:49:08 +03:00
Alistair Leslie-Hughes
f05f084d9a Rebase against 21003538619cb22bf35d7cf68ee0ef13ff658424 2020-01-09 10:21:50 +11:00
Alistair Leslie-Hughes
93a708bf2b Rebase against 6b839a0f85236aac2cc794d5d586f1ba371866b1 2020-01-08 11:08:54 +11:00
Alistair Leslie-Hughes
b9f34bbbc3 Update Copyright year 2020-01-07 12:25:46 +11:00
Alistair Leslie-Hughes
8be2c25e19 Dropped gdiplus-DC_Handling patchset
This patchset has been disabled for 2 years and the bug it referenced is marked as fixed.
2020-01-07 10:25:10 +11:00
Alistair Leslie-Hughes
7059b2e1ec Updated activeds-ADsOpenObject patchset 2020-01-07 08:30:38 +11:00
Alistair Leslie-Hughes
7044b0dc98 Updated dxva2-Video_Decoder patchset
Thanks Gabriel Ivăncescu.
2020-01-07 08:24:24 +11:00
Alistair Leslie-Hughes
a1bf11e38a Release v5.0-rc4 2020-01-04 10:38:31 +11:00
Alistair Leslie-Hughes
703c84ce70 Added comctl32-version_6 2020-01-03 18:23:08 +11:00
Alistair Leslie-Hughes
b79e576574 Updated winepulse-PulseAudio_Support patchset 2020-01-03 18:23:08 +11:00
Zebediah Figura
db1f94bae4 libs-Unicode_Collation: Patch dlls/kernelbase/collation.c too. 2019-12-31 19:18:22 -06:00
Alistair Leslie-Hughes
0f52b315d6 Disable ntoskrnl-safedisc-2 patchset
https://bugs.winehq.org/show_bug.cgi?id=48341
https://bugs.winehq.org/show_bug.cgi?id=48379
2019-12-31 09:09:18 +11:00
Paul Gofman
ce3fc5723d Added ntdll-User_shared_data_fields patchset 2019-12-30 14:31:01 +03:00
Paul Gofman
595f2f9860 Added ntdll-Syscall_Emulation patchset 2019-12-30 13:46:05 +03:00
Alistair Leslie-Hughes
c01051f313 Updated ntdll-ThreadHideFromDebugger patchset 2019-12-30 11:18:46 +11:00
Alistair Leslie-Hughes
d163510e1e Release v5.0-rc3 2019-12-28 18:27:35 +11:00
Alistair Leslie-Hughes
c675804204 Rebase against fa97cbdf14883fb301dcc0a5264369f8ed184182 2019-12-28 09:32:05 +11:00
Zebediah Figura
d729a7b132 Update some documentation. 2019-12-23 22:29:13 -06:00
Alistair Leslie-Hughes
2782e6db1e Updated user32-rawinput-mouse-experimental patchset 2019-12-24 08:50:21 +11:00
Alistair Leslie-Hughes
a08376bca0 Correct commit id 2019-12-24 07:58:24 +11:00
Zebediah Figura
3371e62824 gdiplus-GdipCreateBitmapFromHBITMAP: Add reference to a bug report. 2019-12-23 09:52:45 -06:00
Alistair Leslie-Hughes
8218a78955 Updated rawinput patchsets
This is a completely updated rawinput patchsets from Rémi Bernon,
replacing the current user32-rawinput.
2019-12-23 21:47:16 +11:00
Alistair Leslie-Hughes
a8cb853708 Added gdiplus-GdipCreateBitmapFromHBITMAP patchset 2019-12-23 18:07:23 +11:00
Alistair Leslie-Hughes
6cbb6dc117 Updated directmanipulation-new-dll patchset 2019-12-22 20:59:58 +11:00
Alistair Leslie-Hughes
34302e77dd Release v5.0-rc2 2019-12-21 14:31:48 +11:00
Alistair Leslie-Hughes
ae0343f628 Rebase against 6dd84c53b55ecfa2e2735a914cb126fa0c4b23a5 2019-12-21 14:28:42 +11:00
Alistair Leslie-Hughes
5905340060 Updated dmime-PChannel-range patchset 2019-12-20 10:21:04 +11:00
Paul Gofman
c8e3795e69 Updated ntoskrnl-safedisc-2 patchset
Fix kernel32 pipe tests and crash in GTAV launcher.
2019-12-19 12:40:41 +03:00
Alistair Leslie-Hughes
108662b1cc Rebase against fa66c1b3011a32036b42c436320212aa3b30ae3f 2019-12-19 09:45:39 +11:00
Paul Gofman
088d7f9ddf Added include-LdrData patchset 2019-12-18 13:23:52 +03:00
Alistair Leslie-Hughes
b788fe9549 Rebase against 238c6be5b81cbfcf8cd147b1cbb25d16803efbe1 2019-12-18 09:13:09 +11:00
Alistair Leslie-Hughes
b8b836e43d Added activeds-ADsOpenObject patchset 2019-12-17 19:08:25 +11:00
Alistair Leslie-Hughes
d44f4885f2 Added user32-window-activation patchset 2019-12-17 11:31:16 +11:00
Alistair Leslie-Hughes
73caf7ace2 Added ntoskrnl-safedisc-2 patchset 2019-12-17 11:12:41 +11:00
Paul Gofman
d36d63ac84 Updated winebuild-Fake_Dlls patchset.
Fix stack alignment in x64 syscall thunks, again.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48274
2019-12-16 16:45:05 +03:00
113 changed files with 8299 additions and 2312 deletions

View File

@@ -1,30 +0,0 @@
Contributing to Wine Staging
----------------------------
First of all, thank you for taking the time to contribute to this project.
### Reporting bugs
Since WineConf 2015 Wine Staging is an official part of WineHQ, which means you
can report problems directly at [bugs.winehq.org](https://bugs.winehq.org/).
Most of the time bugs found in Wine Staging also turn out to be present in the
development branch, so its recommended to open your bug in the "Wine" product,
unless you are sure its really "Wine Staging" specific. For bugs related to our
binary packages, please open a bug report in the "Packaging" product.
### Submitting patches
**IMPORTANT:** Please use [dev.wine-staging.com](https://dev.wine-staging.com/patches)
for patch submissions, we currently do not accept Pull requests on GitHub.
Wine Staging mainly concentrates on experimental features and patches which are
difficult to get into the development branch. If you have a very simple bug fix
including tests, there is usually no need to send it to Wine Staging. You can
directly contribute it to the
[development branch](http://wiki.winehq.org/SubmittingPatches). However, if you
already tried that without success, or are working on such a complex area that
you do not really think its ready for inclusion, you might want to submit it to
our Staging tree. Please open a patch submission request on
[dev.wine-staging.com](https://dev.wine-staging.com/patches) including the patch.
More information is also available in our
[Wiki](https://wiki.winehq.org/Wine-Staging_Patches).

View File

@@ -8,7 +8,8 @@ are part of **Wine Staging** and are licensed under the terms of the
```
Copyright (C) 2014-2017 the Wine Staging project authors.
Copyright (C) 2018 Alistair Leslie-Hughes
Copyright (C) 2018 Alistair Leslie-Hughes, Zebediah Figura
Copyright (C) 2019-2020 Alistair Leslie-Hughes, Zebediah Figura, Paul Gofman
Wine Staging is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public

View File

@@ -6,15 +6,14 @@ features, which have not been integrated into the development branch yet. The
idea of Wine Staging is to provide experimental features faster to end users and
to give developers the possibility to discuss and improve their patches before
they are integrated into the main branch. More information about Wine Staging
can also be found on our website [wine-staging.com](http://wine-staging.com).
can also be found [on the WineHQ wiki](https://wiki.winehq.org/Wine-Staging).
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://wine-staging.com/installation.html)
for your operating system.
distributions and for Mac OS X. Just follow the [installation
instructions](https://wiki.winehq.org/Download) for your operating system.
On most distributions the `wine-staging` package is installed to
`/opt/wine-staging`, such that multiple Wine versions can be installed in
@@ -78,5 +77,6 @@ in our [Wiki](https://wiki.winehq.org/Wine-Staging).
Contributing
------------
Please see CONTRIBUTING.md for more information about contributing to Wine
Staging.
For information on contributing to Wine-Staging, please see
<https://wiki.winehq.org/Wine-Staging_Contributing>. Note that GitHub pull
requests are strongly dispreferred, especially for patches.

View File

@@ -0,0 +1,83 @@
From e5500b9a3c7d36563725dc7975c2436a02165906 Mon Sep 17 00:00:00 2001
From: Dmitry Timoshkov <dmitry@baikal.ru>
Date: Fri, 15 Nov 2019 15:46:23 +0800
Subject: [PATCH] include: Add adserr.h.
Signed-off-by: Dmitry Timoshkov <dmitry@baikal.ru>
---
include/Makefile.in | 1 +
include/adserr.h | 50 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 51 insertions(+)
create mode 100644 include/adserr.h
diff --git a/include/Makefile.in b/include/Makefile.in
index cbad4d604f..2e0a10d650 100644
--- a/include/Makefile.in
+++ b/include/Makefile.in
@@ -7,6 +7,7 @@ SOURCES = \
activaut.idl \
activdbg.idl \
activscp.idl \
+ adserr.h \
adshlp.h \
advpub.h \
af_irda.h \
diff --git a/include/adserr.h b/include/adserr.h
new file mode 100644
index 0000000000..83da568763
--- /dev/null
+++ b/include/adserr.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2019 Dmitry Timoshkov
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef __ADSERR_H
+#define __ADSERR_H
+
+#ifdef RC_INVOKED
+#define _HRESULT_TYPEDEF_(x) (x)
+#else
+#define _HRESULT_TYPEDEF_(x) ((HRESULT)x)
+#endif
+
+#define E_ADS_BAD_PATHNAME _HRESULT_TYPEDEF_(0x80005000)
+#define E_ADS_INVALID_DOMAIN_OBJECT _HRESULT_TYPEDEF_(0x80005001)
+#define E_ADS_INVALID_USER_OBJECT _HRESULT_TYPEDEF_(0x80005002)
+#define E_ADS_INVALID_COMPUTER_OBJECT _HRESULT_TYPEDEF_(0x80005003)
+#define E_ADS_UNKNOWN_OBJECT _HRESULT_TYPEDEF_(0x80005004)
+#define E_ADS_PROPERTY_NOT_SET _HRESULT_TYPEDEF_(0x80005005)
+#define E_ADS_PROPERTY_NOT_SUPPORTED _HRESULT_TYPEDEF_(0x80005006)
+#define E_ADS_PROPERTY_INVALID _HRESULT_TYPEDEF_(0x80005007)
+#define E_ADS_BAD_PARAMETER _HRESULT_TYPEDEF_(0x80005008)
+#define E_ADS_OBJECT_UNBOUND _HRESULT_TYPEDEF_(0x80005009)
+#define E_ADS_PROPERTY_NOT_MODIFIED _HRESULT_TYPEDEF_(0x8000500A)
+#define E_ADS_PROPERTY_MODIFIED _HRESULT_TYPEDEF_(0x8000500B)
+#define E_ADS_CANT_CONVERT_DATATYPE _HRESULT_TYPEDEF_(0x8000500C)
+#define E_ADS_PROPERTY_NOT_FOUND _HRESULT_TYPEDEF_(0x8000500D)
+#define E_ADS_OBJECT_EXISTS _HRESULT_TYPEDEF_(0x8000500E)
+#define E_ADS_SCHEMA_VIOLATION _HRESULT_TYPEDEF_(0x8000500F)
+#define E_ADS_COLUMN_NOT_SET _HRESULT_TYPEDEF_(0x80005010)
+#define S_ADS_ERRORSOCCURRED _HRESULT_TYPEDEF_(0x00005011)
+#define S_ADS_NOMORE_ROWS _HRESULT_TYPEDEF_(0x00005012)
+#define S_ADS_NOMORE_COLUMNS _HRESULT_TYPEDEF_(0x00005013)
+#define E_ADS_INVALID_FILTER _HRESULT_TYPEDEF_(0x80005014)
+
+#endif /* __ADSERR_H */
--
2.17.1

View File

@@ -0,0 +1,161 @@
From c12e335b0df736fe2a2f2447d0d751de7cc21d37 Mon Sep 17 00:00:00 2001
From: Dmitry Timoshkov <dmitry@baikal.ru>
Date: Fri, 15 Nov 2019 17:37:11 +0800
Subject: [PATCH 2/5] activeds: Implement ADsOpenObject.
Content-Type: text/plain; charset=UTF-8
To: wine-devel@winehq.org
Signed-off-by: Dmitry Timoshkov <dmitry@baikal.ru>
---
dlls/activeds/Makefile.in | 1 +
dlls/activeds/activeds_main.c | 80 +++++++++++++++++++++++++++++++++--
include/iads.idl | 14 ++++++
3 files changed, 91 insertions(+), 4 deletions(-)
diff --git a/dlls/activeds/Makefile.in b/dlls/activeds/Makefile.in
index 20578a93bc..54f86d661e 100644
--- a/dlls/activeds/Makefile.in
+++ b/dlls/activeds/Makefile.in
@@ -1,5 +1,6 @@
MODULE = activeds.dll
IMPORTLIB = activeds
+IMPORTS = advapi32 ole32 oleaut32
EXTRADLLFLAGS = -mno-cygwin
diff --git a/dlls/activeds/activeds_main.c b/dlls/activeds/activeds_main.c
index 69c5c447dc..8ff587e332 100644
--- a/dlls/activeds/activeds_main.c
+++ b/dlls/activeds/activeds_main.c
@@ -2,6 +2,7 @@
* Implementation of the Active Directory Service Interface
*
* Copyright 2005 Detlef Riekenberg
+ * Copyright 2019 Dmitry Timoshkov
*
* This file contains only stubs to get the printui.dll up and running
* activeds.dll is much much more than this
@@ -30,8 +31,10 @@
#include "winuser.h"
#include "objbase.h"
+#include "initguid.h"
#include "iads.h"
#include "adshlp.h"
+#include "adserr.h"
#include "wine/debug.h"
@@ -112,11 +115,80 @@ HRESULT WINAPI ADsBuildVarArrayInt(LPDWORD lpdwObjectTypes, DWORD dwObjectTypes,
/*****************************************************
* ADsOpenObject [ACTIVEDS.9]
*/
-HRESULT WINAPI ADsOpenObject(LPCWSTR lpszPathName, LPCWSTR lpszUserName, LPCWSTR lpszPassword, DWORD dwReserved, REFIID riid, VOID** ppObject)
+HRESULT WINAPI ADsOpenObject(LPCWSTR path, LPCWSTR user, LPCWSTR password, DWORD reserved, REFIID riid, void **obj)
{
- FIXME("(%s,%s,%u,%s,%p)!stub\n", debugstr_w(lpszPathName),
- debugstr_w(lpszUserName), dwReserved, debugstr_guid(riid), ppObject);
- return E_NOTIMPL;
+ HRESULT hr;
+ HKEY hkey, hprov;
+ WCHAR provider[MAX_PATH], progid[MAX_PATH];
+ DWORD idx = 0;
+
+ TRACE("(%s,%s,%u,%s,%p)\n", debugstr_w(path), debugstr_w(user), reserved, debugstr_guid(riid), obj);
+
+ if (!path || !riid || !obj)
+ return E_INVALIDARG;
+
+ if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\ADs\\Providers", 0, KEY_READ, &hkey))
+ return E_ADS_BAD_PATHNAME;
+
+ hr = E_ADS_BAD_PATHNAME;
+
+ for (;;)
+ {
+ if (RegEnumKeyW(hkey, idx++, provider, ARRAY_SIZE(provider)))
+ break;
+
+ TRACE("provider %s\n", debugstr_w(provider));
+
+ if (!wcsnicmp(path, provider, wcslen(provider)) && path[wcslen(provider)] == ':')
+ {
+ LONG size;
+
+ if (RegOpenKeyExW(hkey, provider, 0, KEY_READ, &hprov))
+ break;
+
+ size = ARRAY_SIZE(progid);
+ if (!RegQueryValueW(hprov, NULL, progid, &size))
+ {
+ CLSID clsid;
+
+ if (CLSIDFromProgID(progid, &clsid) == S_OK)
+ {
+ IADsOpenDSObject *adsopen;
+ IDispatch *disp;
+
+ TRACE("ns %s => clsid %s\n", debugstr_w(progid), wine_dbgstr_guid(&clsid));
+ if (CoCreateInstance(&clsid, 0, CLSCTX_INPROC_SERVER, &IID_IADsOpenDSObject, (void **)&adsopen) == S_OK)
+ {
+ BSTR bpath, buser, bpassword;
+
+ bpath = SysAllocString(path);
+ buser = SysAllocString(user);
+ bpassword = SysAllocString(password);
+
+ hr = IADsOpenDSObject_OpenDSObject(adsopen, bpath, buser, bpassword, reserved, &disp);
+ if (hr == S_OK)
+ {
+ hr = IDispatch_QueryInterface(disp, riid, obj);
+ IDispatch_Release(disp);
+ }
+
+ SysFreeString(bpath);
+ SysFreeString(buser);
+ SysFreeString(bpassword);
+
+ IADsOpenDSObject_Release(adsopen);
+ }
+ }
+ }
+
+ RegCloseKey(hprov);
+ break;
+ }
+ }
+
+ RegCloseKey(hkey);
+
+ return hr;
}
/*****************************************************
diff --git a/include/iads.idl b/include/iads.idl
index 6931b6f734..add52571c7 100644
--- a/include/iads.idl
+++ b/include/iads.idl
@@ -794,6 +794,20 @@ interface IDirectorySearch : IUnknown
HRESULT CloseSearchHandle([in] ADS_SEARCH_HANDLE hSearchResult);
}
+/*****************************************************************************
+ * IID_IADsOpenDSObject interface
+ */
+[
+ odl,
+ uuid(ddf2891e-0f9c-11d0-8ad4-00c04fd8d503),
+ dual,
+ oleautomation
+]
+interface IADsOpenDSObject : IDispatch
+{
+ HRESULT OpenDSObject([in] BSTR path, [in] BSTR user, [in] BSTR password, [in] long reserved, [out,retval] IDispatch **obj);
+}
+
/*****************************************************************************
* IADsADSystemInfo interface
*/
--
2.20.1

View File

@@ -0,0 +1,483 @@
From ba1eb1310db57db3820a3886e374afc507c2b507 Mon Sep 17 00:00:00 2001
From: Dmitry Timoshkov <dmitry@baikal.ru>
Date: Tue, 19 Nov 2019 11:34:13 +0800
Subject: [PATCH 3/5] adsldp: Add LDAPNamespace stubs.
Content-Type: text/plain; charset=UTF-8
To: wine-devel@winehq.org
Signed-off-by: Dmitry Timoshkov <dmitry@baikal.ru>
---
dlls/adsldp/Makefile.in | 5 +-
dlls/adsldp/adsldp.c | 295 ++++++++++++++++++++++++++++++++++++----
dlls/adsldp/adsldp.idl | 9 ++
dlls/adsldp/adsldp.rgs | 16 +++
dlls/adsldp/rsrc.rc | 20 +++
5 files changed, 319 insertions(+), 26 deletions(-)
create mode 100644 dlls/adsldp/adsldp.rgs
create mode 100644 dlls/adsldp/rsrc.rc
diff --git a/dlls/adsldp/Makefile.in b/dlls/adsldp/Makefile.in
index 4dce14fd0d..7bf07fce2c 100644
--- a/dlls/adsldp/Makefile.in
+++ b/dlls/adsldp/Makefile.in
@@ -1,10 +1,13 @@
MODULE = adsldp.dll
-IMPORTS = oleaut32 secur32
+IMPORTS = oleaut32 secur32 rpcrt4
EXTRADLLFLAGS = -mno-cygwin
+dlldata_EXTRADEFS = -DENTRY_PREFIX=ADSLDP_
C_SRCS = \
adsldp.c
IDL_SRCS = \
adsldp.idl
+
+RC_SRCS = rsrc.rc
diff --git a/dlls/adsldp/adsldp.c b/dlls/adsldp/adsldp.c
index 4fc0de41eb..ef62aad279 100644
--- a/dlls/adsldp/adsldp.c
+++ b/dlls/adsldp/adsldp.c
@@ -31,10 +31,15 @@
#define SECURITY_WIN32
#include "security.h"
+#include "wine/heap.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(adsldp);
+DEFINE_GUID(CLSID_LDAPNamespace,0x228d9a82,0xc302,0x11cf,0x9a,0xa4,0x00,0xaa,0x00,0x4a,0x56,0x91);
+
+extern HRESULT WINAPI ADSLDP_DllGetClassObject(REFCLSID,REFIID,void **) DECLSPEC_HIDDEN;
+
static HMODULE adsldp_hinst;
typedef struct
@@ -235,31 +240,239 @@ static const IADsADSystemInfoVtbl IADsADSystemInfo_vtbl =
sysinfo_GetTrees
};
-static HRESULT ADSystemInfo_create(void **obj)
+static HRESULT ADSystemInfo_create(REFIID riid, void **obj)
{
AD_sysinfo *sysinfo;
+ HRESULT hr;
sysinfo = HeapAlloc(GetProcessHeap(), 0, sizeof(*sysinfo));
if (!sysinfo) return E_OUTOFMEMORY;
sysinfo->IADsADSystemInfo_iface.lpVtbl = &IADsADSystemInfo_vtbl;
sysinfo->ref = 1;
- *obj = &sysinfo->IADsADSystemInfo_iface;
- TRACE("created %p\n", *obj);
+ hr = IADsADSystemInfo_QueryInterface(&sysinfo->IADsADSystemInfo_iface, riid, obj);
+ IADsADSystemInfo_Release(&sysinfo->IADsADSystemInfo_iface);
- return S_OK;
+ return hr;
}
+typedef struct
+{
+ IADs IADs_iface;
+ LONG ref;
+} LDAP_namespace;
+
+static inline LDAP_namespace *impl_from_IADs(IADs *iface)
+{
+ return CONTAINING_RECORD(iface, LDAP_namespace, IADs_iface);
+}
+
+static HRESULT WINAPI ldapns_QueryInterface(IADs *iface, REFIID riid, void **obj)
+{
+ TRACE("%p,%s,%p\n", iface, debugstr_guid(riid), obj);
+
+ if (!riid || !obj) return E_INVALIDARG;
+
+ if (IsEqualGUID(riid, &IID_IUnknown) ||
+ IsEqualGUID(riid, &IID_IDispatch) ||
+ IsEqualGUID(riid, &IID_IADs))
+ {
+ IADs_AddRef(iface);
+ *obj = iface;
+ return S_OK;
+ }
+
+ FIXME("interface %s is not implemented\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI ldapns_AddRef(IADs *iface)
+{
+ LDAP_namespace *ldap = impl_from_IADs(iface);
+ return InterlockedIncrement(&ldap->ref);
+}
+
+static ULONG WINAPI ldapns_Release(IADs *iface)
+{
+ LDAP_namespace *ldap = impl_from_IADs(iface);
+ LONG ref = InterlockedDecrement(&ldap->ref);
+
+ if (!ref)
+ {
+ TRACE("destroying %p\n", iface);
+ HeapFree(GetProcessHeap(), 0, ldap);
+ }
+
+ return ref;
+}
+
+static HRESULT WINAPI ldapns_GetTypeInfoCount(IADs *iface, UINT *count)
+{
+ FIXME("%p,%p: stub\n", iface, count);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ldapns_GetTypeInfo(IADs *iface, UINT index, LCID lcid, ITypeInfo **info)
+{
+ FIXME("%p,%u,%#x,%p: stub\n", iface, index, lcid, info);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ldapns_GetIDsOfNames(IADs *iface, REFIID riid, LPOLESTR *names,
+ UINT count, LCID lcid, DISPID *dispid)
+{
+ FIXME("%p,%s,%p,%u,%u,%p: stub\n", iface, debugstr_guid(riid), names, count, lcid, dispid);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ldapns_Invoke(IADs *iface, DISPID dispid, REFIID riid, LCID lcid, WORD flags,
+ DISPPARAMS *params, VARIANT *result, EXCEPINFO *excepinfo, UINT *argerr)
+{
+ FIXME("%p,%d,%s,%04x,%04x,%p,%p,%p,%p: stub\n", iface, dispid, debugstr_guid(riid), lcid, flags,
+ params, result, excepinfo, argerr);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ldapns_get_Name(IADs *iface, BSTR *retval)
+{
+ FIXME("%p,%p: stub\n", iface, retval);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ldapns_get_Class(IADs *iface, BSTR *retval)
+{
+ FIXME("%p,%p: stub\n", iface, retval);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ldapns_get_GUID(IADs *iface, BSTR *retval)
+{
+ FIXME("%p,%p: stub\n", iface, retval);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ldapns_get_ADsPath(IADs *iface, BSTR *retval)
+{
+ FIXME("%p,%p: stub\n", iface, retval);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ldapns_get_Parent(IADs *iface, BSTR *retval)
+{
+ FIXME("%p,%p: stub\n", iface, retval);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ldapns_get_Schema(IADs *iface, BSTR *retval)
+{
+ FIXME("%p,%p: stub\n", iface, retval);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ldapns_GetInfo(IADs *iface)
+{
+ FIXME("%p: stub\n", iface);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ldapns_SetInfo(IADs *iface)
+{
+ FIXME("%p: stub\n", iface);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ldapns_Get(IADs *iface, BSTR name, VARIANT *prop)
+{
+ FIXME("%p,%s,%p: stub\n", iface, debugstr_w(name), prop);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ldapns_Put(IADs *iface, BSTR name, VARIANT prop)
+{
+ FIXME("%p,%s,%s: stub\n", iface, debugstr_w(name), wine_dbgstr_variant(&prop));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ldapns_GetEx(IADs *iface, BSTR name, VARIANT *prop)
+{
+ FIXME("%p,%s,%p: stub\n", iface, debugstr_w(name), prop);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ldapns_PutEx(IADs *iface, LONG code, BSTR name, VARIANT prop)
+{
+ FIXME("%p,%d,%s,%s: stub\n", iface, code, debugstr_w(name), wine_dbgstr_variant(&prop));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ldapns_GetInfoEx(IADs *iface, VARIANT prop, LONG reserved)
+{
+ FIXME("%p,%s,%d: stub\n", iface, wine_dbgstr_variant(&prop), reserved);
+ return E_NOTIMPL;
+}
+
+static const IADsVtbl IADs_vtbl =
+{
+ ldapns_QueryInterface,
+ ldapns_AddRef,
+ ldapns_Release,
+ ldapns_GetTypeInfoCount,
+ ldapns_GetTypeInfo,
+ ldapns_GetIDsOfNames,
+ ldapns_Invoke,
+ ldapns_get_Name,
+ ldapns_get_Class,
+ ldapns_get_GUID,
+ ldapns_get_ADsPath,
+ ldapns_get_Parent,
+ ldapns_get_Schema,
+ ldapns_GetInfo,
+ ldapns_SetInfo,
+ ldapns_Get,
+ ldapns_Put,
+ ldapns_GetEx,
+ ldapns_PutEx,
+ ldapns_GetInfoEx
+};
+
+static HRESULT LDAPNamespace_create(REFIID riid, void **obj)
+{
+ LDAP_namespace *ldap;
+ HRESULT hr;
+
+ ldap = heap_alloc(sizeof(*ldap));
+ if (!ldap) return E_OUTOFMEMORY;
+
+ ldap->IADs_iface.lpVtbl = &IADs_vtbl;
+ ldap->ref = 1;
+
+ hr = IADs_QueryInterface(&ldap->IADs_iface, riid, obj);
+ IADs_Release(&ldap->IADs_iface);
+
+ return hr;
+}
+
+static const struct class_info
+{
+ const CLSID *clsid;
+ HRESULT (*constructor)(REFIID, void **);
+} class_info[] =
+{
+ { &CLSID_ADSystemInfo, ADSystemInfo_create },
+ { &CLSID_LDAPNamespace, LDAPNamespace_create },
+};
+
typedef struct
{
IClassFactory IClassFactory_iface;
- HRESULT (*constructor)(void **);
-} ADSystemInfo_factory;
+ LONG ref;
+ const struct class_info *info;
+} class_factory;
-static inline ADSystemInfo_factory *impl_from_IClassFactory(IClassFactory *iface)
+static inline class_factory *impl_from_IClassFactory(IClassFactory *iface)
{
- return CONTAINING_RECORD(iface, ADSystemInfo_factory, IClassFactory_iface);
+ return CONTAINING_RECORD(iface, class_factory, IClassFactory_iface);
}
static HRESULT WINAPI factory_QueryInterface(IClassFactory *iface, REFIID riid, LPVOID *obj)
@@ -283,19 +496,30 @@ static HRESULT WINAPI factory_QueryInterface(IClassFactory *iface, REFIID riid,
static ULONG WINAPI factory_AddRef(IClassFactory *iface)
{
- return 2;
+ class_factory *factory = impl_from_IClassFactory(iface);
+ ULONG ref = InterlockedIncrement(&factory->ref);
+
+ TRACE("(%p) ref %u\n", iface, ref);
+
+ return ref;
}
static ULONG WINAPI factory_Release(IClassFactory *iface)
{
- return 1;
+ class_factory *factory = impl_from_IClassFactory(iface);
+ ULONG ref = InterlockedDecrement(&factory->ref);
+
+ TRACE("(%p) ref %u\n", iface, ref);
+
+ if (!ref)
+ heap_free(factory);
+
+ return ref;
}
static HRESULT WINAPI factory_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID riid, void **obj)
{
- ADSystemInfo_factory *factory = impl_from_IClassFactory(iface);
- IUnknown *unknown;
- HRESULT hr;
+ class_factory *factory = impl_from_IClassFactory(iface);
TRACE("%p,%s,%p\n", outer, debugstr_guid(riid), obj);
@@ -304,13 +528,7 @@ static HRESULT WINAPI factory_CreateInstance(IClassFactory *iface, IUnknown *out
*obj = NULL;
if (outer) return CLASS_E_NOAGGREGATION;
- hr = factory->constructor((void **)&unknown);
- if (hr == S_OK)
- {
- hr = IUnknown_QueryInterface(unknown, riid, obj);
- IUnknown_Release(unknown);
- }
- return hr;
+ return factory->info->constructor(riid, obj);
}
static HRESULT WINAPI factory_LockServer(IClassFactory *iface, BOOL lock)
@@ -328,21 +546,48 @@ static const struct IClassFactoryVtbl factory_vtbl =
factory_LockServer
};
-static ADSystemInfo_factory ADSystemInfo_cf = { { &factory_vtbl }, ADSystemInfo_create };
+static HRESULT factory_constructor(const struct class_info *info, REFIID riid, void **obj)
+{
+ class_factory *factory;
+ HRESULT hr;
+
+ factory = heap_alloc(sizeof(*factory));
+ if (!factory) return E_OUTOFMEMORY;
+
+ factory->IClassFactory_iface.lpVtbl = &factory_vtbl;
+ factory->ref = 1;
+ factory->info = info;
+
+ hr = IClassFactory_QueryInterface(&factory->IClassFactory_iface, riid, obj);
+ IClassFactory_Release(&factory->IClassFactory_iface);
+
+ return hr;
+}
HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, LPVOID *obj)
{
+ const struct class_info *info = NULL;
+ int i;
+
TRACE("%s,%s,%p\n", debugstr_guid(clsid), debugstr_guid(iid), obj);
if (!clsid || !iid || !obj) return E_INVALIDARG;
*obj = NULL;
- if (IsEqualGUID(clsid, &CLSID_ADSystemInfo))
- return IClassFactory_QueryInterface(&ADSystemInfo_cf.IClassFactory_iface, iid, obj);
+ for (i = 0; i < ARRAY_SIZE(class_info); i++)
+ {
+ if (IsEqualCLSID(class_info[i].clsid, clsid))
+ {
+ info = &class_info[i];
+ break;
+ }
+ }
+
+ if (info)
+ return factory_constructor(info, iid, obj);
- FIXME("class %s/%s is not implemented\n", debugstr_guid(clsid), debugstr_guid(iid));
- return CLASS_E_CLASSNOTAVAILABLE;
+ return ADSLDP_DllGetClassObject(clsid, iid, obj);
}
HRESULT WINAPI DllCanUnloadNow(void)
diff --git a/dlls/adsldp/adsldp.idl b/dlls/adsldp/adsldp.idl
index c2f7504d0c..634aa36327 100644
--- a/dlls/adsldp/adsldp.idl
+++ b/dlls/adsldp/adsldp.idl
@@ -18,8 +18,17 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#pragma makedep proxy
#pragma makedep register
+[
+ helpstring("LDAP Namespace Object"),
+ progid("LDAPNamespace"),
+ uuid(228d9a82-c302-11cf-9aa4-00aa004a5691),
+ threading(both)
+]
+coclass ADs { }
+
[
helpstring("AD System Info Object"),
uuid(50b6327f-afd1-11d2-9cb9-0000f87a369e),
diff --git a/dlls/adsldp/adsldp.rgs b/dlls/adsldp/adsldp.rgs
new file mode 100644
index 0000000000..0da0946832
--- /dev/null
+++ b/dlls/adsldp/adsldp.rgs
@@ -0,0 +1,16 @@
+HKLM
+{
+ NoRemove Software
+ {
+ NoRemove Microsoft
+ {
+ NoRemove ADs
+ {
+ NoRemove Providers
+ {
+ ForceRemove 'LDAP' = s 'LDAPNamespace'
+ }
+ }
+ }
+ }
+}
diff --git a/dlls/adsldp/rsrc.rc b/dlls/adsldp/rsrc.rc
new file mode 100644
index 0000000000..914fe0b2f3
--- /dev/null
+++ b/dlls/adsldp/rsrc.rc
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2019 Dmitry Timoshkov
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/* @makedep: adsldp.rgs */
+1 WINE_REGISTRY adsldp.rgs
--
2.20.1

View File

@@ -0,0 +1,156 @@
From 73b97a7095f833e5323117c1acbb8a64c5e3afcb Mon Sep 17 00:00:00 2001
From: Dmitry Timoshkov <dmitry@baikal.ru>
Date: Tue, 19 Nov 2019 11:46:50 +0800
Subject: [PATCH 4/5] adsldp: Add IADsOpenDSObject stubs.
Content-Type: text/plain; charset=UTF-8
To: wine-devel@winehq.org
Signed-off-by: Dmitry Timoshkov <dmitry@baikal.ru>
---
dlls/adsldp/adsldp.c | 102 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 102 insertions(+)
diff --git a/dlls/adsldp/adsldp.c b/dlls/adsldp/adsldp.c
index ef62aad279..bdce30c143 100644
--- a/dlls/adsldp/adsldp.c
+++ b/dlls/adsldp/adsldp.c
@@ -260,6 +260,7 @@ static HRESULT ADSystemInfo_create(REFIID riid, void **obj)
typedef struct
{
IADs IADs_iface;
+ IADsOpenDSObject IADsOpenDSObject_iface;
LONG ref;
} LDAP_namespace;
@@ -270,6 +271,8 @@ static inline LDAP_namespace *impl_from_IADs(IADs *iface)
static HRESULT WINAPI ldapns_QueryInterface(IADs *iface, REFIID riid, void **obj)
{
+ LDAP_namespace *ldap = impl_from_IADs(iface);
+
TRACE("%p,%s,%p\n", iface, debugstr_guid(riid), obj);
if (!riid || !obj) return E_INVALIDARG;
@@ -283,6 +286,13 @@ static HRESULT WINAPI ldapns_QueryInterface(IADs *iface, REFIID riid, void **obj
return S_OK;
}
+ if (IsEqualGUID(riid, &IID_IADsOpenDSObject))
+ {
+ IADs_AddRef(iface);
+ *obj = &ldap->IADsOpenDSObject_iface;
+ return S_OK;
+ }
+
FIXME("interface %s is not implemented\n", debugstr_guid(riid));
return E_NOINTERFACE;
}
@@ -436,6 +446,97 @@ static const IADsVtbl IADs_vtbl =
ldapns_GetInfoEx
};
+static inline LDAP_namespace *impl_from_IADsOpenDSObject(IADsOpenDSObject *iface)
+{
+ return CONTAINING_RECORD(iface, LDAP_namespace, IADsOpenDSObject_iface);
+}
+
+static HRESULT WINAPI openobj_QueryInterface(IADsOpenDSObject *iface, REFIID riid, void **obj)
+{
+ TRACE("%p,%s,%p\n", iface, debugstr_guid(riid), obj);
+
+ if (!riid || !obj) return E_INVALIDARG;
+
+ if (IsEqualGUID(riid, &IID_IADsOpenDSObject) ||
+ IsEqualGUID(riid, &IID_IDispatch) ||
+ IsEqualGUID(riid, &IID_IUnknown))
+ {
+ IADsOpenDSObject_AddRef(iface);
+ *obj = iface;
+ return S_OK;
+ }
+
+ FIXME("interface %s is not implemented\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI openobj_AddRef(IADsOpenDSObject *iface)
+{
+ LDAP_namespace *ldap = impl_from_IADsOpenDSObject(iface);
+ return InterlockedIncrement(&ldap->ref);
+}
+
+static ULONG WINAPI openobj_Release(IADsOpenDSObject *iface)
+{
+ LDAP_namespace *ldap = impl_from_IADsOpenDSObject(iface);
+ LONG ref = InterlockedDecrement(&ldap->ref);
+
+ if (!ref)
+ {
+ TRACE("destroying %p\n", iface);
+ HeapFree(GetProcessHeap(), 0, ldap);
+ }
+
+ return ref;
+}
+
+static HRESULT WINAPI openobj_GetTypeInfoCount(IADsOpenDSObject *iface, UINT *count)
+{
+ FIXME("%p,%p: stub\n", iface, count);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI openobj_GetTypeInfo(IADsOpenDSObject *iface, UINT index, LCID lcid, ITypeInfo **info)
+{
+ FIXME("%p,%u,%#x,%p: stub\n", iface, index, lcid, info);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI openobj_GetIDsOfNames(IADsOpenDSObject *iface, REFIID riid, LPOLESTR *names,
+ UINT count, LCID lcid, DISPID *dispid)
+{
+ FIXME("%p,%s,%p,%u,%u,%p: stub\n", iface, debugstr_guid(riid), names, count, lcid, dispid);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI openobj_Invoke(IADsOpenDSObject *iface, DISPID dispid, REFIID riid, LCID lcid, WORD flags,
+ DISPPARAMS *params, VARIANT *result, EXCEPINFO *excepinfo, UINT *argerr)
+{
+ FIXME("%p,%d,%s,%04x,%04x,%p,%p,%p,%p: stub\n", iface, dispid, debugstr_guid(riid), lcid, flags,
+ params, result, excepinfo, argerr);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI openobj_OpenDSObject(IADsOpenDSObject *iface, BSTR path, BSTR user, BSTR password,
+ LONG reserved, IDispatch **obj)
+{
+ FIXME("%p,%s,%s,%s,%d,%p: stub\n", iface, debugstr_w(path), debugstr_w(user), debugstr_w(password),
+ reserved, obj);
+ return E_NOTIMPL;
+}
+
+static const IADsOpenDSObjectVtbl IADsOpenDSObject_vtbl =
+{
+ openobj_QueryInterface,
+ openobj_AddRef,
+ openobj_Release,
+ openobj_GetTypeInfoCount,
+ openobj_GetTypeInfo,
+ openobj_GetIDsOfNames,
+ openobj_Invoke,
+ openobj_OpenDSObject
+};
+
static HRESULT LDAPNamespace_create(REFIID riid, void **obj)
{
LDAP_namespace *ldap;
@@ -445,6 +546,7 @@ static HRESULT LDAPNamespace_create(REFIID riid, void **obj)
if (!ldap) return E_OUTOFMEMORY;
ldap->IADs_iface.lpVtbl = &IADs_vtbl;
+ ldap->IADsOpenDSObject_iface.lpVtbl = &IADsOpenDSObject_vtbl;
ldap->ref = 1;
hr = IADs_QueryInterface(&ldap->IADs_iface, riid, obj);
--
2.20.1

View File

@@ -0,0 +1,123 @@
From 488afac28472b0563c67cfad8c02a82f489c2c04 Mon Sep 17 00:00:00 2001
From: Dmitry Timoshkov <dmitry@baikal.ru>
Date: Tue, 19 Nov 2019 12:12:27 +0800
Subject: [PATCH 5/5] adsldp/tests: Add some tests for LDAPNamespace.
Content-Type: text/plain; charset=UTF-8
To: wine-devel@winehq.org
Signed-off-by: Dmitry Timoshkov <dmitry@baikal.ru>
---
dlls/adsldp/tests/Makefile.in | 1 +
dlls/adsldp/tests/ldap.c | 78 +++++++++++++++++++++++++++++++++++
dlls/adsldp/tests/sysinfo.c | 2 +
3 files changed, 81 insertions(+)
create mode 100644 dlls/adsldp/tests/ldap.c
diff --git a/dlls/adsldp/tests/Makefile.in b/dlls/adsldp/tests/Makefile.in
index 777d2aa9de..52141139d5 100644
--- a/dlls/adsldp/tests/Makefile.in
+++ b/dlls/adsldp/tests/Makefile.in
@@ -2,4 +2,5 @@ TESTDLL = adsldp.dll
IMPORTS = ole32 oleaut32 secur32 advapi32 uuid
C_SRCS = \
+ ldap.c \
sysinfo.c
diff --git a/dlls/adsldp/tests/ldap.c b/dlls/adsldp/tests/ldap.c
new file mode 100644
index 0000000000..36b128da20
--- /dev/null
+++ b/dlls/adsldp/tests/ldap.c
@@ -0,0 +1,78 @@
+/*
+ * LDAPNamespace Tests
+ *
+ * Copyright 2019 Dmitry Timoshkov
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "objbase.h"
+#include "iads.h"
+
+#include "wine/test.h"
+
+#include "initguid.h"
+DEFINE_GUID(CLSID_LDAPNamespace,0x228d9a82,0xc302,0x11cf,0x9a,0xa4,0x00,0xaa,0x00,0x4a,0x56,0x91);
+
+static void test_LDAP(void)
+{
+ HRESULT hr;
+ IUnknown *unk;
+ IADs *ads;
+ IADsOpenDSObject *ads_open;
+ IDispatch *disp;
+
+ hr = CoCreateInstance(&CLSID_LDAPNamespace, 0, CLSCTX_INPROC_SERVER, &IID_IADs, (void **)&ads);
+ ok(hr == S_OK, "got %#x\n", hr);
+ IADs_Release(ads);
+
+ hr = CoCreateInstance(&CLSID_LDAPNamespace, 0, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk);
+ ok(hr == S_OK, "got %#x\n", hr);
+
+ hr = IUnknown_QueryInterface(unk, &IID_IDispatch, (void **)&disp);
+ ok(hr == S_OK, "got %#x\n", hr);
+ IDispatch_Release(disp);
+
+ hr = IUnknown_QueryInterface(unk, &IID_IADsOpenDSObject, (void **)&ads_open);
+ ok(hr == S_OK, "got %#x\n", hr);
+ IADsOpenDSObject_Release(ads_open);
+
+ hr = IADsOpenDSObject_OpenDSObject(ads_open, (BSTR)L"LDAP:", NULL, NULL, ADS_SECURE_AUTHENTICATION, &disp);
+todo_wine
+ ok(hr == S_OK, "got %#x\n", hr);
+if (hr == S_OK)
+ IDispatch_Release(disp);
+
+ IUnknown_Release(unk);
+}
+
+START_TEST(ldap)
+{
+ HRESULT hr;
+
+ hr = CoInitialize(NULL);
+ ok(hr == S_OK, "got %#x\n", hr);
+
+ test_LDAP();
+
+ CoUninitialize();
+}
diff --git a/dlls/adsldp/tests/sysinfo.c b/dlls/adsldp/tests/sysinfo.c
index db982aa82f..cb250190f1 100644
--- a/dlls/adsldp/tests/sysinfo.c
+++ b/dlls/adsldp/tests/sysinfo.c
@@ -216,4 +216,6 @@ START_TEST(sysinfo)
test_ComputerName();
test_UserName();
test_sysinfo();
+
+ CoUninitialize();
}
--
2.20.1

View File

@@ -0,0 +1,2 @@
Fixes: [40649] activeds: Implement ADsOpenObject.
#Fixes: [42885] ADsOpenObject to bind to user's account/computer. (related)

View File

@@ -1,15 +1,16 @@
From ba50fc98ee4690e62899d48efc856c2bc910536c Mon Sep 17 00:00:00 2001
From 8044f571b7e674ce9e562488864d48646a9c7b88 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Mon, 7 Aug 2017 01:25:02 +0200
Subject: advapi32/tests: Extend security label / token integrity tests.
Subject: [PATCH] advapi32/tests: Extend security label / token integrity
tests.
---
dlls/advapi32/tests/Makefile.in | 2 +-
dlls/advapi32/tests/security.c | 389 +++++++++++++++++++++++++++++++++++++++-
dlls/advapi32/tests/security.c | 389 +++++++++++++++++++++++++++++++-
2 files changed, 387 insertions(+), 4 deletions(-)
diff --git a/dlls/advapi32/tests/Makefile.in b/dlls/advapi32/tests/Makefile.in
index 36ce031ef62..4437e6e5de7 100644
index 12583e59f57..caee5fae308 100644
--- a/dlls/advapi32/tests/Makefile.in
+++ b/dlls/advapi32/tests/Makefile.in
@@ -1,5 +1,5 @@
@@ -20,10 +21,10 @@ index 36ce031ef62..4437e6e5de7 100644
C_SRCS = \
cred.c \
diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c
index 0fd41fe82fa..4a03db27e69 100644
index a736dbffd22..4529469d932 100644
--- a/dlls/advapi32/tests/security.c
+++ b/dlls/advapi32/tests/security.c
@@ -7191,13 +7191,19 @@ static void test_token_security_descriptor(void)
@@ -7034,13 +7034,19 @@ static void test_token_security_descriptor(void)
{
static SID low_level = {SID_REVISION, 1, {SECURITY_MANDATORY_LABEL_AUTHORITY},
{SECURITY_MANDATORY_LOW_RID}};
@@ -46,7 +47,7 @@ index 0fd41fe82fa..4a03db27e69 100644
PROCESS_INFORMATION info;
DWORD size, index, retd;
ACCESS_ALLOWED_ACE *ace;
@@ -7347,6 +7353,185 @@ static void test_token_security_descriptor(void)
@@ -7190,6 +7196,185 @@ static void test_token_security_descriptor(void)
/* The security label is also not inherited */
if (pAddMandatoryAce)
{
@@ -103,7 +104,7 @@ index 0fd41fe82fa..4a03db27e69 100644
+
+ if (sacl)
+ {
+ ret = pGetAce(sacl, 0, (void **)&ace);
+ ret = GetAce(sacl, 0, (void **)&ace);
+ ok(ret, "GetAce failed with error %u\n", GetLastError());
+ ok(ace->Header.AceType == SYSTEM_MANDATORY_LABEL_ACE_TYPE,
+ "Unexpected ACE type %#x\n", ace->Header.AceType);
@@ -165,7 +166,7 @@ index 0fd41fe82fa..4a03db27e69 100644
+
+ if (sacl)
+ {
+ ret = pGetAce(sacl, 0, (void **)&ace);
+ ret = GetAce(sacl, 0, (void **)&ace);
+ ok(ret, "GetAce failed with error %u\n", GetLastError());
+ ok(ace->Header.AceType == SYSTEM_MANDATORY_LABEL_ACE_TYPE,
+ "Unexpected ACE type %#x\n", ace->Header.AceType);
@@ -215,7 +216,7 @@ index 0fd41fe82fa..4a03db27e69 100644
+
+ if (sacl)
+ {
+ ret = pGetAce(sacl, 0, (void **)&ace);
+ ret = GetAce(sacl, 0, (void **)&ace);
+ ok(ret, "GetAce failed with error %u\n", GetLastError());
+ ok(ace->Header.AceType == SYSTEM_MANDATORY_LABEL_ACE_TYPE,
+ "Unexpected ACE type %#x\n", ace->Header.AceType);
@@ -232,7 +233,7 @@ index 0fd41fe82fa..4a03db27e69 100644
ret = InitializeAcl(acl, 256, ACL_REVISION);
ok(ret, "InitializeAcl failed with error %u\n", GetLastError());
@@ -7362,6 +7547,90 @@ static void test_token_security_descriptor(void)
@@ -7205,6 +7390,90 @@ static void test_token_security_descriptor(void)
ret = SetKernelObjectSecurity(token, LABEL_SECURITY_INFORMATION, sd);
ok(ret, "SetKernelObjectSecurity failed with error %u\n", GetLastError());
@@ -272,7 +273,7 @@ index 0fd41fe82fa..4a03db27e69 100644
+
+ if (sacl)
+ {
+ ret = pGetAce(sacl, 0, (void **)&ace);
+ ret = GetAce(sacl, 0, (void **)&ace);
+ ok(ret, "GetAce failed with error %u\n", GetLastError());
+ ok(ace->Header.AceType == SYSTEM_MANDATORY_LABEL_ACE_TYPE,
+ "Unexpected ACE type %#x\n", ace->Header.AceType);
@@ -310,7 +311,7 @@ index 0fd41fe82fa..4a03db27e69 100644
+
+ if (sacl)
+ {
+ ret = pGetAce(sacl, 0, (void **)&ace);
+ ret = GetAce(sacl, 0, (void **)&ace);
+ ok(ret, "GetAce failed with error %u\n", GetLastError());
+ ok(ace->Header.AceType == SYSTEM_MANDATORY_LABEL_ACE_TYPE,
+ "Unexpected ACE type %#x\n", ace->Header.AceType);
@@ -323,7 +324,7 @@ index 0fd41fe82fa..4a03db27e69 100644
}
else
win_skip("SYSTEM_MANDATORY_LABEL not supported\n");
@@ -7467,6 +7736,116 @@ static void test_child_token_sd(void)
@@ -7312,6 +7581,116 @@ static void test_child_token_sd(void)
HeapFree(GetProcessHeap(), 0, sd);
}
@@ -366,7 +367,7 @@ index 0fd41fe82fa..4a03db27e69 100644
+ ok(acl && acl != (void *)0xdeadbeef, "Got invalid SACL\n");
+ ok(!defaulted, "SACL defaulted\n");
+ ok(acl->AceCount == 1, "Expected exactly one ACE\n");
+ ret = pGetAce(acl, 0, (void **)&ace_label);
+ ret = GetAce(acl, 0, (void **)&ace_label);
+ ok(ret, "GetAce failed with error %u\n", GetLastError());
+ ok(ace_label->Header.AceType == SYSTEM_MANDATORY_LABEL_ACE_TYPE,
+ "Unexpected ACE type %#x\n", ace_label->Header.AceType);
@@ -421,7 +422,7 @@ index 0fd41fe82fa..4a03db27e69 100644
+ ok(acl && acl != (void *)0xdeadbeef, "Got invalid SACL\n");
+ ok(!defaulted, "SACL defaulted\n");
+ ok(acl->AceCount == 1, "Expected exactly one ACE\n");
+ ret = pGetAce(acl, 0, (void **)&ace_label);
+ ret = GetAce(acl, 0, (void **)&ace_label);
+ ok(ret, "GetAce failed with error %u\n", GetLastError());
+ ok(ace_label->Header.AceType == SYSTEM_MANDATORY_LABEL_ACE_TYPE,
+ "Unexpected ACE type %#x\n", ace_label->Header.AceType);
@@ -440,7 +441,7 @@ index 0fd41fe82fa..4a03db27e69 100644
static void test_GetExplicitEntriesFromAclW(void)
{
static const WCHAR wszCurrentUser[] = { 'C','U','R','R','E','N','T','_','U','S','E','R','\0'};
@@ -7653,6 +8032,10 @@ START_TEST(security)
@@ -7571,6 +7950,10 @@ START_TEST(security)
{
if (!strcmp(myARGV[2], "test_token_sd"))
test_child_token_sd();
@@ -452,5 +453,5 @@ index 0fd41fe82fa..4a03db27e69 100644
test_process_security_child();
return;
--
2.13.1
2.17.1

View File

@@ -1,105 +0,0 @@
From 61b96f3dab24d3aec26237c8760d75f964474bc5 Mon Sep 17 00:00:00 2001
From: Louis Lenders <xerox.xerox2000x@gmail.com>
Date: Mon, 8 Apr 2019 17:06:58 +0200
Subject: [PATCH 2/2] combase: Add GetRestrictedErrorInfo and
RoOriginateLanguageException stubs.
Signed-off-by: Louis Lenders <xerox.xerox2000x@gmail.com>
---
.../api-ms-win-core-winrt-error-l1-1-0.spec | 2 +-
.../api-ms-win-core-winrt-error-l1-1-1.spec | 4 ++--
dlls/combase/combase.spec | 4 ++--
dlls/combase/roapi.c | 19 +++++++++++++++++++
4 files changed, 24 insertions(+), 5 deletions(-)
diff --git a/dlls/api-ms-win-core-winrt-error-l1-1-0/api-ms-win-core-winrt-error-l1-1-0.spec b/dlls/api-ms-win-core-winrt-error-l1-1-0/api-ms-win-core-winrt-error-l1-1-0.spec
index de0a6d8..99f1ca3 100644
--- a/dlls/api-ms-win-core-winrt-error-l1-1-0/api-ms-win-core-winrt-error-l1-1-0.spec
+++ b/dlls/api-ms-win-core-winrt-error-l1-1-0/api-ms-win-core-winrt-error-l1-1-0.spec
@@ -1,4 +1,4 @@
-@ stub GetRestrictedErrorInfo
+@ stdcall GetRestrictedErrorInfo(ptr) combase.GetRestrictedErrorInfo
@ stub RoCaptureErrorContext
@ stub RoFailFastWithErrorContext
@ stub RoGetErrorReportingFlags
diff --git a/dlls/api-ms-win-core-winrt-error-l1-1-1/api-ms-win-core-winrt-error-l1-1-1.spec b/dlls/api-ms-win-core-winrt-error-l1-1-1/api-ms-win-core-winrt-error-l1-1-1.spec
index b1ad813..0b390f1 100644
--- a/dlls/api-ms-win-core-winrt-error-l1-1-1/api-ms-win-core-winrt-error-l1-1-1.spec
+++ b/dlls/api-ms-win-core-winrt-error-l1-1-1/api-ms-win-core-winrt-error-l1-1-1.spec
@@ -1,4 +1,4 @@
-@ stub GetRestrictedErrorInfo
+@ stdcall GetRestrictedErrorInfo(ptr) combase.GetRestrictedErrorInfo
@ stub IsErrorPropagationEnabled
@ stub RoCaptureErrorContext
@ stub RoClearError
@@ -9,7 +9,7 @@
@ stub RoInspectThreadErrorInfo
@ stub RoOriginateError
@ stub RoOriginateErrorW
-@ stub RoOriginateLanguageException
+@ stdcall RoOriginateLanguageException(long ptr ptr) combase.RoOriginateLanguageException
@ stub RoReportFailedDelegate
@ stub RoReportUnhandledError
@ stub RoResolveRestrictedErrorInfoReference
diff --git a/dlls/combase/combase.spec b/dlls/combase/combase.spec
index 93575d5..f67527a 100644
--- a/dlls/combase/combase.spec
+++ b/dlls/combase/combase.spec
@@ -180,7 +180,7 @@
@ stub GetFuncDescs
@ stdcall GetHGlobalFromStream(ptr ptr) ole32.GetHGlobalFromStream
@ stub GetHookInterface
-@ stub GetRestrictedErrorInfo
+@ stdcall GetRestrictedErrorInfo(ptr)
@ stub HSTRING_UserFree
@ stub HSTRING_UserFree64
@ stub HSTRING_UserMarshal
@@ -260,7 +260,7 @@
@ stub RoInspectThreadErrorInfo
@ stub RoOriginateError
@ stub RoOriginateErrorW
-@ stub RoOriginateLanguageException
+@ stdcall RoOriginateLanguageException(long ptr ptr)
@ stub RoParameterizedTypeExtraGetTypeSignature
@ stdcall RoRegisterActivationFactories(ptr ptr long ptr)
@ stdcall RoRegisterForApartmentShutdown(ptr ptr ptr)
diff --git a/dlls/combase/roapi.c b/dlls/combase/roapi.c
index c9fe80f..2a6dcdf 100644
--- a/dlls/combase/roapi.c
+++ b/dlls/combase/roapi.c
@@ -21,6 +21,7 @@
#include "initguid.h"
#include "roapi.h"
#include "roparameterizediid.h"
+#include "restrictederrorinfo.h"
#include "winstring.h"
#include "wine/debug.h"
@@ -276,6 +277,24 @@ HRESULT WINAPI RoRegisterActivationFactories(HSTRING *classes, PFNGETACTIVATIONF
}
/***********************************************************************
+ * GetRestrictedErrorInfo (combase.@)
+ */
+HRESULT WINAPI GetRestrictedErrorInfo( IRestrictedErrorInfo **info )
+{
+ FIXME( "(%p)\n", info );
+ return E_NOTIMPL;
+}
+
+/***********************************************************************
+ * RoOriginateLanguageException (combase.@)
+ */
+BOOL WINAPI RoOriginateLanguageException( HRESULT error, HSTRING message, IUnknown *language_exception )
+{
+ FIXME("(%x %s %p) stub\n", error, debugstr_hstring(message), language_exception);
+ return FALSE;
+}
+
+/***********************************************************************
* CleanupTlsOleState (combase.@)
*/
void WINAPI CleanupTlsOleState(void *unknown)
--
1.9.1

View File

@@ -1 +0,0 @@
Fixes: [46972] combase: Add GetRestrictedErrorInfo/RoOriginateLanguageException stubs.

View File

@@ -0,0 +1,57 @@
From ad23e816eb724d81032306f8ac6d4faa96ccaf4a Mon Sep 17 00:00:00 2001
From: Dmitry Timoshkov <dmitry@baikal.ru>
Date: Tue, 12 Nov 2019 18:13:20 +0800
Subject: [PATCH] comctl32: Bump version to 6.0.
An application that I have here checks comctl32.dll version information
and refuses to run, changing DLL version to 6.0 makes it run.
Signed-off-by: Dmitry Timoshkov <dmitry@baikal.ru>
---
dlls/comctl32/comctl32.h | 2 +-
dlls/comctl32/comctl32.rc | 2 +-
include/commctrl.h | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/dlls/comctl32/comctl32.h b/dlls/comctl32/comctl32.h
index 78e97983381..42b434a96d9 100644
--- a/dlls/comctl32/comctl32.h
+++ b/dlls/comctl32/comctl32.h
@@ -192,7 +192,7 @@ INT Str_GetPtrAtoW (LPCSTR lpSrc, LPWSTR lpDest, INT nMaxLen) DECLSPEC_HIDDEN;
BOOL Str_SetPtrAtoW (LPWSTR *lppDest, LPCSTR lpSrc) DECLSPEC_HIDDEN;
BOOL Str_SetPtrWtoA (LPSTR *lppDest, LPCWSTR lpSrc) DECLSPEC_HIDDEN;
-#define COMCTL32_VERSION_MINOR 81
+#define COMCTL32_VERSION_MINOR 0
/* Our internal stack structure of the window procedures to subclass */
typedef struct _SUBCLASSPROCS {
diff --git a/dlls/comctl32/comctl32.rc b/dlls/comctl32/comctl32.rc
index c9aa1ba6253..be6e2425193 100644
--- a/dlls/comctl32/comctl32.rc
+++ b/dlls/comctl32/comctl32.rc
@@ -114,7 +114,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
#define WINE_FILEDESCRIPTION_STR "Wine Common Controls"
#define WINE_FILENAME_STR "comctl32.dll"
#define WINE_FILEVERSION COMCTL32_VERSION, COMCTL32_VERSION_MINOR, 4704, 1100
-#define WINE_FILEVERSION_STR "5.81"
+#define WINE_FILEVERSION_STR "6.00.4704.1100"
#define WINE_PRODUCTVERSION WINE_FILEVERSION
#define WINE_PRODUCTVERSION_STR WINE_FILEVERSION_STR
diff --git a/include/commctrl.h b/include/commctrl.h
index 700b335fbb7..029a4b45457 100644
--- a/include/commctrl.h
+++ b/include/commctrl.h
@@ -51,7 +51,7 @@ enum _LI_METRIC
HRESULT WINAPI LoadIconWithScaleDown(HINSTANCE, const WCHAR *, int, int, HICON *);
HRESULT WINAPI LoadIconMetric(HINSTANCE, const WCHAR *, int, HICON *);
-#define COMCTL32_VERSION 5 /* dll version */
+#define COMCTL32_VERSION 6 /* dll version */
#ifndef _WIN32_IE
#define _WIN32_IE 0x0400
--
2.24.1

View File

@@ -0,0 +1,187 @@
From 095e3e2646bc5ba024c166a2ac6829a894c0d1f7 Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Fri, 10 Jan 2020 09:28:50 +1100
Subject: [PATCH] dinput: Support default DIPROP_BUFFERSIZE buffer size
When a program calls SetProperty with DIPROP_BUFFERSIZE, dinput records
this value for GetProperty but only uses it when the device can support
that number of buffers otherwise a max value.
In the case of game "Far Cry 5", it passes through (DWORD)-1 which
cause HeapAlloc to fail ((DWORD)-1 * sizeof(DIDEVICEOBJECTDATA)).
Since there is no real way of working out the max value, I've capped it at 100 as
the default value is 20.
MSDN reference.
https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ee417908(v=vs.85)
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45732
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
---
dlls/dinput/device.c | 14 ++++++++++----
dlls/dinput/device_private.h | 3 ++-
dlls/dinput/joystick_linux.c | 4 ++++
dlls/dinput/joystick_linuxinput.c | 4 ++++
dlls/dinput/joystick_osx.c | 4 ++++
dlls/dinput/keyboard.c | 3 +++
dlls/dinput/mouse.c | 3 +++
dlls/dinput/tests/device.c | 14 ++++++++++++++
8 files changed, 44 insertions(+), 5 deletions(-)
diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c
index 28329d03b5..1604075f84 100644
--- a/dlls/dinput/device.c
+++ b/dlls/dinput/device.c
@@ -1307,7 +1307,7 @@ HRESULT WINAPI IDirectInputDevice2WImpl_GetProperty(LPDIRECTINPUTDEVICE8W iface,
if (pdiph->dwSize != sizeof(DIPROPDWORD)) return DIERR_INVALIDPARAM;
- pd->dwData = This->queue_len;
+ pd->dwData = This->buffersize;
TRACE("buffersize = %d\n", pd->dwData);
break;
}
@@ -1396,12 +1396,18 @@ HRESULT WINAPI IDirectInputDevice2WImpl_SetProperty(
TRACE("buffersize = %d\n", pd->dwData);
EnterCriticalSection(&This->crit);
+
+ This->buffersize = pd->dwData;
+
+ This->queue_len = This->buffersize > 100 ? 100 : This->buffersize;
+ if (This->buffersize > 100)
+ WARN("Trying to set large buffer size %d\n", pd->dwData);
+
HeapFree(GetProcessHeap(), 0, This->data_queue);
- This->data_queue = !pd->dwData ? NULL : HeapAlloc(GetProcessHeap(), 0,
- pd->dwData * sizeof(DIDEVICEOBJECTDATA));
+ This->data_queue = !This->queue_len ? NULL : HeapAlloc(GetProcessHeap(), 0,
+ This->queue_len * sizeof(DIDEVICEOBJECTDATA));
This->queue_head = This->queue_tail = This->overflow = 0;
- This->queue_len = pd->dwData;
LeaveCriticalSection(&This->crit);
break;
diff --git a/dlls/dinput/device_private.h b/dlls/dinput/device_private.h
index 27e9c26286..23d9e2eebc 100644
--- a/dlls/dinput/device_private.h
+++ b/dlls/dinput/device_private.h
@@ -71,10 +71,11 @@ struct IDirectInputDeviceImpl
DI_EVENT_PROC event_proc; /* function to receive mouse & keyboard events */
LPDIDEVICEOBJECTDATA data_queue; /* buffer for 'GetDeviceData'. */
- int queue_len; /* size of the queue - set in 'SetProperty' */
+ int queue_len; /* valid size of the queue */
int queue_head; /* position to write new event into queue */
int queue_tail; /* next event to read from queue */
BOOL overflow; /* return DI_BUFFEROVERFLOW in 'GetDeviceData' */
+ DWORD buffersize; /* size of the queue - set in 'SetProperty' */
DataFormat data_format; /* user data format and wine to user format converter */
diff --git a/dlls/dinput/joystick_linux.c b/dlls/dinput/joystick_linux.c
index afdf659b4a..1e7bf72936 100644
--- a/dlls/dinput/joystick_linux.c
+++ b/dlls/dinput/joystick_linux.c
@@ -501,6 +501,10 @@ static HRESULT alloc_device(REFGUID rguid, IDirectInputImpl *dinput,
newDevice->generic.base.ref = 1;
newDevice->generic.base.dinput = dinput;
newDevice->generic.base.guid = *rguid;
+ newDevice->generic.base.buffersize = 20;
+ newDevice->generic.base.queue_len = 20;
+ newDevice->generic.base.data_queue = HeapAlloc(GetProcessHeap(), 0,
+ newDevice->generic.base.queue_len * sizeof(DIDEVICEOBJECTDATA));
InitializeCriticalSection(&newDevice->generic.base.crit);
newDevice->generic.base.crit.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": JoystickImpl*->generic.base.crit");
diff --git a/dlls/dinput/joystick_linuxinput.c b/dlls/dinput/joystick_linuxinput.c
index b5418d805c..98283a1eed 100644
--- a/dlls/dinput/joystick_linuxinput.c
+++ b/dlls/dinput/joystick_linuxinput.c
@@ -471,6 +471,10 @@ static JoystickImpl *alloc_device(REFGUID rguid, IDirectInputImpl *dinput, unsig
newDevice->generic.base.ref = 1;
newDevice->generic.base.guid = *rguid;
newDevice->generic.base.dinput = dinput;
+ newDevice->generic.base.buffersize = 20;
+ newDevice->generic.base.queue_len = 20;
+ newDevice->generic.base.data_queue = HeapAlloc(GetProcessHeap(), 0,
+ newDevice->generic.base.queue_len * sizeof(DIDEVICEOBJECTDATA));
newDevice->generic.joy_polldev = joy_polldev;
newDevice->joyfd = -1;
newDevice->joydev = &joydevs[index];
diff --git a/dlls/dinput/joystick_osx.c b/dlls/dinput/joystick_osx.c
index 990f5d1f07..c48cad1f5a 100644
--- a/dlls/dinput/joystick_osx.c
+++ b/dlls/dinput/joystick_osx.c
@@ -1168,6 +1168,10 @@ static HRESULT alloc_device(REFGUID rguid, IDirectInputImpl *dinput,
newDevice->generic.base.ref = 1;
newDevice->generic.base.dinput = dinput;
newDevice->generic.base.guid = *rguid;
+ newDevice->generic.base.buffersize = 20;
+ newDevice->generic.base.queue_len = 20;
+ newDevice->generic.base.data_queue = HeapAlloc(GetProcessHeap(), 0,
+ newDevice->generic.base.queue_len * sizeof(DIDEVICEOBJECTDATA));
InitializeCriticalSection(&newDevice->generic.base.crit);
newDevice->generic.base.crit.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": JoystickImpl*->generic.base.crit");
diff --git a/dlls/dinput/keyboard.c b/dlls/dinput/keyboard.c
index 47f28cac52..15a6be4dee 100644
--- a/dlls/dinput/keyboard.c
+++ b/dlls/dinput/keyboard.c
@@ -268,6 +268,9 @@ static SysKeyboardImpl *alloc_device(REFGUID rguid, IDirectInputImpl *dinput)
InitializeCriticalSection(&newDevice->base.crit);
newDevice->base.crit.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": SysKeyboardImpl*->base.crit");
newDevice->subtype = get_keyboard_subtype();
+ newDevice->base.buffersize = 20;
+ newDevice->base.queue_len = 20;
+ newDevice->base.data_queue = HeapAlloc(GetProcessHeap(), 0, newDevice->base.queue_len * sizeof(DIDEVICEOBJECTDATA));
/* Create copy of default data format */
if (!(df = HeapAlloc(GetProcessHeap(), 0, c_dfDIKeyboard.dwSize))) goto failed;
diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c
index 08ace2f4e9..59c8c9dad8 100644
--- a/dlls/dinput/mouse.c
+++ b/dlls/dinput/mouse.c
@@ -214,6 +214,9 @@ static SysMouseImpl *alloc_device(REFGUID rguid, IDirectInputImpl *dinput)
newDevice->base.crit.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": SysMouseImpl*->base.crit");
newDevice->base.dinput = dinput;
newDevice->base.event_proc = dinput_mouse_hook;
+ newDevice->base.buffersize = 20;
+ newDevice->base.queue_len = 20;
+ newDevice->base.data_queue = HeapAlloc(GetProcessHeap(), 0, newDevice->base.queue_len * sizeof(DIDEVICEOBJECTDATA));
get_app_key(&hkey, &appkey);
if (!get_config_key(hkey, appkey, "MouseWarpOverride", buffer, sizeof(buffer)))
diff --git a/dlls/dinput/tests/device.c b/dlls/dinput/tests/device.c
index a2a5a65686..4dd16c70d2 100644
--- a/dlls/dinput/tests/device.c
+++ b/dlls/dinput/tests/device.c
@@ -106,8 +106,22 @@ static void test_object_info(IDirectInputDeviceA *device, HWND hwnd)
dp.diph.dwHeaderSize = sizeof(DIPROPHEADER);
dp.diph.dwHow = DIPH_DEVICE;
dp.diph.dwObj = 0;
+ dp.dwData = -1;
+
+ hr = IDirectInputDevice_GetProperty(device, DIPROP_BUFFERSIZE, &dp.diph);
+ ok(hr == DI_OK, "Failed: %08x\n", hr);
+ ok(dp.dwData == 20, "got %d\n", dp.dwData);
+
+ dp.dwData = -1;
+ hr = IDirectInputDevice_SetProperty(device, DIPROP_BUFFERSIZE, (LPCDIPROPHEADER)&dp.diph);
+ ok(hr == DI_OK, "SetProperty() failed: %08x\n", hr);
+
dp.dwData = 0;
+ hr = IDirectInputDevice_GetProperty(device, DIPROP_BUFFERSIZE, &dp.diph);
+ ok(hr == DI_OK, "Failed: %08x\n", hr);
+ ok(dp.dwData == -1, "got %d\n", dp.dwData);
+ dp.dwData = 0;
hr = IDirectInputDevice_SetProperty(device, DIPROP_BUFFERSIZE, (LPCDIPROPHEADER)&dp.diph);
ok(hr == DI_OK, "SetProperty() failed: %08x\n", hr);
cnt = 5;
--
2.17.1

View File

@@ -0,0 +1 @@
Fixes: [45732] Far Cry 5 Cannot Steer Land Vehicles

View File

@@ -1,18 +1,18 @@
From 47a1e3618a1629a6f7cca1b84f761eaab3627f75 Mon Sep 17 00:00:00 2001
From dd42a25720d9d711137e84a449319fc197b2639f Mon Sep 17 00:00:00 2001
From: Andrew Church <achurch@achurch.org>
Date: Mon, 25 Feb 2019 11:23:12 +1100
Subject: [PATCH] dinput: Allow reconnecting to disconnected joysticks
Wine-bug: https://bugs.winehq.org/show_bug.cgi?id=34297
---
dlls/dinput/joystick_linuxinput.c | 148 +++++++++++++++++++++++++++++---------
dlls/dinput/joystick_linuxinput.c | 148 +++++++++++++++++++++++-------
1 file changed, 113 insertions(+), 35 deletions(-)
diff --git a/dlls/dinput/joystick_linuxinput.c b/dlls/dinput/joystick_linuxinput.c
index ace4641..233dd25 100644
index 98283a1eedd..439e7d84bd4 100644
--- a/dlls/dinput/joystick_linuxinput.c
+++ b/dlls/dinput/joystick_linuxinput.c
@@ -83,6 +83,13 @@ struct wine_input_absinfo {
@@ -84,6 +84,13 @@ struct wine_input_absinfo {
LONG flat;
};
@@ -26,7 +26,7 @@ index ace4641..233dd25 100644
/* implemented in effect_linuxinput.c */
HRESULT linuxinput_create_effect(int* fd, REFGUID rguid, struct list *parent_list_entry, LPDIRECTINPUTEFFECT* peff);
HRESULT linuxinput_get_info_A(int fd, REFGUID rguid, LPDIEFFECTINFOA info);
@@ -122,6 +129,7 @@ struct JoystickImpl
@@ -123,6 +130,7 @@ struct JoystickImpl
/* joystick private */
int joyfd;
@@ -34,15 +34,15 @@ index ace4641..233dd25 100644
int dev_axes_to_di[ABS_MAX];
POINTL povs[4];
@@ -466,6 +474,7 @@ static JoystickImpl *alloc_device(REFGUID rguid, IDirectInputImpl *dinput, unsig
newDevice->generic.base.dinput = dinput;
@@ -477,6 +485,7 @@ static JoystickImpl *alloc_device(REFGUID rguid, IDirectInputImpl *dinput, unsig
newDevice->generic.base.queue_len * sizeof(DIDEVICEOBJECTDATA));
newDevice->generic.joy_polldev = joy_polldev;
newDevice->joyfd = -1;
+ newDevice->joyfd_state = WINE_FD_STATE_CLOSED;
newDevice->joydev = &joydevs[index];
newDevice->generic.name = newDevice->joydev->name;
list_init(&newDevice->ff_effects);
@@ -669,38 +678,15 @@ static HRESULT joydev_create_device(IDirectInputImpl *dinput, REFGUID rguid, REF
@@ -684,38 +693,15 @@ static HRESULT joydev_create_device(IDirectInputImpl *dinput, REFGUID rguid, REF
return DIERR_DEVICENOTREG;
}
@@ -85,7 +85,7 @@ index ace4641..233dd25 100644
}
else
{
@@ -715,18 +701,53 @@ static HRESULT WINAPI JoystickWImpl_Acquire(LPDIRECTINPUTDEVICE8W iface)
@@ -730,18 +716,53 @@ static HRESULT WINAPI JoystickWImpl_Acquire(LPDIRECTINPUTDEVICE8W iface)
event.type = EV_FF;
event.code = FF_GAIN;
event.value = This->ff_gain;
@@ -141,7 +141,7 @@ index ace4641..233dd25 100644
return DI_OK;
}
@@ -764,6 +785,7 @@ static HRESULT WINAPI JoystickWImpl_Unacquire(LPDIRECTINPUTDEVICE8W iface)
@@ -779,6 +800,7 @@ static HRESULT WINAPI JoystickWImpl_Unacquire(LPDIRECTINPUTDEVICE8W iface)
close(This->joyfd);
This->joyfd = -1;
@@ -149,7 +149,7 @@ index ace4641..233dd25 100644
}
return res;
}
@@ -808,23 +830,79 @@ static void joy_polldev(LPDIRECTINPUTDEVICE8A iface)
@@ -823,23 +845,79 @@ static void joy_polldev(LPDIRECTINPUTDEVICE8A iface)
struct input_event ie;
JoystickImpl *This = impl_from_IDirectInputDevice8A(iface);
@@ -236,5 +236,5 @@ index ace4641..233dd25 100644
TRACE("input_event: type %d, code %d, value %d\n",ie.type,ie.code,ie.value);
switch (ie.type) {
--
1.9.1
2.24.1

View File

@@ -1,2 +1,2 @@
Fixes: [34297] dinput: Allow reconnecting to disconnected joysticks
Depends: dinput-DIPROP_BUFFERSIZE

View File

@@ -0,0 +1,166 @@
From b86977f6822d286b595c756c814c2cc986968050 Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Sun, 22 Dec 2019 19:35:25 +1100
Subject: [PATCH 1/2] directmanipulation: Support IDirectManipulationContent in
IDirectManipulationPrimaryContent interface
Based of patch by Gijs Vermeulen.
---
dlls/directmanipulation/directmanipulation.c | 110 ++++++++++++++++++-
1 file changed, 109 insertions(+), 1 deletion(-)
diff --git a/dlls/directmanipulation/directmanipulation.c b/dlls/directmanipulation/directmanipulation.c
index ca60e76db6e..05601abbd45 100644
--- a/dlls/directmanipulation/directmanipulation.c
+++ b/dlls/directmanipulation/directmanipulation.c
@@ -177,10 +177,10 @@ static HRESULT create_update_manager(IDirectManipulationUpdateManager **obj)
return S_OK;
}
-
struct primarycontext
{
IDirectManipulationPrimaryContent IDirectManipulationPrimaryContent_iface;
+ IDirectManipulationContent IDirectManipulationContent_iface;
LONG ref;
};
@@ -189,6 +189,11 @@ static inline struct primarycontext *impl_from_IDirectManipulationPrimaryContent
return CONTAINING_RECORD(iface, struct primarycontext, IDirectManipulationPrimaryContent_iface);
}
+static inline struct primarycontext *impl_from_IDirectManipulationContent(IDirectManipulationContent *iface)
+{
+ return CONTAINING_RECORD(iface, struct primarycontext, IDirectManipulationContent_iface);
+}
+
static HRESULT WINAPI primary_QueryInterface(IDirectManipulationPrimaryContent *iface, REFIID riid, void **ppv)
{
struct primarycontext *This = impl_from_IDirectManipulationPrimaryContent(iface);
@@ -201,6 +206,12 @@ static HRESULT WINAPI primary_QueryInterface(IDirectManipulationPrimaryContent *
*ppv = &This->IDirectManipulationPrimaryContent_iface;
return S_OK;
}
+ else if(IsEqualGUID(riid, &IID_IDirectManipulationContent))
+ {
+ IUnknown_AddRef(iface);
+ *ppv = &This->IDirectManipulationContent_iface;
+ return S_OK;
+ }
FIXME("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppv);
return E_NOINTERFACE;
@@ -313,6 +324,102 @@ static const IDirectManipulationPrimaryContentVtbl primaryVtbl =
primary_GetCenterPoint
};
+
+static HRESULT WINAPI content_QueryInterface(IDirectManipulationContent *iface, REFIID riid, void **ppv)
+{
+ struct primarycontext *This = impl_from_IDirectManipulationContent(iface);
+ TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), ppv);
+
+ return IDirectManipulationPrimaryContent_QueryInterface(&This->IDirectManipulationPrimaryContent_iface,
+ riid, ppv);
+}
+
+static ULONG WINAPI content_AddRef(IDirectManipulationContent *iface)
+{
+ struct primarycontext *This = impl_from_IDirectManipulationContent(iface);
+ return IDirectManipulationPrimaryContent_AddRef(&This->IDirectManipulationPrimaryContent_iface);
+}
+
+static ULONG WINAPI content_Release(IDirectManipulationContent *iface)
+{
+ struct primarycontext *This = impl_from_IDirectManipulationContent(iface);
+ return IDirectManipulationPrimaryContent_Release(&This->IDirectManipulationPrimaryContent_iface);
+}
+
+static HRESULT WINAPI content_GetContentRect(IDirectManipulationContent *iface, RECT *size)
+{
+ struct primarycontext *This = impl_from_IDirectManipulationContent(iface);
+ FIXME("%p, %p\n", This, size);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI content_SetContentRect(IDirectManipulationContent *iface, const RECT *size)
+{
+ struct primarycontext *This = impl_from_IDirectManipulationContent(iface);
+ FIXME("%p, %p\n", This, size);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI content_GetViewport(IDirectManipulationContent *iface, REFIID riid, void **object)
+{
+ struct primarycontext *This = impl_from_IDirectManipulationContent(iface);
+ FIXME("%p, %p, %p\n", This, debugstr_guid(riid), object);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI content_GetTag(IDirectManipulationContent *iface, REFIID riid, void **object, UINT32 *id)
+{
+ struct primarycontext *This = impl_from_IDirectManipulationContent(iface);
+ FIXME("%p, %p, %p, %p\n", This, debugstr_guid(riid), object, id);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI content_SetTag(IDirectManipulationContent *iface, IUnknown *object, UINT32 id)
+{
+ struct primarycontext *This = impl_from_IDirectManipulationContent(iface);
+ FIXME("%p, %p, %d\n", This, object, id);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI content_GetOutputTransform(IDirectManipulationContent *iface,
+ float *matrix, DWORD count)
+{
+ struct primarycontext *This = impl_from_IDirectManipulationContent(iface);
+ FIXME("%p, %p, %d\n", This, matrix, count);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI content_GetContentTransform(IDirectManipulationContent *iface,
+ float *matrix, DWORD count)
+{
+ struct primarycontext *This = impl_from_IDirectManipulationContent(iface);
+ FIXME("%p, %p, %d\n", This, matrix, count);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI content_SyncContentTransform(IDirectManipulationContent *iface,
+ const float *matrix, DWORD count)
+{
+ struct primarycontext *This = impl_from_IDirectManipulationContent(iface);
+ FIXME("%p, %p, %d\n", This, matrix, count);
+ return E_NOTIMPL;
+}
+
+static const IDirectManipulationContentVtbl contentVtbl =
+{
+ content_QueryInterface,
+ content_AddRef,
+ content_Release,
+ content_GetContentRect,
+ content_SetContentRect,
+ content_GetViewport,
+ content_GetTag,
+ content_SetTag,
+ content_GetOutputTransform,
+ content_GetContentTransform,
+ content_SyncContentTransform
+};
+
struct directviewport
{
IDirectManipulationViewport2 IDirectManipulationViewport2_iface;
@@ -473,6 +580,7 @@ static HRESULT WINAPI viewport_GetPrimaryContent(IDirectManipulationViewport2 *i
return E_OUTOFMEMORY;
primary->IDirectManipulationPrimaryContent_iface.lpVtbl = &primaryVtbl;
+ primary->IDirectManipulationContent_iface.lpVtbl = &contentVtbl;
primary->ref = 1;
*object = &primary->IDirectManipulationPrimaryContent_iface;
--
2.24.0

View File

@@ -0,0 +1,34 @@
From 8e284d9f96e2f3c623d6f520c530aaadad943fcd Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Sun, 22 Dec 2019 20:54:43 +1100
Subject: [PATCH 2/2] directmanipulation: Fake success in some functions
---
dlls/directmanipulation/directmanipulation.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/directmanipulation/directmanipulation.c b/dlls/directmanipulation/directmanipulation.c
index 05601abbd45..b42c1f84387 100644
--- a/dlls/directmanipulation/directmanipulation.c
+++ b/dlls/directmanipulation/directmanipulation.c
@@ -357,7 +357,7 @@ static HRESULT WINAPI content_SetContentRect(IDirectManipulationContent *iface,
{
struct primarycontext *This = impl_from_IDirectManipulationContent(iface);
FIXME("%p, %p\n", This, size);
- return E_NOTIMPL;
+ return S_OK;
}
static HRESULT WINAPI content_GetViewport(IDirectManipulationContent *iface, REFIID riid, void **object)
@@ -540,7 +540,7 @@ static HRESULT WINAPI viewport_SetViewportRect(IDirectManipulationViewport2 *ifa
{
struct directviewport *This = impl_from_IDirectManipulationViewport2(iface);
FIXME("%p, %p\n", This, viewport);
- return E_NOTIMPL;
+ return S_OK;
}
static HRESULT WINAPI viewport_ZoomToRect(IDirectManipulationViewport2 *iface, const float left,
--
2.24.0

View File

@@ -1,45 +0,0 @@
From 6a4d40b86f94703f8c37264739fffc4885507ebf Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Tue, 17 Sep 2019 16:21:22 +1000
Subject: [PATCH] dmime: Ensure Channels are in range before assignment.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=17766
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=24740
---
dlls/dmime/performance.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/dlls/dmime/performance.c b/dlls/dmime/performance.c
index 6e4dae6be7..3bbbb3b853 100644
--- a/dlls/dmime/performance.c
+++ b/dlls/dmime/performance.c
@@ -34,7 +34,7 @@ typedef struct IDirectMusicPerformance8Impl {
float fMasterTempo;
long lMasterVolume;
/* performance channels */
- DMUSIC_PRIVATE_PCHANNEL PChannel[32];
+ DMUSIC_PRIVATE_PCHANNEL PChannel[256];
/* IDirectMusicPerformance8Impl fields */
IDirectMusicAudioPath *pDefaultPath;
HANDLE hNotification;
@@ -624,6 +624,9 @@ static HRESULT WINAPI IDirectMusicPerformance8Impl_AssignPChannelBlock(IDirectMu
FIXME("(%p, %d, %p, %d): semi-stub\n", This, dwBlockNum, pPort, dwGroup-1);
if (NULL == pPort) return E_POINTER;
+ if (dwBlockNum > ARRAY_SIZE(This->PChannel))
+ return S_FALSE;
+
range = 16 * dwBlockNum;
j = 0;
for (i = range; i < range+16; i++) {
@@ -633,7 +636,6 @@ static HRESULT WINAPI IDirectMusicPerformance8Impl_AssignPChannelBlock(IDirectMu
This->PChannel[i].channel = j; /* FIXME: should this be assigned? */
j++;
}
- /*if (dwGroup > 2) return S_FALSE;*/
return S_OK;
}
--
2.17.1

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