public static IDisposable Set(int threadID, IntPtr address, UIntPtr size, DataBreakpointTrigger trigger) { if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { return(new Win32DataBreakpointFactory().Set(threadID, address, size, trigger)); } throw new PlatformNotSupportedException("Only Windows 64 bit is supported"); }
public IDisposable Set(IntPtr address, UIntPtr size, DataBreakpointTrigger trigger) { var breakpoints = new DisposableCollection(); var threads = Process.GetCurrentProcess().Threads .Cast <ProcessThread>().ToArray(); foreach (var thread in threads) { breakpoints.Add(this.Set(thread.Id, address, size, trigger)); } return(breakpoints); }
public IDisposable Set(int threadID, IntPtr address, UIntPtr size, DataBreakpointTrigger trigger) { if (address == IntPtr.Zero) { throw new ArgumentNullException(nameof(address)); } if (size == UIntPtr.Zero) { throw new ArgumentException("Region size must be non-zero", paramName: nameof(size)); } var type = trigger switch { DataBreakpointTrigger.OnWrite => HardwareBreakpointType.Write, DataBreakpointTrigger.OnReadOrWrite => HardwareBreakpointType.ReadWrite, _ => throw new ArgumentException("Invalid value", paramName: nameof(trigger)) }; var sizeType = checked ((ulong)size) switch { 1 => HardwareBreakpointSize.Size1, 2 => HardwareBreakpointSize.Size2, 4 => HardwareBreakpointSize.Size4, 8 => HardwareBreakpointSize.Size8, _ => throw new NotSupportedException( "Memory region size must be 1, 2, 4, or 8 bytes"), }; var threadHandle = Win32Thread.OpenThread(ThreadAccess.All, inheritHandle: false, threadID); if (threadHandle.IsInvalid) { throw new Win32Exception(); } var breakpoint = Win32HardwareBreakpoint.TrySet(threadHandle, type, sizeType, address); if (breakpoint == null) { throw new InvalidOperationException("Data breakpoint limit reached"); } return(breakpoint); }