Wine-Devel
Threads by month
- ----- 2026 -----
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
May 2019
- 96 participants
- 791 discussions
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
Alternatively, trace TRACE() could be removed.
---
dlls/setupapi/parser.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/dlls/setupapi/parser.c b/dlls/setupapi/parser.c
index c1086895d0dc..449ae002c55e 100644
--- a/dlls/setupapi/parser.c
+++ b/dlls/setupapi/parser.c
@@ -1857,7 +1857,12 @@ BOOL WINAPI SetupGetBinaryField( PINFCONTEXT context, DWORD index, BYTE *buffer,
{
TRACE( "%p/%p/%d/%d index %d returning",
context->Inf, context->CurrentInf, context->Section, context->Line, index );
- for (i = index; i < line->nb_fields; i++) TRACE( " %02x", buffer[i - index] );
+ for (i = index; i < line->nb_fields; i++)
+ {
+ TRACE( " %02x", buffer[i - index] );
+ if (i % 100 == 0)
+ TRACE( "\n" );
+ }
TRACE( "\n" );
}
return TRUE;
--
2.21.0
1
0
Signed-off-by: Andreas Maier <staubim(a)quantentunnel.de>
---
dlls/jscript/enumerator.c | 206 ++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 190 insertions(+), 16 deletions(-)
diff --git a/dlls/jscript/enumerator.c b/dlls/jscript/enumerator.c
index d0502f6afa..47140c617a 100644
--- a/dlls/jscript/enumerator.c
+++ b/dlls/jscript/enumerator.c
@@ -26,6 +26,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(jscript);
typedef struct {
jsdisp_t dispex;
+ /* IEnumVARIANT returned by _NewEnum */
+ IEnumVARIANT *enumvar;
+ /* current item */
+ jsval_t item;
} EnumeratorInstance;
static const WCHAR atEndW[] = {'a','t','E','n','d',0};
@@ -33,9 +37,48 @@ static const WCHAR itemW[] = {'i','t','e','m',0};
static const WCHAR moveFirstW[] = {'m','o','v','e','F','i','r','s','t',0};
static const WCHAR moveNextW[] = {'m','o','v','e','N','e','x','t',0};
+static inline EnumeratorInstance *enumerator_from_jsdisp(jsdisp_t *jsdisp)
+{
+ return CONTAINING_RECORD(jsdisp, EnumeratorInstance, dispex);
+}
+
+static inline EnumeratorInstance *enumerator_from_vdisp(vdisp_t *vdisp)
+{
+ return enumerator_from_jsdisp(vdisp->u.jsdisp);
+}
+
+static inline HRESULT enumvar_get_next_item(EnumeratorInstance *This,
+ BOOL init)
+{
+ HRESULT hres;
+ VARIANT nextitem;
+
+ /* not at end ... get next item */
+ if ((init) || (!is_undefined(This->item)))
+ {
+ VariantInit(&nextitem);
+ hres = IEnumVARIANT_Next(This->enumvar, 1, &nextitem, NULL);
+ if (SUCCEEDED(hres))
+ {
+ hres = variant_to_jsval(&nextitem, &This->item);
+ if (FAILED(hres))
+ {
+ ERR("failed to convert jsval to variant!");
+ This->item = jsval_undefined();
+ }
+
+ }
+ else
+ This->item = jsval_undefined();
+ VariantClear(&nextitem);
+ }
+
+ return S_OK;
+}
+
static void Enumerator_destructor(jsdisp_t *dispex)
{
- TRACE("Enumerator_destructor\n");
+ TRACE("\n");
heap_free(dispex);
}
@@ -43,33 +86,90 @@ static void Enumerator_destructor(jsdisp_t *dispex)
static HRESULT Enumerator_atEnd(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
- TRACE("Enumerator_atEnd\n");
+ EnumeratorInstance *This;
- return E_NOTIMPL;
+ if (!(This = enumerator_from_vdisp(jsthis)))
+ {
+ FIXME("we should throw an error...");
+ return E_NOTIMPL;
+ }
+
+ if (r)
+ *r = jsval_bool(is_undefined(This->item));
+
+ TRACE("%s\n", debugstr_jsval(This->item));
+
+ return S_OK;
}
static HRESULT Enumerator_item(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
- TRACE("Enumerator_item\n");
+ EnumeratorInstance *This;
+
+ TRACE("\n");
- return E_NOTIMPL;
+ if (!(This = enumerator_from_vdisp(jsthis)))
+ {
+ FIXME("we should throw an error...");
+ return E_NOTIMPL;
+ }
+
+ return r ? jsval_copy(This->item, r) : S_OK;
}
static HRESULT Enumerator_moveFirst(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
- TRACE("Enumerator_moveFirst\n");
+ EnumeratorInstance *This;
+ HRESULT hres = E_FAIL;
+
+ TRACE("\n");
+
+ if (!(This = enumerator_from_vdisp(jsthis)))
+ {
+ FIXME("we should throw an error...");
+ return E_NOTIMPL;
+ }
- return E_NOTIMPL;
+ if (This->enumvar)
+ {
+ hres = IEnumVARIANT_Reset(This->enumvar);
+ if (!FAILED(hres))
+ hres = enumvar_get_next_item(This, TRUE);
+ }
+ else
+ hres = S_OK;
+
+ if (r)
+ *r = jsval_undefined();
+
+ return hres;
}
static HRESULT Enumerator_moveNext(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
- TRACE("Enumerator_moveNext\n");
+ EnumeratorInstance *This;
+ HRESULT hres = E_FAIL;
+
+ TRACE("\n");
+
+ if (!(This = enumerator_from_vdisp(jsthis)))
+ {
+ FIXME("we should throw an error...");
+ return E_NOTIMPL;
+ }
+
+ if (This->enumvar)
+ hres = enumvar_get_next_item(This, FALSE);
+ else
+ hres = S_OK;
- return E_NOTIMPL;
+ if (r)
+ *r = jsval_undefined();
+
+ return hres;
}
static const builtin_prop_t Enumerator_props[] = {
@@ -101,16 +201,18 @@ static HRESULT EnumeratorConstr_value(script_ctx_t *ctx, vdisp_t *vthis, WORD fl
jsval_t *r)
{
jsdisp_t *obj;
+ jsval_t *arg0;
HRESULT hres;
- TRACE("EnumeratorConstr_value\n");
+ TRACE("\n");
switch(flags) {
case DISPATCH_CONSTRUCT: {
- if (argc != 1)
- return throw_syntax_error(ctx, JS_E_MISSING_ARG, NULL);
+ if (argc > 1)
+ return throw_syntax_error(ctx, JS_E_INVALIDARG, NULL);
- hres = create_enumerator(ctx, &argv[0], &obj);
+ arg0 = (argc == 1) ? &argv[0] : 0;
+ hres = create_enumerator(ctx, arg0, &obj);
if(FAILED(hres))
return hres;
@@ -118,7 +220,7 @@ static HRESULT EnumeratorConstr_value(script_ctx_t *ctx, vdisp_t *vthis, WORD fl
break;
}
default:
- FIXME("unimplemented flags: %x\n", flags);
+ ERR("unimplemented flags: %x\n", flags);
return E_NOTIMPL;
}
@@ -140,7 +242,8 @@ static HRESULT alloc_enumerator(script_ctx_t *ctx, jsdisp_t *object_prototype, E
hres = init_dispex_from_constr(&enumerator->dispex, ctx, &EnumeratorInst_info,
ctx->enumerator_constr);
- if(FAILED(hres)) {
+ if(FAILED(hres))
+ {
heap_free(enumerator);
return hres;
}
@@ -180,11 +283,82 @@ HRESULT create_enumerator(script_ctx_t *ctx, jsval_t *argv, jsdisp_t **ret)
{
EnumeratorInstance *enumerator;
HRESULT hres;
+ IDispatch *obj;
+ DISPPARAMS dispparams = {NULL, NULL, 0, 0};
+ VARIANT varresult;
+
+ IEnumVARIANT *enumvar;
+
+ memset(&varresult, 0, sizeof(VARIANT));
+ VariantInit(&varresult);
+
+ /* new Enumerator() */
+ if (argv == NULL)
+ {
+ enumvar = NULL;
+ }
+ else if (is_object_instance(*argv))
+ {
+ obj = get_object(*argv);
+
+ /* Try to get a IEnumVARIANT by _NewEnum */
+ hres = IDispatch_Invoke(obj,
+ DISPID_NEWENUM, &IID_NULL, LOCALE_NEUTRAL,
+ DISPATCH_METHOD, &dispparams, &varresult,
+ NULL, NULL);
+ if (FAILED(hres))
+ {
+ ERR("Enumerator: no DISPID_NEWENUM.\n");
+ hres = E_INVALIDARG;
+ goto cleanuperr;
+ }
+
+ if ((V_VT(&varresult) == VT_DISPATCH) ||
+ (V_VT(&varresult) == VT_UNKNOWN))
+ {
+ hres = IUnknown_QueryInterface(V_UNKNOWN(&varresult),
+ &IID_IEnumVARIANT, (void**)&enumvar);
+ if (FAILED(hres))
+ {
+ hres = E_INVALIDARG;
+ goto cleanuperr;
+ }
+ }
+ else
+ {
+ ERR("Enumerator: NewEnum unexpected type of varresult (%d).\n", V_VT(&varresult));
+ hres = E_INVALIDARG;
+ goto cleanuperr;
+ }
+ VariantClear(&varresult);
+ }
+ else
+ {
+ ERR("I don't know how to handle this type!\n");
+ hres = E_NOTIMPL;
+ goto cleanuperr;
+ }
hres = alloc_enumerator(ctx, NULL, &enumerator);
if(FAILED(hres))
- return hres;
+ goto cleanuperr;
+
+ enumerator->enumvar = enumvar;
+ if (enumvar)
+ {
+ hres = enumvar_get_next_item(enumerator, TRUE);
+ if (FAILED(hres))
+ goto cleanuperr;
+ }
+ else
+ enumerator->item = jsval_undefined();
*ret = &enumerator->dispex;
+
return S_OK;
+cleanuperr:
+ VariantClear(&varresult);
+ if (enumerator)
+ heap_free(enumerator);
+ return hres;
}
--
2.11.0
2
3
[PATCH 1/4] quartz: Make Parser_OutputPin_BreakConnect() a local helper.
by Zebediah Figura May 11, 2019
by Zebediah Figura May 11, 2019
May 11, 2019
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/quartz/parser.c | 41 ++++++++++++++++++-----------------------
1 file changed, 18 insertions(+), 23 deletions(-)
diff --git a/dlls/quartz/parser.c b/dlls/quartz/parser.c
index 9278a58bf7..d92161f1c2 100644
--- a/dlls/quartz/parser.c
+++ b/dlls/quartz/parser.c
@@ -46,7 +46,6 @@ static HRESULT WINAPI Parser_OutputPin_DecideBufferSize(BaseOutputPin *iface, IM
static HRESULT WINAPI Parser_OutputPin_CheckMediaType(BasePin *pin, const AM_MEDIA_TYPE *pmt);
static HRESULT WINAPI Parser_OutputPin_GetMediaType(BasePin *iface, int iPosition, AM_MEDIA_TYPE *pmt);
static HRESULT WINAPI Parser_OutputPin_DecideAllocator(BaseOutputPin *This, IMemInputPin *pPin, IMemAllocator **pAlloc);
-static HRESULT WINAPI Parser_OutputPin_BreakConnect(BaseOutputPin *This);
static inline ParserImpl *impl_from_IMediaSeeking( IMediaSeeking *iface )
{
@@ -429,7 +428,7 @@ static const BaseOutputPinFuncTable output_BaseOutputFuncTable = {
BaseOutputPinImpl_AttemptConnection,
Parser_OutputPin_DecideBufferSize,
Parser_OutputPin_DecideAllocator,
- Parser_OutputPin_BreakConnect
+ NULL,
};
HRESULT Parser_AddPin(ParserImpl * This, const PIN_INFO * piOutput, ALLOCATOR_PROPERTIES * props, const AM_MEDIA_TYPE * amt)
@@ -468,6 +467,22 @@ HRESULT Parser_AddPin(ParserImpl * This, const PIN_INFO * piOutput, ALLOCATOR_PR
return hr;
}
+static HRESULT WINAPI break_connection(IPin *iface)
+{
+ Parser_OutputPin *pin = unsafe_impl_Parser_OutputPin_from_IPin(iface);
+ HRESULT hr;
+
+ if (!pin->pin.pin.pConnectedTo || !pin->pin.pMemInputPin)
+ hr = VFW_E_NOT_CONNECTED;
+ else
+ {
+ hr = IPin_Disconnect(pin->pin.pin.pConnectedTo);
+ IPin_Disconnect(iface);
+ }
+
+ return hr;
+}
+
static HRESULT Parser_RemoveOutputPins(ParserImpl * This)
{
/* NOTE: should be in critical section when calling this function */
@@ -483,7 +498,7 @@ static HRESULT Parser_RemoveOutputPins(ParserImpl * This)
for (i = 0; i < This->cStreams; i++)
{
- hr = ((BaseOutputPin *)ppOldPins[i + 1])->pFuncsTable->pfnBreakConnect((BaseOutputPin *)ppOldPins[i + 1]);
+ hr = break_connection(ppOldPins[i + 1]);
TRACE("Disconnect: %08x\n", hr);
IPin_Release(ppOldPins[i + 1]);
}
@@ -609,26 +624,6 @@ static HRESULT WINAPI Parser_OutputPin_DecideAllocator(BaseOutputPin *iface, IMe
return hr;
}
-static HRESULT WINAPI Parser_OutputPin_BreakConnect(BaseOutputPin *This)
-{
- HRESULT hr;
-
- TRACE("(%p)->()\n", This);
-
- EnterCriticalSection(This->pin.pCritSec);
- if (!This->pin.pConnectedTo || !This->pMemInputPin)
- hr = VFW_E_NOT_CONNECTED;
- else
- {
- hr = IPin_Disconnect(This->pin.pConnectedTo);
- IPin_Disconnect(&This->pin.IPin_iface);
- }
- LeaveCriticalSection(This->pin.pCritSec);
-
- return hr;
-}
-
-
static HRESULT WINAPI Parser_OutputPin_QueryInterface(IPin * iface, REFIID riid, LPVOID * ppv)
{
Parser_OutputPin *This = unsafe_impl_Parser_OutputPin_from_IPin(iface);
--
2.21.0
2
7
May 11, 2019
From: Michael Müller <michael(a)fds-team.de>
v2:
Added and Correct tests
Use IContextMenu3 for all IContextMenu* interfaces.
Use heap_alloc/free functions
v3:
Correct header issue when compiling i386 (var_arg)
v4:
Add context handler for directories New Menu to wine.inf
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=24812
From: Michael Müller <michael(a)fds-team.de>
Signed-off-by: Vijay Kiran Kamuju <infyquest(a)gmail.com>
---
dlls/shell32/Makefile.in | 1 +
dlls/shell32/shell32_classes.idl | 5 +
dlls/shell32/shell32_main.h | 1 +
dlls/shell32/shellnew.c | 498 +++++++++++++++++++++++++++++++
dlls/shell32/shellole.c | 1 +
dlls/shell32/tests/shlview.c | 9 +-
loader/wine.inf.in | 1 +
7 files changed, 515 insertions(+), 1 deletion(-)
create mode 100644 dlls/shell32/shellnew.c
diff --git a/dlls/shell32/Makefile.in b/dlls/shell32/Makefile.in
index 20365b96fb..0fbc86ecf9 100644
--- a/dlls/shell32/Makefile.in
+++ b/dlls/shell32/Makefile.in
@@ -32,6 +32,7 @@ C_SRCS = \
shelldispatch.c \
shellitem.c \
shelllink.c \
+ shellnew.c \
shellole.c \
shellord.c \
shellpath.c \
diff --git a/dlls/shell32/shell32_classes.idl b/dlls/shell32/shell32_classes.idl
index 6ed497fea5..60de627be3 100644
--- a/dlls/shell32/shell32_classes.idl
+++ b/dlls/shell32/shell32_classes.idl
@@ -80,6 +80,11 @@ coclass KnownFolderManager { interface IKnownFolderManager; }
uuid(4657278a-411b-11d2-839a-00c04fd918d0)
] coclass DragDropHelper { interface IDropTargetHelper; }
+[
+ threading(apartment),
+ uuid(d969a300-e7ff-11d0-a93b-00a0c90f2719)
+] coclass NewMenu { interface IShellExtInit; }
+
[
threading(apartment),
uuid(00bb2763-6a77-11d0-a535-00c04fd7d062)
diff --git a/dlls/shell32/shell32_main.h b/dlls/shell32/shell32_main.h
index 11a96309e8..6d6da97f11 100644
--- a/dlls/shell32/shell32_main.h
+++ b/dlls/shell32/shell32_main.h
@@ -103,6 +103,7 @@ HRESULT WINAPI RecycleBin_Constructor(IUnknown * pUnkOuter, REFIID riif, LPVOID
HRESULT WINAPI QueryAssociations_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppOutput) DECLSPEC_HIDDEN;
HRESULT WINAPI ExplorerBrowser_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppv) DECLSPEC_HIDDEN;
HRESULT WINAPI KnownFolderManager_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppv) DECLSPEC_HIDDEN;
+HRESULT WINAPI NewMenu_Constructor(IUnknown *outer, REFIID riid, LPVOID *ppv) DECLSPEC_HIDDEN;
extern HRESULT CPanel_GetIconLocationW(LPCITEMIDLIST, LPWSTR, UINT, int*) DECLSPEC_HIDDEN;
HRESULT WINAPI CPanel_ExtractIconA(LPITEMIDLIST pidl, LPCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize) DECLSPEC_HIDDEN;
HRESULT WINAPI CPanel_ExtractIconW(LPITEMIDLIST pidl, LPCWSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize) DECLSPEC_HIDDEN;
diff --git a/dlls/shell32/shellnew.c b/dlls/shell32/shellnew.c
new file mode 100644
index 0000000000..89be091e03
--- /dev/null
+++ b/dlls/shell32/shellnew.c
@@ -0,0 +1,498 @@
+/*
+ * Copyright 2015 Michael Müller
+ *
+ * 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 "config.h"
+
+#define COBJMACROS
+#define NONAMELESSUNION
+
+#include <stdarg.h>
+
+#include "winerror.h"
+#include "windef.h"
+#include "winbase.h"
+#include "winnls.h"
+#include "winreg.h"
+
+#include "winuser.h"
+#include "wingdi.h"
+#include "shlobj.h"
+#include "undocshell.h"
+
+#include "pidl.h"
+#include "shell32_main.h"
+#include "shlguid.h"
+#include "shlwapi.h"
+#include "shresdef.h"
+#include "shellfolder.h"
+
+#include "wine/heap.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(shell);
+
+typedef struct
+{
+ IShellExtInit IShellExtInit_iface;
+ IContextMenu3 IContextMenu3_iface;
+ IObjectWithSite IObjectWithSite_iface;
+
+ LONG ref;
+ IUnknown *site;
+ LPITEMIDLIST pidl;
+ HICON icon_folder;
+
+ UINT folder_cmd;
+} NewMenuImpl;
+
+static inline NewMenuImpl *impl_from_IShellExtInit(IShellExtInit *iface)
+{
+ return CONTAINING_RECORD(iface, NewMenuImpl, IShellExtInit_iface);
+}
+
+static inline NewMenuImpl *impl_from_IContextMenu3(IContextMenu3 *iface)
+{
+ return CONTAINING_RECORD(iface, NewMenuImpl, IContextMenu3_iface);
+}
+
+static inline NewMenuImpl *impl_from_IObjectWithSite(IObjectWithSite *iface)
+{
+ return CONTAINING_RECORD(iface, NewMenuImpl, IObjectWithSite_iface);
+}
+
+static HRESULT WINAPI
+NewMenu_ExtInit_QueryInterface(IShellExtInit *iface, REFIID riid, void **ppv)
+{
+ NewMenuImpl *This = impl_from_IShellExtInit(iface);
+ TRACE("(%p)->(%s)\n", This, debugstr_guid(riid));
+
+ *ppv = NULL;
+
+ if (IsEqualIID(riid, &IID_IUnknown) ||
+ IsEqualIID(riid, &IID_IShellExtInit))
+ {
+ *ppv = &This->IShellExtInit_iface;
+ }
+ else if (IsEqualIID(riid, &IID_IObjectWithSite))
+ {
+ *ppv = &This->IObjectWithSite_iface;
+ }
+ else if (IsEqualIID(riid, &IID_IContextMenu) ||
+ IsEqualIID(riid, &IID_IContextMenu2) ||
+ IsEqualIID(riid, &IID_IContextMenu3))
+ {
+ *ppv = &This->IContextMenu3_iface;
+ }
+
+ if (*ppv)
+ {
+ IUnknown_AddRef((IUnknown *)*ppv);
+ TRACE("-- Interface: (%p)->(%p)\n", ppv, *ppv);
+ return S_OK;
+ }
+
+ ERR("-- Interface: E_NOINTERFACE for %s\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI
+NewMenu_ExtInit_AddRef(IShellExtInit *iface)
+{
+ NewMenuImpl *This = impl_from_IShellExtInit(iface);
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p), refcount=%i\n", iface, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI
+NewMenu_ExtInit_Release(IShellExtInit *iface)
+{
+ NewMenuImpl *This = impl_from_IShellExtInit(iface);
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p), refcount=%i\n", iface, ref);
+
+ if (!ref)
+ {
+ if (This->site) IUnknown_Release(This->site);
+ if (This->pidl) ILFree(This->pidl);
+ heap_free(This);
+ }
+
+ return ref;
+}
+
+static HRESULT WINAPI
+NewMenu_ExtInit_Initialize(IShellExtInit *iface, LPCITEMIDLIST pidl, IDataObject *obj, HKEY key)
+{
+ NewMenuImpl *This = impl_from_IShellExtInit(iface);
+
+ TRACE("(%p)->(%p, %p, %p)\n", This, pidl, obj, key );
+
+ if (!pidl)
+ return E_FAIL;
+
+ if (This->pidl) ILFree(This->pidl);
+ This->pidl = ILClone(pidl);
+ This->icon_folder = LoadImageW(shell32_hInstance, (LPCWSTR)MAKEINTRESOURCE(IDI_SHELL_FOLDER), IMAGE_ICON,
+ GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_SHARED);
+
+ return S_OK;
+}
+
+static const IShellExtInitVtbl eivt =
+{
+ NewMenu_ExtInit_QueryInterface,
+ NewMenu_ExtInit_AddRef,
+ NewMenu_ExtInit_Release,
+ NewMenu_ExtInit_Initialize
+};
+
+
+static HRESULT WINAPI
+NewMenu_ObjectWithSite_QueryInterface(IObjectWithSite *iface, REFIID riid, void **ppv)
+{
+ NewMenuImpl *This = impl_from_IObjectWithSite(iface);
+ return NewMenu_ExtInit_QueryInterface(&This->IShellExtInit_iface, riid, ppv);
+}
+
+static ULONG WINAPI
+NewMenu_ObjectWithSite_AddRef(IObjectWithSite *iface)
+{
+ NewMenuImpl *This = impl_from_IObjectWithSite(iface);
+ return NewMenu_ExtInit_AddRef(&This->IShellExtInit_iface);
+}
+
+static ULONG WINAPI
+NewMenu_ObjectWithSite_Release(IObjectWithSite *iface)
+{
+ NewMenuImpl *This = impl_from_IObjectWithSite(iface);
+ return NewMenu_ExtInit_Release(&This->IShellExtInit_iface);
+}
+
+static HRESULT WINAPI
+NewMenu_ObjectWithSite_GetSite(IObjectWithSite *iface, REFIID iid, void **ppv)
+{
+ NewMenuImpl *This = impl_from_IObjectWithSite(iface);
+
+ TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(iid), ppv);
+
+ if (!This->site)
+ return E_FAIL;
+
+ return IUnknown_QueryInterface(This->site, iid, ppv);
+}
+
+static HRESULT WINAPI
+NewMenu_ObjectWithSite_SetSite(IObjectWithSite *iface, IUnknown *punk)
+{
+ NewMenuImpl *This = impl_from_IObjectWithSite(iface);
+
+ TRACE("(%p)->(%p)\n", This, punk);
+
+ if (punk)
+ IUnknown_AddRef(punk);
+
+ if (This->site)
+ IUnknown_Release(This->site);
+
+ This->site = punk;
+ return S_OK;
+}
+
+static const IObjectWithSiteVtbl owsvt =
+{
+ NewMenu_ObjectWithSite_QueryInterface,
+ NewMenu_ObjectWithSite_AddRef,
+ NewMenu_ObjectWithSite_Release,
+ NewMenu_ObjectWithSite_SetSite,
+ NewMenu_ObjectWithSite_GetSite,
+};
+
+
+static HRESULT WINAPI
+NewMenu_ContextMenu3_QueryInterface(IContextMenu3 *iface, REFIID riid, void **ppv)
+{
+ NewMenuImpl *This = impl_from_IContextMenu3(iface);
+ return NewMenu_ExtInit_QueryInterface(&This->IShellExtInit_iface, riid, ppv);
+}
+
+static ULONG WINAPI
+NewMenu_ContextMenu3_AddRef(IContextMenu3 *iface)
+{
+ NewMenuImpl *This = impl_from_IContextMenu3(iface);
+ return NewMenu_ExtInit_AddRef(&This->IShellExtInit_iface);
+}
+
+static ULONG WINAPI
+NewMenu_ContextMenu3_Release(IContextMenu3 *iface)
+{
+ NewMenuImpl *This = impl_from_IContextMenu3(iface);
+ return NewMenu_ExtInit_Release(&This->IShellExtInit_iface);
+}
+
+static HRESULT WINAPI
+NewMenu_ContextMenu3_GetCommandString(IContextMenu3 *iface, UINT_PTR cmd, UINT type,
+ UINT *reserved, LPSTR name, UINT max_len)
+{
+ NewMenuImpl *This = impl_from_IContextMenu3(iface);
+
+ FIXME("(%p)->(%lu %u %p %p %u): stub\n", This, cmd, type, reserved, name, max_len);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT create_folder(NewMenuImpl *This, IShellView *view)
+{
+ IFolderView *folder_view = NULL;
+ IShellFolder *desktop = NULL;
+ IShellFolder *parent = NULL;
+ ISFHelper *helper = NULL;
+ LPITEMIDLIST pidl = NULL;
+ WCHAR nameW[MAX_PATH];
+ HRESULT hr;
+
+ if (view)
+ {
+ hr = IShellView_QueryInterface(view, &IID_IFolderView, (void **)&folder_view);
+ if (FAILED(hr)) return hr;
+
+ hr = IFolderView_GetFolder(folder_view, &IID_IShellFolder, (void **)&parent);
+ if (FAILED(hr)) goto out;
+ }
+ else
+ {
+ hr = SHGetDesktopFolder(&desktop);
+ if (FAILED(hr)) goto out;
+
+ hr = IShellFolder_BindToObject(desktop, This->pidl, NULL, &IID_IShellFolder, (void **)&parent);
+ if (FAILED(hr)) goto out;
+ }
+
+ IShellFolder_QueryInterface(parent, &IID_ISFHelper, (void **)&helper);
+ if (FAILED(hr)) goto out;
+
+ hr = ISFHelper_GetUniqueName(helper, nameW, MAX_PATH);
+ if (FAILED(hr)) goto out;
+
+ hr = ISFHelper_AddFolder(helper, 0, nameW, &pidl);
+ if (FAILED(hr)) goto out;
+
+ if (view)
+ {
+ IShellView_SelectItem(view, pidl, SVSI_DESELECTOTHERS | SVSI_EDIT |
+ SVSI_ENSUREVISIBLE | SVSI_FOCUSED | SVSI_SELECT);
+ }
+
+out:
+ if (pidl) SHFree(pidl);
+ if (helper) ISFHelper_Release(helper);
+ if (parent) IShellFolder_Release(parent);
+ if (desktop) IShellFolder_Release(desktop);
+ if (folder_view) IFolderView_Release(folder_view);
+ return hr;
+}
+
+static HRESULT WINAPI
+NewMenu_ContextMenu3_InvokeCommand(IContextMenu3 *iface, LPCMINVOKECOMMANDINFO info)
+{
+ NewMenuImpl *This = impl_from_IContextMenu3(iface);
+ IShellBrowser *browser;
+ IShellView *view = NULL;
+ HRESULT hr = E_FAIL;
+
+ TRACE("(%p)->(%p)\n", This, info);
+
+ /* New Folder */
+ if (info->lpVerb == 0)
+ {
+ if ((browser = (IShellBrowser *)SendMessageA(info->hwnd, CWM_GETISHELLBROWSER, 0, 0)))
+ {
+ if (FAILED(IShellBrowser_QueryActiveShellView(browser, &view)))
+ view = NULL;
+ }
+ hr = create_folder(This, view);
+ if (view) IShellView_Release(view);
+ }
+
+ return hr;
+}
+
+static UINT insert_new_menu_items(NewMenuImpl *This, HMENU menu, UINT pos, UINT cmd_first, UINT cmd_last)
+{
+ MENUITEMINFOW item;
+ WCHAR buffer[256];
+
+ memset(&item, 0, sizeof(item));
+ item.cbSize = sizeof(item);
+
+ if (cmd_first > cmd_last)
+ return cmd_first;
+
+ /* FIXME: on windows it is only 'Folder' not 'New Folder' */
+ if (!LoadStringW(shell32_hInstance, IDS_NEWFOLDER, buffer, sizeof(buffer) / sizeof(WCHAR)))
+ buffer[0] = 0;
+
+ item.fMask = MIIM_ID | MIIM_BITMAP | MIIM_STRING;
+ item.dwTypeData = buffer;
+ item.cch = strlenW(buffer);
+ item.wID = cmd_first;
+ item.hbmpItem = HBMMENU_CALLBACK;
+ if (InsertMenuItemW(menu, pos, TRUE, &item))
+ {
+ This->folder_cmd = cmd_first++;
+ pos++;
+ }
+
+ return cmd_first;
+}
+
+static HRESULT WINAPI
+NewMenu_ContextMenu3_QueryContextMenu(IContextMenu3 *iface, HMENU menu, UINT index,
+ UINT cmd_first, UINT cmd_last, UINT flags)
+{
+ static WCHAR newW[] = {'N','e','w',0};
+ NewMenuImpl *This = impl_from_IContextMenu3(iface);
+ MENUITEMINFOW item;
+ HMENU submenu;
+ UINT id;
+
+ TRACE("(%p)->(%p, %u, %u, %u, %u)\n", This,
+ menu, index, cmd_first, cmd_last, flags );
+
+ if (!This->pidl)
+ return E_FAIL;
+
+ submenu = CreateMenu();
+ if (!submenu) return E_FAIL;
+
+ id = insert_new_menu_items(This, submenu, 0, cmd_first, cmd_last);
+
+ memset(&item, 0, sizeof(item));
+ item.cbSize = sizeof(item);
+ item.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE | MIIM_SUBMENU;
+ item.fType = MFT_STRING;
+ item.wID = -1;
+ item.dwTypeData = newW; /* FIXME: load from resource file */
+ item.cch = strlenW(newW);
+ item.fState = MFS_ENABLED;
+ item.hSubMenu = submenu;
+
+ if (!InsertMenuItemW(menu, index, TRUE, &item))
+ return E_FAIL;
+
+ return MAKE_HRESULT(SEVERITY_SUCCESS, 0, id);
+}
+
+static HRESULT WINAPI
+NewMenu_ContextMenu3_HandleMenuMsg2(IContextMenu3 *iface, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *result)
+{
+ NewMenuImpl *This = impl_from_IContextMenu3(iface);
+
+ TRACE("(%p)->(%u, %lx, %lx, %p)\n", This, uMsg, wParam, lParam, result);
+
+ switch (uMsg)
+ {
+ case WM_MEASUREITEM:
+ {
+ MEASUREITEMSTRUCT *mis = (MEASUREITEMSTRUCT *)lParam;
+ if (!mis || mis->CtlType != ODT_MENU)
+ break;
+
+ if (This->folder_cmd == mis->itemID)
+ {
+ mis->itemWidth = GetSystemMetrics(SM_CXSMICON);
+ mis->itemHeight = GetSystemMetrics(SM_CYSMICON);
+ }
+
+ if (result) *result = TRUE;
+ break;
+ }
+
+ case WM_DRAWITEM:
+ {
+ DRAWITEMSTRUCT *dis = (DRAWITEMSTRUCT *)lParam;
+ HICON icon = 0;
+ UINT x, y;
+
+ if (!dis || dis->CtlType != ODT_MENU)
+ break;
+
+ if (This->folder_cmd == dis->itemID)
+ icon = This->icon_folder;
+
+ if (!icon)
+ break;
+
+ x = (dis->rcItem.right - dis->rcItem.left - GetSystemMetrics(SM_CXSMICON)) / 2;
+ y = (dis->rcItem.bottom - dis->rcItem.top - GetSystemMetrics(SM_CYSMICON)) / 2;
+ DrawStateW(dis->hDC, NULL, NULL, (LPARAM)icon, 0, x, y, 0, 0, DST_ICON | DSS_NORMAL);
+
+ if (result) *result = TRUE;
+ break;
+ }
+ }
+
+ return S_OK;
+}
+
+static HRESULT WINAPI
+NewMenu_ContextMenu3_HandleMenuMsg(IContextMenu3 *iface, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ return NewMenu_ContextMenu3_HandleMenuMsg2(iface, uMsg, wParam, lParam, NULL);
+}
+
+static const IContextMenu3Vtbl cmvt3 =
+{
+ NewMenu_ContextMenu3_QueryInterface,
+ NewMenu_ContextMenu3_AddRef,
+ NewMenu_ContextMenu3_Release,
+ NewMenu_ContextMenu3_QueryContextMenu,
+ NewMenu_ContextMenu3_InvokeCommand,
+ NewMenu_ContextMenu3_GetCommandString,
+ NewMenu_ContextMenu3_HandleMenuMsg,
+ NewMenu_ContextMenu3_HandleMenuMsg2
+};
+
+HRESULT WINAPI NewMenu_Constructor(IUnknown *outer, REFIID riid, void **obj)
+{
+ NewMenuImpl *menu;
+ HRESULT hr;
+
+ TRACE("outer=%p riid=%s\n", outer, debugstr_guid(riid));
+
+ *obj = NULL;
+
+ if (outer)
+ return CLASS_E_NOAGGREGATION;
+
+ menu = heap_alloc_zero(sizeof(NewMenuImpl));
+ if (!menu) return E_OUTOFMEMORY;
+
+ menu->ref = 1;
+ menu->IShellExtInit_iface.lpVtbl = &eivt;
+ menu->IContextMenu3_iface.lpVtbl = &cmvt3;
+ menu->IObjectWithSite_iface.lpVtbl = &owsvt;
+
+ TRACE("(%p)\n", menu);
+
+ hr = IShellExtInit_QueryInterface(&menu->IShellExtInit_iface, riid, obj);
+ IShellExtInit_Release(&menu->IShellExtInit_iface);
+ return hr;
+}
diff --git a/dlls/shell32/shellole.c b/dlls/shell32/shellole.c
index 3fe96801aa..649e6460cf 100644
--- a/dlls/shell32/shellole.c
+++ b/dlls/shell32/shellole.c
@@ -89,6 +89,7 @@ static const struct {
{&CLSID_Shell, IShellDispatch_Constructor},
{&CLSID_DestinationList, CustomDestinationList_Constructor},
{&CLSID_ShellImageDataFactory, ShellImageDataFactory_Constructor},
+ {&CLSID_NewMenu, NewMenu_Constructor},
{NULL, NULL}
};
diff --git a/dlls/shell32/tests/shlview.c b/dlls/shell32/tests/shlview.c
index f5d96c8d44..dbb24d9356 100644
--- a/dlls/shell32/tests/shlview.c
+++ b/dlls/shell32/tests/shlview.c
@@ -1479,7 +1479,6 @@ static void test_newmenu(void)
HRESULT hr;
hr = CoCreateInstance(&CLSID_NewMenu, NULL, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk);
-todo_wine
ok(hr == S_OK, "Failed to create NewMenu object, hr %#x.\n", hr);
if (hr != S_OK)
{
@@ -1491,6 +1490,14 @@ todo_wine
ok(hr == S_OK, "Failed to get IShellExtInit, hr %#x.\n", hr);
IUnknown_Release(unk2);
+ hr = IUnknown_QueryInterface(unk, &IID_IContextMenu, (void **)&unk2);
+ ok(hr == S_OK, "Failed to get IContextMenu, hr %#x.\n", hr);
+ IUnknown_Release(unk2);
+
+ hr = IUnknown_QueryInterface(unk, &IID_IContextMenu2, (void **)&unk2);
+ ok(hr == S_OK, "Failed to get IContextMenu2, hr %#x.\n", hr);
+ IUnknown_Release(unk2);
+
hr = IUnknown_QueryInterface(unk, &IID_IContextMenu3, (void **)&unk2);
ok(hr == S_OK, "Failed to get IContextMenu3, hr %#x.\n", hr);
IUnknown_Release(unk2);
diff --git a/loader/wine.inf.in b/loader/wine.inf.in
index 4d28a93c35..0a9e8a4028 100644
--- a/loader/wine.inf.in
+++ b/loader/wine.inf.in
@@ -198,6 +198,7 @@ HKCR,chm.file\shell\open\command,,2,"%10%\hh.exe %1"
HKCR,cplfile,,2,"Control Panel Item"
HKCR,cplfile\shell\cplopen,,2,"Open with Control Panel"
HKCR,cplfile\shell\cplopen\command,,2,"rundll32.exe shell32.dll,Control_RunDLL ""%1"",%*"
+HKCR,Directory\Background\shellex\ContextMenuHandlers\New,,16
HKCR,DirectShow,,16
HKCR,exefile,,2,"Application"
HKCR,exefile\DefaultIcon,,2,"%1"
--
2.21.0
1
0
May 11, 2019
Note that the test is interactive since it requires
a reboot (on windows) and a rerun on wine.
AFAIK there's no way around those limitations, so this is the
test I came up with.
Signed-off-by: Fabian Maurer <dark.shadow4(a)web.de>
---
dlls/ntdll/tests/env.c | 57 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 57 insertions(+)
diff --git a/dlls/ntdll/tests/env.c b/dlls/ntdll/tests/env.c
index 4e2ef8222d..41cb44ecd2 100644
--- a/dlls/ntdll/tests/env.c
+++ b/dlls/ntdll/tests/env.c
@@ -515,6 +515,59 @@ static void test_process_params(void)
}
}
+static BOOL setup_environment(void)
+{
+ HKEY key;
+ LSTATUS status;
+ LPCSTR value1 = "%WINETESTVAR2%";
+ LPCSTR value2 = "test ok";
+ BOOL is_ready;
+ const char *path = "System\\CurrentControlSet\\Control\\Session Manager\\Environment";
+ status = RegOpenKeyExA(HKEY_LOCAL_MACHINE, path, 0, KEY_ALL_ACCESS, &key);
+ ok(status == ERROR_SUCCESS, "RegOpenKeyExA failed with %d\n", status);
+
+ status = RegQueryValueExA(key, "WINETESTVAR1", NULL, NULL, NULL, NULL);
+ ok(status == ERROR_SUCCESS || status == ERROR_FILE_NOT_FOUND, "RegQueryValueExA failed with %d\n", status);
+ is_ready = (status == ERROR_SUCCESS);
+ if (!is_ready)
+ {
+ status = RegSetValueExA(key, "WINETESTVAR1", 0, REG_EXPAND_SZ,(LPBYTE)value1, strlen(value1) + 1);
+ ok(status == ERROR_SUCCESS, "RegSetValueExA failed with %d\n", status);
+ status = RegSetValueExA(key, "WINETESTVAR2", 0, REG_EXPAND_SZ,(LPBYTE)value2, strlen(value2) + 1);
+ ok(status == ERROR_SUCCESS, "RegSetValueExA failed with %d\n", status);
+ }
+ RegCloseKey(key);
+
+ return is_ready;
+}
+
+static void test_peb_environment(void)
+{
+ static const WCHAR result1[] = {'W','I','N','E','T','E','S','T','V','A','R','1','=','t','e','s','t',' ','o','k',0};
+ static const WCHAR result2[] = {'W','I','N','E','T','E','S','T','V','A','R','2','=','t','e','s','t',' ','o','k',0};
+ BOOL found1 = FALSE;
+ BOOL found2 = FALSE;
+ BOOL is_ready = setup_environment();
+ if (is_ready)
+ {
+ WCHAR *env = NtCurrentTeb()->Peb->ProcessParameters->Environment;
+ for (; *env; env += lstrlenW(env) + 1)
+ {
+ if (lstrcmpW(env, result1) == 0)
+ found1 = TRUE;
+ if (lstrcmpW(env, result2) == 0)
+ found2 = TRUE;
+ }
+ todo_wine
+ ok(found1, "Didn't find %s in the PEB environment variables\n", wine_dbgstr_w(result1));
+ ok(found2, "Didn't find %s in the PEB environment variables\n", wine_dbgstr_w(result2));
+ }
+ else
+ {
+ skip("Preparation finished. Restart when running windows, then rerun the test for the results.\n");
+ }
+}
+
START_TEST(env)
{
HMODULE mod = GetModuleHandleA("ntdll.dll");
@@ -535,4 +588,8 @@ START_TEST(env)
testSet();
testExpand();
test_process_params();
+ if (winetest_interactive)
+ {
+ test_peb_environment();
+ }
}
--
2.21.0
1
1
[resend PATCH] dxdiagn: Enumerate DirectSound devices and add some basic properties.
by Vijay Kiran Kamuju May 11, 2019
by Vijay Kiran Kamuju May 11, 2019
May 11, 2019
From: Michael Müller <michael(a)fds-team.de>
From: Michael Müller <michael(a)fds-team.de>
Signed-off-by: Vijay Kiran Kamuju <infyquest(a)gmail.com>
---
dlls/dxdiagn/Makefile.in | 2 +-
dlls/dxdiagn/provider.c | 91 +++++++++++++++++++++
dlls/dxdiagn/tests/container.c | 141 +++++++++++++++++++++++++++++++++
3 files changed, 233 insertions(+), 1 deletion(-)
diff --git a/dlls/dxdiagn/Makefile.in b/dlls/dxdiagn/Makefile.in
index c16396e464..e926d3b2a8 100644
--- a/dlls/dxdiagn/Makefile.in
+++ b/dlls/dxdiagn/Makefile.in
@@ -1,5 +1,5 @@
MODULE = dxdiagn.dll
-IMPORTS = strmiids dxguid uuid d3d9 ddraw version ole32 oleaut32 user32 advapi32
+IMPORTS = strmiids dxguid uuid d3d9 ddraw version ole32 oleaut32 user32 advapi32 dsound
C_SRCS = \
container.c \
diff --git a/dlls/dxdiagn/provider.c b/dlls/dxdiagn/provider.c
index 46193e90b0..fa17a5978f 100644
--- a/dlls/dxdiagn/provider.c
+++ b/dlls/dxdiagn/provider.c
@@ -38,6 +38,7 @@
#include "wine/fil_data.h"
#include "psapi.h"
#include "wbemcli.h"
+#include "dsound.h"
#include "wine/debug.h"
@@ -1365,11 +1366,85 @@ static HRESULT build_displaydevices_tree(IDxDiagContainerImpl_Container *node)
return fill_display_information_fallback(node);
}
+struct enum_context
+{
+ IDxDiagContainerImpl_Container *cont;
+ HRESULT hr;
+ int index;
+};
+
+static const WCHAR szGUIDFmt[] =
+{
+ '%','0','8','x','-','%','0','4','x','-','%','0','4','x','-','%','0',
+ '2','x','%','0','2','x','-','%','0','2','x','%','0','2','x','%','0','2',
+ 'x','%','0','2','x','%','0','2','x','%','0','2','x',0
+};
+
+static LPWSTR guid_to_string(LPWSTR lpwstr, REFGUID lpcguid)
+{
+ wsprintfW(lpwstr, szGUIDFmt, lpcguid->Data1, lpcguid->Data2,
+ lpcguid->Data3, lpcguid->Data4[0], lpcguid->Data4[1],
+ lpcguid->Data4[2], lpcguid->Data4[3], lpcguid->Data4[4],
+ lpcguid->Data4[5], lpcguid->Data4[6], lpcguid->Data4[7]);
+
+ return lpwstr;
+}
+
+BOOL CALLBACK dsound_enum(LPGUID guid, LPCWSTR desc, LPCWSTR module, LPVOID context)
+{
+ static const WCHAR deviceid_fmtW[] = {'%','u',0};
+ static const WCHAR szGuidDeviceID[] = {'s','z','G','u','i','d','D','e','v','i','c','e','I','D',0};
+ static const WCHAR szDriverPath[] = {'s','z','D','r','i','v','e','r','P','a','t','h',0};
+
+ struct enum_context *enum_ctx = context;
+ IDxDiagContainerImpl_Container *device;
+ WCHAR buffer[256];
+ const WCHAR *p, *name;
+
+ /* the default device is enumerated twice, one time without GUID */
+ if (!guid) return TRUE;
+
+ snprintfW(buffer, sizeof(buffer)/sizeof(WCHAR), deviceid_fmtW, enum_ctx->index);
+ device = allocate_information_node(buffer);
+ if (!device)
+ {
+ enum_ctx->hr = E_OUTOFMEMORY;
+ return FALSE;
+ }
+
+ add_subcontainer(enum_ctx->cont, device);
+
+ guid_to_string(buffer, guid);
+ enum_ctx->hr = add_bstr_property(device, szGuidDeviceID, buffer);
+ if (FAILED(enum_ctx->hr))
+ return FALSE;
+
+ enum_ctx->hr = add_bstr_property(device, szDescription, desc);
+ if (FAILED(enum_ctx->hr))
+ return FALSE;
+
+ enum_ctx->hr = add_bstr_property(device, szDriverPath, module);
+ if (FAILED(enum_ctx->hr))
+ return FALSE;
+
+ name = module;
+ if ((p = strrchrW(name, '\\'))) name = p + 1;
+ if ((p = strrchrW(name, '/'))) name = p + 1;
+
+ enum_ctx->hr = add_bstr_property(device, szDriverName, name);
+ if (FAILED(enum_ctx->hr))
+ return FALSE;
+
+ enum_ctx->index++;
+ return TRUE;
+}
+
static HRESULT build_directsound_tree(IDxDiagContainerImpl_Container *node)
{
static const WCHAR DxDiag_SoundDevices[] = {'D','x','D','i','a','g','_','S','o','u','n','d','D','e','v','i','c','e','s',0};
static const WCHAR DxDiag_SoundCaptureDevices[] = {'D','x','D','i','a','g','_','S','o','u','n','d','C','a','p','t','u','r','e','D','e','v','i','c','e','s',0};
+ struct enum_context enum_ctx;
IDxDiagContainerImpl_Container *cont;
cont = allocate_information_node(DxDiag_SoundDevices);
@@ -1378,12 +1453,28 @@ static HRESULT build_directsound_tree(IDxDiagContainerImpl_Container *node)
add_subcontainer(node, cont);
+ enum_ctx.cont = cont;
+ enum_ctx.hr = S_OK;
+ enum_ctx.index = 0;
+
+ DirectSoundEnumerateW(dsound_enum, &enum_ctx);
+ if (FAILED(enum_ctx.hr))
+ return enum_ctx.hr;
+
cont = allocate_information_node(DxDiag_SoundCaptureDevices);
if (!cont)
return E_OUTOFMEMORY;
add_subcontainer(node, cont);
+ enum_ctx.cont = cont;
+ enum_ctx.hr = S_OK;
+ enum_ctx.index = 0;
+
+ DirectSoundCaptureEnumerateW(dsound_enum, &enum_ctx);
+ if (FAILED(enum_ctx.hr))
+ return enum_ctx.hr;
+
return S_OK;
}
diff --git a/dlls/dxdiagn/tests/container.c b/dlls/dxdiagn/tests/container.c
index 936707632a..c80717cd39 100644
--- a/dlls/dxdiagn/tests/container.c
+++ b/dlls/dxdiagn/tests/container.c
@@ -36,6 +36,11 @@ static IDxDiagContainer *pddc;
static const WCHAR DxDiag_SystemInfo[] = {'D','x','D','i','a','g','_','S','y','s','t','e','m','I','n','f','o',0};
static const WCHAR DxDiag_DisplayDevices[] = {'D','x','D','i','a','g','_','D','i','s','p','l','a','y','D','e','v','i','c','e','s',0};
+static const WCHAR DxDiag_SoundDevices[] = {'D','x','D','i','a','g','_','D','i','r','e','c','t','S','o','u','n','d','.',
+ 'D','x','D','i','a','g','_','S','o','u','n','d','D','e','v','i','c','e','s',0};
+static const WCHAR DxDiag_SoundCaptureDevices[] = {'D','x','D','i','a','g','_','D','i','r','e','c','t','S','o','u','n','d','.',
+ 'D','x','D','i','a','g','_','S','o','u','n','d','C','a','p','t','u','r','e',
+ 'D','e','v','i','c','e','s',0};
/* Based on debugstr_variant in dlls/jscript/jsutils.c. */
static const char *debugstr_variant(const VARIANT *var)
@@ -1022,6 +1027,140 @@ cleanup:
IDxDiagProvider_Release(pddp);
}
+static void test_DxDiag_SoundDevices(void)
+{
+ static const WCHAR szDescription[] = {'s','z','D','e','s','c','r','i','p','t','i','o','n',0};
+ static const WCHAR szGuidDeviceID[] = {'s','z','G','u','i','d','D','e','v','i','c','e','I','D',0};
+ static const WCHAR szDriverPath[] = {'s','z','D','r','i','v','e','r','P','a','t','h',0};
+ static const WCHAR szDriverName[] = {'s','z','D','r','i','v','e','r','N','a','m','e',0};
+
+ static const struct property_test property_tests[] =
+ {
+ {szDescription, VT_BSTR},
+ {szGuidDeviceID, VT_BSTR},
+ {szDriverName, VT_BSTR},
+ {szDriverPath, VT_BSTR},
+ };
+
+ IDxDiagContainer *sound_cont = NULL;
+ DWORD count, i;
+ HRESULT hr;
+
+ if (!create_root_IDxDiagContainer())
+ {
+ skip("Unable to create the root IDxDiagContainer\n");
+ return;
+ }
+
+ hr = IDxDiagContainer_GetChildContainer(pddc, DxDiag_SoundDevices, &sound_cont);
+ ok(hr == S_OK, "Expected IDxDiagContainer::GetChildContainer to return S_OK, got 0x%08x\n", hr);
+
+ if (hr != S_OK)
+ goto cleanup;
+
+ hr = IDxDiagContainer_GetNumberOfProps(sound_cont, &count);
+ ok(hr == S_OK, "Expected IDxDiagContainer::GetNumberOfProps to return S_OK, got 0x%08x\n", hr);
+ if (hr == S_OK)
+ ok(count == 0, "Expected count to be 0, got %u\n", count);
+
+ hr = IDxDiagContainer_GetNumberOfChildContainers(sound_cont, &count);
+ ok(hr == S_OK, "Expected IDxDiagContainer::GetNumberOfChildContainers to return S_OK, got 0x%08x\n", hr);
+
+ if (hr != S_OK)
+ goto cleanup;
+
+ for (i = 0; i < count; i++)
+ {
+ WCHAR child_container[256];
+ IDxDiagContainer *child;
+
+ hr = IDxDiagContainer_EnumChildContainerNames(sound_cont, i, child_container, sizeof(child_container)/sizeof(WCHAR));
+ ok(hr == S_OK, "Expected IDxDiagContainer::EnumChildContainerNames to return S_OK, got 0x%08x\n", hr);
+
+ hr = IDxDiagContainer_GetChildContainer(sound_cont, child_container, &child);
+ ok(hr == S_OK, "Expected IDxDiagContainer::GetChildContainer to return S_OK, got 0x%08x\n", hr);
+
+ if (hr == S_OK)
+ {
+ trace("Testing container %s\n", wine_dbgstr_w(child_container));
+ test_container_properties(child, property_tests, sizeof(property_tests)/sizeof(property_tests[0]));
+ }
+ IDxDiagContainer_Release(child);
+ }
+
+cleanup:
+ if (sound_cont) IDxDiagContainer_Release(sound_cont);
+ IDxDiagContainer_Release(pddc);
+ IDxDiagProvider_Release(pddp);
+}
+
+static void test_DxDiag_SoundCaptureDevices(void)
+{
+ static const WCHAR szDescription[] = {'s','z','D','e','s','c','r','i','p','t','i','o','n',0};
+ static const WCHAR szGuidDeviceID[] = {'s','z','G','u','i','d','D','e','v','i','c','e','I','D',0};
+ static const WCHAR szDriverPath[] = {'s','z','D','r','i','v','e','r','P','a','t','h',0};
+ static const WCHAR szDriverName[] = {'s','z','D','r','i','v','e','r','N','a','m','e',0};
+
+ static const struct property_test property_tests[] =
+ {
+ {szDescription, VT_BSTR},
+ {szGuidDeviceID, VT_BSTR},
+ {szDriverName, VT_BSTR},
+ {szDriverPath, VT_BSTR},
+ };
+
+ IDxDiagContainer *sound_cont = NULL;
+ DWORD count, i;
+ HRESULT hr;
+
+ if (!create_root_IDxDiagContainer())
+ {
+ skip("Unable to create the root IDxDiagContainer\n");
+ return;
+ }
+
+ hr = IDxDiagContainer_GetChildContainer(pddc, DxDiag_SoundCaptureDevices, &sound_cont);
+ ok(hr == S_OK, "Expected IDxDiagContainer::GetChildContainer to return S_OK, got 0x%08x\n", hr);
+
+ if (hr != S_OK)
+ goto cleanup;
+
+ hr = IDxDiagContainer_GetNumberOfProps(sound_cont, &count);
+ ok(hr == S_OK, "Expected IDxDiagContainer::GetNumberOfProps to return S_OK, got 0x%08x\n", hr);
+ if (hr == S_OK)
+ ok(count == 0, "Expected count to be 0, got %u\n", count);
+
+ hr = IDxDiagContainer_GetNumberOfChildContainers(sound_cont, &count);
+ ok(hr == S_OK, "Expected IDxDiagContainer::GetNumberOfChildContainers to return S_OK, got 0x%08x\n", hr);
+
+ if (hr != S_OK)
+ goto cleanup;
+
+ for (i = 0; i < count; i++)
+ {
+ WCHAR child_container[256];
+ IDxDiagContainer *child;
+
+ hr = IDxDiagContainer_EnumChildContainerNames(sound_cont, i, child_container, sizeof(child_container)/sizeof(WCHAR));
+ ok(hr == S_OK, "Expected IDxDiagContainer::EnumChildContainerNames to return S_OK, got 0x%08x\n", hr);
+
+ hr = IDxDiagContainer_GetChildContainer(sound_cont, child_container, &child);
+ ok(hr == S_OK, "Expected IDxDiagContainer::GetChildContainer to return S_OK, got 0x%08x\n", hr);
+
+ if (hr == S_OK)
+ {
+ trace("Testing container %s\n", wine_dbgstr_w(child_container));
+ test_container_properties(child, property_tests, sizeof(property_tests)/sizeof(property_tests[0]));
+ }
+ IDxDiagContainer_Release(child);
+ }
+
+cleanup:
+ if (sound_cont) IDxDiagContainer_Release(sound_cont);
+ IDxDiagContainer_Release(pddc);
+ IDxDiagProvider_Release(pddp);
+}
+
START_TEST(container)
{
CoInitialize(NULL);
@@ -1036,5 +1175,7 @@ START_TEST(container)
test_root_children();
test_DxDiag_SystemInfo();
test_DxDiag_DisplayDevices();
+ test_DxDiag_SoundDevices();
+ test_DxDiag_SoundCaptureDevices();
CoUninitialize();
}
--
2.21.0
1
0
Signed-off-by: Andreas Maier <staubim(a)quantentunnel.de>
---
dlls/jscript/enumerator.c | 206 ++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 190 insertions(+), 16 deletions(-)
diff --git a/dlls/jscript/enumerator.c b/dlls/jscript/enumerator.c
index aa7737ac52..3831990219 100644
--- a/dlls/jscript/enumerator.c
+++ b/dlls/jscript/enumerator.c
@@ -26,6 +26,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(jscript);
typedef struct {
jsdisp_t dispex;
+ /* IEnumVARIANT returned by _NewEnum */
+ IEnumVARIANT *enumvar;
+ /* current item */
+ jsval_t item;
} EnumeratorInstance;
static const WCHAR atEndW[] = {'a','t','E','n','d',0};
@@ -33,9 +37,48 @@ static const WCHAR itemW[] = {'i','t','e','m',0};
static const WCHAR moveFirstW[] = {'m','o','v','e','F','i','r','s','t',0};
static const WCHAR moveNextW[] = {'m','o','v','e','N','e','x','t',0};
+static inline EnumeratorInstance *enumerator_from_jsdisp(jsdisp_t *jsdisp)
+{
+ return CONTAINING_RECORD(jsdisp, EnumeratorInstance, dispex);
+}
+
+static inline EnumeratorInstance *enumerator_from_vdisp(vdisp_t *vdisp)
+{
+ return enumerator_from_jsdisp(vdisp->u.jsdisp);
+}
+
+static inline HRESULT enumvar_get_next_item(EnumeratorInstance *This,
+ BOOL init)
+{
+ HRESULT hres;
+ VARIANT nextitem;
+
+ /* not at end ... get next item */
+ if ((init) || (!is_undefined(This->item)))
+ {
+ VariantInit(&nextitem);
+ hres = IEnumVARIANT_Next(This->enumvar, 1, &nextitem, NULL);
+ if (SUCCEEDED(hres))
+ {
+ hres = variant_to_jsval(&nextitem, &This->item);
+ if (FAILED(hres))
+ {
+ ERR("failed to convert jsval to variant!");
+ This->item = jsval_undefined();
+ }
+
+ }
+ else
+ This->item = jsval_undefined();
+ VariantClear(&nextitem);
+ }
+
+ return S_OK;
+}
+
static void Enumerator_destructor(jsdisp_t *dispex)
{
- TRACE("Enumerator_destructor\n");
+ TRACE("\n");
heap_free(dispex);
}
@@ -43,33 +86,90 @@ static void Enumerator_destructor(jsdisp_t *dispex)
HRESULT Enumerator_atEnd(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
- TRACE("Enumerator_atEnd\n");
+ EnumeratorInstance *This;
- return E_NOTIMPL;
+ if (!(This = enumerator_from_vdisp(jsthis)))
+ {
+ FIXME("we should throw an error...");
+ return E_NOTIMPL;
+ }
+
+ if (r)
+ *r = jsval_bool(is_undefined(This->item));
+
+ TRACE("%s\n", debugstr_jsval(This->item));
+
+ return S_OK;
}
HRESULT Enumerator_item(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
- TRACE("Enumerator_item\n");
+ EnumeratorInstance *This;
+
+ TRACE("\n");
- return E_NOTIMPL;
+ if (!(This = enumerator_from_vdisp(jsthis)))
+ {
+ FIXME("we should throw an error...");
+ return E_NOTIMPL;
+ }
+
+ return r ? jsval_copy(This->item, r) : S_OK;
}
HRESULT Enumerator_moveFirst(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
- TRACE("Enumerator_moveFirst\n");
+ EnumeratorInstance *This;
+ HRESULT hres = E_FAIL;
+
+ TRACE("\n");
+
+ if (!(This = enumerator_from_vdisp(jsthis)))
+ {
+ FIXME("we should throw an error...");
+ return E_NOTIMPL;
+ }
- return E_NOTIMPL;
+ if (This->enumvar)
+ {
+ hres = IEnumVARIANT_Reset(This->enumvar);
+ if (!FAILED(hres))
+ hres = enumvar_get_next_item(This, TRUE);
+ }
+ else
+ hres = S_OK;
+
+ if (r)
+ *r = jsval_undefined();
+
+ return hres;
}
HRESULT Enumerator_moveNext(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
- TRACE("Enumerator_moveNext\n");
+ EnumeratorInstance *This;
+ HRESULT hres = E_FAIL;
+
+ TRACE("\n");
+
+ if (!(This = enumerator_from_vdisp(jsthis)))
+ {
+ FIXME("we should throw an error...");
+ return E_NOTIMPL;
+ }
+
+ if (This->enumvar)
+ hres = enumvar_get_next_item(This, FALSE);
+ else
+ hres = S_OK;
- return E_NOTIMPL;
+ if (r)
+ *r = jsval_undefined();
+
+ return hres;
}
static const builtin_prop_t Enumerator_props[] = {
@@ -101,16 +201,18 @@ static HRESULT EnumeratorConstr_value(script_ctx_t *ctx, vdisp_t *vthis, WORD fl
jsval_t *r)
{
jsdisp_t *obj;
+ jsval_t *arg0;
HRESULT hres;
- TRACE("EnumeratorConstr_value\n");
+ TRACE("\n");
switch(flags) {
case DISPATCH_CONSTRUCT: {
- if (argc != 1)
- return throw_syntax_error(ctx, JS_E_MISSING_ARG, NULL);
+ if (argc > 1)
+ return throw_syntax_error(ctx, JS_E_INVALIDARG, NULL);
- hres = create_enumerator(ctx, &argv[0], &obj);
+ arg0 = (argc == 1) ? &argv[0] : 0;
+ hres = create_enumerator(ctx, arg0, &obj);
if(FAILED(hres))
return hres;
@@ -118,7 +220,7 @@ static HRESULT EnumeratorConstr_value(script_ctx_t *ctx, vdisp_t *vthis, WORD fl
break;
}
default:
- FIXME("unimplemented flags: %x\n", flags);
+ ERR("unimplemented flags: %x\n", flags);
return E_NOTIMPL;
}
@@ -140,7 +242,8 @@ static HRESULT alloc_enumerator(script_ctx_t *ctx, jsdisp_t *object_prototype, E
hres = init_dispex_from_constr(&enumerator->dispex, ctx, &EnumeratorInst_info,
ctx->enumerator_constr);
- if(FAILED(hres)) {
+ if(FAILED(hres))
+ {
heap_free(enumerator);
return hres;
}
@@ -180,11 +283,82 @@ HRESULT create_enumerator(script_ctx_t *ctx, jsval_t *argv, jsdisp_t **ret)
{
EnumeratorInstance *enumerator;
HRESULT hres;
+ IDispatch *obj;
+ DISPPARAMS dispparams = {NULL, NULL, 0, 0};
+ VARIANT varresult;
+
+ IEnumVARIANT *enumvar;
+
+ memset(&varresult, 0, sizeof(VARIANT));
+ VariantInit(&varresult);
+
+ /* new Enumerator() */
+ if (argv == NULL)
+ {
+ enumvar = NULL;
+ }
+ else if (is_object_instance(*argv))
+ {
+ obj = get_object(*argv);
+
+ /* Try to get a IEnumVARIANT by _NewEnum */
+ hres = IDispatch_Invoke(obj,
+ DISPID_NEWENUM, &IID_NULL, LOCALE_NEUTRAL,
+ DISPATCH_METHOD, &dispparams, &varresult,
+ NULL, NULL);
+ if (FAILED(hres))
+ {
+ ERR("Enumerator: no DISPID_NEWENUM.\n");
+ hres = E_INVALIDARG;
+ goto cleanuperr;
+ }
+
+ if ((V_VT(&varresult) == VT_DISPATCH) ||
+ (V_VT(&varresult) == VT_UNKNOWN))
+ {
+ hres = IUnknown_QueryInterface(V_UNKNOWN(&varresult),
+ &IID_IEnumVARIANT, (void**)&enumvar);
+ if (FAILED(hres))
+ {
+ hres = E_INVALIDARG;
+ goto cleanuperr;
+ }
+ }
+ else
+ {
+ ERR("Enumerator: NewEnum unexpected type of varresult (%d).\n", V_VT(&varresult));
+ hres = E_INVALIDARG;
+ goto cleanuperr;
+ }
+ VariantClear(&varresult);
+ }
+ else
+ {
+ ERR("I don't know how to handle this type!\n");
+ hres = E_NOTIMPL;
+ goto cleanuperr;
+ }
hres = alloc_enumerator(ctx, NULL, &enumerator);
if(FAILED(hres))
- return hres;
+ goto cleanuperr;
+
+ enumerator->enumvar = enumvar;
+ if (enumvar)
+ {
+ hres = enumvar_get_next_item(enumerator, TRUE);
+ if (FAILED(hres))
+ goto cleanuperr;
+ }
+ else
+ enumerator->item = jsval_undefined();
*ret = &enumerator->dispex;
+
return S_OK;
+cleanuperr:
+ VariantClear(&varresult);
+ if (enumerator)
+ heap_free(enumerator);
+ return hres;
}
--
2.11.0
2
3
On Sat., 11 May 2019, 1:19 am Alexandre Julliard, <julliard(a)winehq.org>
wrote:
> The Wine development release 4.8 is now available.
>
> What's new in this release (see below for details):
> - Support building most programs in PE format.
> - Unicode data updated to Unicode 12.0.
> - Support for MSI patch files.
> - Default to non-PIC builds on i386.
> - Joystick support improvements.
> - Asturian locale.
> - Various bug fixes.
>
> The source is available from the following locations:
>
> https://dl.winehq.org/wine/source/4.x/wine-4.8.tar.xz
> http://mirrors.ibiblio.org/wine/source/4.x/wine-4.8.tar.xz
>
> Binary packages for various distributions will be available from:
>
> https://www.winehq.org/download
>
> You will find documentation on https://www.winehq.org/documentation
>
> You can also get the current source directly from the git
> repository. Check https://www.winehq.org/git for details.
>
> Wine is available thanks to the work of many people. See the file
> AUTHORS in the distribution for the complete list.
>
> ----------------------------------------------------------------
>
> Bugs fixed in 4.8 (total 38):
>
> 12332 Microsoft Windows Server 2003 DDK SP1 installer crashes
> ('setupapi.SetupCloseFileQueue' should do proper handle validation before
> accessing members)
> 14695 Lifeforce demo misses codecs (msvideo1 needs to support 24 bpp
> output)
> 28196 Test Drive Unlimited: Water is always rendered on top of
> everything.
> 28254 Multiple kernel drivers crash during load/relocation (relocation
> entry crosses page boundary)(PMP Exam Version 7 CrypKey, Age of Wushu
> SDProtect DRM, StarForce v3)
> 29460 Multiple kernel drivers crash in entry due to ntoskrnl.exe
> IoGetCurrentProcess() being a stub (Ruijie Supplicant Su1xDriver.sys,
> nProtect GameGuard/Tachyon Kernel Control Driver)
> 31101 ScoobyRom v0.6.x-0.8.x (.NET 4.0 app) fails to start with
> Wine-Mono
> 31350 Multiple .NET 3.x WPF applications crash in Vista/Win7 mode due
> to dwmapi.DwmGetTransportAttributes stub returning E_NOTIMPL (T-Online
> Mediencenter Assistent, Valil.Chess, Zwift 1.0)
> 34372 Multiple applications need AllocateAndGetTcpExTableFromStack
> (cross compiled dbus, spamMonitor)
> 37359 planetside 2 no mouseclicks registered
> 37540 Multiple games and applications wrapped with Enigma v4 and GG DRM
> schemes crash on startup (incompatible with use of position independent
> code (PIC) in Wine dlls)
> 38423 Python 3.5.x exe installer fails with Access denied error
> 39614 Wine initialises a Critical Section for Mutexes by NULL instead
> of (void*)-1
> 42420 MidiIllustrator Virtuoso 3 crashes when using any File open dialog
> 44850 Microsoft Skype 8.x crashes on unimplemented function
> iphlpapi.dll.GetBestRoute2
> 45155 OpenGL Window Z order in Truespace
> 45213 Multiple applications using Microsoft Detours library crash on
> startup after compiling Wine with GCC 8.x+ and -O2 (GOT/PIC code emitted at
> Win32 API entries)(Microsoft Visual Studio 201x, Visual Assist plugin)
> 45757 Visual Studio 2017 Installer - "The installer manifest failed
> signature validation"
> 45765 Universe Sandbox 2 unimplemented function
> USER32.dll.GetPointerType
> 45947 Native Access crashes on unimplemented function
> virtdisk.dll.OpenVirtualDisk
> 46861 TopoEdit crashes with unimplemented function
> mf.dll.MFEnumDeviceSources
> 46905 Multiple eventlog monitor applications go haywire (endless
> console spam, live-loop CPU) due to advapi32.ReadEventLogA/W returning
> lasterror ERROR_CALL_NOT_IMPLEMENTED
> 46989 Grand Prix Legends: Wheel (Wheel, Gas, Brake) axes inputs aren't
> recognized
> 46993 ntoskrnl.exe tests don't compile when using -O0
> 47016 MS Office 365 installer needs mfplay.dll.MFPCreateMediaPlayer
> 47023 Warframe in-game screenshot fails if screenshot directory already
> exists
> 47027 Wine built with GCC 8.x+ and -O2 causes apps and games using
> madCodeHook/madExcept 3.x/4.x to crash (hook engine can't cope with GOT/
> PIC code emitted within 15-byte range at Win32 API entries)(EA Origin,
> HeidiSQL 10.x)
> 47032 valgrind shows uninitialized read in writev from call_req_handler
> 47082 NI System Web Server crashes on unimplemented function
> authz.dll.AuthzFreeResourceManager
> 47096 World of Warships 0.8.3.x client (DirectX 11) crashes when
> post-battle results screen is about to be displayed
> 47097 Wine built with GCC 8.x+ and -O2 causes Steam games using In-Game
> Overlay 'gameoverlayrenderer.dll' to crash (hook engine can't cope with
> GOT/PIC code emitted at Win32 API entries)
> 47107 Windows XP DDK installer fails to copy any files
> 47122 Star Citizen stopped working on commit
> 32d7838da73dd9bc3ee999d73a310da7adfb27dd
> 47123 Starcitizen - joystick not recognized
> 47129 Rendering glitch in Caste Siege/Ballerburg (invalid vertex count
> in IDirect3DDevice3::DrawIndexedPrimitiveVB)
> 47131 Esportal client 1.0 (CS:GO anti-cheat) fails to start, reporting
> 'The procedure entry point InitiateShutdownW could not be located in the
> dynamic link library ADVAPI32.dll'
> 47138 Microsoft .NET Framework 2.x installer fails ('RegSvcs.exe'
> bootstrapper needs unicode casing tables, 'l_intl.nls' no longer installed
> in WINEPREFIX)
> 47142 Esportal client 1.0 (CS:GO anti-cheat) fails to start, reporting
> 'The procedure entry point NdrServerCallAll could not be located in the
> dynamic link library RPCRT4.dll'
> 47145 Esportal client 1.0 (CS:GO anti-cheat) fails to start, reporting
> 'The procedure entry point K32GetWsChangesEx could not be located in the
> dynamic link library KERNEL32.dll'
>
> ----------------------------------------------------------------
>
> Changes since 4.7:
>
> Alexandre Julliard (85):
> attrib: Build with msvcrt.
> cabarc: Build with msvcrt.
> clock: Build with msvcrt.
> control: Build with msvcrt.
> dxdiag: Build with msvcrt.
> eject: Build with msvcrt.
> expand: Build with msvcrt.
> extrac32: Build with msvcrt.
> hh: Build with msvcrt.
> hostname: Build with msvcrt.
> icinfo: Build with msvcrt.
> iexplore: Build with msvcrt.
> ipconfig: Build with msvcrt.
> msidb: Build with msvcrt.
> msiexec: Build with msvcrt.
> net: Build with msvcrt.
> netstat: Build with msvcrt.
> oleview: Build with msvcrt.
> progman: Build with msvcrt.
> regsvr32: Build with msvcrt.
> ntdll: Check for time conversion error to silence a compiler warning.
> makefiles: Also pass -fPIC flag when linking.
> rpcss: Build with msvcrt.
> rundll32: Build with msvcrt.
> sc: Build with msvcrt.
> schtasks: Build with msvcrt.
> services: Build with msvcrt.
> start: Build with msvcrt.
> svchost: Build with msvcrt.
> taskkill: Build with msvcrt.
> uninstaller: Build with msvcrt.
> view: Build with msvcrt.
> makefiles: Don't use custom LDFLAGS to link dlls.
> configure: Disable stdcall fixups for PE builds.
> include: Add DECLSPEC_IMPORT on OpenGL functions when not building
> opengl32.
> crypt32: Fix comparison of domain name components.
> winedevice: Build with msvcrt.
> winemine: Build with msvcrt.
> winemsibuilder: Build with msvcrt.
> winetest: Build with msvcrt.
> winhlp32: Build with msvcrt.
> wmic: Build with msvcrt.
> write: Build with msvcrt.
> wscript: Build with msvcrt.
> ping: Avoid using getopt().
> ping: Build with msvcrt.
> winefile: Get rid of the Unix filesystem support.
> winefile: Build with msvcrt.
> include: Use DECLSPEC_HIDDEN instead of DECLSPEC_IMPORT for dll
> exports.
> include: Move DECLSPEC_HOTPATCH definition out of config.h.
> makefiles: Support delay imports for PE builds.
> makefiles: Use a separate LDFLAGS variable for cross-compilation.
> makefiles: Only cross-compile the import libraries that are actually
> used.
> makefiles: Only cross-compile the static libraries that are actually
> used.
> dxerr8: Don't use snprintf().
> dxerr9: Don't use snprintf().
> strmbase: Avoid using wine/unicode.h.
> cmd: Build with msvcrt.
> explorer: Move screen saver activation to the X11 driver.
> explorer: Build with msvcrt.
> cmd: Explicitly mark qsort() callback funtions cdecl.
> services: Explicitly mark a qsort() callback funtion cdecl.
> uninstaller: Explicitly mark a qsort() callback funtion cdecl.
> winefile: Explicitly mark qsort() callback funtions cdecl.
> winhttp/tests: Get a test file from the WineHQ tests subdirectory.
> include/msvcrt: Add inttypes.h header.
> advapi32: Use strncmpiW instead of memicmpW for strings without
> embedded nulls.
> atl: Use strncmpiW instead of memicmpW for strings without embedded
> nulls.
> fusion: Use strncmpiW instead of memicmpW for strings without
> embedded nulls.
> kernel32: Use strncmpiW instead of memicmpW for strings without
> embedded nulls.
> kernelbase: Use strncmpiW instead of memicmpW for strings without
> embedded nulls.
> mountmgr.sys: Use strncmpiW instead of memicmpW for strings without
> embedded nulls.
> mshtml: Use strncmpiW instead of memicmpW for strings without
> embedded nulls.
> msi: Use strncmpiW instead of memicmpW for strings without embedded
> nulls.
> kernel32: Reset stdio file descriptors when passed invalid handles.
> ntdll: Reset stdio file descriptors when passed invalid handles.
> netapi32: Use strncmpiW instead of memicmpW for strings without
> embedded nulls.
> ntdll: Use strncmpiW instead of memicmpW for strings without
> embedded nulls.
> pdh: Use strncmpiW instead of memicmpW for strings without embedded
> nulls.
> qmgr: Use strncmpiW instead of memicmpW for strings without embedded
> nulls.
> shlwapi: Use strncmpiW instead of memicmpW for strings without
> embedded nulls.
> urlmon: Use strncmpiW instead of memicmpW for strings without
> embedded nulls.
> userenv: Use strncmpiW instead of memicmpW for strings without
> embedded nulls.
> wbemprox: Use strncmpiW instead of memicmpW for strings without
> embedded nulls.
> webservices: Use strncmpiW instead of memicmpW for strings without
> embedded nulls.
>
> Alistair Leslie-Hughes (12):
> wintab32/tests: Improve WTInfoA tests.
> authz: Add AuthzFreeResourceManager stub.
> dinput: Don't return unsupported interfaces.
> dinput: Return E_NOINTERFACE from IDirectInputDevice2 QueryInterface.
> dinput: Don't report that we cannot open a device.
> dinput: Improve EnumDevice tracing.
> dinput: Support DIDEVICEINSTANCE_DX3 for Mouse GetDeviceInfo.
> dinput: Use a helper function to get device type.
> dinput: Trace This pointer in a consistent way.
> dinput: Ensure Cursor is visible on config dialog.
> mspatcha/tests: Fix compile error on older compilers.
> mspatcha/tests: Make functions static.
>
> Andrew Eikum (11):
> winebus.sys: Fix some report descriptors.
> winebus.sys: Fix udev report descriptor length.
> winebus.sys: Remove some magic numbers.
> winebus.sys: Fix ball value reporting.
> hid: Shift usage values to LSB.
> dinput: Use heuristics to guess if a device is a gamepad or a
> joystick.
> winebus.sys: Order axes before buttons.
> winebus.sys: Report hatswitch values correctly.
> winebus.sys: Report SDL controller dpad as hatswitch.
> winebus.sys: Report SDL controller buttons in the right order.
> winebus.sys: Pack hatswitch values into button bytes.
>
> Aric Stewart (2):
> winemac.drv: Set done if macdrv_process_text_input is not processing
> input.
> winemac.drv: Allow mac IME to clear text in system input method.
>
> Austin English (2):
> iphlpapi: Add GetBestRoute2 stub.
> advapi32: In ReadEventLogA/W, return ERROR_HANDLE_EOF instead of
> ERROR_CALL_NOT_IMPLEMENTED.
>
> Bryon Roche (1):
> windowscodecs: Byte swap png read/write for 16-bpp data.
>
> Conor McCarthy (4):
> mspatcha: Add functions to API header file.
> mspatcha: Partially implement ApplyPatchToFileW and related
> functions.
> mspatcha/tests: Test implementations of ApplyPatchToFileW and
> related functions.
> mspatcha: Add stubs for signature and normalization functions.
>
> Damjan Jovanovic (1):
> qcap/vfwcapture: Implement IPin::CheckMediaType().
>
> Derek Lesho (2):
> ntoskrnl.exe: Export and set PsInitialSystemProcess.
> ntoskrnl.exe: Implement PsIsSystemThread.
>
> Dmitry Timoshkov (2):
> crypt32: CryptMsgUpdate should skip broken certificates.
> mshtml: Implement HTMLStyleSheetRulesCollection::item.
>
> Enol Puente (4):
> wrc: Add Asturian locale.
> wmc: Support Asturian.
> kernel32: Add Asturian locale.
> po: Add Asturian translation.
>
> Erich Hoover (2):
> iphlpapi: Implement AllocateAndGetTcpExTableFromStack.
> kernel32: Add SearchPath test demonstrating the priority of the
> working directory.
>
> François Gouget (4):
> ntoskrnl.exe: Make run_work_item_worker() static.
> user32: Make WIN_SetOwner() static.
> kernel32/tests: Use ok_() so the TestBot can correctly detect the
> line.
> jscript: Make the Enumerator_props functions static.
>
> Henri Verbeet (37):
> wined3d: Introduce a debug helper for Vulkan return values.
> wined3d: Use shader_glsl_append_imm_vec4() in
> shader_glsl_get_register_name().
> wined3d: Get rid of the redundant "device" parameter to
> context_destroy().
> wined3d: Introduce a separate structure for OpenGL context
> information.
> wined3d: Introduce wined3d_context_init().
> wined3d: Simplify wined3d_context_destroy().
> wined3d: Rename context_destroy_gl_resources() to
> wined3d_context_cleanup().
> wined3d: Free the "texture_type" array in wined3d_context_cleanup().
> wined3d: Introduce wined3d_context_gl_destroy().
> wined3d: Free shader backend and fragment pipe context data in
> device_context_remove().
> wined3d: Allocate shader backend and fragment pipe context data in
> device_context_add().
> wined3d: Get rid of the "target" parameter to context_create().
> wined3d: Get rid of the "target" parameter to wined3d_context_init().
> wined3d: Get rid of the "target" parameter to
> wined3d_adapter_gl_create_context().
> wined3d: Get rid of context_validate_onscreen_formats().
> winex11: Only handle errors from GLX requests in GLXErrorHandler().
> wined3d: Query Vulkan GPU memory.
> wined3d: Get rid of a redundant initialisation in
> wined3d_device_set_implicit_swapchain().
> wined3d: Share more swapchain setup with the "no3d" adapter in
> wined3d_device_set_implicit_swapchain().
> wined3d: Determine the ORM_BACKBUFFER depth/stencil format in
> wined3d_adapter_gl_create_context().
> wined3d: Make the adapter responsible for context destruction and
> allocation.
> wined3d: Pass a wined3d_context_gl structure to
> context_bind_texture().
> wined3d: Move the "texture_type" field from struct wined3d_context
> to struct wined3d_context_gl.
> wined3d: Move the "dummy_arbfp_prog" field from struct
> wined3d_context to struct wined3d_context_gl.
> wined3d: Store the glEnableWINE and glDisableWINE pointers in the
> wined3d_gl_info structure.
> wined3d: Move the extension emulation fields from struct
> wined3d_context to struct wined3d_context_gl.
> wined3d: Pass a wined3d_context_gl structure to
> context_load_tex_coords().
> wined3d: Pass a wined3d_context_gl structure to
> context_get_tex_unit_mapping().
> wined3d: Pass a wined3d_context_gl structure to
> context_bind_shader_resources().
> wined3d: Pass a wined3d_context_gl structure to
> context_apply_blit_state().
> wined3d: Pass a wined3d_context_gl structure to
> context_apply_ffp_blit_state().
> wined3d: Pass a wined3d_context_gl structure to
> wined3d_texture_gl_bind_and_dirtify().
> wined3d: Pass a wined3d_context_gl structure to context_map_stage().
> wined3d: Pass a wined3d_context_gl structure to
> context_map_fixed_function_samplers().
> wined3d: Pass a wined3d_context_gl structure to
> context_map_psamplers().
> wined3d: Pass a wined3d_context_gl structure to
> context_map_vsamplers().
> wined3d: Pass a wined3d_context_gl structure to
> context_unit_free_for_vs().
>
> Jacek Caban (26):
> ntoskrnl.exe: Implement IoGetCurrentProcess.
> ntoskrnl.exe: Implement PsGetProcessId.
> ntoskrnl.exe: Implement PsGetThreadId.
> ntoskrnl.exe: Implement ObOpenObjectByPointer.
> ntoskrnl.exe: Use ObOpenObjectByPointer to get handle for kernel
> object.
> ntoskrnl.exe: Support SL_INVOKE_ON_CANCEL in IoCompleteRequest.
> ntoskrnl.exe: Support NULL offset in IoBuildSynchronousFsdRequest.
> ntoskrnl.exe: Use ObGetObjectType in kernel_object_from_handle.
> ntoskrnl.exe: Implement IoAllocateWorkItem and IoFreeWorkItem.
> ntoskrnl.exe: Implement IoQueueWorkItem.
> ntoskrnl.exe: Add work item tests.
> ntoskrnl.exe: Implement IoBuildAsynchronousFsdRequest.
> ntoskrnl.exe/tests: Add IoCallDriver tests.
> ntoskrnl.exe: Implement IoCancelIrp.
> ntoskrnl.exe/tests: Add CancelIo tests.
> ntoskrnl.exe: Set IRP DeviceObject in IoCallDriver.
> ntoskrnl.exe: Support UserEvent in IoCompleteRequest.
> server: Pass IRP output size in irp_params_t.
> server: Don't use IRP_MJ_* constants for ntoskrnl.exe communication.
> server: Store currently executed IRP call on server side.
> server: Pass file object handle in IRP_CALL_CREATE request.
> ntoskrnl.exe: Associate file object with server object before
> calling IRP routine.
> ntoskrnl.exe: Don't keep reference to driver created file objects on
> client side.
> ntoskrnl.exe/tests: Add more overlapped tests.
> hidclass.sys: Make read IRP queue thread safe.
> hidclass.sys: Support canceling read IRPs.
>
> Jactry Zeng (2):
> kernel32/tests: Avoid a crash on WinXP and Win2K.
> d3dcompiler: Implement D3DReadFileToBlob().
>
> Jefferson Carpenter (1):
> server: Add __pad member to pe_image_info_t and zero it.
>
> Julian Rüger (1):
> po: Update German translation.
>
> Józef Kucia (20):
> wined3d: Implement GPU description registry override for Vulkan
> adapter.
> wined3d: Factor out wined3d_copy_name().
> wined3d: Make wined3d_gpu_description from Vulkan physical device
> properties.
> wined3d: Assign *device in adapter_vk_create_device().
> dxgi: Avoid magic constants.
> d3d11: Set more format support flags.
> dxgi: Factor out d3d12_swapchain_record_swapchain_blit().
> dxgi: Make Vulkan swapchain image count independent of DXGI buffer
> count.
> dxgi: Add some asserts for Vulkan swapchains.
> dxgi: Acquire Vulkan image just before present when we have user
> images.
> d3d11: Implement ID3D11Multithread.
> d3d11/tests: Add test for creating deferred contexts.
> d3d11/tests: Add test for ID3D11Multithread.
> d3d10core/tests: Add test for ID3D11Multithread.
> wined3d: Query Vulkan shared system memory.
> wined3d: Store texture swizzle capability in struct wined3d_d3d_info.
> d3d11: Report format support more accurately based on feature level.
> wined3d: Make the adapter responsible for initialising and
> de-initialising 3D.
> wined3d: Propagate HRESULTs in context creation functions.
> wined3d: Fix wined3d_get_wine_vk_version().
>
> Louis Lenders (5):
> user32: Added GetPointerType stub.
> dwmapi: Return DWM_E_COMPOSITIONDISABLED instead of E_NOTIMPL in
> DwmGetTransportAttributes.
> advapi32: Add InitiateShutdown{A,W} stub.
> rpcrt4: Add NdrServerCallAll stub.
> kernel32: Add K32GetWsChangesEx stub.
>
> Martin Storsjo (2):
> avicap32: Fix compilation with older videodev2.h.
> qcap: Fix compilation with older videodev2.h.
>
> Michael Müller (3):
> version: Correctly return VFF_CURNEDEST in VerFindFileA.
> include: Add dxva.h header file.
> avifil32: Correctly handle compressed frames when desired format is
> specified.
>
> Michael Stefaniuc (7):
> ntdll/tests: Avoid the comma operator.
> ntoskrnl.exe: Correctly initialize two CRITICAL_SECTION_DEBUGs.
> wintrust: Use the ARRAY_SIZE() macro.
> mscoree: Remove a redundant NULL check before heap_free().
> riched32/tests: Test the correct return value.
> mfplat/tests: Remove a duplicated ok() check.
> rpcrt4: Use CONTAINING_RECORD instead of an extra macro.
>
> Nikolay Sivov (32):
> tools: Update to Unicode 12.0.
> mfplat: Improve thread safety for IStream-based stream.
> mfplat: Improve method traces.
> mfreadwrite: Return sample timestamp from ReadSample().
> mf: Add stub scheme handler for local file urls.
> ntdll: Account for null terminating char in unload traces (Coverity).
> mfreadwrite: Wake waiting threads on stream states changes.
> ntdll: Initialize critical section debug info with correct pointer
> value.
> mfplat: Copy attributes when cloning presentation descriptor.
> mfplat: Add more attribute guids.
> mf: Add MFEnumDeviceSources() stub.
> dbgeng/tests: Fix event handle leak (Coverity).
> mfplat: Implement async file stream creation API.
> mf: Register file: scheme handler.
> mfplat: Use file url scheme as a fallback.
> mfplat/tests: Add some tests for calling scheme handler directly.
> mf: Implement file scheme handler.
> wmvcore: Return success from OpenStream().
> mf: Add a stub for sample grabber activation object.
> mfplat: Add topology attributes guids.
> mf: Implement SetObject()/GetObject() for topology node.
> mfplat: Improve SetGUID() traces.
> mfplat: Implement Read() for file-based stream.
> mfplat: Implement IsEndOfStream() for file stream.
> mfplat: Write attribute store when registering MFT.
> mfplat: Write flags when registering MFT.
> mf: Set preferred media types for nodes.
> mf: Implement CloneFrom() for nodes.
> mf: Implement node connections.
> mf: Rework node collection implementation.
> mf: Disconnect removed nodes.
> mf: Add IMFGetService stub for media session.
>
> Paul Gofman (3):
> wined3d: Check if destination texture is FBO attachable in
> glsl_blitter_supported().
> ddraw: Fix vertex count in d3d_device3_DrawIndexedPrimitiveVB().
> wined3d: Apply stencil mask to stencil reference value.
>
> Piotr Caban (9):
> winebus.sys: Add more traces on hidraw communication errors.
> hid: Add HidP_SetUsages implementation.
> hid: Add support for ranges in find_value.
> hid: Only set first usage in an array in HidP_SetUsageValue.
> hidclass.sys: Set LinkCollection field in build_elements function.
> hidclass.sys: Set LinkUsagePage field in build_elements function.
> hidclass.sys: Set LinkUsage field in build_elements function.
> hidclass.sys: Treat all one-bit fields as buttons.
> hidclass.sys: Fill some reserved fields when building
> HIDP_{BUTTON,VALUE}_CAPS.
>
> Qian Hong (1):
> server: Create primary group using DOMAIN_GROUP_RID_USERS.
>
> Rafał Harabień (1):
> ntoskrnl.exe: Fix handling relocations on page boundary.
>
> Tim Schumacher (2):
> winejoystick: Add support for wheel axes.
> dinput: Map wheel, gas, and brake axes as well.
>
> Vijay Kiran Kamuju (4):
> virtdisk: Add stub and tests for OpenVirtualDisk.
> include: Add missing defines, enums and functions for dwmapi.h.
> wpcap: Fix compile warnings for redefinition of
> PCAP_OPENFLAG_PROMISCUOUS.
> include: Add missing navigation and gamepad key definitions in
> winuser.rh.
>
> Vincent Povirk (2):
> mscoree: Accept old framework build in exe metadata.
> windowscodecs: Treat 16-bit channels as little endian.
>
> Zebediah Figura (30):
> quartz: Convert media type registration to IRegistrar mechanism.
> quartz: Avoid importing shlwapi.
> evr/tests: Rewrite test_evr_filter_aggregation().
> evr/tests: Add tests for filter interfaces.
> winegcc: Add support for -fno-PIC.
> makefiles: Build with -fno-PIC on i386.
> setupapi: Extract individual files from cabinets.
> setupapi/tests: Avoid assert().
> setupapi/tests: Add some tests for SetupInstallFilesFromInfSection().
> setupapi: Avoid passing a NULL source root path to
> SetupQueueDefaultCopy() and SetupQueueCopySection().
> setupapi: Fill out all source file parameters in
> SetupQueueCopySection().
> setupapi: Fill out all source file parameters in
> SetupQueueDefaultCopy().
> setupapi: Implement SetupQueueCopyIndirectA() on top of the W
> variant.
> setupapi: Remove implementation for LayoutInf parameter of
> SP_FILE_COPY_PARAMS.
> setupapi: Separate the entire copy operation into a helper function.
> setupapi: Keep track of source media in a separate list.
> setupapi: Implement
> SetupDefaultQueueCallback(SPFILENOTIFY_NEEDMEDIA).
> setupapi: Implement W -> A mapping of SPFILENOTIFY_NEEDMEDIA.
> setupapi: Properly null-terminate the path in concat_W().
> setupapi: Use the source file name if the destination file name is
> NULL.
> setupapi: Implement source media path resolution.
> setupapi/tests: Add tests for source media path resolution.
> setupapi: Add magic bytes to struct file_queue and validate them in
> SetupCloseFileQueue().
> ntoskrnl.exe/tests: Use coarser waits for timer tests.
> ntoskrnl.exe/tests: Avoid linking directly to CancelIoEx().
> msi: Remove registration for no longer used
> WineMsiRemoteCustomAction coclass.
> setupapi: Avoid passing a NULL source filename to
> SetupQueueDefaultCopy().
> strmbase: Move some internal definitions to strmbase_private.h.
> strmbase: Move "AttemptConnection" to the base source pin function
> table.
> strmbase: Get rid of the "pfnGetMediaTypeVersion" callback.
>
> Zhiyi Zhang (1):
> include: Add more kernel mode graphics driver definitions.
>
> --
> Alexandre Julliard
> julliard(a)winehq.org
>
>
1
0
Binary packages for various distributions will be available from:
https://www.winehq.org/download
Summary since last release
* Rebased to current wine 4.8 (XXXXXX patches are applied to wine vanilla)
NOTE:
FAudio will not be supported until distro's have FAudio library as part
of their
standard repositories.
Upstreamed (Either directly from staging or fixed with a similar patch).
* user32: Added GetPointerType stub.
* virtdisk: Add stub for OpenVirtualDisk
* iphlpapi: Implement AllocateAndGetTcpExTableFromStack.
* server: Create primary group using DOMAIN_GROUP_RID_USERS.
* winejoystick: Add support for wheel axes.
* dinput: Map wheel, gas, and brake axes as well.
* dwmapi: Return DWM_E_COMPOSITIONDISABLED instead of E_NOTIMPL in
DwmGetTransportAttributes.
* include: Add dxva.h header file.
* iphlpapi: Add GetBestRoute2 stub.
* kernel32: Add SearchPath test demonstrating the priority of the
working directory.
* version: Correctly return VFF_CURNEDEST in VerFindFileA.
* avifil32: Correctly handle compressed frames when desired format is
specified.
* setupapi: Check handle type for HSPFILEQ handles.
* ntoskrnl.exe: Avoid invalid memory access when relocation block
addresses memory outside of the current page.
* windowscodecs: Byte swap png read/write for 16-bpp data.
Added:
* [38780] AArch64 platforms: register X18 (TEB) must remain reserved for
Wine to run 64-bit ARM Windows applications.
* [34108] dinput: Improve support for user Joystick configuration.
* [36764] dinput: Allow DirectX version 3 to enumerate joysticks.
Updated:
* ntdll-Junction_Points
* eventfd_synchronization
* ddraw-Rendering_Targets
* winex11.drv-mouse-coorrds
Where can you help
* Run Steam/Battle.net/UPlay.
* Try you favorite game.
* Test your favorite applications.
* Improve staging patches and get them accepted upstream.
As always, if you find a bug, please report it via
https://bugs.winehq.org
Best Regards
Alistair.
1
0
1
0