void UpdateBreakpoints(DkmProcess process, LuaRemoteProcessData processData) { // Can't update breakpoints if we don't have the hook attached if (processData.locations == null) { return; } UpdateHooks(process, processData); int count = processData.activeBreakpoints.Count; if (count > 256) { count = 256; } ulong pointerSize = (ulong)DebugHelpers.GetPointerSize(process); ulong sourceNameAddress = processData.locations.helperBreakSourcesAddress; for (int i = 0; i < count; i++) { ulong dataAddress = processData.locations.helperBreakDataAddress + (ulong)i * 3 * pointerSize; var breakpoint = processData.activeBreakpoints[i]; DebugHelpers.TryWritePointerVariable(process, dataAddress, (ulong)breakpoint.line); if (breakpoint.functionAddress == 0) { Debug.Assert(breakpoint.source != null); byte[] sourceNameBytes = Encoding.UTF8.GetBytes(breakpoint.source); DebugHelpers.TryWriteRawBytes(process, sourceNameAddress, sourceNameBytes); DebugHelpers.TryWriteByteVariable(process, sourceNameAddress + (ulong)sourceNameBytes.Length, 0); ulong currSourceNameAddress = sourceNameAddress; sourceNameAddress += (ulong)sourceNameBytes.Length + 1; DebugHelpers.TryWritePointerVariable(process, dataAddress + pointerSize, 0); DebugHelpers.TryWritePointerVariable(process, dataAddress + pointerSize * 2, currSourceNameAddress); } else { DebugHelpers.TryWritePointerVariable(process, dataAddress + pointerSize, breakpoint.functionAddress); DebugHelpers.TryWritePointerVariable(process, dataAddress + pointerSize * 2, 0); } } DebugHelpers.TryWriteIntVariable(process, processData.locations.helperBreakCountAddress, count); }