Wine-Devel
Threads by month
- ----- 2026 -----
- June
- May
- April
- 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
- 4 participants
- 84544 discussions
[PATCH 3/7] rundll32: Activate context at ID 123 before calling library functions.
by Zhiyi Zhang April 13, 2022
by Zhiyi Zhang April 13, 2022
April 13, 2022
This is required to enable common control v6 for library functions called by rundll32.exe.
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
programs/rundll32/rundll32.c | 25 +++++++++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/programs/rundll32/rundll32.c b/programs/rundll32/rundll32.c
index fe9d17f0f48..deae5d664c3 100644
--- a/programs/rundll32/rundll32.c
+++ b/programs/rundll32/rundll32.c
@@ -276,9 +276,12 @@ int WINAPI wWinMain(HINSTANCE instance, HINSTANCE hOldInstance, LPWSTR szCmdLine
HWND hWnd;
LPWSTR szDllName,szEntryPoint;
void *entry_point = NULL;
- BOOL unicode = FALSE, win16 = FALSE;
+ BOOL unicode = FALSE, win16 = FALSE, activated = FALSE;
+ HMODULE hDll, hCtx = INVALID_HANDLE_VALUE;
+ WCHAR path[MAX_PATH];
STARTUPINFOW info;
- HMODULE hDll;
+ ULONG_PTR cookie;
+ ACTCTXW ctx;
hWnd=NULL;
hDll=NULL;
@@ -301,6 +304,21 @@ int WINAPI wWinMain(HINSTANCE instance, HINSTANCE hOldInstance, LPWSTR szCmdLine
szEntryPoint = get_next_arg(&szCmdLine);
WINE_TRACE("EntryPoint=%s\n",wine_dbgstr_w(szEntryPoint));
+ /* Activate context before DllMain() is called */
+ if (SearchPathW(NULL, szDllName, NULL, ARRAY_SIZE(path), path, NULL))
+ {
+ memset(&ctx, 0, sizeof(ctx));
+ ctx.cbSize = sizeof(ctx);
+ ctx.lpSource = path;
+ ctx.lpResourceName = MAKEINTRESOURCEW(123);
+ ctx.dwFlags = ACTCTX_FLAG_RESOURCE_NAME_VALID;
+ hCtx = CreateActCtxW(&ctx);
+ if (hCtx != INVALID_HANDLE_VALUE)
+ activated = ActivateActCtx(hCtx, &cookie);
+ else
+ WINE_TRACE("No manifest at ID 123 in %s\n", wine_dbgstr_w(path));
+ }
+
/* Load the library */
hDll=LoadLibraryW(szDllName);
if (hDll) entry_point = get_entry_point32( hDll, szEntryPoint, &unicode );
@@ -363,6 +381,9 @@ int WINAPI wWinMain(HINSTANCE instance, HINSTANCE hOldInstance, LPWSTR szCmdLine
}
CLEANUP:
+ if (activated)
+ DeactivateActCtx(0, cookie);
+ ReleaseActCtx(hCtx);
if (hWnd)
DestroyWindow(hWnd);
if (hDll)
--
2.32.0
1
0
April 13, 2022
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/kernel32/tests/actctx.c | 31 +++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/dlls/kernel32/tests/actctx.c b/dlls/kernel32/tests/actctx.c
index ebe1bb86470..71337c0f38e 100644
--- a/dlls/kernel32/tests/actctx.c
+++ b/dlls/kernel32/tests/actctx.c
@@ -2688,9 +2688,12 @@ static void extract_resource(const char *name, const char *type, const char *pat
static void test_CreateActCtx(void)
{
+ static const DWORD flags[] = {LOAD_LIBRARY_AS_DATAFILE, LOAD_LIBRARY_AS_IMAGE_RESOURCE,
+ LOAD_LIBRARY_AS_IMAGE_RESOURCE | LOAD_LIBRARY_AS_DATAFILE};
CHAR path[MAX_PATH], dir[MAX_PATH], dll[MAX_PATH];
ACTCTXA actctx;
HANDLE handle;
+ int i;
GetTempPathA(ARRAY_SIZE(path), path);
strcat(path, "main_wndcls.manifest");
@@ -2827,6 +2830,34 @@ todo_wine {
delete_manifest_file("testdir.manifest");
delete_manifest_file("assembly_dir\\testdir.manifest");
RemoveDirectoryA(dir);
+
+ /* create using lpSource with a DLL relative name */
+ memset(&actctx, 0, sizeof(actctx));
+ actctx.cbSize = sizeof(actctx);
+ actctx.lpSource = "shell32.dll";
+ actctx.lpResourceName = MAKEINTRESOURCEA(124);
+ actctx.dwFlags = ACTCTX_FLAG_RESOURCE_NAME_VALID;
+ handle = CreateActCtxA(&actctx);
+ ok(handle == INVALID_HANDLE_VALUE, "CreateActCtxA succeeded\n");
+
+ /* create from module loaded as data file */
+ memset(&actctx, 0, sizeof(actctx));
+ actctx.cbSize = sizeof(actctx);
+ actctx.lpResourceName = MAKEINTRESOURCEA(1);
+ actctx.dwFlags = ACTCTX_FLAG_HMODULE_VALID | ACTCTX_FLAG_RESOURCE_NAME_VALID;
+ for (i = 0; i < ARRAY_SIZE(flags); ++i)
+ {
+ winetest_push_context("%lu", flags[i]);
+
+ /* use explorer.exe because using modules already loaded has a different behavior */
+ actctx.hModule = LoadLibraryExA("C:\\windows\\explorer.exe", NULL, flags[i]);
+ ok(actctx.hModule != NULL, "LoadLibraryExA failed, error %lu\n", GetLastError());
+ handle = CreateActCtxA(&actctx);
+ ok(handle == INVALID_HANDLE_VALUE, "CreateActCtxA succeeded\n");
+ FreeLibrary(actctx.hModule);
+
+ winetest_pop_context();
+ }
}
static BOOL init_funcs(void)
--
2.32.0
1
0
[PATCH 1/2] win32u: Do not enumerate the "Keyboard Layouts" key in NtUserGetKeyboardLayoutList().
by Zebediah Figura April 12, 2022
by Zebediah Figura April 12, 2022
April 12, 2022
From: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
This function returns only those keyboards currently configured by the user,
whereas the "Keyboard Layouts" key contains all keyboards that can be
configured.
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/win32u/input.c | 44 +++-----------------------------------------
1 file changed, 3 insertions(+), 41 deletions(-)
diff --git a/dlls/win32u/input.c b/dlls/win32u/input.c
index addff0e5fb3..70b4d7e4fb5 100644
--- a/dlls/win32u/input.c
+++ b/dlls/win32u/input.c
@@ -929,54 +929,16 @@ HKL WINAPI NtUserActivateKeyboardLayout( HKL layout, UINT flags )
*/
UINT WINAPI NtUserGetKeyboardLayoutList( INT size, HKL *layouts )
{
- char buffer[4096];
- KEY_NODE_INFORMATION *key_info = (KEY_NODE_INFORMATION *)buffer;
- KEY_VALUE_PARTIAL_INFORMATION *value_info = (KEY_VALUE_PARTIAL_INFORMATION *)buffer;
- DWORD count, tmp, i = 0;
- HKEY hkey, subkey;
- HKL layout;
+ DWORD count;
TRACE_(keyboard)( "size %d, layouts %p.\n", size, layouts );
if ((count = user_driver->pGetKeyboardLayoutList( size, layouts )) != ~0) return count;
- layout = get_locale_kbd_layout();
- count = 0;
-
- count++;
if (size && layouts)
- {
- layouts[count - 1] = layout;
- if (count == size) return count;
- }
+ layouts[0] = get_locale_kbd_layout();
- if ((hkey = reg_open_key( NULL, keyboard_layouts_keyW, sizeof(keyboard_layouts_keyW) )))
- {
- while (!NtEnumerateKey( hkey, i++, KeyNodeInformation, key_info,
- sizeof(buffer) - sizeof(WCHAR), &tmp ))
- {
- if (!(subkey = reg_open_key( hkey, key_info->Name, key_info->NameLength ))) continue;
- key_info->Name[key_info->NameLength / sizeof(WCHAR)] = 0;
- tmp = wcstoul( key_info->Name, NULL, 16 );
- if (query_reg_ascii_value( subkey, "Layout Id", value_info, sizeof(buffer) ) &&
- value_info->Type == REG_SZ)
- tmp = MAKELONG( LOWORD( tmp ),
- 0xf000 | (wcstoul( (const WCHAR *)value_info->Data, NULL, 16 ) & 0xfff) );
- NtClose( subkey );
-
- if (layout == UlongToHandle( tmp )) continue;
-
- count++;
- if (size && layouts)
- {
- layouts[count - 1] = UlongToHandle( tmp );
- if (count == size) break;
- }
- }
- NtClose( hkey );
- }
-
- return count;
+ return 1;
}
/****************************************************************************
--
2.34.1
1
1
[PATCH 1/4] ntdll: Return the required length from NtQueryDirectoryObject().
by Zebediah Figura April 12, 2022
by Zebediah Figura April 12, 2022
April 12, 2022
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/ntdll/tests/om.c | 2 +-
dlls/ntdll/unix/sync.c | 6 +++---
server/directory.c | 6 ++++--
server/protocol.def | 1 +
4 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/dlls/ntdll/tests/om.c b/dlls/ntdll/tests/om.c
index 91eb2919cb6..7d7b4b09e73 100644
--- a/dlls/ntdll/tests/om.c
+++ b/dlls/ntdll/tests/om.c
@@ -2638,7 +2638,7 @@ static void test_query_directory(void)
memset( buffer, 0xcc, sizeof(buffer) );
status = NtQueryDirectoryObject( dir, info, needed_size - 1, TRUE, TRUE, &context, &size );
ok( status == STATUS_BUFFER_TOO_SMALL, "got %#lx\n", status );
- todo_wine ok( size == needed_size, "expected size %lu, got %lu\n", needed_size, size );
+ ok( size == needed_size, "expected size %lu, got %lu\n", needed_size, size );
status = NtQueryDirectoryObject( dir, info, sizeof(buffer), TRUE, TRUE, &context, NULL );
ok( !status, "got %#lx\n", status );
diff --git a/dlls/ntdll/unix/sync.c b/dlls/ntdll/unix/sync.c
index e1cc2d818b4..46facdd2b0e 100644
--- a/dlls/ntdll/unix/sync.c
+++ b/dlls/ntdll/unix/sync.c
@@ -1125,10 +1125,10 @@ NTSTATUS WINAPI NtQueryDirectoryObject( HANDLE handle, DIRECTORY_BASIC_INFORMATI
buffer->ObjectName.Buffer[buffer->ObjectName.Length/sizeof(WCHAR)] = 0;
buffer->ObjectTypeName.Buffer[buffer->ObjectTypeName.Length/sizeof(WCHAR)] = 0;
*context = index + 1;
-
- if (ret_size)
- *ret_size = buffer->ObjectName.MaximumLength + buffer->ObjectTypeName.MaximumLength + sizeof(*buffer);
}
+
+ if (ret_size && (!ret || ret == STATUS_BUFFER_TOO_SMALL))
+ *ret_size = sizeof(*buffer) + reply->total_len + 2 * sizeof(WCHAR);
}
SERVER_END_REQ;
}
diff --git a/server/directory.c b/server/directory.c
index caaf8c43d33..23d7eb0a2b7 100644
--- a/server/directory.c
+++ b/server/directory.c
@@ -546,9 +546,11 @@ DECL_HANDLER(get_directory_entry)
const struct unicode_str *type_name = &obj->ops->type->name;
const WCHAR *name = get_object_name( obj, &name_len );
- if (name_len + type_name->len <= get_reply_max_size())
+ reply->total_len = name_len + type_name->len;
+
+ if (reply->total_len <= get_reply_max_size())
{
- void *ptr = set_reply_data_size( name_len + type_name->len );
+ void *ptr = set_reply_data_size( reply->total_len );
if (ptr)
{
reply->name_len = name_len;
diff --git a/server/protocol.def b/server/protocol.def
index d9bed6855e9..9b7b99ae86a 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -3275,6 +3275,7 @@ struct handle_info
obj_handle_t handle; /* handle to the directory */
unsigned int index; /* entry index */
@REPLY
+ data_size_t total_len; /* total length needed for strings */
data_size_t name_len; /* length of the entry name in bytes */
VARARG(name,unicode_str,name_len); /* entry name */
VARARG(type,unicode_str); /* entry type */
--
2.34.1
2
5
[PATCH] kernelbase: Set user_lcid to the user locale, not the system locale.
by Zebediah Figura April 12, 2022
by Zebediah Figura April 12, 2022
April 12, 2022
Fixes: fffbe3fcaef9c2b0e3814305b212a95188c1b0c2
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/kernelbase/locale.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c
index 358aa8c123c..95d7d77ecd7 100644
--- a/dlls/kernelbase/locale.c
+++ b/dlls/kernelbase/locale.c
@@ -1767,7 +1767,7 @@ void init_locale( HMODULE module )
load_locale_nls();
NtQueryDefaultLocale( FALSE, &system_lcid );
- NtQueryDefaultLocale( FALSE, &user_lcid );
+ NtQueryDefaultLocale( TRUE, &user_lcid );
if (!(system_locale = NlsValidateLocale( &system_lcid, 0 )))
{
if (GetEnvironmentVariableW( L"WINELOCALE", bufferW, ARRAY_SIZE(bufferW) ))
--
2.34.1
1
0
April 12, 2022
From: Nikolay Sivov <nsivov(a)codeweavers.com>
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
Signed-off-by: Matteo Bruni <mbruni(a)codeweavers.com>
---
v2: Tweak style / formatting a bit more while at it.
dlls/d3dxof/Makefile.in | 1 -
dlls/d3dxof/d3dxof.c | 561 ++++++++++++++++++++--------------------
dlls/d3dxof/parsing.c | 76 +++---
3 files changed, 322 insertions(+), 316 deletions(-)
diff --git a/dlls/d3dxof/Makefile.in b/dlls/d3dxof/Makefile.in
index 8171b57421d..93032adbb3f 100644
--- a/dlls/d3dxof/Makefile.in
+++ b/dlls/d3dxof/Makefile.in
@@ -1,4 +1,3 @@
-EXTRADEFS = -DWINE_NO_LONG_TYPES
MODULE = d3dxof.dll
IMPORTLIB = d3dxof
IMPORTS = dxguid uuid ole32 advapi32
diff --git a/dlls/d3dxof/d3dxof.c b/dlls/d3dxof/d3dxof.c
index e16b0d802f3..41614d117fe 100644
--- a/dlls/d3dxof/d3dxof.c
+++ b/dlls/d3dxof/d3dxof.c
@@ -81,46 +81,49 @@ static inline IDirectXFileImpl *impl_from_IDirectXFile(IDirectXFile *iface)
return CONTAINING_RECORD(iface, IDirectXFileImpl, IDirectXFile_iface);
}
-/*** IUnknown methods ***/
-static HRESULT WINAPI IDirectXFileImpl_QueryInterface(IDirectXFile* iface, REFIID riid, void** ppvObject)
+static HRESULT WINAPI IDirectXFileImpl_QueryInterface(IDirectXFile *iface, REFIID riid, void **out)
{
- IDirectXFileImpl *This = impl_from_IDirectXFile(iface);
+ IDirectXFileImpl *object = impl_from_IDirectXFile(iface);
- TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
+ TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
- if (IsEqualGUID(riid, &IID_IUnknown)
- || IsEqualGUID(riid, &IID_IDirectXFile))
- {
- IUnknown_AddRef(iface);
- *ppvObject = &This->IDirectXFile_iface;
- return S_OK;
- }
+ if (IsEqualGUID(riid, &IID_IUnknown)
+ || IsEqualGUID(riid, &IID_IDirectXFile))
+ {
+ *out = &object->IDirectXFile_iface;
+ }
+ else
+ {
+ *out = NULL;
+ WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+ }
- ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
- return E_NOINTERFACE;
+ IUnknown_AddRef((IUnknown *)*out);
+ return S_OK;
}
-static ULONG WINAPI IDirectXFileImpl_AddRef(IDirectXFile* iface)
+static ULONG WINAPI IDirectXFileImpl_AddRef(IDirectXFile *iface)
{
- IDirectXFileImpl *This = impl_from_IDirectXFile(iface);
- ULONG ref = InterlockedIncrement(&This->ref);
+ IDirectXFileImpl *object = impl_from_IDirectXFile(iface);
+ ULONG refcount = InterlockedIncrement(&object->ref);
- TRACE("(%p/%p)->(): new ref %d\n", iface, This, ref);
+ TRACE("%p increasing refcount to %lu.\n", iface, refcount);
- return ref;
+ return refcount;
}
-static ULONG WINAPI IDirectXFileImpl_Release(IDirectXFile* iface)
+static ULONG WINAPI IDirectXFileImpl_Release(IDirectXFile *iface)
{
- IDirectXFileImpl *This = impl_from_IDirectXFile(iface);
- ULONG ref = InterlockedDecrement(&This->ref);
+ IDirectXFileImpl *object = impl_from_IDirectXFile(iface);
+ ULONG refcount = InterlockedDecrement(&object->ref);
- TRACE("(%p/%p)->(): new ref %d\n", iface, This, ref);
+ TRACE("%p decreasing refcount to %lu.\n", iface, refcount);
- if (!ref)
- HeapFree(GetProcessHeap(), 0, This);
+ if (!refcount)
+ HeapFree(GetProcessHeap(), 0, object);
- return ref;
+ return refcount;
}
/*** IDirectXFile methods ***/
@@ -133,7 +136,7 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV
DWORD file_size;
DWORD bytes_written;
- TRACE("(%p/%p)->(%p,%x,%p)\n", This, iface, pvSource, dwLoadOptions, ppEnumObj);
+ TRACE("iface %p, source %p, load_options %#lx, out %p.\n", iface, pvSource, dwLoadOptions, ppEnumObj);
if (!ppEnumObj)
return DXFILEERR_BADVALUE;
@@ -212,19 +215,19 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV
{
LPDXFILELOADMEMORY lpdxflm = pvSource;
- TRACE("Source in memory at %p with size %d\n", lpdxflm->lpMemory, lpdxflm->dSize);
+ TRACE("Source in memory at %p with size %ld.\n", lpdxflm->lpMemory, lpdxflm->dSize);
file_buffer = lpdxflm->lpMemory;
file_size = lpdxflm->dSize;
}
else
{
- FIXME("Source type %d is not handled yet\n", dwLoadOptions);
+ FIXME("Source type %ld not handled yet.\n", dwLoadOptions);
hr = DXFILEERR_NOTDONEYET;
goto error;
}
- TRACE("File size is %d bytes\n", file_size);
+ TRACE("File size is %lu bytes.\n", file_size);
if (TRACE_ON(d3dxof_dump))
{
@@ -261,7 +264,7 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV
if (TRACE_ON(d3dxof))
{
ULONG i;
- TRACE("Registered templates (%d):\n", This->nb_xtemplates);
+ TRACE("Registered templates (%lu):\n", This->nb_xtemplates);
for (i = 1; i < This->nb_xtemplates; i++)
TRACE("%s - %s\n", This->xtemplates[i].name, debugstr_guid(&This->xtemplates[i].class_id));
}
@@ -277,21 +280,22 @@ error:
return hr;
}
-static HRESULT WINAPI IDirectXFileImpl_CreateSaveObject(IDirectXFile* iface, LPCSTR szFileName, DXFILEFORMAT dwFileFormat, LPDIRECTXFILESAVEOBJECT* ppSaveObj)
+static HRESULT WINAPI IDirectXFileImpl_CreateSaveObject(IDirectXFile *iface, const char *filename,
+ DXFILEFORMAT format, LPDIRECTXFILESAVEOBJECT *out)
{
- IDirectXFileImpl *This = impl_from_IDirectXFile(iface);
- IDirectXFileSaveObjectImpl *object;
- HRESULT hr;
+ IDirectXFileSaveObjectImpl *object;
+ HRESULT hr;
- FIXME("(%p/%p)->(%s,%x,%p) partial stub!\n", This, iface, szFileName, dwFileFormat, ppSaveObj);
+ FIXME("iface %p, filename %s, format %lu, out %p partial stub!\n", iface, debugstr_a(filename),
+ format, out);
- if (!szFileName || !ppSaveObj)
- return E_POINTER;
+ if (!filename || !out)
+ return E_POINTER;
- hr = IDirectXFileSaveObjectImpl_Create(&object);
- if (SUCCEEDED(hr))
- *ppSaveObj = &object->IDirectXFileSaveObject_iface;
- return hr;
+ hr = IDirectXFileSaveObjectImpl_Create(&object);
+ if (SUCCEEDED(hr))
+ *out = &object->IDirectXFileSaveObject_iface;
+ return hr;
}
static HRESULT WINAPI IDirectXFileImpl_RegisterTemplates(IDirectXFile* iface, LPVOID pvData, DWORD cbSize)
@@ -307,7 +311,7 @@ static HRESULT WINAPI IDirectXFileImpl_RegisterTemplates(IDirectXFile* iface, LP
buf.rem_bytes = cbSize;
buf.pdxf = This;
- TRACE("(%p/%p)->(%p,%d)\n", This, iface, pvData, cbSize);
+ TRACE("iface %p, data %p, size %lu.\n", iface, pvData, cbSize);
if (!pvData)
return DXFILEERR_BADVALUE;
@@ -339,10 +343,11 @@ static HRESULT WINAPI IDirectXFileImpl_RegisterTemplates(IDirectXFile* iface, LP
if (TRACE_ON(d3dxof))
{
- ULONG i;
- TRACE("Registered templates (%d):\n", This->nb_xtemplates);
- for (i = 1; i < This->nb_xtemplates; i++)
- TRACE("%s - %s\n", This->xtemplates[i].name, debugstr_guid(&This->xtemplates[i].class_id));
+ unsigned int i;
+
+ TRACE("Registered templates (%lu):\n", This->nb_xtemplates);
+ for (i = 1; i < This->nb_xtemplates; ++i)
+ TRACE("%s - %s\n", This->xtemplates[i].name, debugstr_guid(&This->xtemplates[i].class_id));
}
hr = DXFILE_OK;
@@ -384,99 +389,91 @@ static inline IDirectXFileBinaryImpl *impl_from_IDirectXFileBinary(IDirectXFileB
return CONTAINING_RECORD(iface, IDirectXFileBinaryImpl, IDirectXFileBinary_iface);
}
-/*** IUnknown methods ***/
-static HRESULT WINAPI IDirectXFileBinaryImpl_QueryInterface(IDirectXFileBinary* iface, REFIID riid, void** ppvObject)
+static HRESULT WINAPI IDirectXFileBinaryImpl_QueryInterface(IDirectXFileBinary *iface,
+ REFIID riid, void **out)
{
- IDirectXFileBinaryImpl *This = impl_from_IDirectXFileBinary(iface);
+ IDirectXFileBinaryImpl *object = impl_from_IDirectXFileBinary(iface);
- TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
+ TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
- if (IsEqualGUID(riid, &IID_IUnknown)
- || IsEqualGUID(riid, &IID_IDirectXFileObject)
- || IsEqualGUID(riid, &IID_IDirectXFileBinary))
- {
- IUnknown_AddRef(iface);
- *ppvObject = &This->IDirectXFileBinary_iface;
- return S_OK;
- }
-
- /* Do not print an error for interfaces that can be queried to retrieve the type of the object */
- if (!IsEqualGUID(riid, &IID_IDirectXFileData)
- && !IsEqualGUID(riid, &IID_IDirectXFileDataReference))
- ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
+ if (IsEqualGUID(riid, &IID_IUnknown)
+ || IsEqualGUID(riid, &IID_IDirectXFileObject)
+ || IsEqualGUID(riid, &IID_IDirectXFileBinary))
+ {
+ *out = &object->IDirectXFileBinary_iface;
+ }
+ else
+ {
+ *out = NULL;
+ /* Do not print an error for interfaces that can be queried to
+ * retrieve the type of the object */
+ if (!IsEqualGUID(riid, &IID_IDirectXFileData) && !IsEqualGUID(riid, &IID_IDirectXFileDataReference))
+ WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+ }
- return E_NOINTERFACE;
+ IUnknown_AddRef((IUnknown *)*out);
+ return S_OK;
}
-static ULONG WINAPI IDirectXFileBinaryImpl_AddRef(IDirectXFileBinary* iface)
+static ULONG WINAPI IDirectXFileBinaryImpl_AddRef(IDirectXFileBinary *iface)
{
- IDirectXFileBinaryImpl *This = impl_from_IDirectXFileBinary(iface);
- ULONG ref = InterlockedIncrement(&This->ref);
+ IDirectXFileBinaryImpl *object = impl_from_IDirectXFileBinary(iface);
+ ULONG refcount = InterlockedIncrement(&object->ref);
- TRACE("(%p/%p)->(): new ref %d\n", iface, This, ref);
+ TRACE("%p increasing refcount to %lu.\n", iface, refcount);
- return ref;
+ return refcount;
}
-static ULONG WINAPI IDirectXFileBinaryImpl_Release(IDirectXFileBinary* iface)
+static ULONG WINAPI IDirectXFileBinaryImpl_Release(IDirectXFileBinary *iface)
{
- IDirectXFileBinaryImpl *This = impl_from_IDirectXFileBinary(iface);
- ULONG ref = InterlockedDecrement(&This->ref);
+ IDirectXFileBinaryImpl *object = impl_from_IDirectXFileBinary(iface);
+ ULONG refcount = InterlockedDecrement(&object->ref);
- TRACE("(%p/%p)->(): new ref %d\n", iface, This, ref);
+ TRACE("%p decreasing refcount to %lu.\n", iface, refcount);
- if (!ref)
- HeapFree(GetProcessHeap(), 0, This);
+ if (!refcount)
+ HeapFree(GetProcessHeap(), 0, object);
- return ref;
+ return refcount;
}
-/*** IDirectXFileObject methods ***/
-static HRESULT WINAPI IDirectXFileBinaryImpl_GetName(IDirectXFileBinary* iface, LPSTR pstrNameBuf, LPDWORD pdwBufLen)
-
+static HRESULT WINAPI IDirectXFileBinaryImpl_GetName(IDirectXFileBinary *iface, char *name,
+ DWORD *length)
{
- IDirectXFileBinaryImpl *This = impl_from_IDirectXFileBinary(iface);
-
- FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, pstrNameBuf, pdwBufLen);
+ FIXME("iface %p, name %p, length %p stub!\n", iface, name, length);
- return DXFILEERR_BADVALUE;
+ return DXFILEERR_BADVALUE;
}
-static HRESULT WINAPI IDirectXFileBinaryImpl_GetId(IDirectXFileBinary* iface, LPGUID pGuid)
+static HRESULT WINAPI IDirectXFileBinaryImpl_GetId(IDirectXFileBinary *iface, GUID *guid)
{
- IDirectXFileBinaryImpl *This = impl_from_IDirectXFileBinary(iface);
-
- FIXME("(%p/%p)->(%p) stub!\n", This, iface, pGuid);
+ FIXME("iface %p, guid %p stub!\n", iface, guid);
- return DXFILEERR_BADVALUE;
+ return DXFILEERR_BADVALUE;
}
-/*** IDirectXFileBinary methods ***/
-static HRESULT WINAPI IDirectXFileBinaryImpl_GetSize(IDirectXFileBinary* iface, DWORD* pcbSize)
+static HRESULT WINAPI IDirectXFileBinaryImpl_GetSize(IDirectXFileBinary *iface, DWORD *size)
{
- IDirectXFileBinaryImpl *This = impl_from_IDirectXFileBinary(iface);
-
- FIXME("(%p/%p)->(%p) stub!\n", This, iface, pcbSize);
+ FIXME("iface %p, size %p stub!\n", iface, size);
- return DXFILEERR_BADVALUE;
+ return DXFILEERR_BADVALUE;
}
-static HRESULT WINAPI IDirectXFileBinaryImpl_GetMimeType(IDirectXFileBinary* iface, LPCSTR* pszMimeType)
+static HRESULT WINAPI IDirectXFileBinaryImpl_GetMimeType(IDirectXFileBinary *iface, LPCSTR *mimetype)
{
- IDirectXFileBinaryImpl *This = impl_from_IDirectXFileBinary(iface);
-
- FIXME("(%p/%p)->(%p) stub!\n", This, iface, pszMimeType);
+ FIXME("iface %p, mimetype %p stub!\n", iface, mimetype);
- return DXFILEERR_BADVALUE;
+ return DXFILEERR_BADVALUE;
}
-static HRESULT WINAPI IDirectXFileBinaryImpl_Read(IDirectXFileBinary* iface, LPVOID pvData, DWORD cbSize, LPDWORD pcbRead)
+static HRESULT WINAPI IDirectXFileBinaryImpl_Read(IDirectXFileBinary *iface, void *data,
+ DWORD size, DWORD *count)
{
- IDirectXFileBinaryImpl *This = impl_from_IDirectXFileBinary(iface);
-
- FIXME("(%p/%p)->(%p, %d, %p) stub!\n", This, iface, pvData, cbSize, pcbRead);
+ FIXME("iface %p, data %p, size %lu, count %p stub!\n", iface, data, size, count);
- return DXFILEERR_BADVALUE;
+ return DXFILEERR_BADVALUE;
}
static const IDirectXFileBinaryVtbl IDirectXFileBinary_Vtbl =
@@ -514,62 +511,65 @@ static inline IDirectXFileDataImpl *impl_from_IDirectXFileData(IDirectXFileData
return CONTAINING_RECORD(iface, IDirectXFileDataImpl, IDirectXFileData_iface);
}
-/*** IUnknown methods ***/
-static HRESULT WINAPI IDirectXFileDataImpl_QueryInterface(IDirectXFileData* iface, REFIID riid, void** ppvObject)
+static HRESULT WINAPI IDirectXFileDataImpl_QueryInterface(IDirectXFileData *iface, REFIID riid,
+ void **out)
{
- IDirectXFileDataImpl *This = impl_from_IDirectXFileData(iface);
+ IDirectXFileDataImpl *data = impl_from_IDirectXFileData(iface);
- TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
-
- if (IsEqualGUID(riid, &IID_IUnknown)
- || IsEqualGUID(riid, &IID_IDirectXFileObject)
- || IsEqualGUID(riid, &IID_IDirectXFileData))
- {
- IUnknown_AddRef(iface);
- *ppvObject = &This->IDirectXFileData_iface;
- return S_OK;
- }
+ TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
- /* Do not print an error for interfaces that can be queried to retrieve the type of the object */
- if (!IsEqualGUID(riid, &IID_IDirectXFileBinary)
- && !IsEqualGUID(riid, &IID_IDirectXFileDataReference))
- ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
+ if (IsEqualGUID(riid, &IID_IUnknown)
+ || IsEqualGUID(riid, &IID_IDirectXFileObject)
+ || IsEqualGUID(riid, &IID_IDirectXFileData))
+ {
+ *out = &data->IDirectXFileData_iface;
+ }
+ else
+ {
+ *out = NULL;
+ /* Do not print an error for interfaces that can be queried to
+ * retrieve the type of the object */
+ if (!IsEqualGUID(riid, &IID_IDirectXFileBinary) && !IsEqualGUID(riid, &IID_IDirectXFileDataReference))
+ WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+ }
- return E_NOINTERFACE;
+ IUnknown_AddRef((IUnknown *)*out);
+ return S_OK;
}
-static ULONG WINAPI IDirectXFileDataImpl_AddRef(IDirectXFileData* iface)
+static ULONG WINAPI IDirectXFileDataImpl_AddRef(IDirectXFileData *iface)
{
- IDirectXFileDataImpl *This = impl_from_IDirectXFileData(iface);
- ULONG ref = InterlockedIncrement(&This->ref);
+ IDirectXFileDataImpl *data = impl_from_IDirectXFileData(iface);
+ ULONG refcount = InterlockedIncrement(&data->ref);
- TRACE("(%p/%p)->(): new ref %d\n", iface, This, ref);
+ TRACE("%p increasing refcount to %lu.\n", iface, refcount);
- return ref;
+ return refcount;
}
-static ULONG WINAPI IDirectXFileDataImpl_Release(IDirectXFileData* iface)
+static ULONG WINAPI IDirectXFileDataImpl_Release(IDirectXFileData *iface)
{
- IDirectXFileDataImpl *This = impl_from_IDirectXFileData(iface);
- ULONG ref = InterlockedDecrement(&This->ref);
+ IDirectXFileDataImpl *data = impl_from_IDirectXFileData(iface);
+ ULONG refcount = InterlockedDecrement(&data->ref);
- TRACE("(%p/%p)->(): new ref %d\n", iface, This, ref);
+ TRACE("%p decreasing refcount to %lu.\n", iface, refcount);
- if (!ref)
- {
- if (!This->level && !This->from_ref)
+ if (!refcount)
{
- HeapFree(GetProcessHeap(), 0, This->pstrings);
- if (This->pobj)
- {
- HeapFree(GetProcessHeap(), 0, This->pobj->pdata);
- HeapFree(GetProcessHeap(), 0, This->pobj);
- }
+ if (!data->level && !data->from_ref)
+ {
+ HeapFree(GetProcessHeap(), 0, data->pstrings);
+ if (data->pobj)
+ {
+ HeapFree(GetProcessHeap(), 0, data->pobj->pdata);
+ HeapFree(GetProcessHeap(), 0, data->pobj);
+ }
+ }
+ HeapFree(GetProcessHeap(), 0, data);
}
- HeapFree(GetProcessHeap(), 0, This);
- }
- return ref;
+ return refcount;
}
/*** IDirectXFileObject methods ***/
@@ -724,31 +724,29 @@ static HRESULT WINAPI IDirectXFileDataImpl_GetNextObject(IDirectXFileData* iface
return DXFILE_OK;
}
-static HRESULT WINAPI IDirectXFileDataImpl_AddDataObject(IDirectXFileData* iface, LPDIRECTXFILEDATA pDataObj)
+static HRESULT WINAPI IDirectXFileDataImpl_AddDataObject(IDirectXFileData *iface, LPDIRECTXFILEDATA data)
{
- IDirectXFileDataImpl *This = impl_from_IDirectXFileData(iface);
-
- FIXME("(%p/%p)->(%p) stub!\n", This, iface, pDataObj);
+ FIXME("iface %p, data %p stub!\n", iface, data);
- return DXFILEERR_BADVALUE;
+ return DXFILEERR_BADVALUE;
}
-static HRESULT WINAPI IDirectXFileDataImpl_AddDataReference(IDirectXFileData* iface, LPCSTR szRef, const GUID* pguidRef)
+static HRESULT WINAPI IDirectXFileDataImpl_AddDataReference(IDirectXFileData *iface,
+ const char *reference, const GUID *guidref)
{
- IDirectXFileDataImpl *This = impl_from_IDirectXFileData(iface);
-
- FIXME("(%p/%p)->(%s,%p) stub!\n", This, iface, szRef, pguidRef);
+ FIXME("iface %p, reference %s, guid reference %s stub!\n", iface, debugstr_a(reference),
+ debugstr_guid(guidref));
- return DXFILEERR_BADVALUE;
+ return DXFILEERR_BADVALUE;
}
-static HRESULT WINAPI IDirectXFileDataImpl_AddBinaryObject(IDirectXFileData* iface, LPCSTR szName, const GUID* pguid, LPCSTR szMimeType, LPVOID pvData, DWORD cbSize)
+static HRESULT WINAPI IDirectXFileDataImpl_AddBinaryObject(IDirectXFileData *iface, const char *name,
+ const GUID *guid, const char *mimetype, void *data, DWORD size)
{
- IDirectXFileDataImpl *This = impl_from_IDirectXFileData(iface);
+ FIXME("iface %p, name %s, guid %s, mimetype %s, data %p, size %lu stub!\n", iface, debugstr_a(name),
+ debugstr_guid(guid), debugstr_a(mimetype), data, size);
- FIXME("(%p/%p)->(%s,%p,%s,%p,%d) stub!\n", This, iface, szName, pguid, szMimeType, pvData, cbSize);
-
- return DXFILEERR_BADVALUE;
+ return DXFILEERR_BADVALUE;
}
static const IDirectXFileDataVtbl IDirectXFileData_Vtbl =
@@ -789,51 +787,54 @@ static inline IDirectXFileDataReferenceImpl *impl_from_IDirectXFileDataReference
return CONTAINING_RECORD(iface, IDirectXFileDataReferenceImpl, IDirectXFileDataReference_iface);
}
-/*** IUnknown methods ***/
-static HRESULT WINAPI IDirectXFileDataReferenceImpl_QueryInterface(IDirectXFileDataReference* iface, REFIID riid, void** ppvObject)
+static HRESULT WINAPI IDirectXFileDataReferenceImpl_QueryInterface(IDirectXFileDataReference *iface,
+ REFIID riid, void **out)
{
- IDirectXFileDataReferenceImpl *This = impl_from_IDirectXFileDataReference(iface);
+ IDirectXFileDataReferenceImpl *object = impl_from_IDirectXFileDataReference(iface);
- TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
+ TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
- if (IsEqualGUID(riid, &IID_IUnknown)
- || IsEqualGUID(riid, &IID_IDirectXFileObject)
- || IsEqualGUID(riid, &IID_IDirectXFileDataReference))
- {
- IUnknown_AddRef(iface);
- *ppvObject = &This->IDirectXFileDataReference_iface;
- return S_OK;
- }
-
- /* Do not print an error for interfaces that can be queried to retrieve the type of the object */
- if (!IsEqualGUID(riid, &IID_IDirectXFileData)
- && !IsEqualGUID(riid, &IID_IDirectXFileBinary))
- ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
+ if (IsEqualGUID(riid, &IID_IUnknown)
+ || IsEqualGUID(riid, &IID_IDirectXFileObject)
+ || IsEqualGUID(riid, &IID_IDirectXFileDataReference))
+ {
+ *out = &object->IDirectXFileDataReference_iface;
+ }
+ else
+ {
+ /* Do not print an error for interfaces that can be queried to
+ * retrieve the type of the object */
+ *out = NULL;
+ if (!IsEqualGUID(riid, &IID_IDirectXFileData) && !IsEqualGUID(riid, &IID_IDirectXFileBinary))
+ WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+ }
- return E_NOINTERFACE;
+ IUnknown_AddRef((IUnknown *)*out);
+ return S_OK;
}
-static ULONG WINAPI IDirectXFileDataReferenceImpl_AddRef(IDirectXFileDataReference* iface)
+static ULONG WINAPI IDirectXFileDataReferenceImpl_AddRef(IDirectXFileDataReference *iface)
{
- IDirectXFileDataReferenceImpl *This = impl_from_IDirectXFileDataReference(iface);
- ULONG ref = InterlockedIncrement(&This->ref);
+ IDirectXFileDataReferenceImpl *object = impl_from_IDirectXFileDataReference(iface);
+ ULONG refcount = InterlockedIncrement(&object->ref);
- TRACE("(%p/%p)->(): new ref %d\n", iface, This, ref);
+ TRACE("%p increasing refcount to %lu.\n", iface, refcount);
- return ref;
+ return refcount;
}
-static ULONG WINAPI IDirectXFileDataReferenceImpl_Release(IDirectXFileDataReference* iface)
+static ULONG WINAPI IDirectXFileDataReferenceImpl_Release(IDirectXFileDataReference *iface)
{
- IDirectXFileDataReferenceImpl *This = impl_from_IDirectXFileDataReference(iface);
- ULONG ref = InterlockedDecrement(&This->ref);
+ IDirectXFileDataReferenceImpl *object = impl_from_IDirectXFileDataReference(iface);
+ ULONG refcount = InterlockedDecrement(&object->ref);
- TRACE("(%p/%p)->(): new ref %d\n", iface, This, ref);
+ TRACE("%p decreasing refcount to %lu.\n", iface, refcount);
- if (!ref)
- HeapFree(GetProcessHeap(), 0, This);
+ if (!refcount)
+ HeapFree(GetProcessHeap(), 0, object);
- return ref;
+ return refcount;
}
/*** IDirectXFileObject methods ***/
@@ -864,18 +865,19 @@ static HRESULT WINAPI IDirectXFileDataReferenceImpl_GetName(IDirectXFileDataRefe
return DXFILE_OK;
}
-static HRESULT WINAPI IDirectXFileDataReferenceImpl_GetId(IDirectXFileDataReference* iface, LPGUID pGuid)
+static HRESULT WINAPI IDirectXFileDataReferenceImpl_GetId(IDirectXFileDataReference *iface,
+ GUID *guid)
{
- IDirectXFileDataReferenceImpl *This = impl_from_IDirectXFileDataReference(iface);
+ IDirectXFileDataReferenceImpl *object = impl_from_IDirectXFileDataReference(iface);
- TRACE("(%p/%p)->(%p)\n", This, iface, pGuid);
+ TRACE("iface %p, guid %p.\n", iface, guid);
- if (!pGuid)
- return DXFILEERR_BADVALUE;
+ if (!guid)
+ return DXFILEERR_BADVALUE;
- *pGuid = This->ptarget->class_id;
+ *guid = object->ptarget->class_id;
- return DXFILE_OK;
+ return DXFILE_OK;
}
/*** IDirectXFileDataReference ***/
@@ -937,54 +939,59 @@ static inline IDirectXFileEnumObjectImpl *impl_from_IDirectXFileEnumObject(IDire
return CONTAINING_RECORD(iface, IDirectXFileEnumObjectImpl, IDirectXFileEnumObject_iface);
}
-/*** IUnknown methods ***/
-static HRESULT WINAPI IDirectXFileEnumObjectImpl_QueryInterface(IDirectXFileEnumObject* iface, REFIID riid, void** ppvObject)
+static HRESULT WINAPI IDirectXFileEnumObjectImpl_QueryInterface(IDirectXFileEnumObject *iface,
+ REFIID riid, void **out)
{
- IDirectXFileEnumObjectImpl *This = impl_from_IDirectXFileEnumObject(iface);
+ IDirectXFileEnumObjectImpl *object = impl_from_IDirectXFileEnumObject(iface);
- TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
+ TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
- if (IsEqualGUID(riid, &IID_IUnknown)
- || IsEqualGUID(riid, &IID_IDirectXFileEnumObject))
- {
- IUnknown_AddRef(iface);
- *ppvObject = &This->IDirectXFileEnumObject_iface;
- return S_OK;
- }
+ if (IsEqualGUID(riid, &IID_IUnknown)
+ || IsEqualGUID(riid, &IID_IDirectXFileEnumObject))
+ {
+ *out = &object->IDirectXFileEnumObject_iface;
+ }
+ else
+ {
+ *out = NULL;
+ WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+ }
- ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
- return E_NOINTERFACE;
+ IUnknown_AddRef((IUnknown *)*out);
+ return S_OK;
}
-static ULONG WINAPI IDirectXFileEnumObjectImpl_AddRef(IDirectXFileEnumObject* iface)
+static ULONG WINAPI IDirectXFileEnumObjectImpl_AddRef(IDirectXFileEnumObject *iface)
{
- IDirectXFileEnumObjectImpl *This = impl_from_IDirectXFileEnumObject(iface);
- ULONG ref = InterlockedIncrement(&This->ref);
+ IDirectXFileEnumObjectImpl *object = impl_from_IDirectXFileEnumObject(iface);
+ ULONG refcount = InterlockedIncrement(&object->ref);
- TRACE("(%p/%p)->(): new ref %d\n", iface, This, ref);
+ TRACE("%p increasing refcount to %lu.\n", iface, refcount);
- return ref;
+ return refcount;
}
-static ULONG WINAPI IDirectXFileEnumObjectImpl_Release(IDirectXFileEnumObject* iface)
+static ULONG WINAPI IDirectXFileEnumObjectImpl_Release(IDirectXFileEnumObject *iface)
{
- IDirectXFileEnumObjectImpl *This = impl_from_IDirectXFileEnumObject(iface);
- ULONG ref = InterlockedDecrement(&This->ref);
+ IDirectXFileEnumObjectImpl *object = impl_from_IDirectXFileEnumObject(iface);
+ ULONG refcount = InterlockedDecrement(&object->ref);
- TRACE("(%p/%p)->(): new ref %d\n", iface, This, ref);
+ TRACE("%p decreasing refcount to %lu.\n", iface, refcount);
- if (!ref)
- {
- ULONG i;
- for (i = 0; i < This->nb_xobjects; i++)
- IDirectXFileData_Release(This->pRefObjects[i]);
- if (This->mapped_memory)
- UnmapViewOfFile(This->mapped_memory);
- HeapFree(GetProcessHeap(), 0, This->decomp_buffer);
- HeapFree(GetProcessHeap(), 0, This);
- }
+ if (!refcount)
+ {
+ unsigned int i;
+
+ for (i = 0; i < object->nb_xobjects; ++i)
+ IDirectXFileData_Release(object->pRefObjects[i]);
+ if (object->mapped_memory)
+ UnmapViewOfFile(object->mapped_memory);
+ HeapFree(GetProcessHeap(), 0, object->decomp_buffer);
+ HeapFree(GetProcessHeap(), 0, object);
+ }
- return ref;
+ return refcount;
}
/*** IDirectXFileEnumObject methods ***/
@@ -1071,22 +1078,20 @@ error:
return hr;
}
-static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetDataObjectById(IDirectXFileEnumObject* iface, REFGUID rguid, LPDIRECTXFILEDATA* ppDataObj)
+static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetDataObjectById(IDirectXFileEnumObject *iface,
+ REFGUID guid, LPDIRECTXFILEDATA *data)
{
- IDirectXFileEnumObjectImpl *This = impl_from_IDirectXFileEnumObject(iface);
-
- FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, rguid, ppDataObj);
+ FIXME("iface %p, guid %s, data %p stub!\n", iface, debugstr_guid(guid), data);
- return DXFILEERR_BADVALUE;
+ return DXFILEERR_BADVALUE;
}
-static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetDataObjectByName(IDirectXFileEnumObject* iface, LPCSTR szName, LPDIRECTXFILEDATA* ppDataObj)
+static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetDataObjectByName(IDirectXFileEnumObject *iface,
+ const char *name, LPDIRECTXFILEDATA *data)
{
- IDirectXFileEnumObjectImpl *This = impl_from_IDirectXFileEnumObject(iface);
+ FIXME("iface %p, name %s, data %p stub!\n", iface, debugstr_a(name), data);
- FIXME("(%p/%p)->(%s,%p) stub!\n", This, iface, szName, ppDataObj);
-
- return DXFILEERR_BADVALUE;
+ return DXFILEERR_BADVALUE;
}
static const IDirectXFileEnumObjectVtbl IDirectXFileEnumObject_Vtbl =
@@ -1122,73 +1127,73 @@ static inline IDirectXFileSaveObjectImpl *impl_from_IDirectXFileSaveObject(IDire
return CONTAINING_RECORD(iface, IDirectXFileSaveObjectImpl, IDirectXFileSaveObject_iface);
}
-/*** IUnknown methods ***/
-static HRESULT WINAPI IDirectXFileSaveObjectImpl_QueryInterface(IDirectXFileSaveObject* iface, REFIID riid, void** ppvObject)
+static HRESULT WINAPI IDirectXFileSaveObjectImpl_QueryInterface(IDirectXFileSaveObject *iface,
+ REFIID riid, void **out)
{
- IDirectXFileSaveObjectImpl *This = impl_from_IDirectXFileSaveObject(iface);
+ IDirectXFileSaveObjectImpl *object = impl_from_IDirectXFileSaveObject(iface);
- TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
+ TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
- if (IsEqualGUID(riid, &IID_IUnknown)
- || IsEqualGUID(riid, &IID_IDirectXFileSaveObject))
- {
- IUnknown_AddRef(iface);
- *ppvObject = &This->IDirectXFileSaveObject_iface;
- return S_OK;
- }
+ if (IsEqualGUID(riid, &IID_IUnknown)
+ || IsEqualGUID(riid, &IID_IDirectXFileSaveObject))
+ {
+ *out = &object->IDirectXFileSaveObject_iface;
+ }
+ else
+ {
+ WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+ }
- ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
- return E_NOINTERFACE;
+ IUnknown_AddRef((IUnknown *)*out);
+ return S_OK;
}
-static ULONG WINAPI IDirectXFileSaveObjectImpl_AddRef(IDirectXFileSaveObject* iface)
+static ULONG WINAPI IDirectXFileSaveObjectImpl_AddRef(IDirectXFileSaveObject *iface)
{
- IDirectXFileSaveObjectImpl *This = impl_from_IDirectXFileSaveObject(iface);
- ULONG ref = InterlockedIncrement(&This->ref);
+ IDirectXFileSaveObjectImpl *object = impl_from_IDirectXFileSaveObject(iface);
+ ULONG refcount = InterlockedIncrement(&object->ref);
- TRACE("(%p/%p)->(): new ref %d\n", iface, This, ref);
+ TRACE("%p increasing refcount to %lu.\n", iface, refcount);
- return ref;
+ return refcount;
}
-static ULONG WINAPI IDirectXFileSaveObjectImpl_Release(IDirectXFileSaveObject* iface)
+static ULONG WINAPI IDirectXFileSaveObjectImpl_Release(IDirectXFileSaveObject *iface)
{
- IDirectXFileSaveObjectImpl *This = impl_from_IDirectXFileSaveObject(iface);
- ULONG ref = InterlockedDecrement(&This->ref);
+ IDirectXFileSaveObjectImpl *object = impl_from_IDirectXFileSaveObject(iface);
+ ULONG refcount = InterlockedDecrement(&object->ref);
- TRACE("(%p/%p)->(): new ref %d\n", iface, This, ref);
+ TRACE("%p decreasing refcount to %lu.\n", iface, refcount);
- if (!ref)
- HeapFree(GetProcessHeap(), 0, This);
+ if (!refcount)
+ HeapFree(GetProcessHeap(), 0, object);
- return ref;
+ return refcount;
}
-static HRESULT WINAPI IDirectXFileSaveObjectImpl_SaveTemplates(IDirectXFileSaveObject* iface, DWORD cTemplates, const GUID** ppguidTemplates)
+static HRESULT WINAPI IDirectXFileSaveObjectImpl_SaveTemplates(IDirectXFileSaveObject *iface,
+ DWORD count, const GUID **templates)
{
- IDirectXFileSaveObjectImpl *This = impl_from_IDirectXFileSaveObject(iface);
+ FIXME("iface %p, count %lu, templates %p stub!\n", iface, count, templates);
- FIXME("(%p/%p)->(%d,%p) stub!\n", This, iface, cTemplates, ppguidTemplates);
-
- return DXFILE_OK;
+ return DXFILE_OK;
}
-static HRESULT WINAPI IDirectXFileSaveObjectImpl_CreateDataObject(IDirectXFileSaveObject* iface, REFGUID rguidTemplate, LPCSTR szName, const GUID* pguid, DWORD cbSize, LPVOID pvData, LPDIRECTXFILEDATA* ppDataObj)
+static HRESULT WINAPI IDirectXFileSaveObjectImpl_CreateDataObject(IDirectXFileSaveObject *iface, REFGUID template,
+ const char *name, const GUID *guid, DWORD size, void *data, LPDIRECTXFILEDATA *dataobj)
{
- IDirectXFileSaveObjectImpl *This = impl_from_IDirectXFileSaveObject(iface);
-
- FIXME("(%p/%p)->(%p,%s,%p,%d,%p,%p) stub!\n", This, iface, rguidTemplate, szName, pguid, cbSize, pvData, ppDataObj);
+ FIXME("iface %p, template %s, name %s, guid %s, size %lu, data %p, dataobj %p stub!\n",
+ iface, debugstr_guid(template), debugstr_a(name), debugstr_guid(guid), size, data, dataobj);
- return DXFILEERR_BADVALUE;
+ return DXFILEERR_BADVALUE;
}
-static HRESULT WINAPI IDirectXFileSaveObjectImpl_SaveData(IDirectXFileSaveObject* iface, LPDIRECTXFILEDATA ppDataObj)
+static HRESULT WINAPI IDirectXFileSaveObjectImpl_SaveData(IDirectXFileSaveObject *iface, LPDIRECTXFILEDATA data)
{
- IDirectXFileSaveObjectImpl *This = impl_from_IDirectXFileSaveObject(iface);
-
- FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppDataObj);
+ FIXME("iface %p, data %p stub!\n", iface, data);
- return DXFILEERR_BADVALUE;
+ return DXFILEERR_BADVALUE;
}
static const IDirectXFileSaveObjectVtbl IDirectXFileSaveObject_Vtbl =
diff --git a/dlls/d3dxof/parsing.c b/dlls/d3dxof/parsing.c
index 8431078949f..5446124234e 100644
--- a/dlls/d3dxof/parsing.c
+++ b/dlls/d3dxof/parsing.c
@@ -147,7 +147,7 @@ static void dump_template(xtemplate* templates_array, xtemplate* ptemplate)
for (k = 0; k < ptemplate->members[j].nb_dims; k++)
{
if (ptemplate->members[j].dim_fixed[k])
- wine_dbg_printf("[%d]", ptemplate->members[j].dim_value[k]);
+ wine_dbg_printf("[%ld]", ptemplate->members[j].dim_value[k]);
else
wine_dbg_printf("[%s]", ptemplate->members[ptemplate->members[j].dim_value[k]].name);
}
@@ -237,8 +237,8 @@ HRESULT parse_header(parse_buffer * buf, BYTE ** decomp_buffer_ptr)
if (!read_bytes(buf, &decomp_file_size, sizeof(decomp_file_size)))
return DXFILEERR_BADFILETYPE;
- TRACE("Compressed format %s detected: decompressed file size with xof header = %d\n",
- debugstr_fourcc(header[2]), decomp_file_size);
+ TRACE("Compressed format %s detected: decompressed file size with xof header = %lu.\n",
+ debugstr_fourcc(header[2]), decomp_file_size);
/* Does not take xof header into account */
decomp_file_size -= 16;
@@ -274,8 +274,8 @@ HRESULT parse_header(parse_buffer * buf, BYTE ** decomp_buffer_ptr)
}
if ((decomp_buffer - *decomp_buffer_ptr) != decomp_file_size)
- ERR("Size of all decompressed chunks (%u) does not match decompressed file size (%u)\n",
- (DWORD)(decomp_buffer - *decomp_buffer_ptr), decomp_file_size);
+ ERR("Size of all decompressed chunks (%lu) does not match decompressed file size (%lu).\n",
+ (DWORD)(decomp_buffer - *decomp_buffer_ptr), decomp_file_size);
/* Use decompressed data */
buf->buffer = *decomp_buffer_ptr;
@@ -475,19 +475,20 @@ static BOOL is_guid(parse_buffer* buf)
tmp[pos] = 0;
if (pos != 38 /* <+36+> */)
{
- TRACE("Wrong guid %s (%d)\n", tmp, pos);
- return FALSE;
+ TRACE("Wrong guid %s (%lu).\n", tmp, pos);
+ return FALSE;
}
buf->buffer += pos;
buf->rem_bytes -= pos;
- ret = sscanf(tmp, CLSIDFMT, &class_id.Data1, tab, tab+1, tab+2, tab+3, tab+4, tab+5, tab+6, tab+7, tab+8, tab+9);
+ ret = sscanf(tmp, "<%08lx-%04lx-%04lx-%02lx%02lx-%02lx%02lx%02lx%02lx%02lx%02lx>",
+ &class_id.Data1, tab, tab+1, tab+2, tab+3, tab+4, tab+5, tab+6, tab+7, tab+8, tab+9);
if (ret != 11)
{
- TRACE("Wrong guid %s (%d)\n", tmp, pos);
- return FALSE;
+ TRACE("Wrong guid %s (%lu).\n", tmp, pos);
+ return FALSE;
}
- TRACE("Found guid %s (%d)\n", tmp, pos);
+ TRACE("Found guid %s (%lu).\n", tmp, pos);
class_id.Data2 = tab[0];
class_id.Data3 = tab[1];
@@ -588,9 +589,9 @@ static BOOL is_integer(parse_buffer* buf)
buf->buffer += pos;
buf->rem_bytes -= pos;
- sscanf(tmp, "%d", &integer);
+ sscanf(tmp, "%ld", &integer);
- TRACE("Found integer %s - %d\n", tmp, integer);
+ TRACE("Found integer %s - %ld.\n", tmp, integer);
*(DWORD*)buf->value = integer;
@@ -725,19 +726,19 @@ static WORD parse_TOKEN(parse_buffer * buf)
/* Convert integer and float list into separate elements */
if (token == TOKEN_INTEGER_LIST)
{
- if (!read_bytes(buf, &buf->list_nb_elements, 4))
- return TOKEN_ERROR;
- token = TOKEN_INTEGER;
- buf->list_type_float = FALSE;
- TRACE("Integer list (TOKEN_INTEGER_LIST) of size %d\n", buf->list_nb_elements);
+ if (!read_bytes(buf, &buf->list_nb_elements, 4))
+ return TOKEN_ERROR;
+ token = TOKEN_INTEGER;
+ buf->list_type_float = FALSE;
+ TRACE("Integer list (TOKEN_INTEGER_LIST) of size %lu.\n", buf->list_nb_elements);
}
else if (token == TOKEN_FLOAT_LIST)
{
- if (!read_bytes(buf, &buf->list_nb_elements, 4))
- return TOKEN_ERROR;
- token = TOKEN_FLOAT;
- buf->list_type_float = TRUE;
- TRACE("Float list (TOKEN_FLOAT_LIST) of size %d\n", buf->list_nb_elements);
+ if (!read_bytes(buf, &buf->list_nb_elements, 4))
+ return TOKEN_ERROR;
+ token = TOKEN_FLOAT;
+ buf->list_type_float = TRUE;
+ TRACE("Float list (TOKEN_FLOAT_LIST) of size %lu.\n", buf->list_nb_elements);
}
}
@@ -783,16 +784,16 @@ static WORD parse_TOKEN(parse_buffer * buf)
}
break;
case TOKEN_INTEGER:
- {
+ {
DWORD integer;
if (!read_bytes(buf, &integer, 4))
- return TOKEN_ERROR;
- TRACE("integer = %u\n", integer);
+ return TOKEN_ERROR;
+ TRACE("integer = %lu.\n", integer);
- *(DWORD*)buf->value = integer;
- }
- break;
+ *(DWORD *)buf->value = integer;
+ break;
+ }
case TOKEN_GUID:
{
char strguid[39];
@@ -1089,7 +1090,8 @@ static BOOL parse_template(parse_buffer * buf)
if (get_TOKEN(buf) != TOKEN_CBRACE)
return FALSE;
- TRACE("%d - %s - %s\n", buf->pdxf->nb_xtemplates, buf->pdxf->xtemplates[buf->pdxf->nb_xtemplates].name, debugstr_guid(&buf->pdxf->xtemplates[buf->pdxf->nb_xtemplates].class_id));
+ TRACE("%lu - %s - %s\n", buf->pdxf->nb_xtemplates, buf->pdxf->xtemplates[buf->pdxf->nb_xtemplates].name,
+ debugstr_guid(&buf->pdxf->xtemplates[buf->pdxf->nb_xtemplates].class_id));
buf->pdxf->nb_xtemplates++;
return TRUE;
@@ -1161,7 +1163,7 @@ static BOOL parse_object_members_list(parse_buffer * buf)
nb_elems *= *(DWORD*)(buf->pxo->root->pdata + buf->pxo->members[pt->members[i].dim_value[k]].start);
}
- TRACE("Elements to consider: %u\n", nb_elems);
+ TRACE("Elements to consider: %lu.\n", nb_elems);
for (k = 0; k < nb_elems; k++)
{
@@ -1201,7 +1203,7 @@ static BOOL parse_object_members_list(parse_buffer * buf)
if (token == TOKEN_INTEGER)
{
get_TOKEN(buf);
- TRACE("%s = %d\n", pt->members[i].name, *(DWORD*)buf->value);
+ TRACE("%s = %ld.\n", pt->members[i].name, *(DWORD *)buf->value);
/* Assume larger size */
if (!check_buffer(buf, 4))
return FALSE;
@@ -1217,7 +1219,7 @@ static BOOL parse_object_members_list(parse_buffer * buf)
}
else
{
- FIXME("Token %d not supported\n", pt->members[i].type);
+ FIXME("Token %ld not supported.\n", pt->members[i].type);
return FALSE;
}
}
@@ -1234,7 +1236,7 @@ static BOOL parse_object_members_list(parse_buffer * buf)
}
else
{
- FIXME("Token %d not supported\n", pt->members[i].type);
+ FIXME("Token %ld not supported.\n", pt->members[i].type);
return FALSE;
}
}
@@ -1259,13 +1261,13 @@ static BOOL parse_object_members_list(parse_buffer * buf)
}
else
{
- FIXME("Token %d not supported\n", pt->members[i].type);
+ FIXME("Token %ld not supported.\n", pt->members[i].type);
return FALSE;
}
}
else
{
- WARN("Unexpected token %d\n", token);
+ WARN("Unexpected token %ld.\n", token);
return FALSE;
}
}
@@ -1369,7 +1371,7 @@ _exit:
if (buf->pxo->nb_children > MAX_CHILDREN)
{
- FIXME("Too many children %d\n", buf->pxo->nb_children);
+ FIXME("Too many children: %lu.\n", buf->pxo->nb_children);
return FALSE;
}
--
2.34.1
1
2
April 12, 2022
Signed-off-by: Eric Pouech <eric.pouech(a)gmail.com>
---
dlls/windowscodecs/tests/metadata.c | 14 +++++++-------
dlls/windowscodecs/tests/pngformat.c | 4 ++--
2 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c
index 2ec9eb645e80..41f20efa9cd9 100644
--- a/dlls/windowscodecs/tests/metadata.c
+++ b/dlls/windowscodecs/tests/metadata.c
@@ -698,27 +698,27 @@ static void compare_metadata(IWICMetadataReader *reader, const struct test_data
case VT_UI1:
ok(td[i].count == U(value).caub.cElems, "%lu: expected cElems %d, got %ld\n", i, td[i].count, U(value).caub.cElems);
for (j = 0; j < U(value).caub.cElems; j++)
- ok(td[i].value[j] == U(value).caub.pElems[j], "%lu: expected value[%ld] %#lx/%#lx, got %#x\n", i, j, (ULONG)td[i].value[j], (ULONG)(td[i].value[j] >> 32), U(value).caub.pElems[j]);
+ ok(td[i].value[j] == U(value).caub.pElems[j], "%lu: expected value[%ld] %#I64x, got %#x\n", i, j, td[i].value[j], U(value).caub.pElems[j]);
break;
case VT_I2:
case VT_UI2:
ok(td[i].count == U(value).caui.cElems, "%lu: expected cElems %d, got %ld\n", i, td[i].count, U(value).caui.cElems);
for (j = 0; j < U(value).caui.cElems; j++)
- ok(td[i].value[j] == U(value).caui.pElems[j], "%lu: expected value[%ld] %#lx/%#lx, got %#x\n", i, j, (ULONG)td[i].value[j], (ULONG)(td[i].value[j] >> 32), U(value).caui.pElems[j]);
+ ok(td[i].value[j] == U(value).caui.pElems[j], "%lu: expected value[%ld] %#I64x, got %#x\n", i, j, td[i].value[j], U(value).caui.pElems[j]);
break;
case VT_I4:
case VT_UI4:
case VT_R4:
ok(td[i].count == U(value).caul.cElems, "%lu: expected cElems %d, got %ld\n", i, td[i].count, U(value).caul.cElems);
for (j = 0; j < U(value).caul.cElems; j++)
- ok(td[i].value[j] == U(value).caul.pElems[j], "%lu: expected value[%ld] %#lx/%#lx, got %#lx\n", i, j, (ULONG)td[i].value[j], (ULONG)(td[i].value[j] >> 32), U(value).caul.pElems[j]);
+ ok(td[i].value[j] == U(value).caul.pElems[j], "%lu: expected value[%ld] %#I64x, got %#lx\n", i, j, td[i].value[j], U(value).caul.pElems[j]);
break;
case VT_I8:
case VT_UI8:
case VT_R8:
ok(td[i].count == U(value).cauh.cElems, "%lu: expected cElems %d, got %ld\n", i, td[i].count, U(value).cauh.cElems);
for (j = 0; j < U(value).cauh.cElems; j++)
- ok(td[i].value[j] == U(value).cauh.pElems[j].QuadPart, "%lu: expected value[%ld] %08lx/%08lx, got %08lx/%08lx\n", i, j, (ULONG)td[i].value[j], (ULONG)(td[i].value[j] >> 32), U(value).cauh.pElems[j].u.LowPart, U(value).cauh.pElems[j].u.HighPart);
+ ok(td[i].value[j] == U(value).cauh.pElems[j].QuadPart, "%lu: expected value[%ld] %I64x, got %08lx/%08lx\n", i, j, td[i].value[j], U(value).cauh.pElems[j].u.LowPart, U(value).cauh.pElems[j].u.HighPart);
break;
case VT_LPSTR:
ok(td[i].count == U(value).calpstr.cElems, "%lu: expected cElems %d, got %ld\n", i, td[i].count, U(value).caub.cElems);
@@ -745,8 +745,8 @@ static void compare_metadata(IWICMetadataReader *reader, const struct test_data
ok(!memcmp(td[i].string, U(value).blob.pBlobData, td[i].count), "%lu: expected %s, got %s\n", i, td[i].string, U(value).blob.pBlobData);
}
else
- ok(U(value).uhVal.QuadPart == td[i].value[0], "%lu: expected value %#x/%#x got %#lx/%#lx\n",
- i, (UINT)td[i].value[0], (UINT)(td[i].value[0] >> 32), U(value).uhVal.u.LowPart, U(value).uhVal.u.HighPart);
+ ok(U(value).uhVal.QuadPart == td[i].value[0], "%lu: expected value %#I64x got %#lx/%#lx\n",
+ i, td[i].value[0], U(value).uhVal.u.LowPart, U(value).uhVal.u.HighPart);
PropVariantClear(&schema);
PropVariantClear(&id);
@@ -2067,7 +2067,7 @@ static void test_metadata_APE(void)
ok(value.vt == (VT_UI1|VT_VECTOR), "unexpected vt: %i\n", id.vt);
ok(td[1].count == U(value).caub.cElems, "expected cElems %d, got %ld\n", td[1].count, U(value).caub.cElems);
for (i = 0; i < U(value).caub.cElems; i++)
- ok(td[1].value[i] == U(value).caub.pElems[i], "%u: expected value %#lx/%#lx, got %#x\n", i, (ULONG)td[1].value[i], (ULONG)(td[1].value[i] >> 32), U(value).caub.pElems[i]);
+ ok(td[1].value[i] == U(value).caub.pElems[i], "%u: expected value %#I64x, got %#x\n", i, td[1].value[i], U(value).caub.pElems[i]);
PropVariantClear(&value);
hr = IWICMetadataReader_GetMetadataHandlerInfo(reader, &info);
diff --git a/dlls/windowscodecs/tests/pngformat.c b/dlls/windowscodecs/tests/pngformat.c
index 1181ebbe3690..ca5a220d40d6 100644
--- a/dlls/windowscodecs/tests/pngformat.c
+++ b/dlls/windowscodecs/tests/pngformat.c
@@ -300,8 +300,8 @@ static HRESULT create_decoder(const void *image_data, UINT image_size, IWICBitma
zero.QuadPart = 0;
IStream_Seek (stream, zero, STREAM_SEEK_CUR, &pos);
- ok(pos.QuadPart < image_size, "seek beyond the end of stream: %x%08x >= %x\n",
- (UINT)(pos.QuadPart >> 32), (UINT)pos.QuadPart, image_size);
+ ok(pos.QuadPart < image_size, "seek beyond the end of stream: %I64x >= %x\n",
+ pos.QuadPart, image_size);
refcount = IStream_Release(stream);
ok(refcount > 0, "expected stream refcount > 0\n");
2
1
The following series is the result of work from
- Torge Matties, Jacek Caban and myself
- and went through various convergence, merges, rewrite and improvements
(especially patch #2 for various authors)
it provides:
- support for CREATE_NO_WINDOW flag in CreateProcess
- a solution for regression introduced in f034084d49b354811096524d472ae5172ac1cebf
(when a Wine initial process isn't attached to a unix console, it can
generates lots new console window creation, with unwanted side effects,
like not using parents std streams for output)
- with the correspondings non regression tests
v3 -> v4:
- using negative handle values for console pseudo handles
- don't report FIXME to users
- removed Wine only tests
Signed-off-by: Eric Pouech <eric.pouech(a)gmail.com>
---
Supersedes: 231894-231897
Eric Pouech (4):
dlls/kernel32/tests: Add more CreateProcess console management tests.
dlls/{ntdll, kernel*}: Add support for CREATE_NO_WINDOW flag in CreateProcess.
include/condrv.h, server: using negative values for console pseudo handles
dlls/{ntdll,kernel*}: provide a pseudo console environment for initial CUI processes not tied to an Unix tty
dlls/kernel32/tests/console.c | 86 +++++++++++++++++++++++++++++------
dlls/kernelbase/console.c | 39 ++++++++++++----
dlls/kernelbase/process.c | 11 +++--
dlls/ntdll/unix/env.c | 2 +
dlls/ntdll/unix/process.c | 2 +
include/wine/condrv.h | 6 ++-
programs/conhost/conhost.c | 11 +++--
programs/conhost/conhost.h | 1 +
server/process.c | 4 +-
9 files changed, 128 insertions(+), 34 deletions(-)
2
8
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/evr/evr.c | 42 ++++++++++++++++++++++++++++++++++++++++++
dlls/evr/tests/evr.c | 21 ++++++++++++++++++++-
2 files changed, 62 insertions(+), 1 deletion(-)
diff --git a/dlls/evr/evr.c b/dlls/evr/evr.c
index 5e6ca03ea3d..e64151b650c 100644
--- a/dlls/evr/evr.c
+++ b/dlls/evr/evr.c
@@ -34,6 +34,7 @@ struct evr
{
struct strmbase_renderer renderer;
IEVRFilterConfig IEVRFilterConfig_iface;
+ IAMFilterMiscFlags IAMFilterMiscFlags_iface;
};
static struct evr *impl_from_strmbase_renderer(struct strmbase_renderer *iface)
@@ -47,6 +48,8 @@ static HRESULT evr_query_interface(struct strmbase_renderer *iface, REFIID iid,
if (IsEqualGUID(iid, &IID_IEVRFilterConfig))
*out = &filter->IEVRFilterConfig_iface;
+ else if (IsEqualGUID(iid, &IID_IAMFilterMiscFlags))
+ *out = &filter->IAMFilterMiscFlags_iface;
else
return E_NOINTERFACE;
@@ -132,6 +135,44 @@ static const IEVRFilterConfigVtbl filter_config_vtbl =
filter_config_GetNumberOfStreams,
};
+static struct evr *impl_from_IAMFilterMiscFlags(IAMFilterMiscFlags *iface)
+{
+ return CONTAINING_RECORD(iface, struct evr, IAMFilterMiscFlags_iface);
+}
+
+static HRESULT WINAPI filter_misc_flags_QueryInterface(IAMFilterMiscFlags *iface, REFIID iid, void **out)
+{
+ struct evr *filter = impl_from_IAMFilterMiscFlags(iface);
+ return IUnknown_QueryInterface(filter->renderer.filter.outer_unk, iid, out);
+}
+
+static ULONG WINAPI filter_misc_flags_AddRef(IAMFilterMiscFlags *iface)
+{
+ struct evr *filter = impl_from_IAMFilterMiscFlags(iface);
+ return IUnknown_AddRef(filter->renderer.filter.outer_unk);
+}
+
+static ULONG WINAPI filter_misc_flags_Release(IAMFilterMiscFlags *iface)
+{
+ struct evr *filter = impl_from_IAMFilterMiscFlags(iface);
+ return IUnknown_Release(filter->renderer.filter.outer_unk);
+}
+
+static ULONG WINAPI filter_misc_flags_GetMiscFlags(IAMFilterMiscFlags *iface)
+{
+ TRACE("%p.\n", iface);
+
+ return AM_FILTER_MISC_FLAGS_IS_RENDERER;
+}
+
+static const IAMFilterMiscFlagsVtbl filter_misc_flags_vtbl =
+{
+ filter_misc_flags_QueryInterface,
+ filter_misc_flags_AddRef,
+ filter_misc_flags_Release,
+ filter_misc_flags_GetMiscFlags,
+};
+
HRESULT evr_filter_create(IUnknown *outer, void **out)
{
struct evr *object;
@@ -142,6 +183,7 @@ HRESULT evr_filter_create(IUnknown *outer, void **out)
strmbase_renderer_init(&object->renderer, outer,
&CLSID_EnhancedVideoRenderer, L"EVR Input0", &renderer_ops);
object->IEVRFilterConfig_iface.lpVtbl = &filter_config_vtbl;
+ object->IAMFilterMiscFlags_iface.lpVtbl = &filter_misc_flags_vtbl;
TRACE("Created EVR %p.\n", object);
*out = &object->renderer.filter.IUnknown_inner;
diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c
index 93e262e52a3..fa9ad2a0b35 100644
--- a/dlls/evr/tests/evr.c
+++ b/dlls/evr/tests/evr.c
@@ -276,7 +276,7 @@ static void test_interfaces(void)
IBaseFilter *filter = create_evr();
ULONG ref;
- todo_wine check_interface(filter, &IID_IAMFilterMiscFlags, TRUE);
+ check_interface(filter, &IID_IAMFilterMiscFlags, TRUE);
check_interface(filter, &IID_IBaseFilter, TRUE);
check_interface(filter, &IID_IEVRFilterConfig, TRUE);
check_interface(filter, &IID_IMediaFilter, TRUE);
@@ -551,6 +551,24 @@ static void test_unconnected_eos(void)
ok(!ref, "Got outstanding refcount %ld.\n", ref);
}
+static void test_misc_flags(void)
+{
+ IBaseFilter *filter = create_evr();
+ IAMFilterMiscFlags *misc_flags;
+ ULONG ref, flags;
+ HRESULT hr;
+
+ hr = IBaseFilter_QueryInterface(filter, &IID_IAMFilterMiscFlags, (void **)&misc_flags);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+
+ flags = IAMFilterMiscFlags_GetMiscFlags(misc_flags);
+ ok(flags == AM_FILTER_MISC_FLAGS_IS_RENDERER, "Unexpected flags %#lx.\n", flags);
+ IAMFilterMiscFlags_Release(misc_flags);
+
+ ref = IBaseFilter_Release(filter);
+ ok(!ref, "Got outstanding refcount %ld.\n", ref);
+}
+
static IMFMediaType * create_video_type(const GUID *subtype)
{
IMFMediaType *video_type;
@@ -3207,6 +3225,7 @@ START_TEST(evr)
test_find_pin();
test_pin_info();
test_unconnected_eos();
+ test_misc_flags();
test_default_mixer();
test_default_mixer_type_negotiation();
--
2.35.1
2
1
[PATCH 6/6] wineoss: Move create_stream and release_stream to the unixlib.
by Huw Davies April 12, 2022
by Huw Davies April 12, 2022
April 12, 2022
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/wineoss.drv/mmdevdrv.c | 300 ++++--------------------------------
dlls/wineoss.drv/oss.c | 139 +++++++++++++++++
dlls/wineoss.drv/unixlib.h | 21 +++
3 files changed, 191 insertions(+), 269 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c
index 56b188424fb..2ea3c80f3ca 100644
--- a/dlls/wineoss.drv/mmdevdrv.c
+++ b/dlls/wineoss.drv/mmdevdrv.c
@@ -260,6 +260,16 @@ int WINAPI AUDDRV_GetPriority(void)
return params.priority;
}
+static HRESULT stream_release(struct oss_stream *stream)
+{
+ struct release_stream_params params;
+
+ params.stream = stream;
+ OSS_CALL(release_stream, ¶ms);
+
+ return params.result;
+}
+
static void oss_lock(struct oss_stream *stream)
{
pthread_mutex_lock(&stream->lock);
@@ -342,13 +352,6 @@ static void get_device_guid(EDataFlow flow, const char *device, GUID *guid)
RegCloseKey(key);
}
-static int open_device(const char *device, EDataFlow flow)
-{
- int flags = ((flow == eRender) ? O_WRONLY : O_RDONLY) | O_NONBLOCK;
-
- return open(device, flags, 0);
-}
-
static void set_stream_volumes(ACImpl *This)
{
struct oss_stream *stream = This->stream;
@@ -524,7 +527,6 @@ static ULONG WINAPI AudioClient_AddRef(IAudioClient3 *iface)
static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface)
{
ACImpl *This = impl_from_IAudioClient3(iface);
- struct oss_stream *stream = This->stream;
ULONG ref;
ref = InterlockedDecrement(&This->ref);
@@ -550,21 +552,8 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface)
LeaveCriticalSection(&g_sessions_lock);
}
HeapFree(GetProcessHeap(), 0, This->vols);
- if(stream){
- SIZE_T size;
- close(stream->fd);
- if(stream->local_buffer){
- size = 0;
- NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, &size, MEM_RELEASE);
- }
- if(stream->tmp_buffer){
- size = 0;
- NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, &size, MEM_RELEASE);
- }
- CoTaskMemFree(stream->fmt);
- pthread_mutex_destroy(&stream->lock);
- HeapFree(GetProcessHeap(), 0, stream);
- }
+ if(This->stream)
+ stream_release(This->stream);
HeapFree(GetProcessHeap(), 0, This);
}
return ref;
@@ -604,177 +593,6 @@ static void dump_fmt(const WAVEFORMATEX *fmt)
}
}
-static DWORD get_channel_mask(unsigned int channels)
-{
- switch(channels){
- case 0:
- return 0;
- case 1:
- return KSAUDIO_SPEAKER_MONO;
- case 2:
- return KSAUDIO_SPEAKER_STEREO;
- case 3:
- return KSAUDIO_SPEAKER_STEREO | SPEAKER_LOW_FREQUENCY;
- case 4:
- return KSAUDIO_SPEAKER_QUAD; /* not _SURROUND */
- case 5:
- return KSAUDIO_SPEAKER_QUAD | SPEAKER_LOW_FREQUENCY;
- case 6:
- return KSAUDIO_SPEAKER_5POINT1; /* not 5POINT1_SURROUND */
- case 7:
- return KSAUDIO_SPEAKER_5POINT1 | SPEAKER_BACK_CENTER;
- case 8:
- return KSAUDIO_SPEAKER_7POINT1_SURROUND; /* Vista deprecates 7POINT1 */
- }
- FIXME("Unknown speaker configuration: %u\n", channels);
- return 0;
-}
-
-static int get_oss_format(const WAVEFORMATEX *fmt)
-{
- WAVEFORMATEXTENSIBLE *fmtex = (WAVEFORMATEXTENSIBLE*)fmt;
-
- if(fmt->wFormatTag == WAVE_FORMAT_PCM ||
- (fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE &&
- IsEqualGUID(&fmtex->SubFormat, &KSDATAFORMAT_SUBTYPE_PCM))){
- switch(fmt->wBitsPerSample){
- case 8:
- return AFMT_U8;
- case 16:
- return AFMT_S16_LE;
- case 24:
- return AFMT_S24_LE;
- case 32:
- return AFMT_S32_LE;
- }
- return -1;
- }
-
-#ifdef AFMT_FLOAT
- if(fmt->wFormatTag == WAVE_FORMAT_IEEE_FLOAT ||
- (fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE &&
- IsEqualGUID(&fmtex->SubFormat, &KSDATAFORMAT_SUBTYPE_IEEE_FLOAT))){
- if(fmt->wBitsPerSample != 32)
- return -1;
-
- return AFMT_FLOAT;
- }
-#endif
-
- return -1;
-}
-
-static WAVEFORMATEX *clone_format(const WAVEFORMATEX *fmt)
-{
- WAVEFORMATEX *ret;
- size_t size;
-
- if(fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE)
- size = sizeof(WAVEFORMATEXTENSIBLE);
- else
- size = sizeof(WAVEFORMATEX);
-
- ret = CoTaskMemAlloc(size);
- if(!ret)
- return NULL;
-
- memcpy(ret, fmt, size);
-
- ret->cbSize = size - sizeof(WAVEFORMATEX);
-
- return ret;
-}
-
-static HRESULT setup_oss_device(AUDCLNT_SHAREMODE mode, int fd,
- const WAVEFORMATEX *fmt, WAVEFORMATEX **out)
-{
- int tmp, oss_format;
- double tenth;
- HRESULT ret = S_OK;
- WAVEFORMATEX *closest = NULL;
-
- tmp = oss_format = get_oss_format(fmt);
- if(oss_format < 0)
- return AUDCLNT_E_UNSUPPORTED_FORMAT;
- if(ioctl(fd, SNDCTL_DSP_SETFMT, &tmp) < 0){
- WARN("SETFMT failed: %d (%s)\n", errno, strerror(errno));
- return E_FAIL;
- }
- if(tmp != oss_format){
- TRACE("Format unsupported by this OSS version: %x\n", oss_format);
- return AUDCLNT_E_UNSUPPORTED_FORMAT;
- }
-
- if(fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE &&
- (fmt->nAvgBytesPerSec == 0 ||
- fmt->nBlockAlign == 0 ||
- ((WAVEFORMATEXTENSIBLE*)fmt)->Samples.wValidBitsPerSample > fmt->wBitsPerSample))
- return E_INVALIDARG;
-
- if(fmt->nChannels == 0)
- return AUDCLNT_E_UNSUPPORTED_FORMAT;
-
- closest = clone_format(fmt);
- if(!closest)
- return E_OUTOFMEMORY;
-
- tmp = fmt->nSamplesPerSec;
- if(ioctl(fd, SNDCTL_DSP_SPEED, &tmp) < 0){
- WARN("SPEED failed: %d (%s)\n", errno, strerror(errno));
- CoTaskMemFree(closest);
- return E_FAIL;
- }
- tenth = fmt->nSamplesPerSec * 0.1;
- if(tmp > fmt->nSamplesPerSec + tenth || tmp < fmt->nSamplesPerSec - tenth){
- ret = S_FALSE;
- closest->nSamplesPerSec = tmp;
- }
-
- tmp = fmt->nChannels;
- if(ioctl(fd, SNDCTL_DSP_CHANNELS, &tmp) < 0){
- WARN("CHANNELS failed: %d (%s)\n", errno, strerror(errno));
- CoTaskMemFree(closest);
- return E_FAIL;
- }
- if(tmp != fmt->nChannels){
- ret = S_FALSE;
- closest->nChannels = tmp;
- }
-
- if(closest->wFormatTag == WAVE_FORMAT_EXTENSIBLE)
- ((WAVEFORMATEXTENSIBLE*)closest)->dwChannelMask = get_channel_mask(closest->nChannels);
-
- if(fmt->nBlockAlign != fmt->nChannels * fmt->wBitsPerSample / 8 ||
- fmt->nAvgBytesPerSec != fmt->nBlockAlign * fmt->nSamplesPerSec ||
- (fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE &&
- ((WAVEFORMATEXTENSIBLE*)fmt)->Samples.wValidBitsPerSample < fmt->wBitsPerSample))
- ret = S_FALSE;
-
- if(mode == AUDCLNT_SHAREMODE_EXCLUSIVE &&
- fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE){
- if(((WAVEFORMATEXTENSIBLE*)fmt)->dwChannelMask == 0 ||
- ((WAVEFORMATEXTENSIBLE*)fmt)->dwChannelMask & SPEAKER_RESERVED)
- ret = S_FALSE;
- }
-
- if(ret == S_FALSE && !out)
- ret = AUDCLNT_E_UNSUPPORTED_FORMAT;
-
- if(ret == S_FALSE && out){
- closest->nBlockAlign =
- closest->nChannels * closest->wBitsPerSample / 8;
- closest->nAvgBytesPerSec =
- closest->nBlockAlign * closest->nSamplesPerSec;
- if(closest->wFormatTag == WAVE_FORMAT_EXTENSIBLE)
- ((WAVEFORMATEXTENSIBLE*)closest)->Samples.wValidBitsPerSample = closest->wBitsPerSample;
- *out = closest;
- } else
- CoTaskMemFree(closest);
-
- TRACE("returning: %08x\n", ret);
- return ret;
-}
-
static void session_init_vols(AudioSession *session, UINT channels)
{
if(session->channel_count < channels){
@@ -860,11 +678,9 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
const GUID *sessionguid)
{
ACImpl *This = impl_from_IAudioClient3(iface);
+ struct create_stream_params params;
struct oss_stream *stream;
- oss_audioinfo ai;
- SIZE_T size;
- int i;
- HRESULT hr;
+ unsigned int i;
TRACE("(%p)->(%x, %x, %s, %s, %p, %s)\n", This, mode, flags,
wine_dbgstr_longlong(duration), wine_dbgstr_longlong(period), fmt, debugstr_guid(sessionguid));
@@ -920,92 +736,38 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
return AUDCLNT_E_ALREADY_INITIALIZED;
}
- stream = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*This->stream));
- if(!stream){
- LeaveCriticalSection(&g_sessions_lock);
- return E_OUTOFMEMORY;
- }
- stream->flow = This->dataflow;
- pthread_mutex_init(&stream->lock, NULL);
-
- stream->fd = open_device(This->devnode, This->dataflow);
- if(stream->fd < 0){
- WARN("Unable to open device %s: %d (%s)\n", This->devnode, errno, strerror(errno));
- hr = AUDCLNT_E_DEVICE_INVALIDATED;
- goto exit;
- }
-
- ai.dev = -1;
- if(ioctl(stream->fd, SNDCTL_ENGINEINFO, &ai) < 0){
- WARN("Unable to get audio info for device %s: %d (%s)\n", This->devnode, errno, strerror(errno));
- hr = E_FAIL;
- goto exit;
- }
-
- TRACE("OSS audioinfo:\n");
- TRACE("devnode: %s\n", ai.devnode);
- TRACE("name: %s\n", ai.name);
- TRACE("busy: %x\n", ai.busy);
- TRACE("caps: %x\n", ai.caps);
- TRACE("iformats: %x\n", ai.iformats);
- TRACE("oformats: %x\n", ai.oformats);
- TRACE("enabled: %d\n", ai.enabled);
- TRACE("min_rate: %d\n", ai.min_rate);
- TRACE("max_rate: %d\n", ai.max_rate);
- TRACE("min_channels: %d\n", ai.min_channels);
- TRACE("max_channels: %d\n", ai.max_channels);
-
- hr = setup_oss_device(mode, stream->fd, fmt, NULL);
- if(FAILED(hr))
- goto exit;
-
- stream->fmt = clone_format(fmt);
- if(!stream->fmt){
- hr = E_OUTOFMEMORY;
- goto exit;
- }
-
- stream->period_us = period / 10;
- stream->period_frames = MulDiv(fmt->nSamplesPerSec, period, 10000000);
+ params.device = This->devnode;
+ params.flow = This->dataflow;
+ params.share = mode;
+ params.flags = flags;
+ params.duration = duration;
+ params.period = period;
+ params.fmt = fmt;
+ params.stream = &stream;
- stream->bufsize_frames = MulDiv(duration, fmt->nSamplesPerSec, 10000000);
- if(mode == AUDCLNT_SHAREMODE_EXCLUSIVE)
- stream->bufsize_frames -= stream->bufsize_frames % stream->period_frames;
- size = stream->bufsize_frames * fmt->nBlockAlign;
- if(NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, 0, &size,
- MEM_COMMIT, PAGE_READWRITE)){
- hr = E_OUTOFMEMORY;
- goto exit;
+ OSS_CALL(create_stream, ¶ms);
+ if(FAILED(params.result)){
+ LeaveCriticalSection(&g_sessions_lock);
+ return params.result;
}
This->channel_count = fmt->nChannels;
This->vols = HeapAlloc(GetProcessHeap(), 0, This->channel_count * sizeof(float));
if(!This->vols){
- hr = E_OUTOFMEMORY;
+ params.result = E_OUTOFMEMORY;
goto exit;
}
for(i = 0; i < This->channel_count; ++i)
This->vols[i] = 1.f;
- stream->share = mode;
- stream->flags = flags;
- stream->oss_bufsize_bytes = 0;
-
- hr = get_audio_session(sessionguid, This->parent, This->channel_count,
+ params.result = get_audio_session(sessionguid, This->parent, This->channel_count,
&This->session);
exit:
- if(FAILED(hr)){
+ if(FAILED(params.result)){
+ stream_release(stream);
HeapFree(GetProcessHeap(), 0, This->vols);
This->vols = NULL;
- CoTaskMemFree(stream->fmt);
- if(stream->fd >= 0) close(stream->fd);
- if(stream->local_buffer){
- size = 0;
- NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, &size, MEM_RELEASE);
- }
- pthread_mutex_destroy(&stream->lock);
- HeapFree(GetProcessHeap(), 0, stream);
} else {
list_add_tail(&This->session->clients, &This->entry);
This->stream = stream;
@@ -1014,7 +776,7 @@ exit:
LeaveCriticalSection(&g_sessions_lock);
- return hr;
+ return params.result;
}
static HRESULT WINAPI AudioClient_GetBufferSize(IAudioClient3 *iface,
diff --git a/dlls/wineoss.drv/oss.c b/dlls/wineoss.drv/oss.c
index 389ec73ee10..628d0c5818a 100644
--- a/dlls/wineoss.drv/oss.c
+++ b/dlls/wineoss.drv/oss.c
@@ -31,6 +31,7 @@
#include <unistd.h>
#include <errno.h>
#include <sys/soundcard.h>
+#include <pthread.h>
#include "ntstatus.h"
#define WIN32_NO_STATUS
@@ -45,6 +46,30 @@
WINE_DEFAULT_DEBUG_CHANNEL(oss);
+/* copied from kernelbase */
+static int muldiv( int a, int b, int c )
+{
+ LONGLONG ret;
+
+ if (!c) return -1;
+
+ /* We want to deal with a positive divisor to simplify the logic. */
+ if (c < 0)
+ {
+ a = -a;
+ c = -c;
+ }
+
+ /* If the result is positive, we "add" to round. else, we subtract to round. */
+ if ((a < 0 && b < 0) || (a >= 0 && b >= 0))
+ ret = (((LONGLONG)a * b) + (c / 2)) / c;
+ else
+ ret = (((LONGLONG)a * b) - (c / 2)) / c;
+
+ if (ret > 2147483647 || ret < -2147483647) return -1;
+ return ret;
+}
+
static NTSTATUS test_connect(void *args)
{
struct test_connect_params *params = args;
@@ -466,6 +491,118 @@ static HRESULT setup_oss_device(AUDCLNT_SHAREMODE share, int fd,
return ret;
}
+static NTSTATUS create_stream(void *args)
+{
+ struct create_stream_params *params = args;
+ WAVEFORMATEXTENSIBLE *fmtex;
+ struct oss_stream *stream;
+ oss_audioinfo ai;
+ SIZE_T size;
+
+ stream = calloc(1, sizeof(*stream));
+ if(!stream){
+ params->result = E_OUTOFMEMORY;
+ return STATUS_SUCCESS;
+ }
+
+ stream->flow = params->flow;
+ pthread_mutex_init(&stream->lock, NULL);
+
+ stream->fd = open_device(params->device, params->flow);
+ if(stream->fd < 0){
+ WARN("Unable to open device %s: %d (%s)\n", params->device, errno, strerror(errno));
+ params->result = AUDCLNT_E_DEVICE_INVALIDATED;
+ goto exit;
+ }
+
+ ai.dev = -1;
+ if(ioctl(stream->fd, SNDCTL_ENGINEINFO, &ai) < 0){
+ WARN("Unable to get audio info for device %s: %d (%s)\n", params->device, errno, strerror(errno));
+ params->result = E_FAIL;
+ goto exit;
+ }
+
+ TRACE("OSS audioinfo:\n");
+ TRACE("devnode: %s\n", ai.devnode);
+ TRACE("name: %s\n", ai.name);
+ TRACE("busy: %x\n", ai.busy);
+ TRACE("caps: %x\n", ai.caps);
+ TRACE("iformats: %x\n", ai.iformats);
+ TRACE("oformats: %x\n", ai.oformats);
+ TRACE("enabled: %d\n", ai.enabled);
+ TRACE("min_rate: %d\n", ai.min_rate);
+ TRACE("max_rate: %d\n", ai.max_rate);
+ TRACE("min_channels: %d\n", ai.min_channels);
+ TRACE("max_channels: %d\n", ai.max_channels);
+
+ params->result = setup_oss_device(params->share, stream->fd, params->fmt, NULL);
+ if(FAILED(params->result))
+ goto exit;
+
+ fmtex = clone_format(params->fmt);
+ if(!fmtex){
+ params->result = E_OUTOFMEMORY;
+ goto exit;
+ }
+ stream->fmt = &fmtex->Format;
+
+ stream->period_us = params->period / 10;
+ stream->period_frames = muldiv(params->fmt->nSamplesPerSec, params->period, 10000000);
+
+ stream->bufsize_frames = muldiv(params->duration, params->fmt->nSamplesPerSec, 10000000);
+ if(params->share == AUDCLNT_SHAREMODE_EXCLUSIVE)
+ stream->bufsize_frames -= stream->bufsize_frames % stream->period_frames;
+ size = stream->bufsize_frames * params->fmt->nBlockAlign;
+ if(NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, 0, &size,
+ MEM_COMMIT, PAGE_READWRITE)){
+ params->result = E_OUTOFMEMORY;
+ goto exit;
+ }
+
+ stream->share = params->share;
+ stream->flags = params->flags;
+ stream->oss_bufsize_bytes = 0;
+
+exit:
+ if(FAILED(params->result)){
+ if(stream->fd >= 0) close(stream->fd);
+ if(stream->local_buffer){
+ size = 0;
+ NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, &size, MEM_RELEASE);
+ }
+ pthread_mutex_destroy(&stream->lock);
+ free(stream->fmt);
+ free(stream);
+ }else{
+ *params->stream = stream;
+ }
+
+ return STATUS_SUCCESS;
+}
+
+static NTSTATUS release_stream(void *args)
+{
+ struct release_stream_params *params = args;
+ struct oss_stream *stream = params->stream;
+ SIZE_T size;
+
+ close(stream->fd);
+ if(stream->local_buffer){
+ size = 0;
+ NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, &size, MEM_RELEASE);
+ }
+ if(stream->tmp_buffer){
+ size = 0;
+ NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, &size, MEM_RELEASE);
+ }
+ free(stream->fmt);
+ pthread_mutex_destroy(&stream->lock);
+ free(stream);
+
+ params->result = S_OK;
+ return STATUS_SUCCESS;
+}
+
static NTSTATUS is_format_supported(void *args)
{
struct is_format_supported_params *params = args;
@@ -599,6 +736,8 @@ unixlib_entry_t __wine_unix_call_funcs[] =
{
test_connect,
get_endpoint_ids,
+ create_stream,
+ release_stream,
is_format_supported,
get_mix_format,
};
diff --git a/dlls/wineoss.drv/unixlib.h b/dlls/wineoss.drv/unixlib.h
index 8f82518b10e..c0a0b25c374 100644
--- a/dlls/wineoss.drv/unixlib.h
+++ b/dlls/wineoss.drv/unixlib.h
@@ -69,6 +69,25 @@ struct get_endpoint_ids_params
unsigned int default_idx;
};
+struct create_stream_params
+{
+ const char *device;
+ EDataFlow flow;
+ AUDCLNT_SHAREMODE share;
+ UINT flags;
+ REFERENCE_TIME duration;
+ REFERENCE_TIME period;
+ const WAVEFORMATEX *fmt;
+ HRESULT result;
+ struct oss_stream **stream;
+};
+
+struct release_stream_params
+{
+ struct oss_stream *stream;
+ HRESULT result;
+};
+
struct is_format_supported_params
{
const char *device;
@@ -91,6 +110,8 @@ enum oss_funcs
{
oss_test_connect,
oss_get_endpoint_ids,
+ oss_create_stream,
+ oss_release_stream,
oss_is_format_supported,
oss_get_mix_format,
};
--
2.25.1
2
1