[PATCH 2/3] ntdll: Leave some space around DbgBreakPoint and DbgUserBreakPoint.

Rémi Bernon rbernon at codeweavers.com
Tue Jun 23 03:18:53 CDT 2020


On 2020-06-22 23:27, Rémi Bernon wrote:
> 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  | 4 ++--
>   dlls/ntdll/signal_i386.c   | 4 ++--
>   dlls/ntdll/signal_x86_64.c | 4 ++--
>   3 files changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c
> index 0159888f7ab..10cbb7c131a 100644
> --- a/dlls/ntdll/signal_arm64.c
> +++ b/dlls/ntdll/signal_arm64.c
> @@ -1358,12 +1358,12 @@ 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\t.nops 16")
>   
>   /**********************************************************************
>    *              DbgUserBreakPoint   (NTDLL.@)
>    */
> -__ASM_STDCALL_FUNC( DbgUserBreakPoint, 0, "brk #0; ret")
> +__ASM_STDCALL_FUNC( DbgUserBreakPoint, 0, "brk #0; ret\n\t.nops 16")
>   
>   /**********************************************************************
>    *           NtCurrentTeb   (NTDLL.@)
> diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
> index 21cc1b3ead4..e050b87257d 100644
> --- a/dlls/ntdll/signal_i386.c
> +++ b/dlls/ntdll/signal_i386.c
> @@ -565,12 +565,12 @@ 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\t.nops 16")
>   
>   /**********************************************************************
>    *		DbgUserBreakPoint   (NTDLL.@)
>    */
> -__ASM_STDCALL_FUNC( DbgUserBreakPoint, 0, "int $3; ret")
> +__ASM_STDCALL_FUNC( DbgUserBreakPoint, 0, "int $3; ret\n\t.nops 16")
>   
>   /**********************************************************************
>    *           NtCurrentTeb   (NTDLL.@)
> diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
> index 52f7b73f8bf..3bae66be188 100644
> --- a/dlls/ntdll/signal_x86_64.c
> +++ b/dlls/ntdll/signal_x86_64.c
> @@ -2751,11 +2751,11 @@ 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\t.nops 64")
>   
>   /**********************************************************************
>    *		DbgUserBreakPoint   (NTDLL.@)
>    */
> -__ASM_STDCALL_FUNC( DbgUserBreakPoint, 0, "int $3; ret")
> +__ASM_STDCALL_FUNC( DbgUserBreakPoint, 0, "int $3; ret\n\t.nops 64")
>   
>   #endif  /* __x86_64__ */
> 

So apparently old binutils like what's used in default Proton build 
doesn't know about .nops, I guess it could be .fill, or possibly .align 
before and after the int.
-- 
Rémi Bernon <rbernon at codeweavers.com>



More information about the wine-devel mailing list