Paul Gofman : xaudio2_7: Also preserve %ebx in call_on_voice_processing_pass_start().

Alexandre Julliard julliard at winehq.org
Fri Aug 23 09:31:27 CDT 2019


Module: wine
Branch: stable
Commit: f7e395df3248c18546176efd4641c3b194f922fd
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=f7e395df3248c18546176efd4641c3b194f922fd

Author: Paul Gofman <gofmanp at gmail.com>
Date:   Thu Apr 11 11:30:50 2019 +0300

xaudio2_7: Also preserve %ebx in call_on_voice_processing_pass_start().

It is tested that EBX register is not preserved by
IXAudio2VoiceCallback_OnVoiceProcessingPassStart callback
in League of Legends. It doesn't lead to crash in the
present xaudio, while it might still be a potential issue.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46870
Signed-off-by: Paul Gofman <gofmanp at gmail.com>
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit a5b22c86b4d46fa8443cc2bee8b91d237eb8996b)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>

---

 dlls/xaudio2_7/xaudio_dll.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/dlls/xaudio2_7/xaudio_dll.c b/dlls/xaudio2_7/xaudio_dll.c
index 0bbe943..6dc0d8f 100644
--- a/dlls/xaudio2_7/xaudio_dll.c
+++ b/dlls/xaudio2_7/xaudio_dll.c
@@ -52,7 +52,8 @@ static HINSTANCE instance;
 #endif
 
 #if XAUDIO2_VER != 0 && defined(__i386__)
-/* EVE Online uses an OnVoiceProcessingPassStart callback which corrupts %esi. */
+/* EVE Online uses an OnVoiceProcessingPassStart callback which corrupts %esi;
+ * League of Legends uses a callback which corrupts %ebx. */
 #define IXAudio2VoiceCallback_OnVoiceProcessingPassStart(a, b) call_on_voice_processing_pass_start(a, b)
 extern void call_on_voice_processing_pass_start(IXAudio2VoiceCallback *This, UINT32 BytesRequired);
 __ASM_GLOBAL_FUNC( call_on_voice_processing_pass_start,
@@ -65,13 +66,17 @@ __ASM_GLOBAL_FUNC( call_on_voice_processing_pass_start,
                   __ASM_CFI(".cfi_rel_offset %esi,-4\n\t")
                    "pushl %edi\n\t"
                   __ASM_CFI(".cfi_rel_offset %edi,-8\n\t")
-                   "subl $8,%esp\n\t"
+                   "pushl %ebx\n\t"
+                  __ASM_CFI(".cfi_rel_offset %ebx,-12\n\t")
+                   "subl $4,%esp\n\t"
                    "pushl 12(%ebp)\n\t"     /* BytesRequired */
                    "pushl 8(%ebp)\n\t"      /* This */
                    "movl 8(%ebp),%eax\n\t"
                    "movl 0(%eax),%eax\n\t"
                    "call *0(%eax)\n\t"      /* This->lpVtbl->OnVoiceProcessingPassStart */
-                   "leal -8(%ebp),%esp\n\t"
+                   "leal -12(%ebp),%esp\n\t"
+                   "popl %ebx\n\t"
+                   __ASM_CFI(".cfi_same_value %ebx\n\t")
                    "popl %edi\n\t"
                    __ASM_CFI(".cfi_same_value %edi\n\t")
                    "popl %esi\n\t"




More information about the wine-cvs mailing list