Example #1
0
        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);
            }
        }
Example #2
0
 public SeekOverunEventArgs(long offset, ProcessSeekOrigin loc)
 {
     this.Offset   = offset;
     this.Location = loc;
 }