public long Seek(long offset, ProcessSeekOrigin loc) { SeekOverunEventArgs args = null; var continueBaseSeek = true; switch (loc) { case ProcessSeekOrigin.BeginningOfProcessMemory: args = new SeekOverunEventArgs(offset, loc); OnSeekOverun(this, args); continueBaseSeek = args.ContinueBaseSeek; break; case ProcessSeekOrigin.Begin: if (offset > this.BufferLength || offset < 0) { args = new SeekOverunEventArgs(offset, loc); OnSeekOverun(this, args); continueBaseSeek = args.ContinueBaseSeek; } break; case ProcessSeekOrigin.End: var position = this.BufferLength + offset; if (position > this.BufferLength || position < 0) { args = new SeekOverunEventArgs(offset, loc); OnSeekOverun(this, args); continueBaseSeek = args.ContinueBaseSeek; } break; case ProcessSeekOrigin.Current: if (offset > this.BufferLength - this.Position || offset < 0) { args = new SeekOverunEventArgs(offset, loc); OnSeekOverun(this, args); continueBaseSeek = args.ContinueBaseSeek; } break; default: e.Throw <ArgumentException>("Invalid seek origin {0}", loc); break; } if (continueBaseSeek) { if (args != null) { if (args.OutOfRegionPosition) { switch (args.BaseSeekOrigin) { case SeekOrigin.Begin: outOfRegionPosition = args.BaseOffset; break; case SeekOrigin.Current: outOfRegionPosition = base.Position + args.BaseOffset; break; case SeekOrigin.End: outOfRegionPosition = base.Length + args.BaseOffset; break; } return(outOfRegionPosition); } else { outOfRegionPosition = -1; try { return(base.Seek(args.BaseOffset, args.BaseSeekOrigin)); } catch (Exception ex) { throw; } } } else { try { return(base.Seek(offset, (SeekOrigin)loc)); } catch (Exception ex) { throw; } } } else { return(args.Position); } }
public SeekOverunEventArgs(long offset, ProcessSeekOrigin loc) { this.Offset = offset; this.Location = loc; }