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
April 2019
- 82 participants
- 739 discussions
[v3 PATCH] ntdll: Add NtSuspendProcess()/NtResumeProcess() implementation.
by Nikolay Sivov April 18, 2019
by Nikolay Sivov April 18, 2019
April 18, 2019
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
Version 3 adds more tests, specifically to show that reaching thread suspend
limit is not an error condition for NtSuspendProcess(). What's left is using same
thread list loops as Michael's patch, while counter check loop is removed.
dlls/ntdll/process.c | 24 +++++-
dlls/ntdll/tests/exception.c | 151 ++++++++++++++++++++++++++++++++-
include/wine/server_protocol.h | 32 ++++++-
server/process.c | 38 +++++++++
server/protocol.def | 12 +++
server/request.h | 8 ++
server/thread.c | 4 +-
server/thread.h | 2 +
server/trace.c | 16 ++++
9 files changed, 278 insertions(+), 9 deletions(-)
diff --git a/dlls/ntdll/process.c b/dlls/ntdll/process.c
index 6c6c427372..573a7a771d 100644
--- a/dlls/ntdll/process.c
+++ b/dlls/ntdll/process.c
@@ -763,8 +763,16 @@ NTSTATUS WINAPI NtOpenProcess(PHANDLE handle, ACCESS_MASK access,
*/
NTSTATUS WINAPI NtResumeProcess( HANDLE handle )
{
- FIXME("stub: %p\n", handle);
- return STATUS_NOT_IMPLEMENTED;
+ NTSTATUS ret;
+
+ SERVER_START_REQ( resume_process )
+ {
+ req->handle = wine_server_obj_handle( handle );
+ ret = wine_server_call( req );
+ }
+ SERVER_END_REQ;
+
+ return ret;
}
/******************************************************************************
@@ -773,8 +781,16 @@ NTSTATUS WINAPI NtResumeProcess( HANDLE handle )
*/
NTSTATUS WINAPI NtSuspendProcess( HANDLE handle )
{
- FIXME("stub: %p\n", handle);
- return STATUS_NOT_IMPLEMENTED;
+ NTSTATUS ret;
+
+ SERVER_START_REQ( suspend_process )
+ {
+ req->handle = wine_server_obj_handle( handle );
+ ret = wine_server_call( req );
+ }
+ SERVER_END_REQ;
+
+ return ret;
}
diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c
index b7bf2748b5..3b3f72f07d 100644
--- a/dlls/ntdll/tests/exception.c
+++ b/dlls/ntdll/tests/exception.c
@@ -53,6 +53,8 @@ static NTSTATUS (WINAPI *pNtQueryInformationProcess)(HANDLE, PROCESSINFOCLASS,
static NTSTATUS (WINAPI *pNtSetInformationProcess)(HANDLE, PROCESSINFOCLASS, PVOID, ULONG);
static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL);
static NTSTATUS (WINAPI *pNtClose)(HANDLE);
+static NTSTATUS (WINAPI *pNtSuspendProcess)(HANDLE process);
+static NTSTATUS (WINAPI *pNtResumeProcess)(HANDLE process);
#if defined(__x86_64__)
typedef struct
@@ -158,6 +160,9 @@ static VOID (CDECL *pRtlUnwindEx)(VOID*, VOID*, EXCEPTION_RECORD*, VOID*, C
static int (CDECL *p_setjmp)(_JUMP_BUFFER*);
#endif
+static int my_argc;
+static char** my_argv;
+
#ifdef __i386__
#ifndef __WINE_WINTRNL_H
@@ -167,8 +172,6 @@ static int (CDECL *p_setjmp)(_JUMP_BUFFER*);
#define MEM_EXECUTE_OPTION_PERMANENT 0x08
#endif
-static int my_argc;
-static char** my_argv;
static int test_stage;
static BOOL is_wow64;
@@ -3190,6 +3193,138 @@ static void test_suspend_thread(void)
CloseHandle(thread);
}
+static const char *suspend_process_event_name = "suspend_process_event";
+static const char *suspend_process_event2_name = "suspend_process_event2";
+
+static DWORD WINAPI dummy_thread_proc( void *arg )
+{
+ return 0;
+}
+
+static void suspend_process_proc(void)
+{
+ HANDLE event = OpenEventA(SYNCHRONIZE, FALSE, suspend_process_event_name);
+ HANDLE event2 = OpenEventA(SYNCHRONIZE | EVENT_MODIFY_STATE, FALSE, suspend_process_event2_name);
+ unsigned int count;
+ NTSTATUS status;
+ HANDLE thread;
+
+ ok(event != NULL, "Failed to open event handle.\n");
+ ok(event2 != NULL, "Failed to open event handle.\n");
+
+ thread = CreateThread(NULL, 0, dummy_thread_proc, 0, CREATE_SUSPENDED, NULL);
+ ok(thread != NULL, "Failed to create auxiliary thread.\n");
+
+ /* Suspend up to limit. */
+ while (!(status = NtSuspendThread(thread, NULL)))
+ ;
+ ok(status == STATUS_SUSPEND_COUNT_EXCEEDED, "Unexpected status %#x.\n", status);
+
+ for (;;)
+ {
+ SetEvent(event2);
+ if (WaitForSingleObject(event, 100) == WAIT_OBJECT_0)
+ break;
+ }
+
+ status = NtSuspendThread(thread, &count);
+ ok(!status, "Failed to suspend a thread, status %#x.\n", status);
+ ok(count == 125, "Unexpected suspend count %u.\n", count);
+
+ status = NtResumeThread(thread, NULL);
+ ok(!status, "Failed to resume a thread, status %#x.\n", status);
+
+ CloseHandle(event);
+ CloseHandle(event2);
+}
+
+static void test_suspend_process(void)
+{
+ PROCESS_INFORMATION info;
+ char path_name[MAX_PATH];
+ STARTUPINFOA startup;
+ HANDLE event, event2;
+ NTSTATUS status;
+ char **argv;
+ DWORD ret;
+
+ event = CreateEventA(NULL, FALSE, FALSE, suspend_process_event_name);
+ ok(event != NULL, "Failed to create event.\n");
+
+ event2 = CreateEventA(NULL, FALSE, FALSE, suspend_process_event2_name);
+ ok(event2 != NULL, "Failed to create event.\n");
+
+ winetest_get_mainargs(&argv);
+ memset(&startup, 0, sizeof(startup));
+ startup.cb = sizeof(startup);
+ sprintf(path_name, "%s exception suspend_process", argv[0]);
+
+ ret = CreateProcessA(NULL, path_name, NULL, NULL, FALSE, 0, NULL, NULL, &startup, &info),
+ ok(ret, "Failed to create target process.\n");
+
+ /* New process signals this event. */
+ ResetEvent(event2);
+ ret = WaitForSingleObject(event2, INFINITE);
+ ok(ret == WAIT_OBJECT_0, "Wait failed, %#x.\n", ret);
+
+ /* Suspend main thread */
+ status = NtSuspendThread(info.hThread, &ret);
+ ok(!status && !ret, "Failed to suspend main thread, status %#x.\n", status);
+
+ /* Process wasn't suspended yet. */
+ status = pNtResumeProcess(info.hProcess);
+ ok(!status, "Failed to resume a process, status %#x.\n", status);
+
+ status = pNtSuspendProcess(0);
+ ok(status == STATUS_INVALID_HANDLE, "Unexpected status %#x.\n", status);
+
+ status = pNtResumeProcess(info.hProcess);
+ ok(!status, "Failed to resume a process, status %#x.\n", status);
+
+ ResetEvent(event2);
+ ret = WaitForSingleObject(event2, 200);
+ ok(ret == WAIT_OBJECT_0, "Wait failed.\n");
+
+ status = pNtSuspendProcess(info.hProcess);
+ ok(!status, "Failed to suspend a process, status %#x.\n", status);
+
+ status = NtSuspendThread(info.hThread, &ret);
+ ok(!status && ret == 1, "Failed to suspend main thread, status %#x.\n", status);
+ status = NtResumeThread(info.hThread, &ret);
+ ok(!status && ret == 2, "Failed to resume main thread, status %#x.\n", status);
+
+ ResetEvent(event2);
+ ret = WaitForSingleObject(event2, 200);
+ ok(ret == WAIT_TIMEOUT, "Wait failed.\n");
+
+ status = pNtSuspendProcess(info.hProcess);
+ ok(!status, "Failed to suspend a process, status %#x.\n", status);
+
+ status = pNtResumeProcess(info.hProcess);
+ ok(!status, "Failed to resume a process, status %#x.\n", status);
+
+ ResetEvent(event2);
+ ret = WaitForSingleObject(event2, 200);
+ ok(ret == WAIT_TIMEOUT, "Wait failed.\n");
+
+ status = pNtResumeProcess(info.hProcess);
+ ok(!status, "Failed to resume a process, status %#x.\n", status);
+
+ ResetEvent(event2);
+ ret = WaitForSingleObject(event2, 200);
+ ok(ret == WAIT_OBJECT_0, "Wait failed.\n");
+
+ SetEvent(event);
+
+ winetest_wait_child_process(info.hProcess);
+
+ CloseHandle(info.hProcess);
+ CloseHandle(info.hThread);
+
+ CloseHandle(event);
+ CloseHandle(event2);
+}
+
START_TEST(exception)
{
HMODULE hntdll = GetModuleHandleA("ntdll.dll");
@@ -3197,6 +3332,14 @@ START_TEST(exception)
HMODULE hmsvcrt = LoadLibraryA("msvcrt.dll");
#endif
+ my_argc = winetest_get_mainargs( &my_argv );
+
+ if (my_argc >= 3 && !strcmp(my_argv[2], "suspend_process"))
+ {
+ suspend_process_proc();
+ return;
+ }
+
code_mem = VirtualAlloc(NULL, 65536, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if(!code_mem) {
trace("VirtualAlloc failed\n");
@@ -3224,6 +3367,8 @@ START_TEST(exception)
pNtSetInformationProcess = (void*)GetProcAddress( hntdll,
"NtSetInformationProcess" );
pIsWow64Process = (void *)GetProcAddress(GetModuleHandleA("kernel32.dll"), "IsWow64Process");
+ pNtSuspendProcess = (void *)GetProcAddress( hntdll, "NtSuspendProcess" );
+ pNtResumeProcess = (void *)GetProcAddress( hntdll, "NtResumeProcess" );
#ifdef __i386__
if (!pIsWow64Process || !pIsWow64Process( GetCurrentProcess(), &is_wow64 )) is_wow64 = FALSE;
@@ -3309,6 +3454,7 @@ START_TEST(exception)
test_prot_fault();
test_thread_context();
test_suspend_thread();
+ test_suspend_process();
#elif defined(__x86_64__)
pRtlAddFunctionTable = (void *)GetProcAddress( hntdll,
@@ -3351,6 +3497,7 @@ START_TEST(exception)
test_dpe_exceptions();
test_wow64_context();
test_suspend_thread();
+ test_suspend_process();
if (pRtlAddFunctionTable && pRtlDeleteFunctionTable && pRtlInstallFunctionTableCallback && pRtlLookupFunctionEntry)
test_dynamic_unwind();
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 88b933cc14..c3d1bb6a59 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -5742,6 +5742,30 @@ struct terminate_job_reply
};
+
+struct suspend_process_request
+{
+ struct request_header __header;
+ obj_handle_t handle;
+};
+struct suspend_process_reply
+{
+ struct reply_header __header;
+};
+
+
+
+struct resume_process_request
+{
+ struct request_header __header;
+ obj_handle_t handle;
+};
+struct resume_process_reply
+{
+ struct reply_header __header;
+};
+
+
enum request
{
REQ_new_process,
@@ -6040,6 +6064,8 @@ enum request
REQ_set_job_limits,
REQ_set_job_completion_port,
REQ_terminate_job,
+ REQ_suspend_process,
+ REQ_resume_process,
REQ_NB_REQUESTS
};
@@ -6343,6 +6369,8 @@ union generic_request
struct set_job_limits_request set_job_limits_request;
struct set_job_completion_port_request set_job_completion_port_request;
struct terminate_job_request terminate_job_request;
+ struct suspend_process_request suspend_process_request;
+ struct resume_process_request resume_process_request;
};
union generic_reply
{
@@ -6644,8 +6672,10 @@ union generic_reply
struct set_job_limits_reply set_job_limits_reply;
struct set_job_completion_port_reply set_job_completion_port_reply;
struct terminate_job_reply terminate_job_reply;
+ struct suspend_process_reply suspend_process_reply;
+ struct resume_process_reply resume_process_reply;
};
-#define SERVER_PROTOCOL_VERSION 578
+#define SERVER_PROTOCOL_VERSION 579
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/process.c b/server/process.c
index 473d3b1a27..1260baf0a9 100644
--- a/server/process.c
+++ b/server/process.c
@@ -1705,3 +1705,41 @@ DECL_HANDLER(set_job_completion_port)
release_object( job );
}
+
+/* Suspend a process */
+DECL_HANDLER(suspend_process)
+{
+ struct process *process;
+
+ if ((process = get_process_from_handle( req->handle, PROCESS_SUSPEND_RESUME )))
+ {
+ struct list *ptr, *next;
+
+ LIST_FOR_EACH_SAFE( ptr, next, &process->thread_list )
+ {
+ struct thread *thread = LIST_ENTRY( ptr, struct thread, proc_entry );
+ suspend_thread( thread );
+ }
+
+ release_object( process );
+ }
+}
+
+/* Resume a process */
+DECL_HANDLER(resume_process)
+{
+ struct process *process;
+
+ if ((process = get_process_from_handle( req->handle, PROCESS_SUSPEND_RESUME )))
+ {
+ struct list *ptr, *next;
+
+ LIST_FOR_EACH_SAFE( ptr, next, &process->thread_list )
+ {
+ struct thread *thread = LIST_ENTRY( ptr, struct thread, proc_entry );
+ resume_thread( thread );
+ }
+
+ release_object( process );
+ }
+}
diff --git a/server/protocol.def b/server/protocol.def
index b6ad514463..888e22faf7 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -3909,3 +3909,15 @@ struct handle_info
obj_handle_t handle; /* handle to the job */
int status; /* process exit code */
@END
+
+
+/* Suspend a process */
+(a)REQ(suspend_process)
+ obj_handle_t handle; /* process handle */
+(a)END
+
+
+/* Resume a process */
+(a)REQ(resume_process)
+ obj_handle_t handle; /* process handle */
+(a)END
diff --git a/server/request.h b/server/request.h
index a3e95137e1..a21252c7a6 100644
--- a/server/request.h
+++ b/server/request.h
@@ -408,6 +408,8 @@ DECL_HANDLER(process_in_job);
DECL_HANDLER(set_job_limits);
DECL_HANDLER(set_job_completion_port);
DECL_HANDLER(terminate_job);
+DECL_HANDLER(suspend_process);
+DECL_HANDLER(resume_process);
#ifdef WANT_REQUEST_HANDLERS
@@ -710,6 +712,8 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
(req_handler)req_set_job_limits,
(req_handler)req_set_job_completion_port,
(req_handler)req_terminate_job,
+ (req_handler)req_suspend_process,
+ (req_handler)req_resume_process,
};
C_ASSERT( sizeof(affinity_t) == 8 );
@@ -2436,6 +2440,10 @@ C_ASSERT( sizeof(struct set_job_completion_port_request) == 32 );
C_ASSERT( FIELD_OFFSET(struct terminate_job_request, handle) == 12 );
C_ASSERT( FIELD_OFFSET(struct terminate_job_request, status) == 16 );
C_ASSERT( sizeof(struct terminate_job_request) == 24 );
+C_ASSERT( FIELD_OFFSET(struct suspend_process_request, handle) == 12 );
+C_ASSERT( sizeof(struct suspend_process_request) == 16 );
+C_ASSERT( FIELD_OFFSET(struct resume_process_request, handle) == 12 );
+C_ASSERT( sizeof(struct resume_process_request) == 16 );
#endif /* WANT_REQUEST_HANDLERS */
diff --git a/server/thread.c b/server/thread.c
index b1d324f7de..7057c9bbd0 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -570,7 +570,7 @@ void stop_thread_if_suspended( struct thread *thread )
}
/* suspend a thread */
-static int suspend_thread( struct thread *thread )
+int suspend_thread( struct thread *thread )
{
int old_count = thread->suspend;
if (thread->suspend < MAXIMUM_SUSPEND_COUNT)
@@ -582,7 +582,7 @@ static int suspend_thread( struct thread *thread )
}
/* resume a thread */
-static int resume_thread( struct thread *thread )
+int resume_thread( struct thread *thread )
{
int old_count = thread->suspend;
if (thread->suspend > 0)
diff --git a/server/thread.h b/server/thread.h
index bafc08ed42..8bf7d73ead 100644
--- a/server/thread.h
+++ b/server/thread.h
@@ -131,6 +131,8 @@ extern struct token *thread_get_impersonation_token( struct thread *thread );
extern int set_thread_affinity( struct thread *thread, affinity_t affinity );
extern int is_cpu_supported( enum cpu_type cpu );
extern unsigned int get_supported_cpu_mask(void);
+extern int suspend_thread( struct thread *thread );
+extern int resume_thread( struct thread *thread );
/* ptrace functions */
diff --git a/server/trace.c b/server/trace.c
index d4d0c3eb8d..5c6325a257 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -4582,6 +4582,16 @@ static void dump_terminate_job_request( const struct terminate_job_request *req
fprintf( stderr, ", status=%d", req->status );
}
+static void dump_suspend_process_request( const struct suspend_process_request *req )
+{
+ fprintf( stderr, " handle=%04x", req->handle );
+}
+
+static void dump_resume_process_request( const struct resume_process_request *req )
+{
+ fprintf( stderr, " handle=%04x", req->handle );
+}
+
static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
(dump_func)dump_new_process_request,
(dump_func)dump_exec_process_request,
@@ -4879,6 +4889,8 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
(dump_func)dump_set_job_limits_request,
(dump_func)dump_set_job_completion_port_request,
(dump_func)dump_terminate_job_request,
+ (dump_func)dump_suspend_process_request,
+ (dump_func)dump_resume_process_request,
};
static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
@@ -5178,6 +5190,8 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
NULL,
NULL,
NULL,
+ NULL,
+ NULL,
};
static const char * const req_names[REQ_NB_REQUESTS] = {
@@ -5477,6 +5491,8 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
"set_job_limits",
"set_job_completion_port",
"terminate_job",
+ "suspend_process",
+ "resume_process",
};
static const struct
--
2.20.1
1
0
April 17, 2019
Avoiding duplication is necessary for typelibs, but there's no reason to
explicitly duplicate if we aren't building a typelib.
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
tools/widl/typetree.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/tools/widl/typetree.c b/tools/widl/typetree.c
index b93806be98..4a78350858 100644
--- a/tools/widl/typetree.c
+++ b/tools/widl/typetree.c
@@ -299,19 +299,17 @@ type_t *type_new_enum(const char *name, struct namespace *namespace, int defined
type_t *type_new_struct(char *name, struct namespace *namespace, int defined, var_list_t *fields)
{
- type_t *tag_type = name ? find_type(name, namespace, tsSTRUCT) : NULL;
type_t *t;
/* avoid creating duplicate typelib type entries */
- if (tag_type && do_typelib) return tag_type;
+ if (name && (t = find_type(name, namespace, tsSTRUCT)))
+ return t;
t = make_type(TYPE_STRUCT);
t->name = name;
t->namespace = namespace;
- if (tag_type && tag_type->details.structure)
- t->details.structure = tag_type->details.structure;
- else if (defined)
+ if (defined)
{
t->details.structure = xmalloc(sizeof(*t->details.structure));
t->details.structure->fields = fields;
--
2.21.0
2
3
April 17, 2019
For instance, to debug the msxml3 tests I've tried
tests $ gdb --args ../../../loader/wine64 msxml3_test.exe.so domdoc
(gdb) b domdoc.c:13003
Make breakpoint pending on future shared library load? (y or [n]) y
(gdb) r
in which case gdb breaks at a segfault in which there is little stack
information, but does not break at my breakpoint, as well as
...
(gdb) set follow-fork-mode child
(gdb) r
in which case gdb still does not break at my breakpoint, nor at the segfault.
2
7
Microsoft changed the result from failure to success in recent Windows10
Example failures:
http://test.winehq.org/data/f9301c2b66450a1cdd986e9052fcaa76535ba8b7/win10_…
http://test.winehq.org/data/f9301c2b66450a1cdd986e9052fcaa76535ba8b7/win10_…
Patch tested:
https://testbot.winehq.org/JobDetails.pl?Key=51063
--
bye bye ...
... Detlef
Signed-off-by: Detlef Riekenberg <wine.dev(a)web.de>
---
dlls/gdi32/tests/dc.c | 3 ---
1 file changed, 3 deletions(-)
diff --git a/dlls/gdi32/tests/dc.c b/dlls/gdi32/tests/dc.c
index 2d9ef1dd88..9962f3daee 100644
--- a/dlls/gdi32/tests/dc.c
+++ b/dlls/gdi32/tests/dc.c
@@ -815,9 +815,6 @@ static void test_DeleteDC(void)
ret = UnregisterClassA("Wine class DC", GetModuleHandleA(NULL));
ok(ret, "UnregisterClassA failed\n");
- ret = GetObjectType(hdc_test);
- ok(!ret, "GetObjectType should fail for a deleted DC\n");
-
/* CS_OWNDC */
memset(&cls, 0, sizeof(cls));
cls.cbSize = sizeof(cls);
--
2.21.0.windows.1
2
1
1
0
[PATCH] d3dx9_36: Implement ID3DXSkinInfoImpl_UpdateSkinnedMesh.
by Vijay Kiran Kamuju April 17, 2019
by Vijay Kiran Kamuju April 17, 2019
April 17, 2019
This patch fixes last problem of bug 32572.
https://bugs.winehq.org/show_bug.cgi?id=32572
From: Christian Costa <titan.costa(a)gmail.com>
Signed-off-by: Vijay Kiran Kamuju <infyquest(a)gmail.com>
---
dlls/d3dx9_36/skin.c | 86 ++++++++++++++++++++++++++++++++++++--
dlls/d3dx9_36/tests/mesh.c | 83 ++++++++++++++++++++++++++++++++++++
2 files changed, 166 insertions(+), 3 deletions(-)
diff --git a/dlls/d3dx9_36/skin.c b/dlls/d3dx9_36/skin.c
index f197d33582a..c27d0c7a8a8 100644
--- a/dlls/d3dx9_36/skin.c
+++ b/dlls/d3dx9_36/skin.c
@@ -2,6 +2,7 @@
* Skin Info operations specific to D3DX9.
*
* Copyright (C) 2011 Dylan Smith
+ * Copyright (C) 2013 Christian Costa
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -377,10 +378,89 @@ static HRESULT WINAPI d3dx9_skin_info_GetDeclaration(ID3DXSkinInfo *iface,
static HRESULT WINAPI d3dx9_skin_info_UpdateSkinnedMesh(ID3DXSkinInfo *iface, const D3DXMATRIX *bone_transforms,
const D3DXMATRIX *bone_inv_transpose_transforms, const void *src_vertices, void *dst_vertices)
{
- FIXME("iface %p, bone_transforms %p, bone_inv_transpose_transforms %p, src_vertices %p, dst_vertices %p stub!\n",
- iface, bone_transforms, bone_inv_transpose_transforms, src_vertices, dst_vertices);
+ struct d3dx9_skin_info *skin = impl_from_ID3DXSkinInfo(iface);
+ DWORD size = D3DXGetFVFVertexSize(skin->fvf);
+ DWORD i, j;
- return E_NOTIMPL;
+ TRACE("iface %p, bone_transforms %p, bone_inv_transpose_transforms %p, src_vertices %p, dst_vertices %p\n",
+ skin, bone_transforms, bone_inv_transpose_transforms, src_vertices, dst_vertices);
+
+ if (bone_inv_transpose_transforms)
+ FIXME("Skinning vertices with two position elements not supported\n");
+
+ if ((skin->fvf & D3DFVF_POSITION_MASK) != D3DFVF_XYZ) {
+ FIXME("Vertex type %#x not supported\n", skin->fvf & D3DFVF_POSITION_MASK);
+ return E_FAIL;
+ }
+
+ /* Reset all positions */
+ for (i = 0; i < skin->num_vertices; i++) {
+ D3DXVECTOR3 *position = (D3DXVECTOR3*)((BYTE*)dst_vertices + size * i);
+ position->x = 0.0f;
+ position->y = 0.0f;
+ position->z = 0.0f;
+ }
+
+ /* Update positions that are influenced by bones */
+ for (i = 0; i < skin->num_bones; i++) {
+ D3DXMATRIX bone_inverse, matrix;
+
+ D3DXMatrixInverse(&bone_inverse, NULL, &skin->bones[i].transform);
+ D3DXMatrixMultiply(&matrix, &bone_transforms[i], &bone_inverse);
+ D3DXMatrixMultiply(&matrix, &matrix, &skin->bones[i].transform);
+
+ for (j = 0; j < skin->bones[i].num_influences; j++) {
+ D3DXVECTOR3 position;
+ D3DXVECTOR3 *position_src = (D3DXVECTOR3*)((BYTE*)src_vertices + size * skin->bones[i].vertices[j]);
+ D3DXVECTOR3 *position_dest = (D3DXVECTOR3*)((BYTE*)dst_vertices + size * skin->bones[i].vertices[j]);
+ FLOAT weight = skin->bones[i].weights[j];
+
+ D3DXVec3TransformCoord(&position, position_src, &matrix);
+ position_dest->x += weight * position.x;
+ position_dest->y += weight * position.y;
+ position_dest->z += weight * position.z;
+ }
+ }
+
+ if (skin->fvf & D3DFVF_NORMAL) {
+ /* Reset all normals */
+ for (i = 0; i < skin->num_vertices; i++) {
+ D3DXVECTOR3 *normal = (D3DXVECTOR3*)((BYTE*)dst_vertices + size * i + sizeof(D3DXVECTOR3));
+ normal->x = 0.0f;
+ normal->y = 0.0f;
+ normal->z = 0.0f;
+ }
+
+ /* Update normals that are influenced by bones */
+ for (i = 0; i < skin->num_bones; i++) {
+ D3DXMATRIX bone_inverse, matrix;
+
+ D3DXMatrixInverse(&bone_inverse, NULL, &skin->bones[i].transform);
+ D3DXMatrixMultiply(&matrix, &skin->bones[i].transform, &bone_transforms[i]);
+
+ for (j = 0; j < skin->bones[i].num_influences; j++) {
+ D3DXVECTOR3 normal;
+ D3DXVECTOR3 *normal_src = (D3DXVECTOR3*)((BYTE*)src_vertices + size * skin->bones[i].vertices[j] + sizeof(D3DXVECTOR3));
+ D3DXVECTOR3 *normal_dest = (D3DXVECTOR3*)((BYTE*)dst_vertices + size * skin->bones[i].vertices[j] + sizeof(D3DXVECTOR3));
+ FLOAT weight = skin->bones[i].weights[j];
+
+ D3DXVec3TransformNormal(&normal, normal_src, &bone_inverse);
+ D3DXVec3TransformNormal(&normal, &normal, &matrix);
+ normal_dest->x += weight * normal.x;
+ normal_dest->y += weight * normal.y;
+ normal_dest->z += weight * normal.z;
+ }
+ }
+
+ /* Normalize all normals that are influenced by bones*/
+ for (i = 0; i < skin->num_vertices; i++) {
+ D3DXVECTOR3 *normal_dest = (D3DXVECTOR3*)((BYTE*)dst_vertices + (i * size) + sizeof(D3DXVECTOR3));
+ if ((normal_dest->x != 0.0f) && (normal_dest->y != 0.0f) && (normal_dest->z != 0.0f))
+ D3DXVec3Normalize(normal_dest, normal_dest);
+ }
+ }
+
+ return D3D_OK;
}
static HRESULT WINAPI d3dx9_skin_info_ConvertToBlendedMesh(ID3DXSkinInfo *iface, ID3DXMesh *mesh_in,
diff --git a/dlls/d3dx9_36/tests/mesh.c b/dlls/d3dx9_36/tests/mesh.c
index da9b80c578b..13dfb5286fd 100644
--- a/dlls/d3dx9_36/tests/mesh.c
+++ b/dlls/d3dx9_36/tests/mesh.c
@@ -5193,6 +5193,88 @@ static void test_create_skin_info(void)
ok(hr == D3DERR_INVALIDCALL, "Expected D3DERR_INVALIDCALL, got %#x\n", hr);
}
+static void test_update_skinned_mesh(void)
+{
+ static DWORD bone0_vertices[2] = { 1, 3 };
+ static FLOAT bone0_weights[2] = { 1.0f, 0.5f };
+ static DWORD bone1_vertices[2] = { 2, 3 };
+ static FLOAT bone1_weights[2] = { 1.0f, 0.5f };
+ static D3DMATRIX bones_matrix[2] =
+ { { { {
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ 2.0f, 2.0f, 4.0f, 1.0f
+ } } },
+ { { {
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ -4.0f, -4.0f, 4.0f, 1.0f
+ } } } };
+ static D3DVECTOR vertices_src[] = {{ 1.0f, 1.0f, 1.0f },
+ { 1.0f, 0.0f, 0.0f },
+ { 1.0f, 1.0f, -1.0f },
+ { 0.0f, 1.0f, 0.0f },
+ { -1.0f, -1.0f, 1.0f },
+ { 0.0f, 0.0f, 1.0f },
+ { -1.0f, -1.0f, -1.0f },
+ { -1.0f, 0.0f, 0.0f },
+ };
+ static D3DVECTOR vertices_ref[] = {{ 0.0f, 0.0f, 0.0f },
+ { 0.0f, 0.0f, 0.0f },
+ { 3.0f, 3.0f, 3.0f },
+ { 0.0f, 1.0f, 0.0f },
+ { -5.0f, -5.0f, 5.0f },
+ { 0.0f, 0.0f, 1.0f },
+ { -2.0f, -2.0f, 3.0f },
+ { -1.0f, 0.0f, 0.0f },
+ };
+ D3DVECTOR vertices_dest[8];
+ HRESULT hr;
+ ID3DXSkinInfo *skin_info;
+ D3DXMATRIX matrix;
+ int i;
+
+ D3DXMatrixIdentity(&matrix);
+ for (i = 0; i < 8; i++)
+ {
+ vertices_dest[i].x = 10000.0f;
+ vertices_dest[i].y = 10000.0f;
+ vertices_dest[i].z = 10000.0f;
+ }
+
+ hr = D3DXCreateSkinInfoFVF(4, D3DFVF_XYZ | D3DFVF_NORMAL, 2, &skin_info);
+ ok(hr == D3D_OK, "Expected D3D_OK, got %#x\n", hr);
+
+ skin_info->lpVtbl->SetBoneInfluence(skin_info, 0, 2, bone0_vertices, bone0_weights);
+ ok(hr == D3D_OK, "Expected D3D_OK, got %#x\n", hr);
+ skin_info->lpVtbl->SetBoneOffsetMatrix(skin_info, 0, &matrix);
+ ok(hr == D3D_OK, "Expected D3D_OK, got %#x\n", hr);
+ skin_info->lpVtbl->SetBoneInfluence(skin_info, 1, 2, bone1_vertices, bone1_weights);
+ ok(hr == D3D_OK, "Expected D3D_OK, got %#x\n", hr);
+ skin_info->lpVtbl->SetBoneOffsetMatrix(skin_info, 1, &matrix);
+ ok(hr == D3D_OK, "Expected D3D_OK, got %#x\n", hr);
+ skin_info->lpVtbl->UpdateSkinnedMesh(skin_info, bones_matrix, NULL, vertices_src, vertices_dest);
+ ok(hr == D3D_OK, "Expected D3D_OK, got %#x\n", hr);
+ for (i = 0; i < 4; i++)
+ {
+ ok(compare(vertices_dest[i*2].x, vertices_ref[i*2].x), "Vertex[%d].position.x: got %g, expected %g\n",
+ i, vertices_dest[i*2].x, vertices_ref[i*2].x);
+ ok(compare(vertices_dest[i*2].y, vertices_ref[i*2].y), "Vertex[%d].position.y: got %g, expected %g\n",
+ i, vertices_dest[i*2].y, vertices_ref[i*2].y);
+ ok(compare(vertices_dest[i*2].z, vertices_ref[i*2].z), "Vertex[%d].position.z: got %g, expected %g\n",
+ i, vertices_dest[i*2].z, vertices_ref[i*2].z);
+ ok(compare(vertices_dest[i*2+1].x, vertices_ref[i*2+1].x), "Vertex[%d].normal.x: got %g, expected %g\n",
+ i, vertices_dest[i*2+1].x, vertices_ref[i*2+1].x);
+ ok(compare(vertices_dest[i*2+1].y, vertices_ref[i*2+1].y), "Vertex[%d].normal.y: got %g, expected %g\n",
+ i, vertices_dest[i*2+1].y, vertices_ref[i*2+1].y);
+ ok(compare(vertices_dest[i*2+1].z, vertices_ref[i*2+1].z), "Vertex[%d].normal.z: got %g, expected %g\n",
+ i, vertices_dest[i*2+1].z, vertices_ref[i*2+1].z);
+ }
+ skin_info->lpVtbl->Release(skin_info);
+}
+
static void test_convert_adjacency_to_point_reps(void)
{
HRESULT hr;
@@ -11393,6 +11475,7 @@ START_TEST(mesh)
D3DXGenerateAdjacencyTest();
test_update_semantics();
test_create_skin_info();
+ test_update_skinned_mesh();
test_convert_adjacency_to_point_reps();
test_convert_point_reps_to_adjacency();
test_weld_vertices();
--
2.17.0
3
6
[PATCH 1/7] qedit/tests: Add more tests for sample grabber filter interfaces.
by Zebediah Figura April 17, 2019
by Zebediah Figura April 17, 2019
April 17, 2019
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/qedit/tests/Makefile.in | 1 +
dlls/qedit/tests/mediadet.c | 12 -----
dlls/qedit/tests/samplegrabber.c | 87 ++++++++++++++++++++++++++++++++
3 files changed, 88 insertions(+), 12 deletions(-)
create mode 100644 dlls/qedit/tests/samplegrabber.c
diff --git a/dlls/qedit/tests/Makefile.in b/dlls/qedit/tests/Makefile.in
index 07dd4b0bb7..052336d64d 100644
--- a/dlls/qedit/tests/Makefile.in
+++ b/dlls/qedit/tests/Makefile.in
@@ -3,6 +3,7 @@ IMPORTS = oleaut32 ole32
C_SRCS = \
mediadet.c \
+ samplegrabber.c \
timeline.c
RC_SRCS = qedit.rc
diff --git a/dlls/qedit/tests/mediadet.c b/dlls/qedit/tests/mediadet.c
index 6bc20e574e..5c567e26d4 100644
--- a/dlls/qedit/tests/mediadet.c
+++ b/dlls/qedit/tests/mediadet.c
@@ -612,18 +612,6 @@ static void test_samplegrabber(void)
IMemInputPin_Release(inpin);
IPin_Release(pin);
- /* Interfaces that native does not support */
- hr = ISampleGrabber_QueryInterface(sg, &IID_IMediaPosition, (void**)&unk);
- todo_wine ok(hr == E_NOINTERFACE, "QueryInterface for IID_IMediaPosition failed: %08x\n", hr);
- hr = ISampleGrabber_QueryInterface(sg, &IID_IMediaSeeking, (void**)&unk);
- todo_wine ok(hr == E_NOINTERFACE, "QueryInterface for IID_IMediaSeeking failed: %08x\n", hr);
- hr = ISampleGrabber_QueryInterface(sg, &IID_IMemInputPin, (void**)&unk);
- ok(hr == E_NOINTERFACE, "QueryInterface for IID_IMemInputPin failed: %08x\n", hr);
- hr = ISampleGrabber_QueryInterface(sg, &IID_IQualityControl, (void**)&unk);
- ok(hr == E_NOINTERFACE, "QueryInterface for IID_IQualityControl failed: %08x\n", hr);
- hr = ISampleGrabber_QueryInterface(sg, &IID_ISeekingPassThru, (void**)&unk);
- ok(hr == E_NOINTERFACE, "QueryInterface for IID_ISeekingPassThru failed: %08x\n", hr);
-
while (ISampleGrabber_Release(sg));
}
diff --git a/dlls/qedit/tests/samplegrabber.c b/dlls/qedit/tests/samplegrabber.c
new file mode 100644
index 0000000000..d6fa4051d5
--- /dev/null
+++ b/dlls/qedit/tests/samplegrabber.c
@@ -0,0 +1,87 @@
+/*
+ * Sample grabber filter unit tests
+ *
+ * Copyright 2018 Zebediah Figura
+ *
+ * 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
+ */
+
+#define COBJMACROS
+#include "dshow.h"
+#include "qedit.h"
+#include "wine/test.h"
+
+static IBaseFilter *create_sample_grabber(void)
+{
+ IBaseFilter *filter = NULL;
+ HRESULT hr = CoCreateInstance(&CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IBaseFilter, (void **)&filter);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ return filter;
+}
+
+#define check_interface(a, b, c) check_interface_(__LINE__, a, b, c)
+static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOOL supported)
+{
+ IUnknown *iface = iface_ptr;
+ HRESULT hr, expected_hr;
+ IUnknown *unk;
+
+ expected_hr = supported ? S_OK : E_NOINTERFACE;
+
+ hr = IUnknown_QueryInterface(iface, iid, (void **)&unk);
+ ok_(__FILE__, line)(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr);
+ if (SUCCEEDED(hr))
+ IUnknown_Release(unk);
+}
+
+static void test_interfaces(void)
+{
+ IBaseFilter *filter = create_sample_grabber();
+ ULONG ref;
+
+ check_interface(filter, &IID_IBaseFilter, TRUE);
+ check_interface(filter, &IID_IMediaFilter, TRUE);
+ check_interface(filter, &IID_IPersist, TRUE);
+ check_interface(filter, &IID_ISampleGrabber, TRUE);
+ check_interface(filter, &IID_IUnknown, TRUE);
+
+ check_interface(filter, &IID_IAMFilterMiscFlags, FALSE);
+ check_interface(filter, &IID_IBasicAudio, FALSE);
+ check_interface(filter, &IID_IBasicVideo, FALSE);
+ check_interface(filter, &IID_IKsPropertySet, FALSE);
+ todo_wine check_interface(filter, &IID_IMediaPosition, FALSE);
+ todo_wine check_interface(filter, &IID_IMediaSeeking, FALSE);
+ check_interface(filter, &IID_IMemInputPin, FALSE);
+ check_interface(filter, &IID_IPersistPropertyBag, FALSE);
+ check_interface(filter, &IID_IPin, FALSE);
+ check_interface(filter, &IID_IQualityControl, FALSE);
+ check_interface(filter, &IID_IQualProp, FALSE);
+ check_interface(filter, &IID_IReferenceClock, FALSE);
+ check_interface(filter, &IID_ISeekingPassThru, FALSE);
+ check_interface(filter, &IID_IVideoWindow, FALSE);
+
+ ref = IBaseFilter_Release(filter);
+ ok(!ref, "Got unexpected refcount %d.\n", ref);
+}
+
+START_TEST(samplegrabber)
+{
+ CoInitialize(NULL);
+
+ test_interfaces();
+
+ CoUninitialize();
+}
--
2.21.0
4
19
April 17, 2019
This matches what Windows does with common controllers like xbox 360.
Signed-off-by: Andrew Eikum <aeikum(a)codeweavers.com>
---
This allows controllers to work in some games like Telltale games and
Yakuza Kiwami.
dlls/dinput/dinput_main.c | 1 +
dlls/dinput/joystick_linux.c | 9 +++------
dlls/dinput/joystick_linuxinput.c | 9 +++------
dlls/dinput/joystick_osx.c | 7 +++++--
4 files changed, 12 insertions(+), 14 deletions(-)
diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c
index 1b2020c7110..7b6a5b075cd 100644
--- a/dlls/dinput/dinput_main.c
+++ b/dlls/dinput/dinput_main.c
@@ -246,6 +246,7 @@ static const char *_dump_DIDEVTYPE_value(DWORD dwDevType, DWORD dwVersion)
case DIDEVTYPE_KEYBOARD: return "DIDEVTYPE_KEYBOARD";
case DIDEVTYPE_JOYSTICK: return "DIDEVTYPE_JOYSTICK";
case DIDEVTYPE_DEVICE: return "DIDEVTYPE_DEVICE";
+ case DIDEVTYPE_GAMEPAD: return "DIDEVTYPE_GAMEPAD";
default: return "Unknown";
}
} else {
diff --git a/dlls/dinput/joystick_linux.c b/dlls/dinput/joystick_linux.c
index 963e62f017c..736a06e2b27 100644
--- a/dlls/dinput/joystick_linux.c
+++ b/dlls/dinput/joystick_linux.c
@@ -316,9 +316,9 @@ static void fill_joystick_dideviceinstanceW(LPDIDEVICEINSTANCEW lpddi, DWORD ver
lpddi->guidProduct = joystick_devices[id].guid_product;
/* we only support traditional joysticks for now */
if (version >= 0x0800)
- lpddi->dwDevType = DI8DEVTYPE_JOYSTICK | (DI8DEVTYPEJOYSTICK_STANDARD << 8);
+ lpddi->dwDevType = DI8DEVTYPE_GAMEPAD | (DI8DEVTYPEJOYSTICK_STANDARD << 8);
else
- lpddi->dwDevType = DIDEVTYPE_JOYSTICK | (DIDEVTYPEJOYSTICK_TRADITIONAL << 8);
+ lpddi->dwDevType = DIDEVTYPE_JOYSTICK | (DIDEVTYPEJOYSTICK_GAMEPAD << 8);
/* Assume the joystick as HID if it is attached to USB bus and has a valid VID/PID */
if (joystick_devices[id].bus_type == BUS_USB &&
@@ -326,10 +326,7 @@ static void fill_joystick_dideviceinstanceW(LPDIDEVICEINSTANCEW lpddi, DWORD ver
{
lpddi->dwDevType |= DIDEVTYPE_HID;
lpddi->wUsagePage = 0x01; /* Desktop */
- if (lpddi->dwDevType == DI8DEVTYPE_JOYSTICK || lpddi->dwDevType == DIDEVTYPE_JOYSTICK)
- lpddi->wUsage = 0x04; /* Joystick */
- else
- lpddi->wUsage = 0x05; /* Game Pad */
+ lpddi->wUsage = 0x05; /* Game Pad */
}
MultiByteToWideChar(CP_ACP, 0, joystick_devices[id].name, -1, lpddi->tszInstanceName, MAX_PATH);
diff --git a/dlls/dinput/joystick_linuxinput.c b/dlls/dinput/joystick_linuxinput.c
index 910e755d3ed..cea669b90cb 100644
--- a/dlls/dinput/joystick_linuxinput.c
+++ b/dlls/dinput/joystick_linuxinput.c
@@ -355,9 +355,9 @@ static void fill_joystick_dideviceinstanceW(LPDIDEVICEINSTANCEW lpddi, DWORD ver
lpddi->guidFFDriver = GUID_NULL;
if (version >= 0x0800)
- lpddi->dwDevType = DI8DEVTYPE_JOYSTICK | (DI8DEVTYPEJOYSTICK_STANDARD << 8);
+ lpddi->dwDevType = DI8DEVTYPE_GAMEPAD | (DI8DEVTYPEJOYSTICK_STANDARD << 8);
else
- lpddi->dwDevType = DIDEVTYPE_JOYSTICK | (DIDEVTYPEJOYSTICK_TRADITIONAL << 8);
+ lpddi->dwDevType = DIDEVTYPE_JOYSTICK | (DIDEVTYPEJOYSTICK_GAMEPAD << 8);
/* Assume the joystick as HID if it is attached to USB bus and has a valid VID/PID */
if (joydevs[id].bus_type == BUS_USB &&
@@ -365,10 +365,7 @@ static void fill_joystick_dideviceinstanceW(LPDIDEVICEINSTANCEW lpddi, DWORD ver
{
lpddi->dwDevType |= DIDEVTYPE_HID;
lpddi->wUsagePage = 0x01; /* Desktop */
- if (lpddi->dwDevType == DI8DEVTYPE_JOYSTICK || lpddi->dwDevType == DIDEVTYPE_JOYSTICK)
- lpddi->wUsage = 0x04; /* Joystick */
- else
- lpddi->wUsage = 0x05; /* Game Pad */
+ lpddi->wUsage = 0x05; /* Game Pad */
}
MultiByteToWideChar(CP_ACP, 0, joydevs[id].name, -1, lpddi->tszInstanceName, MAX_PATH);
diff --git a/dlls/dinput/joystick_osx.c b/dlls/dinput/joystick_osx.c
index 0701b9f42cc..daef1a12ed5 100644
--- a/dlls/dinput/joystick_osx.c
+++ b/dlls/dinput/joystick_osx.c
@@ -969,9 +969,12 @@ static HRESULT joydev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINS
lpddi->guidProduct.Data1 = make_vid_pid(device);
/* we only support traditional joysticks for now */
if (version >= 0x0800)
- lpddi->dwDevType = DI8DEVTYPE_JOYSTICK | (DI8DEVTYPEJOYSTICK_STANDARD << 8);
+ lpddi->dwDevType = DI8DEVTYPE_GAMEPAD | (DI8DEVTYPEJOYSTICK_STANDARD << 8);
else
- lpddi->dwDevType = DIDEVTYPE_JOYSTICK | (DIDEVTYPEJOYSTICK_TRADITIONAL << 8);
+ lpddi->dwDevType = DIDEVTYPE_JOYSTICK | (DIDEVTYPEJOYSTICK_GAMEPAD << 8);
+ lpddi->dwDevType |= DIDEVTYPE_HID;
+ lpddi->wUsagePage = 0x01; /* Desktop */
+ lpddi->wUsage = 0x05; /* Game Pad */
sprintf(lpddi->tszInstanceName, "Joystick %d", id);
/* get the device name */
--
2.21.0
2
1
[PATCH V2 1/3] mmsystem.dll16: Remove and replace tabs with spaces
by Vijay Kiran Kamuju April 17, 2019
by Vijay Kiran Kamuju April 17, 2019
April 17, 2019
From: Vijay Kiran Kamuju <infyquest(a)gmail.com>
Signed-off-by: Vijay Kiran Kamuju <infyquest(a)gmail.com>
---
dlls/mmsystem.dll16/message16.c | 938 ++++++++++++++++----------------
1 file changed, 469 insertions(+), 469 deletions(-)
diff --git a/dlls/mmsystem.dll16/message16.c b/dlls/mmsystem.dll16/message16.c
index 012d3dca869..28f20ba0b29 100644
--- a/dlls/mmsystem.dll16/message16.c
+++ b/dlls/mmsystem.dll16/message16.c
@@ -42,29 +42,29 @@ WINE_DEFAULT_DEBUG_CHANNEL(winmm);
* ================================= */
/**************************************************************************
- * MMSYSTDRV_Mixer_Map16To32W [internal]
+ * MMSYSTDRV_Mixer_Map16To32W [internal]
*/
-static MMSYSTEM_MapType MMSYSTDRV_Mixer_Map16To32W (UINT wMsg, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2)
+static MMSYSTEM_MapType MMSYSTDRV_Mixer_Map16To32W (UINT wMsg, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2)
{
return MMSYSTEM_MAP_MSGERROR;
}
/**************************************************************************
- * MMSYSTDRV_Mixer_UnMap16To32W [internal]
+ * MMSYSTDRV_Mixer_UnMap16To32W [internal]
*/
-static MMSYSTEM_MapType MMSYSTDRV_Mixer_UnMap16To32W(UINT wMsg, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2, MMRESULT fn_ret)
+static MMSYSTEM_MapType MMSYSTDRV_Mixer_UnMap16To32W(UINT wMsg, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2, MMRESULT fn_ret)
{
#if 0
- MIXERCAPSA micA;
- UINT ret = mixerGetDevCapsA(devid, &micA, sizeof(micA));
+ MIXERCAPSA micA;
+ UINT ret = mixerGetDevCapsA(devid, &micA, sizeof(micA));
if (ret == MMSYSERR_NOERROR) {
- mixcaps->wMid = micA.wMid;
- mixcaps->wPid = micA.wPid;
- mixcaps->vDriverVersion = micA.vDriverVersion;
- strcpy(mixcaps->szPname, micA.szPname);
- mixcaps->fdwSupport = micA.fdwSupport;
- mixcaps->cDestinations = micA.cDestinations;
+ mixcaps->wMid = micA.wMid;
+ mixcaps->wPid = micA.wPid;
+ mixcaps->vDriverVersion = micA.vDriverVersion;
+ strcpy(mixcaps->szPname, micA.szPname);
+ mixcaps->fdwSupport = micA.fdwSupport;
+ mixcaps->cDestinations = micA.cDestinations;
}
return ret;
#endif
@@ -72,9 +72,9 @@ static MMSYSTEM_MapType MMSYSTDRV_Mixer_UnMap16To32W(UINT wMsg, DWORD_PTR* lpPa
}
/**************************************************************************
- * MMSYSTDRV_Mixer_MapCB
+ * MMSYSTDRV_Mixer_MapCB
*/
-static void MMSYSTDRV_Mixer_MapCB(DWORD uMsg, DWORD_PTR* dwUser, DWORD_PTR* dwParam1, DWORD_PTR* dwParam2)
+static void MMSYSTDRV_Mixer_MapCB(DWORD uMsg, DWORD_PTR* dwUser, DWORD_PTR* dwParam1, DWORD_PTR* dwParam2)
{
FIXME("NIY\n");
}
@@ -84,50 +84,50 @@ static void MMSYSTDRV_Mixer_MapCB(DWORD uMsg, DWORD_PTR* dwUser
* ================================= */
/**************************************************************************
- * MMSYSTDRV_MidiIn_Map16To32W [internal]
+ * MMSYSTDRV_MidiIn_Map16To32W [internal]
*/
-static MMSYSTEM_MapType MMSYSTDRV_MidiIn_Map16To32W (UINT wMsg, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2)
+static MMSYSTEM_MapType MMSYSTDRV_MidiIn_Map16To32W(UINT wMsg, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2)
{
return MMSYSTEM_MAP_MSGERROR;
}
/**************************************************************************
- * MMSYSTDRV_MidiIn_UnMap16To32W [internal]
+ * MMSYSTDRV_MidiIn_UnMap16To32W [internal]
*/
-static MMSYSTEM_MapType MMSYSTDRV_MidiIn_UnMap16To32W(UINT wMsg, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2, MMRESULT fn_ret)
+static MMSYSTEM_MapType MMSYSTDRV_MidiIn_UnMap16To32W(UINT wMsg, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2, MMRESULT fn_ret)
{
return MMSYSTEM_MAP_MSGERROR;
}
/**************************************************************************
- * MMSYSTDRV_MidiIn_MapCB [internal]
+ * MMSYSTDRV_MidiIn_MapCB [internal]
*/
-static void MMSYSTDRV_MidiIn_MapCB(UINT uMsg, DWORD_PTR* dwUser, DWORD_PTR* dwParam1, DWORD_PTR* dwParam2)
+static void MMSYSTDRV_MidiIn_MapCB(UINT uMsg, DWORD_PTR* dwUser, DWORD_PTR* dwParam1, DWORD_PTR* dwParam2)
{
switch (uMsg) {
case MIM_OPEN:
case MIM_CLOSE:
- /* dwParam1 & dwParam2 are supposed to be 0, nothing to do */
+ /* dwParam1 & dwParam2 are supposed to be 0, nothing to do */
case MIM_DATA:
case MIM_MOREDATA:
case MIM_ERROR:
- /* dwParam1 & dwParam2 are data, nothing to do */
- break;
+ /* dwParam1 & dwParam2 are data, nothing to do */
+ break;
case MIM_LONGDATA:
case MIM_LONGERROR:
- {
- LPMIDIHDR mh32 = (LPMIDIHDR)(*dwParam1);
- SEGPTR segmh16 = *(SEGPTR*)((LPSTR)mh32 - sizeof(LPMIDIHDR));
- LPMIDIHDR16 mh16 = MapSL(segmh16);
-
- *dwParam1 = (DWORD)segmh16;
- mh16->dwFlags = mh32->dwFlags;
- mh16->dwBytesRecorded = mh32->dwBytesRecorded;
- }
- break;
+ {
+ LPMIDIHDR mh32 = (LPMIDIHDR)(*dwParam1);
+ SEGPTR segmh16 = *(SEGPTR*)((LPSTR)mh32 - sizeof(LPMIDIHDR));
+ LPMIDIHDR16 mh16 = MapSL(segmh16);
+
+ *dwParam1 = (DWORD)segmh16;
+ mh16->dwFlags = mh32->dwFlags;
+ mh16->dwBytesRecorded = mh32->dwBytesRecorded;
+ }
+ break;
default:
- ERR("Unknown msg %u\n", uMsg);
+ ERR("Unknown msg %u\n", uMsg);
}
}
@@ -136,187 +136,187 @@ static void MMSYSTDRV_MidiIn_MapCB(UINT uMsg, DWORD_PTR* dwUser, DW
* ================================= */
/**************************************************************************
- * MMSYSTDRV_MidiOut_Map16To32W [internal]
+ * MMSYSTDRV_MidiOut_Map16To32W [internal]
*/
-static MMSYSTEM_MapType MMSYSTDRV_MidiOut_Map16To32W (UINT wMsg, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2)
+static MMSYSTEM_MapType MMSYSTDRV_MidiOut_Map16To32W (UINT wMsg, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2)
{
- MMSYSTEM_MapType ret = MMSYSTEM_MAP_MSGERROR;
+ MMSYSTEM_MapType ret = MMSYSTEM_MAP_MSGERROR;
switch (wMsg) {
case MODM_GETNUMDEVS:
case MODM_DATA:
case MODM_RESET:
case MODM_SETVOLUME:
- ret = MMSYSTEM_MAP_OK;
- break;
+ ret = MMSYSTEM_MAP_OK;
+ break;
case MODM_OPEN:
case MODM_CLOSE:
case MODM_GETVOLUME:
- FIXME("Shouldn't be used: the corresponding 16 bit functions use the 32 bit interface\n");
- break;
+ FIXME("Shouldn't be used: the corresponding 16 bit functions use the 32 bit interface\n");
+ break;
case MODM_GETDEVCAPS:
- {
- LPMIDIOUTCAPSW moc32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMIDIOUTCAPS16) + sizeof(MIDIOUTCAPSW));
- LPMIDIOUTCAPS16 moc16 = MapSL(*lpParam1);
-
- if (moc32) {
- *(LPMIDIOUTCAPS16*)moc32 = moc16;
- moc32 = (LPMIDIOUTCAPSW)((LPSTR)moc32 + sizeof(LPMIDIOUTCAPS16));
- *lpParam1 = (DWORD)moc32;
- *lpParam2 = sizeof(MIDIOUTCAPSW);
-
- ret = MMSYSTEM_MAP_OKMEM;
- } else {
- ret = MMSYSTEM_MAP_NOMEM;
- }
- }
- break;
+ {
+ LPMIDIOUTCAPSW moc32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMIDIOUTCAPS16) + sizeof(MIDIOUTCAPSW));
+ LPMIDIOUTCAPS16 moc16 = MapSL(*lpParam1);
+
+ if (moc32) {
+ *(LPMIDIOUTCAPS16*)moc32 = moc16;
+ moc32 = (LPMIDIOUTCAPSW)((LPSTR)moc32 + sizeof(LPMIDIOUTCAPS16));
+ *lpParam1 = (DWORD)moc32;
+ *lpParam2 = sizeof(MIDIOUTCAPSW);
+
+ ret = MMSYSTEM_MAP_OKMEM;
+ } else {
+ ret = MMSYSTEM_MAP_NOMEM;
+ }
+ }
+ break;
case MODM_PREPARE:
- {
- LPMIDIHDR mh32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMIDIHDR) + sizeof(MIDIHDR));
- LPMIDIHDR16 mh16 = MapSL(*lpParam1);
-
- if (mh32) {
- *(LPMIDIHDR*)mh32 = (LPMIDIHDR)*lpParam1;
- mh32 = (LPMIDIHDR)((LPSTR)mh32 + sizeof(LPMIDIHDR));
- mh32->lpData = MapSL((SEGPTR)mh16->lpData);
- mh32->dwBufferLength = mh16->dwBufferLength;
- mh32->dwBytesRecorded = mh16->dwBytesRecorded;
- mh32->dwUser = mh16->dwUser;
- mh32->dwFlags = mh16->dwFlags;
- mh16->lpNext = (MIDIHDR16*)mh32; /* for reuse in unprepare and write */
- *lpParam1 = (DWORD)mh32;
- *lpParam2 = offsetof(MIDIHDR,dwOffset); /* old size, without dwOffset */
-
- ret = MMSYSTEM_MAP_OKMEM;
- } else {
- ret = MMSYSTEM_MAP_NOMEM;
- }
- }
- break;
+ {
+ LPMIDIHDR mh32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMIDIHDR) + sizeof(MIDIHDR));
+ LPMIDIHDR16 mh16 = MapSL(*lpParam1);
+
+ if (mh32) {
+ *(LPMIDIHDR*)mh32 = (LPMIDIHDR)*lpParam1;
+ mh32 = (LPMIDIHDR)((LPSTR)mh32 + sizeof(LPMIDIHDR));
+ mh32->lpData = MapSL((SEGPTR)mh16->lpData);
+ mh32->dwBufferLength = mh16->dwBufferLength;
+ mh32->dwBytesRecorded = mh16->dwBytesRecorded;
+ mh32->dwUser = mh16->dwUser;
+ mh32->dwFlags = mh16->dwFlags;
+ mh16->lpNext = (MIDIHDR16*)mh32; /* for reuse in unprepare and write */
+ *lpParam1 = (DWORD)mh32;
+ *lpParam2 = offsetof(MIDIHDR,dwOffset); /* old size, without dwOffset */
+
+ ret = MMSYSTEM_MAP_OKMEM;
+ } else {
+ ret = MMSYSTEM_MAP_NOMEM;
+ }
+ }
+ break;
case MODM_UNPREPARE:
case MODM_LONGDATA:
- {
- LPMIDIHDR16 mh16 = MapSL(*lpParam1);
- LPMIDIHDR mh32 = (MIDIHDR*)mh16->lpNext;
-
- *lpParam1 = (DWORD)mh32;
- *lpParam2 = offsetof(MIDIHDR,dwOffset);
- /* dwBufferLength can be reduced between prepare & write */
- if (wMsg == MODM_LONGDATA && mh32->dwBufferLength < mh16->dwBufferLength) {
- ERR("Size of buffer has been increased from %d to %d, keeping initial value\n",
- mh32->dwBufferLength, mh16->dwBufferLength);
- } else
- mh32->dwBufferLength = mh16->dwBufferLength;
- ret = MMSYSTEM_MAP_OKMEM;
- }
- break;
+ {
+ LPMIDIHDR16 mh16 = MapSL(*lpParam1);
+ LPMIDIHDR mh32 = (MIDIHDR*)mh16->lpNext;
+
+ *lpParam1 = (DWORD)mh32;
+ *lpParam2 = offsetof(MIDIHDR,dwOffset);
+ /* dwBufferLength can be reduced between prepare & write */
+ if (wMsg == MODM_LONGDATA && mh32->dwBufferLength < mh16->dwBufferLength) {
+ ERR("Size of buffer has been increased from %d to %d, keeping initial value\n",
+ mh32->dwBufferLength, mh16->dwBufferLength);
+ } else
+ mh32->dwBufferLength = mh16->dwBufferLength;
+ ret = MMSYSTEM_MAP_OKMEM;
+ }
+ break;
case MODM_CACHEPATCHES:
case MODM_CACHEDRUMPATCHES:
default:
- FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
- break;
+ FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
+ break;
}
return ret;
}
/**************************************************************************
- * MMSYSTDRV_MidiOut_UnMap16To32W [internal]
+ * MMSYSTDRV_MidiOut_UnMap16To32W [internal]
*/
-static MMSYSTEM_MapType MMSYSTDRV_MidiOut_UnMap16To32W(UINT wMsg, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2, MMRESULT fn_ret)
+static MMSYSTEM_MapType MMSYSTDRV_MidiOut_UnMap16To32W(UINT wMsg, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2, MMRESULT fn_ret)
{
- MMSYSTEM_MapType ret = MMSYSTEM_MAP_MSGERROR;
+ MMSYSTEM_MapType ret = MMSYSTEM_MAP_MSGERROR;
switch (wMsg) {
case MODM_GETNUMDEVS:
case MODM_DATA:
case MODM_RESET:
case MODM_SETVOLUME:
- ret = MMSYSTEM_MAP_OK;
- break;
+ ret = MMSYSTEM_MAP_OK;
+ break;
case MODM_OPEN:
case MODM_CLOSE:
case MODM_GETVOLUME:
- FIXME("Shouldn't be used: the corresponding 16 bit functions use the 32 bit interface\n");
- break;
+ FIXME("Shouldn't be used: the corresponding 16 bit functions use the 32 bit interface\n");
+ break;
case MODM_GETDEVCAPS:
- {
- LPMIDIOUTCAPSW moc32 = (LPMIDIOUTCAPSW)(*lpParam1);
- LPMIDIOUTCAPS16 moc16 = *(LPMIDIOUTCAPS16*)((LPSTR)moc32 - sizeof(LPMIDIOUTCAPS16));
-
- moc16->wMid = moc32->wMid;
- moc16->wPid = moc32->wPid;
- moc16->vDriverVersion = moc32->vDriverVersion;
- WideCharToMultiByte( CP_ACP, 0, moc32->szPname, -1, moc16->szPname,
- sizeof(moc16->szPname), NULL, NULL );
- moc16->wTechnology = moc32->wTechnology;
- moc16->wVoices = moc32->wVoices;
- moc16->wNotes = moc32->wNotes;
- moc16->wChannelMask = moc32->wChannelMask;
- moc16->dwSupport = moc32->dwSupport;
- HeapFree(GetProcessHeap(), 0, (LPSTR)moc32 - sizeof(LPMIDIOUTCAPS16));
- ret = MMSYSTEM_MAP_OK;
- }
- break;
+ {
+ LPMIDIOUTCAPSW moc32 = (LPMIDIOUTCAPSW)(*lpParam1);
+ LPMIDIOUTCAPS16 moc16 = *(LPMIDIOUTCAPS16*)((LPSTR)moc32 - sizeof(LPMIDIOUTCAPS16));
+
+ moc16->wMid = moc32->wMid;
+ moc16->wPid = moc32->wPid;
+ moc16->vDriverVersion = moc32->vDriverVersion;
+ WideCharToMultiByte( CP_ACP, 0, moc32->szPname, -1, moc16->szPname,
+ sizeof(moc16->szPname), NULL, NULL );
+ moc16->wTechnology = moc32->wTechnology;
+ moc16->wVoices = moc32->wVoices;
+ moc16->wNotes = moc32->wNotes;
+ moc16->wChannelMask = moc32->wChannelMask;
+ moc16->dwSupport = moc32->dwSupport;
+ HeapFree(GetProcessHeap(), 0, (LPSTR)moc32 - sizeof(LPMIDIOUTCAPS16));
+ ret = MMSYSTEM_MAP_OK;
+ }
+ break;
case MODM_PREPARE:
case MODM_UNPREPARE:
case MODM_LONGDATA:
- {
- LPMIDIHDR mh32 = (LPMIDIHDR)(*lpParam1);
- LPMIDIHDR16 mh16 = MapSL(*(SEGPTR*)((LPSTR)mh32 - sizeof(LPMIDIHDR)));
+ {
+ LPMIDIHDR mh32 = (LPMIDIHDR)(*lpParam1);
+ LPMIDIHDR16 mh16 = MapSL(*(SEGPTR*)((LPSTR)mh32 - sizeof(LPMIDIHDR)));
- assert((MIDIHDR*)mh16->lpNext == mh32);
- mh16->dwFlags = mh32->dwFlags;
+ assert((MIDIHDR*)mh16->lpNext == mh32);
+ mh16->dwFlags = mh32->dwFlags;
- if (wMsg == MODM_UNPREPARE && fn_ret == MMSYSERR_NOERROR) {
- HeapFree(GetProcessHeap(), 0, (LPSTR)mh32 - sizeof(LPMIDIHDR));
- mh16->lpNext = 0;
- }
- ret = MMSYSTEM_MAP_OK;
- }
- break;
+ if (wMsg == MODM_UNPREPARE && fn_ret == MMSYSERR_NOERROR) {
+ HeapFree(GetProcessHeap(), 0, (LPSTR)mh32 - sizeof(LPMIDIHDR));
+ mh16->lpNext = 0;
+ }
+ ret = MMSYSTEM_MAP_OK;
+ }
+ break;
case MODM_CACHEPATCHES:
case MODM_CACHEDRUMPATCHES:
default:
- FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
- break;
+ FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
+ break;
}
return ret;
}
/******************************************************************
- * MMSYSTDRV_MidiOut_MapCB
+ * MMSYSTDRV_MidiOut_MapCB
*/
-static void MMSYSTDRV_MidiOut_MapCB(UINT uMsg, DWORD_PTR* dwUser, DWORD_PTR* dwParam1, DWORD_PTR* dwParam2)
+static void MMSYSTDRV_MidiOut_MapCB(UINT uMsg, DWORD_PTR* dwUser, DWORD_PTR* dwParam1, DWORD_PTR* dwParam2)
{
switch (uMsg) {
case MOM_OPEN:
case MOM_CLOSE:
- /* dwParam1 & dwParam2 are supposed to be 0, nothing to do */
- break;
+ /* dwParam1 & dwParam2 are supposed to be 0, nothing to do */
+ break;
case MOM_POSITIONCB:
- /* MIDIHDR.dwOffset exists since Win 32 only */
- FIXME("MOM_POSITIONCB/MEVT_F_CALLBACK wants MIDIHDR.dwOffset in 16 bit code\n");
- /* fall through */
+ /* MIDIHDR.dwOffset exists since Win 32 only */
+ FIXME("MOM_POSITIONCB/MEVT_F_CALLBACK wants MIDIHDR.dwOffset in 16 bit code\n");
+ /* fall through */
case MOM_DONE:
- {
- /* initial map is: 16 => 32 */
- LPMIDIHDR mh32 = (LPMIDIHDR)(*dwParam1);
- SEGPTR segmh16 = *(SEGPTR*)((LPSTR)mh32 - sizeof(LPMIDIHDR));
- LPMIDIHDR16 mh16 = MapSL(segmh16);
-
- *dwParam1 = (DWORD)segmh16;
- mh16->dwFlags = mh32->dwFlags;
- }
- break;
+ {
+ /* initial map is: 16 => 32 */
+ LPMIDIHDR mh32 = (LPMIDIHDR)(*dwParam1);
+ SEGPTR segmh16 = *(SEGPTR*)((LPSTR)mh32 - sizeof(LPMIDIHDR));
+ LPMIDIHDR16 mh16 = MapSL(segmh16);
+
+ *dwParam1 = (DWORD)segmh16;
+ mh16->dwFlags = mh32->dwFlags;
+ }
+ break;
default:
- ERR("Unknown msg %u\n", uMsg);
+ ERR("Unknown msg %u\n", uMsg);
}
}
@@ -325,120 +325,120 @@ static void MMSYSTDRV_MidiOut_MapCB(UINT uMsg, DWORD_PTR* dwUser, DWORD_PTR* dw
* ================================= */
/**************************************************************************
- * MMSYSTDRV_WaveIn_Map16To32W [internal]
+ * MMSYSTDRV_WaveIn_Map16To32W [internal]
*/
-static MMSYSTEM_MapType MMSYSTDRV_WaveIn_Map16To32W (UINT wMsg, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2)
+static MMSYSTEM_MapType MMSYSTDRV_WaveIn_Map16To32W(UINT wMsg, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2)
{
- MMSYSTEM_MapType ret = MMSYSTEM_MAP_MSGERROR;
+ MMSYSTEM_MapType ret = MMSYSTEM_MAP_MSGERROR;
switch (wMsg) {
case WIDM_GETNUMDEVS:
case WIDM_RESET:
case WIDM_START:
case WIDM_STOP:
- ret = MMSYSTEM_MAP_OK;
- break;
+ ret = MMSYSTEM_MAP_OK;
+ break;
case WIDM_OPEN:
case WIDM_CLOSE:
- FIXME("Shouldn't be used: the corresponding 16 bit functions use the 32 bit interface\n");
- break;
+ FIXME("Shouldn't be used: the corresponding 16 bit functions use the 32 bit interface\n");
+ break;
case WIDM_GETDEVCAPS:
- {
- LPWAVEINCAPSW wic32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPWAVEINCAPS16) + sizeof(WAVEINCAPSW));
- LPWAVEINCAPS16 wic16 = MapSL(*lpParam1);
-
- if (wic32) {
- *(LPWAVEINCAPS16*)wic32 = wic16;
- wic32 = (LPWAVEINCAPSW)((LPSTR)wic32 + sizeof(LPWAVEINCAPS16));
- *lpParam1 = (DWORD)wic32;
- *lpParam2 = sizeof(WAVEINCAPSW);
-
- ret = MMSYSTEM_MAP_OKMEM;
- } else {
- ret = MMSYSTEM_MAP_NOMEM;
- }
- }
- break;
+ {
+ LPWAVEINCAPSW wic32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPWAVEINCAPS16) + sizeof(WAVEINCAPSW));
+ LPWAVEINCAPS16 wic16 = MapSL(*lpParam1);
+
+ if (wic32) {
+ *(LPWAVEINCAPS16*)wic32 = wic16;
+ wic32 = (LPWAVEINCAPSW)((LPSTR)wic32 + sizeof(LPWAVEINCAPS16));
+ *lpParam1 = (DWORD)wic32;
+ *lpParam2 = sizeof(WAVEINCAPSW);
+
+ ret = MMSYSTEM_MAP_OKMEM;
+ } else {
+ ret = MMSYSTEM_MAP_NOMEM;
+ }
+ }
+ break;
case WIDM_GETPOS:
- {
- LPMMTIME mmt32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMMTIME16) + sizeof(MMTIME));
- LPMMTIME16 mmt16 = MapSL(*lpParam1);
-
- if (mmt32) {
- *(LPMMTIME16*)mmt32 = mmt16;
- mmt32 = (LPMMTIME)((LPSTR)mmt32 + sizeof(LPMMTIME16));
-
- mmt32->wType = mmt16->wType;
- *lpParam1 = (DWORD)mmt32;
- *lpParam2 = sizeof(MMTIME);
-
- ret = MMSYSTEM_MAP_OKMEM;
- } else {
- ret = MMSYSTEM_MAP_NOMEM;
- }
- }
- break;
+ {
+ LPMMTIME mmt32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMMTIME16) + sizeof(MMTIME));
+ LPMMTIME16 mmt16 = MapSL(*lpParam1);
+
+ if (mmt32) {
+ *(LPMMTIME16*)mmt32 = mmt16;
+ mmt32 = (LPMMTIME)((LPSTR)mmt32 + sizeof(LPMMTIME16));
+
+ mmt32->wType = mmt16->wType;
+ *lpParam1 = (DWORD)mmt32;
+ *lpParam2 = sizeof(MMTIME);
+
+ ret = MMSYSTEM_MAP_OKMEM;
+ } else {
+ ret = MMSYSTEM_MAP_NOMEM;
+ }
+ }
+ break;
case WIDM_PREPARE:
- {
- LPWAVEHDR wh32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPWAVEHDR) + sizeof(WAVEHDR));
- LPWAVEHDR wh16 = MapSL(*lpParam1);
-
- if (wh32) {
- *(LPWAVEHDR*)wh32 = (LPWAVEHDR)*lpParam1;
- wh32 = (LPWAVEHDR)((LPSTR)wh32 + sizeof(LPWAVEHDR));
- wh32->lpData = MapSL((SEGPTR)wh16->lpData);
- wh32->dwBufferLength = wh16->dwBufferLength;
- wh32->dwBytesRecorded = wh16->dwBytesRecorded;
- wh32->dwUser = wh16->dwUser;
- wh32->dwFlags = wh16->dwFlags;
- wh32->dwLoops = wh16->dwLoops;
- /* FIXME: nothing on wh32->lpNext */
- /* could link the wh32->lpNext at this level for memory house keeping */
- wh16->lpNext = wh32; /* for reuse in unprepare and write */
- *lpParam1 = (DWORD)wh32;
- *lpParam2 = sizeof(WAVEHDR);
-
- ret = MMSYSTEM_MAP_OKMEM;
- } else {
- ret = MMSYSTEM_MAP_NOMEM;
- }
- }
- break;
+ {
+ LPWAVEHDR wh32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPWAVEHDR) + sizeof(WAVEHDR));
+ LPWAVEHDR wh16 = MapSL(*lpParam1);
+
+ if (wh32) {
+ *(LPWAVEHDR*)wh32 = (LPWAVEHDR)*lpParam1;
+ wh32 = (LPWAVEHDR)((LPSTR)wh32 + sizeof(LPWAVEHDR));
+ wh32->lpData = MapSL((SEGPTR)wh16->lpData);
+ wh32->dwBufferLength = wh16->dwBufferLength;
+ wh32->dwBytesRecorded = wh16->dwBytesRecorded;
+ wh32->dwUser = wh16->dwUser;
+ wh32->dwFlags = wh16->dwFlags;
+ wh32->dwLoops = wh16->dwLoops;
+ /* FIXME: nothing on wh32->lpNext */
+ /* could link the wh32->lpNext at this level for memory house keeping */
+ wh16->lpNext = wh32; /* for reuse in unprepare and write */
+ *lpParam1 = (DWORD)wh32;
+ *lpParam2 = sizeof(WAVEHDR);
+
+ ret = MMSYSTEM_MAP_OKMEM;
+ } else {
+ ret = MMSYSTEM_MAP_NOMEM;
+ }
+ }
+ break;
case WIDM_ADDBUFFER:
case WIDM_UNPREPARE:
- {
- LPWAVEHDR wh16 = MapSL(*lpParam1);
- LPWAVEHDR wh32 = wh16->lpNext;
-
- *lpParam1 = (DWORD)wh32;
- *lpParam2 = sizeof(WAVEHDR);
- /* dwBufferLength can be reduced between prepare & write */
- if (wMsg == WIDM_ADDBUFFER && wh32->dwBufferLength < wh16->dwBufferLength) {
- ERR("Size of buffer has been increased from %d to %d, keeping initial value\n",
- wh32->dwBufferLength, wh16->dwBufferLength);
- } else
- wh32->dwBufferLength = wh16->dwBufferLength;
- ret = MMSYSTEM_MAP_OKMEM;
- }
- break;
+ {
+ LPWAVEHDR wh16 = MapSL(*lpParam1);
+ LPWAVEHDR wh32 = wh16->lpNext;
+
+ *lpParam1 = (DWORD)wh32;
+ *lpParam2 = sizeof(WAVEHDR);
+ /* dwBufferLength can be reduced between prepare & write */
+ if (wMsg == WIDM_ADDBUFFER && wh32->dwBufferLength < wh16->dwBufferLength) {
+ ERR("Size of buffer has been increased from %d to %d, keeping initial value\n",
+ wh32->dwBufferLength, wh16->dwBufferLength);
+ } else
+ wh32->dwBufferLength = wh16->dwBufferLength;
+ ret = MMSYSTEM_MAP_OKMEM;
+ }
+ break;
case WIDM_MAPPER_STATUS:
- /* just a single DWORD */
- *lpParam2 = (DWORD)MapSL(*lpParam2);
- ret = MMSYSTEM_MAP_OK;
- break;
+ /* just a single DWORD */
+ *lpParam2 = (DWORD)MapSL(*lpParam2);
+ ret = MMSYSTEM_MAP_OK;
+ break;
default:
- FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
- break;
+ FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
+ break;
}
return ret;
}
/**************************************************************************
- * MMSYSTDRV_WaveIn_UnMap16To32W [internal]
+ * MMSYSTDRV_WaveIn_UnMap16To32W [internal]
*/
-static MMSYSTEM_MapType MMSYSTDRV_WaveIn_UnMap16To32W(UINT wMsg, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2, MMRESULT fn_ret)
+static MMSYSTEM_MapType MMSYSTDRV_WaveIn_UnMap16To32W(UINT wMsg, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2, MMRESULT fn_ret)
{
- MMSYSTEM_MapType ret = MMSYSTEM_MAP_MSGERROR;
+ MMSYSTEM_MapType ret = MMSYSTEM_MAP_MSGERROR;
switch (wMsg) {
case WIDM_GETNUMDEVS:
@@ -446,87 +446,87 @@ static MMSYSTEM_MapType MMSYSTDRV_WaveIn_UnMap16To32W(UINT wMsg, DWORD_PTR* lpP
case WIDM_START:
case WIDM_STOP:
case WIDM_MAPPER_STATUS:
- ret = MMSYSTEM_MAP_OK;
- break;
+ ret = MMSYSTEM_MAP_OK;
+ break;
case WIDM_OPEN:
case WIDM_CLOSE:
- FIXME("Shouldn't be used: the corresponding 16 bit functions use the 32 bit interface\n");
- break;
+ FIXME("Shouldn't be used: the corresponding 16 bit functions use the 32 bit interface\n");
+ break;
case WIDM_GETDEVCAPS:
- {
- LPWAVEINCAPSW wic32 = (LPWAVEINCAPSW)(*lpParam1);
- LPWAVEINCAPS16 wic16 = *(LPWAVEINCAPS16*)((LPSTR)wic32 - sizeof(LPWAVEINCAPS16));
-
- wic16->wMid = wic32->wMid;
- wic16->wPid = wic32->wPid;
- wic16->vDriverVersion = wic32->vDriverVersion;
- WideCharToMultiByte( CP_ACP, 0, wic32->szPname, -1, wic16->szPname,
- sizeof(wic16->szPname), NULL, NULL );
- wic16->dwFormats = wic32->dwFormats;
- wic16->wChannels = wic32->wChannels;
- HeapFree(GetProcessHeap(), 0, (LPSTR)wic32 - sizeof(LPWAVEINCAPS16));
- ret = MMSYSTEM_MAP_OK;
- }
- break;
+ {
+ LPWAVEINCAPSW wic32 = (LPWAVEINCAPSW)(*lpParam1);
+ LPWAVEINCAPS16 wic16 = *(LPWAVEINCAPS16*)((LPSTR)wic32 - sizeof(LPWAVEINCAPS16));
+
+ wic16->wMid = wic32->wMid;
+ wic16->wPid = wic32->wPid;
+ wic16->vDriverVersion = wic32->vDriverVersion;
+ WideCharToMultiByte( CP_ACP, 0, wic32->szPname, -1, wic16->szPname,
+ sizeof(wic16->szPname), NULL, NULL );
+ wic16->dwFormats = wic32->dwFormats;
+ wic16->wChannels = wic32->wChannels;
+ HeapFree(GetProcessHeap(), 0, (LPSTR)wic32 - sizeof(LPWAVEINCAPS16));
+ ret = MMSYSTEM_MAP_OK;
+ }
+ break;
case WIDM_GETPOS:
- {
- LPMMTIME mmt32 = (LPMMTIME)(*lpParam1);
- LPMMTIME16 mmt16 = *(LPMMTIME16*)((LPSTR)mmt32 - sizeof(LPMMTIME16));
-
- MMSYSTEM_MMTIME32to16(mmt16, mmt32);
- HeapFree(GetProcessHeap(), 0, (LPSTR)mmt32 - sizeof(LPMMTIME16));
- ret = MMSYSTEM_MAP_OK;
- }
- break;
+ {
+ LPMMTIME mmt32 = (LPMMTIME)(*lpParam1);
+ LPMMTIME16 mmt16 = *(LPMMTIME16*)((LPSTR)mmt32 - sizeof(LPMMTIME16));
+
+ MMSYSTEM_MMTIME32to16(mmt16, mmt32);
+ HeapFree(GetProcessHeap(), 0, (LPSTR)mmt32 - sizeof(LPMMTIME16));
+ ret = MMSYSTEM_MAP_OK;
+ }
+ break;
case WIDM_ADDBUFFER:
case WIDM_PREPARE:
case WIDM_UNPREPARE:
- {
- LPWAVEHDR wh32 = (LPWAVEHDR)(*lpParam1);
- LPWAVEHDR wh16 = MapSL(*(SEGPTR*)((LPSTR)wh32 - sizeof(LPWAVEHDR)));
-
- assert(wh16->lpNext == wh32);
- wh16->dwBytesRecorded = wh32->dwBytesRecorded;
- wh16->dwFlags = wh32->dwFlags;
-
- if (wMsg == WIDM_UNPREPARE && fn_ret == MMSYSERR_NOERROR) {
- HeapFree(GetProcessHeap(), 0, (LPSTR)wh32 - sizeof(LPWAVEHDR));
- wh16->lpNext = 0;
- }
- ret = MMSYSTEM_MAP_OK;
- }
- break;
+ {
+ LPWAVEHDR wh32 = (LPWAVEHDR)(*lpParam1);
+ LPWAVEHDR wh16 = MapSL(*(SEGPTR*)((LPSTR)wh32 - sizeof(LPWAVEHDR)));
+
+ assert(wh16->lpNext == wh32);
+ wh16->dwBytesRecorded = wh32->dwBytesRecorded;
+ wh16->dwFlags = wh32->dwFlags;
+
+ if (wMsg == WIDM_UNPREPARE && fn_ret == MMSYSERR_NOERROR) {
+ HeapFree(GetProcessHeap(), 0, (LPSTR)wh32 - sizeof(LPWAVEHDR));
+ wh16->lpNext = 0;
+ }
+ ret = MMSYSTEM_MAP_OK;
+ }
+ break;
default:
- FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
- break;
+ FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
+ break;
}
return ret;
}
/**************************************************************************
- * MMSYSTDRV_WaveIn_MapCB [internal]
+ * MMSYSTDRV_WaveIn_MapCB [internal]
*/
-static void MMSYSTDRV_WaveIn_MapCB(UINT uMsg, DWORD_PTR* dwUser, DWORD_PTR* dwParam1, DWORD_PTR* dwParam2)
+static void MMSYSTDRV_WaveIn_MapCB(UINT uMsg, DWORD_PTR* dwUser, DWORD_PTR* dwParam1, DWORD_PTR* dwParam2)
{
switch (uMsg) {
case WIM_OPEN:
case WIM_CLOSE:
- /* dwParam1 & dwParam2 are supposed to be 0, nothing to do */
- break;
+ /* dwParam1 & dwParam2 are supposed to be 0, nothing to do */
+ break;
case WIM_DATA:
- {
- /* initial map is: 16 => 32 */
- LPWAVEHDR wh32 = (LPWAVEHDR)(*dwParam1);
- SEGPTR segwh16 = *(SEGPTR*)((LPSTR)wh32 - sizeof(LPWAVEHDR));
- LPWAVEHDR wh16 = MapSL(segwh16);
-
- *dwParam1 = (DWORD)segwh16;
- wh16->dwFlags = wh32->dwFlags;
- wh16->dwBytesRecorded = wh32->dwBytesRecorded;
- }
- break;
+ {
+ /* initial map is: 16 => 32 */
+ LPWAVEHDR wh32 = (LPWAVEHDR)(*dwParam1);
+ SEGPTR segwh16 = *(SEGPTR*)((LPSTR)wh32 - sizeof(LPWAVEHDR));
+ LPWAVEHDR wh16 = MapSL(segwh16);
+
+ *dwParam1 = (DWORD)segwh16;
+ wh16->dwFlags = wh32->dwFlags;
+ wh16->dwBytesRecorded = wh32->dwBytesRecorded;
+ }
+ break;
default:
- ERR("Unknown msg %u\n", uMsg);
+ ERR("Unknown msg %u\n", uMsg);
}
}
@@ -535,11 +535,11 @@ static void MMSYSTDRV_WaveIn_MapCB(UINT uMsg, DWORD_PTR* dwUser, DWORD_PTR*
* ================================= */
/**************************************************************************
- * MMSYSTDRV_WaveOut_Map16To32W [internal]
+ * MMSYSTDRV_WaveOut_Map16To32W [internal]
*/
-static MMSYSTEM_MapType MMSYSTDRV_WaveOut_Map16To32W (UINT wMsg, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2)
+static MMSYSTEM_MapType MMSYSTDRV_WaveOut_Map16To32W(UINT wMsg, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2)
{
- MMSYSTEM_MapType ret = MMSYSTEM_MAP_MSGERROR;
+ MMSYSTEM_MapType ret = MMSYSTEM_MAP_MSGERROR;
switch (wMsg) {
/* nothing to do */
@@ -552,112 +552,112 @@ static MMSYSTEM_MapType MMSYSTDRV_WaveOut_Map16To32W (UINT wMsg, DWORD_PTR* lp
case WODM_SETPITCH:
case WODM_SETPLAYBACKRATE:
case WODM_SETVOLUME:
- ret = MMSYSTEM_MAP_OK;
- break;
+ ret = MMSYSTEM_MAP_OK;
+ break;
case WODM_GETPITCH:
case WODM_GETPLAYBACKRATE:
case WODM_GETVOLUME:
case WODM_OPEN:
- FIXME("Shouldn't be used: the corresponding 16 bit functions use the 32 bit interface\n");
- break;
+ FIXME("Shouldn't be used: the corresponding 16 bit functions use the 32 bit interface\n");
+ break;
case WODM_GETDEVCAPS:
- {
- LPWAVEOUTCAPSW woc32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPWAVEOUTCAPS16) + sizeof(WAVEOUTCAPSW));
- LPWAVEOUTCAPS16 woc16 = MapSL(*lpParam1);
-
- if (woc32) {
- *(LPWAVEOUTCAPS16*)woc32 = woc16;
- woc32 = (LPWAVEOUTCAPSW)((LPSTR)woc32 + sizeof(LPWAVEOUTCAPS16));
- *lpParam1 = (DWORD)woc32;
- *lpParam2 = sizeof(WAVEOUTCAPSW);
-
- ret = MMSYSTEM_MAP_OKMEM;
- } else {
- ret = MMSYSTEM_MAP_NOMEM;
- }
- }
- break;
+ {
+ LPWAVEOUTCAPSW woc32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPWAVEOUTCAPS16) + sizeof(WAVEOUTCAPSW));
+ LPWAVEOUTCAPS16 woc16 = MapSL(*lpParam1);
+
+ if (woc32) {
+ *(LPWAVEOUTCAPS16*)woc32 = woc16;
+ woc32 = (LPWAVEOUTCAPSW)((LPSTR)woc32 + sizeof(LPWAVEOUTCAPS16));
+ *lpParam1 = (DWORD)woc32;
+ *lpParam2 = sizeof(WAVEOUTCAPSW);
+
+ ret = MMSYSTEM_MAP_OKMEM;
+ } else {
+ ret = MMSYSTEM_MAP_NOMEM;
+ }
+ }
+ break;
case WODM_GETPOS:
- {
- LPMMTIME mmt32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMMTIME16) + sizeof(MMTIME));
- LPMMTIME16 mmt16 = MapSL(*lpParam1);
-
- if (mmt32) {
- *(LPMMTIME16*)mmt32 = mmt16;
- mmt32 = (LPMMTIME)((LPSTR)mmt32 + sizeof(LPMMTIME16));
-
- mmt32->wType = mmt16->wType;
- *lpParam1 = (DWORD)mmt32;
- *lpParam2 = sizeof(MMTIME);
-
- ret = MMSYSTEM_MAP_OKMEM;
- } else {
- ret = MMSYSTEM_MAP_NOMEM;
- }
- }
- break;
+ {
+ LPMMTIME mmt32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMMTIME16) + sizeof(MMTIME));
+ LPMMTIME16 mmt16 = MapSL(*lpParam1);
+
+ if (mmt32) {
+ *(LPMMTIME16*)mmt32 = mmt16;
+ mmt32 = (LPMMTIME)((LPSTR)mmt32 + sizeof(LPMMTIME16));
+
+ mmt32->wType = mmt16->wType;
+ *lpParam1 = (DWORD)mmt32;
+ *lpParam2 = sizeof(MMTIME);
+
+ ret = MMSYSTEM_MAP_OKMEM;
+ } else {
+ ret = MMSYSTEM_MAP_NOMEM;
+ }
+ }
+ break;
case WODM_PREPARE:
- {
- LPWAVEHDR wh32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPWAVEHDR) + sizeof(WAVEHDR));
- LPWAVEHDR wh16 = MapSL(*lpParam1);
-
- if (wh32) {
- *(LPWAVEHDR*)wh32 = (LPWAVEHDR)*lpParam1;
- wh32 = (LPWAVEHDR)((LPSTR)wh32 + sizeof(LPWAVEHDR));
- wh32->lpData = MapSL((SEGPTR)wh16->lpData);
- wh32->dwBufferLength = wh16->dwBufferLength;
- wh32->dwBytesRecorded = wh16->dwBytesRecorded;
- wh32->dwUser = wh16->dwUser;
- wh32->dwFlags = wh16->dwFlags;
- wh32->dwLoops = wh16->dwLoops;
- /* FIXME: nothing on wh32->lpNext */
- /* could link the wh32->lpNext at this level for memory house keeping */
- wh16->lpNext = wh32; /* for reuse in unprepare and write */
- *lpParam1 = (DWORD)wh32;
- *lpParam2 = sizeof(WAVEHDR);
-
- ret = MMSYSTEM_MAP_OKMEM;
- } else {
- ret = MMSYSTEM_MAP_NOMEM;
- }
- }
- break;
+ {
+ LPWAVEHDR wh32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPWAVEHDR) + sizeof(WAVEHDR));
+ LPWAVEHDR wh16 = MapSL(*lpParam1);
+
+ if (wh32) {
+ *(LPWAVEHDR*)wh32 = (LPWAVEHDR)*lpParam1;
+ wh32 = (LPWAVEHDR)((LPSTR)wh32 + sizeof(LPWAVEHDR));
+ wh32->lpData = MapSL((SEGPTR)wh16->lpData);
+ wh32->dwBufferLength = wh16->dwBufferLength;
+ wh32->dwBytesRecorded = wh16->dwBytesRecorded;
+ wh32->dwUser = wh16->dwUser;
+ wh32->dwFlags = wh16->dwFlags;
+ wh32->dwLoops = wh16->dwLoops;
+ /* FIXME: nothing on wh32->lpNext */
+ /* could link the wh32->lpNext at this level for memory house keeping */
+ wh16->lpNext = wh32; /* for reuse in unprepare and write */
+ *lpParam1 = (DWORD)wh32;
+ *lpParam2 = sizeof(WAVEHDR);
+
+ ret = MMSYSTEM_MAP_OKMEM;
+ } else {
+ ret = MMSYSTEM_MAP_NOMEM;
+ }
+ }
+ break;
case WODM_UNPREPARE:
case WODM_WRITE:
- {
- LPWAVEHDR wh16 = MapSL(*lpParam1);
- LPWAVEHDR wh32 = wh16->lpNext;
-
- *lpParam1 = (DWORD)wh32;
- *lpParam2 = sizeof(WAVEHDR);
- /* dwBufferLength can be reduced between prepare & write */
- if (wMsg == WODM_WRITE && wh32->dwBufferLength < wh16->dwBufferLength) {
- ERR("Size of buffer has been increased from %d to %d, keeping initial value\n",
- wh32->dwBufferLength, wh16->dwBufferLength);
- } else
- wh32->dwBufferLength = wh16->dwBufferLength;
- ret = MMSYSTEM_MAP_OKMEM;
- }
- break;
+ {
+ LPWAVEHDR wh16 = MapSL(*lpParam1);
+ LPWAVEHDR wh32 = wh16->lpNext;
+
+ *lpParam1 = (DWORD)wh32;
+ *lpParam2 = sizeof(WAVEHDR);
+ /* dwBufferLength can be reduced between prepare & write */
+ if (wMsg == WODM_WRITE && wh32->dwBufferLength < wh16->dwBufferLength) {
+ ERR("Size of buffer has been increased from %d to %d, keeping initial value\n",
+ wh32->dwBufferLength, wh16->dwBufferLength);
+ } else
+ wh32->dwBufferLength = wh16->dwBufferLength;
+ ret = MMSYSTEM_MAP_OKMEM;
+ }
+ break;
case WODM_MAPPER_STATUS:
- *lpParam2 = (DWORD)MapSL(*lpParam2);
- ret = MMSYSTEM_MAP_OK;
- break;
+ *lpParam2 = (DWORD)MapSL(*lpParam2);
+ ret = MMSYSTEM_MAP_OK;
+ break;
default:
- FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
- break;
+ FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
+ break;
}
return ret;
}
/**************************************************************************
- * MMSYSTDRV_WaveOut_UnMap16To32W [internal]
+ * MMSYSTDRV_WaveOut_UnMap16To32W [internal]
*/
-static MMSYSTEM_MapType MMSYSTDRV_WaveOut_UnMap16To32W(UINT wMsg, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2, MMRESULT fn_ret)
+static MMSYSTEM_MapType MMSYSTDRV_WaveOut_UnMap16To32W(UINT wMsg, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2, MMRESULT fn_ret)
{
- MMSYSTEM_MapType ret = MMSYSTEM_MAP_MSGERROR;
+ MMSYSTEM_MapType ret = MMSYSTEM_MAP_MSGERROR;
switch (wMsg) {
/* nothing to do */
@@ -671,90 +671,90 @@ static MMSYSTEM_MapType MMSYSTDRV_WaveOut_UnMap16To32W(UINT wMsg, DWORD_PTR* lp
case WODM_SETPLAYBACKRATE:
case WODM_SETVOLUME:
case WODM_MAPPER_STATUS:
- ret = MMSYSTEM_MAP_OK;
- break;
+ ret = MMSYSTEM_MAP_OK;
+ break;
case WODM_GETPITCH:
case WODM_GETPLAYBACKRATE:
case WODM_GETVOLUME:
case WODM_OPEN:
- FIXME("Shouldn't be used: those 16 bit functions use the 32 bit interface\n");
- break;
+ FIXME("Shouldn't be used: those 16 bit functions use the 32 bit interface\n");
+ break;
case WODM_GETDEVCAPS:
- {
- LPWAVEOUTCAPSW woc32 = (LPWAVEOUTCAPSW)(*lpParam1);
- LPWAVEOUTCAPS16 woc16 = *(LPWAVEOUTCAPS16*)((LPSTR)woc32 - sizeof(LPWAVEOUTCAPS16));
-
- woc16->wMid = woc32->wMid;
- woc16->wPid = woc32->wPid;
- woc16->vDriverVersion = woc32->vDriverVersion;
- WideCharToMultiByte( CP_ACP, 0, woc32->szPname, -1, woc16->szPname,
- sizeof(woc16->szPname), NULL, NULL );
- woc16->dwFormats = woc32->dwFormats;
- woc16->wChannels = woc32->wChannels;
- woc16->dwSupport = woc32->dwSupport;
- HeapFree(GetProcessHeap(), 0, (LPSTR)woc32 - sizeof(LPWAVEOUTCAPS16));
- ret = MMSYSTEM_MAP_OK;
- }
- break;
+ {
+ LPWAVEOUTCAPSW woc32 = (LPWAVEOUTCAPSW)(*lpParam1);
+ LPWAVEOUTCAPS16 woc16 = *(LPWAVEOUTCAPS16*)((LPSTR)woc32 - sizeof(LPWAVEOUTCAPS16));
+
+ woc16->wMid = woc32->wMid;
+ woc16->wPid = woc32->wPid;
+ woc16->vDriverVersion = woc32->vDriverVersion;
+ WideCharToMultiByte( CP_ACP, 0, woc32->szPname, -1, woc16->szPname,
+ sizeof(woc16->szPname), NULL, NULL );
+ woc16->dwFormats = woc32->dwFormats;
+ woc16->wChannels = woc32->wChannels;
+ woc16->dwSupport = woc32->dwSupport;
+ HeapFree(GetProcessHeap(), 0, (LPSTR)woc32 - sizeof(LPWAVEOUTCAPS16));
+ ret = MMSYSTEM_MAP_OK;
+ }
+ break;
case WODM_GETPOS:
- {
- LPMMTIME mmt32 = (LPMMTIME)(*lpParam1);
- LPMMTIME16 mmt16 = *(LPMMTIME16*)((LPSTR)mmt32 - sizeof(LPMMTIME16));
-
- MMSYSTEM_MMTIME32to16(mmt16, mmt32);
- HeapFree(GetProcessHeap(), 0, (LPSTR)mmt32 - sizeof(LPMMTIME16));
- ret = MMSYSTEM_MAP_OK;
- }
- break;
+ {
+ LPMMTIME mmt32 = (LPMMTIME)(*lpParam1);
+ LPMMTIME16 mmt16 = *(LPMMTIME16*)((LPSTR)mmt32 - sizeof(LPMMTIME16));
+
+ MMSYSTEM_MMTIME32to16(mmt16, mmt32);
+ HeapFree(GetProcessHeap(), 0, (LPSTR)mmt32 - sizeof(LPMMTIME16));
+ ret = MMSYSTEM_MAP_OK;
+ }
+ break;
case WODM_PREPARE:
case WODM_UNPREPARE:
case WODM_WRITE:
- {
- LPWAVEHDR wh32 = (LPWAVEHDR)(*lpParam1);
- LPWAVEHDR wh16 = MapSL(*(SEGPTR*)((LPSTR)wh32 - sizeof(LPWAVEHDR)));
-
- assert(wh16->lpNext == wh32);
- wh16->dwFlags = wh32->dwFlags;
-
- if (wMsg == WODM_UNPREPARE && fn_ret == MMSYSERR_NOERROR) {
- HeapFree(GetProcessHeap(), 0, (LPSTR)wh32 - sizeof(LPWAVEHDR));
- wh16->lpNext = 0;
- }
- ret = MMSYSTEM_MAP_OK;
- }
- break;
+ {
+ LPWAVEHDR wh32 = (LPWAVEHDR)(*lpParam1);
+ LPWAVEHDR wh16 = MapSL(*(SEGPTR*)((LPSTR)wh32 - sizeof(LPWAVEHDR)));
+
+ assert(wh16->lpNext == wh32);
+ wh16->dwFlags = wh32->dwFlags;
+
+ if (wMsg == WODM_UNPREPARE && fn_ret == MMSYSERR_NOERROR) {
+ HeapFree(GetProcessHeap(), 0, (LPSTR)wh32 - sizeof(LPWAVEHDR));
+ wh16->lpNext = 0;
+ }
+ ret = MMSYSTEM_MAP_OK;
+ }
+ break;
default:
- FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
- break;
+ FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
+ break;
}
return ret;
}
/**************************************************************************
- * MMDRV_WaveOut_Callback [internal]
+ * MMDRV_WaveOut_Callback [internal]
*/
-static void MMSYSTDRV_WaveOut_MapCB(UINT uMsg, DWORD_PTR* dwUser, DWORD_PTR* dwParam1, DWORD_PTR* dwParam2)
+static void MMSYSTDRV_WaveOut_MapCB(UINT uMsg, DWORD_PTR* dwUser, DWORD_PTR* dwParam1, DWORD_PTR* dwParam2)
{
switch (uMsg) {
case WOM_OPEN:
case WOM_CLOSE:
- /* dwParam1 & dwParam2 are supposed to be 0, nothing to do */
- break;
+ /* dwParam1 & dwParam2 are supposed to be 0, nothing to do */
+ break;
case WOM_DONE:
{
- /* initial map is: 16 => 32 */
- LPWAVEHDR wh32 = (LPWAVEHDR)(*dwParam1);
- SEGPTR segwh16 = *(SEGPTR*)((LPSTR)wh32 - sizeof(LPWAVEHDR));
- LPWAVEHDR wh16 = MapSL(segwh16);
-
- *dwParam1 = (DWORD)segwh16;
- wh16->dwFlags = wh32->dwFlags;
- }
- break;
+ /* initial map is: 16 => 32 */
+ LPWAVEHDR wh32 = (LPWAVEHDR)(*dwParam1);
+ SEGPTR segwh16 = *(SEGPTR*)((LPSTR)wh32 - sizeof(LPWAVEHDR));
+ LPWAVEHDR wh16 = MapSL(segwh16);
+
+ *dwParam1 = (DWORD)segwh16;
+ wh16->dwFlags = wh32->dwFlags;
+ }
+ break;
default:
- ERR("Unknown msg %u\n", uMsg);
+ ERR("Unknown msg %u\n", uMsg);
}
}
@@ -762,12 +762,12 @@ static void MMSYSTDRV_WaveOut_MapCB(UINT uMsg, DWORD_PTR* dwUser, DWORD_PTR* dw
* # DRIVER THUNKING #
* ###################################################
*/
-typedef MMSYSTEM_MapType (*MMSYSTDRV_MAPMSG)(UINT wMsg, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2);
-typedef MMSYSTEM_MapType (*MMSYSTDRV_UNMAPMSG)(UINT wMsg, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2, MMRESULT ret);
-typedef void (*MMSYSTDRV_MAPCB)(DWORD wMsg, DWORD_PTR* dwUser, DWORD_PTR* dwParam1, DWORD_PTR* dwParam2);
+typedef MMSYSTEM_MapType (*MMSYSTDRV_MAPMSG)(UINT wMsg, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2);
+typedef MMSYSTEM_MapType (*MMSYSTDRV_UNMAPMSG)(UINT wMsg, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2, MMRESULT ret);
+typedef void (*MMSYSTDRV_MAPCB)(DWORD wMsg, DWORD_PTR* dwUser, DWORD_PTR* dwParam1, DWORD_PTR* dwParam2);
#include <pshpack1.h>
-#define MMSYSTDRV_MAX_THUNKS 32
+#define MMSYSTDRV_MAX_THUNKS 32
static struct mmsystdrv_thunk
{
@@ -800,7 +800,7 @@ static struct MMSYSTDRV_Type
};
/******************************************************************
- * MMSYSTDRV_Callback3216
+ * MMSYSTDRV_Callback3216
*
*/
static LRESULT CALLBACK MMSYSTDRV_Callback3216(struct mmsystdrv_thunk* thunk, HDRVR hDev,
@@ -852,10 +852,10 @@ static LRESULT CALLBACK MMSYSTDRV_Callback3216(struct mmsystdrv_thunk* thunk, HD
}
/******************************************************************
- * MMSYSTDRV_AddThunk
+ * MMSYSTDRV_AddThunk
*
*/
-struct mmsystdrv_thunk* MMSYSTDRV_AddThunk(DWORD callback, DWORD flags, enum MMSYSTEM_DriverType kind)
+struct mmsystdrv_thunk* MMSYSTDRV_AddThunk(DWORD callback, DWORD flags, enum MMSYSTEM_DriverType kind)
{
struct mmsystdrv_thunk* thunk;
@@ -901,11 +901,11 @@ struct mmsystdrv_thunk* MMSYSTDRV_AddThunk(DWORD callback, DWORD flags, en
}
/******************************************************************
- * MMSYSTDRV_FindHandle
+ * MMSYSTDRV_FindHandle
*
* Must be called with lock set
*/
-static void* MMSYSTDRV_FindHandle(void* h)
+static void* MMSYSTDRV_FindHandle(void* h)
{
struct mmsystdrv_thunk* thunk;
@@ -921,19 +921,19 @@ static void* MMSYSTDRV_FindHandle(void* h)
}
/******************************************************************
- * MMSYSTDRV_SetHandle
+ * MMSYSTDRV_SetHandle
*
*/
-void MMSYSTDRV_SetHandle(struct mmsystdrv_thunk* thunk, void* h)
+void MMSYSTDRV_SetHandle(struct mmsystdrv_thunk* thunk, void* h)
{
if (MMSYSTDRV_FindHandle(h)) FIXME("Already has a thunk for this handle %p!!!\n", h);
thunk->hMmdrv = h;
}
/******************************************************************
- * MMSYSTDRV_DeleteThunk
+ * MMSYSTDRV_DeleteThunk
*/
-void MMSYSTDRV_DeleteThunk(struct mmsystdrv_thunk* thunk)
+void MMSYSTDRV_DeleteThunk(struct mmsystdrv_thunk* thunk)
{
thunk->callback = 0;
thunk->flags = CALLBACK_NULL;
@@ -942,9 +942,9 @@ void MMSYSTDRV_DeleteThunk(struct mmsystdrv_thunk* thunk)
}
/******************************************************************
- * MMSYSTDRV_CloseHandle
+ * MMSYSTDRV_CloseHandle
*/
-void MMSYSTDRV_CloseHandle(void* h)
+void MMSYSTDRV_CloseHandle(void* h)
{
struct mmsystdrv_thunk* thunk;
@@ -957,9 +957,9 @@ void MMSYSTDRV_CloseHandle(void* h)
}
/******************************************************************
- * MMSYSTDRV_Message
+ * MMSYSTDRV_Message
*/
-DWORD MMSYSTDRV_Message(void* h, UINT msg, DWORD_PTR param1, DWORD_PTR param2)
+DWORD MMSYSTDRV_Message(void* h, UINT msg, DWORD_PTR param1, DWORD_PTR param2)
{
struct mmsystdrv_thunk* thunk = MMSYSTDRV_FindHandle(h);
struct MMSYSTDRV_Type* drvtype;
--
2.17.0
1
2
April 17, 2019
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/msi/action.c | 2 +-
dlls/msi/tests/action.c | 14 ++++++++++++--
2 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index 849335edde..03b6abfa45 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -7050,7 +7050,7 @@ static UINT env_parse_flags( LPCWSTR *name, LPCWSTR *value, DWORD *flags )
else if (*cptr == '!')
*flags |= ENV_ACT_REMOVEMATCH;
else if (*cptr == '*')
- *flags |= ENV_MOD_MACHINE;
+ *flags |= ENV_MOD_MACHINE | ENV_ACT_REMOVE;
else
break;
diff --git a/dlls/msi/tests/action.c b/dlls/msi/tests/action.c
index 068fc55b78..60ae92e64c 100644
--- a/dlls/msi/tests/action.c
+++ b/dlls/msi/tests/action.c
@@ -247,7 +247,8 @@ static const char env_environment_dat[] =
"Var26\t+-MSITESTVAR20\t2[~]\tOne\n"
"Var27\t+-MSITESTVAR21\t[~];1\tOne\n"
"Var28\t-MSITESTVAR22\t1\tOne\n"
- "Var29\t-MSITESTVAR23\t2\tOne\n";
+ "Var29\t-MSITESTVAR23\t2\tOne\n"
+ "Var30\t*MSITESTVAR100\t1\tOne\n";
static const char service_install_dat[] =
"ServiceInstall\tName\tDisplayName\tServiceType\tStartType\tErrorControl\t"
@@ -4960,7 +4961,7 @@ static void test_envvar(void)
{
char buffer[16];
UINT r, i;
- HKEY env;
+ HKEY env, env2;
LONG res;
if (is_process_limited())
@@ -4974,6 +4975,10 @@ static void test_envvar(void)
res = RegCreateKeyExA(HKEY_CURRENT_USER, "Environment", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &env, NULL);
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+ res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Control\\Session Manager\\Environment",
+ 0, NULL, 0, KEY_ALL_ACCESS, NULL, &env2, NULL);
+ ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+
res = RegSetValueExA(env, "MSITESTVAR1", 0, REG_SZ, (const BYTE *)"0", 2);
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
@@ -5027,6 +5032,7 @@ static void test_envvar(void)
CHECK_REG_STR(env, "MSITESTVAR19", "1");
CHECK_REG_STR(env, "MSITESTVAR20", "1");
CHECK_REG_STR(env, "MSITESTVAR21", "1");
+ CHECK_REG_STR(env2, "MSITESTVAR100", "1");
res = RegSetValueExA(env, "MSITESTVAR22", 0, REG_SZ, (const BYTE *)"1", 2);
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
@@ -5054,11 +5060,15 @@ todo_wine {
ok(res == ERROR_FILE_NOT_FOUND, "[%d] got %u\n", i, res);
}
+ res = RegDeleteValueA(env2, "MSITESTVAR100");
+ ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res);
+
error:
RegDeleteValueA(env, "MSITESTVAR1");
RegDeleteValueA(env, "MSITESTVAR2");
RegDeleteValueA(env, "MSITESTVAR21");
RegCloseKey(env);
+ RegCloseKey(env2);
DeleteFileA(msifile);
}
--
2.20.1
2
1