[PATCH v3] ntdll: Leave some space around DbgBreakPoint and DbgUserBreakPoint.

Rémi Bernon rbernon at codeweavers.com
Wed Jun 24 03:03:10 CDT 2020


CoD: Black Ops 3 and CoD: WWII modify these (and several others) and
expect to have enough space for a few instructions.

It then verifies later that the patches are still in place, and
terminates if the byte sequence do not match. Having small symbols can
make the patches to overlap and the check to fail.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/ntdll/signal_arm64.c  | 8 ++++++--
 dlls/ntdll/signal_i386.c   | 8 ++++++--
 dlls/ntdll/signal_x86_64.c | 8 ++++++--
 3 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c
index 0159888f7ab..ddced4e0baa 100644
--- a/dlls/ntdll/signal_arm64.c
+++ b/dlls/ntdll/signal_arm64.c
@@ -1358,12 +1358,16 @@ USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer,
 /**********************************************************************
  *              DbgBreakPoint   (NTDLL.@)
  */
-__ASM_STDCALL_FUNC( DbgBreakPoint, 0, "brk #0; ret")
+__ASM_STDCALL_FUNC( DbgBreakPoint, 0, "brk #0; ret"
+                    "\n\tnop; nop; nop; nop; nop; nop; nop; nop"
+                    "\n\tnop; nop; nop; nop; nop; nop" );
 
 /**********************************************************************
  *              DbgUserBreakPoint   (NTDLL.@)
  */
-__ASM_STDCALL_FUNC( DbgUserBreakPoint, 0, "brk #0; ret")
+__ASM_STDCALL_FUNC( DbgUserBreakPoint, 0, "brk #0; ret"
+                    "\n\tnop; nop; nop; nop; nop; nop; nop; nop"
+                    "\n\tnop; nop; nop; nop; nop; nop" );
 
 /**********************************************************************
  *           NtCurrentTeb   (NTDLL.@)
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
index bda19bf4632..d91d19f043a 100644
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -555,12 +555,16 @@ USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer,
 /**********************************************************************
  *		DbgBreakPoint   (NTDLL.@)
  */
-__ASM_STDCALL_FUNC( DbgBreakPoint, 0, "int $3; ret")
+__ASM_STDCALL_FUNC( DbgBreakPoint, 0, "int $3; ret"
+                    "\n\tnop; nop; nop; nop; nop; nop; nop; nop"
+                    "\n\tnop; nop; nop; nop; nop; nop" );
 
 /**********************************************************************
  *		DbgUserBreakPoint   (NTDLL.@)
  */
-__ASM_STDCALL_FUNC( DbgUserBreakPoint, 0, "int $3; ret")
+__ASM_STDCALL_FUNC( DbgUserBreakPoint, 0, "int $3; ret"
+                    "\n\tnop; nop; nop; nop; nop; nop; nop; nop"
+                    "\n\tnop; nop; nop; nop; nop; nop" );
 
 /**********************************************************************
  *           NtCurrentTeb   (NTDLL.@)
diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
index 52f7b73f8bf..284522ffae7 100644
--- a/dlls/ntdll/signal_x86_64.c
+++ b/dlls/ntdll/signal_x86_64.c
@@ -2751,11 +2751,15 @@ USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer,
 /**********************************************************************
  *		DbgBreakPoint   (NTDLL.@)
  */
-__ASM_STDCALL_FUNC( DbgBreakPoint, 0, "int $3; ret")
+__ASM_STDCALL_FUNC( DbgBreakPoint, 0, "int $3; ret"
+                    "\n\tnop; nop; nop; nop; nop; nop; nop; nop"
+                    "\n\tnop; nop; nop; nop; nop; nop" );
 
 /**********************************************************************
  *		DbgUserBreakPoint   (NTDLL.@)
  */
-__ASM_STDCALL_FUNC( DbgUserBreakPoint, 0, "int $3; ret")
+__ASM_STDCALL_FUNC( DbgUserBreakPoint, 0, "int $3; ret"
+                    "\n\tnop; nop; nop; nop; nop; nop; nop; nop"
+                    "\n\tnop; nop; nop; nop; nop; nop" );
 
 #endif  /* __x86_64__ */
-- 
2.27.0




More information about the wine-devel mailing list