Rebase against cfb1d2058fb47ff3f72501e0aaf35b97ea128036.

This commit is contained in:
Zebediah Figura
2022-02-14 18:52:59 -06:00
parent 68441b1d95
commit 5cfa68940f
12 changed files with 146 additions and 230 deletions

View File

@@ -1,15 +1,15 @@
From 5467b7a82f16dfb7cbd6de4badcd107e7ec5f292 Mon Sep 17 00:00:00 2001
From 0b70d2f52080c75d0fd183235957270a525c7b32 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Fri, 26 Feb 2016 03:54:28 +0100
Subject: mmsystem.dll16: Refcount midihdr to work around buggy application
which unprepares buffer during a callback.
Subject: [PATCH] mmsystem.dll16: Refcount midihdr to work around buggy
application which unprepares buffer during a callback.
---
dlls/mmsystem.dll16/message16.c | 123 ++++++++++++++++++++++++----------------
1 file changed, 74 insertions(+), 49 deletions(-)
dlls/mmsystem.dll16/message16.c | 121 +++++++++++++++++++-------------
1 file changed, 73 insertions(+), 48 deletions(-)
diff --git a/dlls/mmsystem.dll16/message16.c b/dlls/mmsystem.dll16/message16.c
index 012d3dc..2c01eb4 100644
index 5a722bb6691..a6816920dae 100644
--- a/dlls/mmsystem.dll16/message16.c
+++ b/dlls/mmsystem.dll16/message16.c
@@ -33,6 +33,13 @@
@@ -26,7 +26,7 @@ index 012d3dc..2c01eb4 100644
/* =================================
* A U X M A P P E R S
* ================================= */
@@ -117,13 +124,13 @@ static void MMSYSTDRV_MidiIn_MapCB(UINT uMsg, DWORD_PTR* dwUser, DW
@@ -117,13 +124,13 @@ static void MMSYSTDRV_MidiIn_MapCB(DWORD uMsg, DWORD_PTR* dwUser, D
case MIM_LONGDATA:
case MIM_LONGERROR:
{
@@ -46,13 +46,15 @@ index 012d3dc..2c01eb4 100644
}
break;
default:
@@ -175,42 +182,49 @@ static MMSYSTEM_MapType MMSYSTDRV_MidiOut_Map16To32W (UINT wMsg, DWORD_PTR* lpP
@@ -175,42 +182,49 @@ static MMSYSTEM_MapType MMSYSTDRV_MidiOut_Map16To32W (DWORD wMsg, DWORD_PTR* lp
break;
case MODM_PREPARE:
{
- LPMIDIHDR mh32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMIDIHDR) + sizeof(MIDIHDR));
- LPMIDIHDR16 mh16 = MapSL(*lpParam1);
-
+ struct mihdrWrap *mh32 = HeapAlloc(GetProcessHeap(), 0, sizeof(struct mihdrWrap));
+ LPMIDIHDR16 mh16 = MapSL(*lpParam1);
- if (mh32) {
- *(LPMIDIHDR*)mh32 = (LPMIDIHDR)*lpParam1;
- mh32 = (LPMIDIHDR)((LPSTR)mh32 + sizeof(LPMIDIHDR));
@@ -64,13 +66,6 @@ index 012d3dc..2c01eb4 100644
- mh16->lpNext = (MIDIHDR16*)mh32; /* for reuse in unprepare and write */
- *lpParam1 = (DWORD)mh32;
- *lpParam2 = offsetof(MIDIHDR,dwOffset); /* old size, without dwOffset */
+ struct mihdrWrap *mh32 = HeapAlloc(GetProcessHeap(), 0, sizeof(struct mihdrWrap));
+ LPMIDIHDR16 mh16 = MapSL(*lpParam1);
- ret = MMSYSTEM_MAP_OKMEM;
- } else {
- ret = MMSYSTEM_MAP_NOMEM;
- }
+ if (mh32)
+ {
+ mh32->ref = 2;
@@ -83,7 +78,11 @@ index 012d3dc..2c01eb4 100644
+ mh16->lpNext = (MIDIHDR16*)mh32; /* for reuse in unprepare and write */
+ *lpParam1 = (DWORD)&mh32->hdr;
+ *lpParam2 = offsetof(MIDIHDR,dwOffset); /* old size, without dwOffset */
+
- ret = MMSYSTEM_MAP_OKMEM;
- } else {
- ret = MMSYSTEM_MAP_NOMEM;
- }
+ ret = MMSYSTEM_MAP_OKMEM;
+ }
+ else
@@ -102,7 +101,7 @@ index 012d3dc..2c01eb4 100644
- *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",
- ERR("Size of buffer has been increased from %ld to %ld, keeping initial value\n",
- mh32->dwBufferLength, mh16->dwBufferLength);
- } else
- mh32->dwBufferLength = mh16->dwBufferLength;
@@ -125,7 +124,7 @@ index 012d3dc..2c01eb4 100644
}
break;
@@ -267,17 +281,28 @@ static MMSYSTEM_MapType MMSYSTDRV_MidiOut_UnMap16To32W(UINT wMsg, DWORD_PTR* lp
@@ -267,17 +281,28 @@ static MMSYSTEM_MapType MMSYSTDRV_MidiOut_UnMap16To32W(DWORD wMsg, DWORD_PTR* l
case MODM_UNPREPARE:
case MODM_LONGDATA:
{
@@ -163,7 +162,7 @@ index 012d3dc..2c01eb4 100644
}
break;
@@ -307,12 +332,12 @@ static void MMSYSTDRV_MidiOut_MapCB(UINT uMsg, DWORD_PTR* dwUser, DWORD_PTR* dw
@@ -307,12 +332,12 @@ static void MMSYSTDRV_MidiOut_MapCB(DWORD uMsg, DWORD_PTR* dwUser, DWORD_PTR* d
case MOM_DONE:
{
/* initial map is: 16 => 32 */
@@ -182,5 +181,5 @@ index 012d3dc..2c01eb4 100644
break;
default:
--
2.9.0
2.34.1