public void MapMirror(long Src, long Dst, long Size, int Type) { Src = AMemoryHelper.PageRoundDown(Src); Dst = AMemoryHelper.PageRoundDown(Dst); Size = AMemoryHelper.PageRoundUp(Size); long PagesCount = Size / PageSize; while (PagesCount-- > 0) { PTEntry SrcEntry = GetPTEntry(Src); PTEntry DstEntry = GetPTEntry(Dst); DstEntry.Map = PTMap.Mapped; DstEntry.Type = Type; DstEntry.Perm = SrcEntry.Perm; SrcEntry.Perm = AMemoryPerm.None; SrcEntry.Attr |= 1; SetPTEntry(Src, SrcEntry); SetPTEntry(Dst, DstEntry); Src += PageSize; Dst += PageSize; } }
public long GetPhys(long Position, AMemoryPerm Perm) { if (!HasPTEntry(Position)) { if (Position < 0x08000000) { Console.WriteLine($"HACK: Ignoring bad access at {Position:x16}"); return(0); } throw new VmmPageFaultException(Position); } PTEntry Entry = GetPTEntry(Position); long AbsPos = Entry.Position + (Position & PageMask); if (Entry.Map == PTMap.Mirror) { return(GetPhys(AbsPos, Perm)); } if (Entry.Map == PTMap.Unmapped) { throw new VmmPageFaultException(Position); } return(AbsPos); }
public AMemoryMapInfo GetMapInfo(long Position) { Position = AMemoryHelper.PageRoundDown(Position); PTEntry BaseEntry = GetPTEntry(Position); bool IsSameSegment(long Pos) { PTEntry Entry = GetPTEntry(Pos); return(Entry.Type == BaseEntry.Type && Entry.Map == BaseEntry.Map && Entry.Perm == BaseEntry.Perm); } long Start = Position; long End = Position + PageSize; while (Start > 0 && IsSameSegment(Start - PageSize)) { Start -= PageSize; } while (End < AddrSize && IsSameSegment(End)) { End += PageSize; } long Size = End - Start; return(new AMemoryMapInfo(Start, Size, BaseEntry.Type, BaseEntry.Perm)); }
private void SetPTEntry(long Position, long Size, PTEntry Entry) { while (Size > 0) { SetPTEntry(Position, Entry); Position += PageSize; Size -= PageSize; } }
private void SetPTEntry(long Position, PTEntry Entry) { long L0 = (Position >> PTLvl0Bit) & PTLvl0Mask; long L1 = (Position >> PTLvl1Bit) & PTLvl1Mask; if (PageTable[L0] == null) { PageTable[L0] = new PTEntry[PTLvl1Size]; } PageTable[L0][L1] = Entry; }
private void SetPTEntry(long Position, long Size, int Type, PTEntry Entry) { while (Size > 0) { if (GetPTEntry(Position).Type == Type) { SetPTEntry(Position, Entry); } Position += PageSize; Size -= PageSize; } }
public void SetAttrBit(long Position, long Size, int Bit) { while (Size > 0) { PTEntry Entry = GetPTEntry(Position); Entry.Attr |= (1 << Bit); SetPTEntry(Position, Entry); Position += PageSize; Size -= PageSize; } }
private void SetPTEntry(long Position, PTEntry Entry) { if (!IsValidPosition(Position)) { throw new ArgumentOutOfRangeException(nameof(Position)); } long L0 = (Position >> PTLvl0Bit) & PTLvl0Mask; long L1 = (Position >> PTLvl1Bit) & PTLvl1Mask; if (PageTable[L0] == null) { PageTable[L0] = new PTEntry[PTLvl1Size]; } PageTable[L0][L1] = Entry; }
public void Reprotect(long Position, long Size, AMemoryPerm Perm) { Position = AMemoryHelper.PageRoundDown(Position); Size = AMemoryHelper.PageRoundUp(Size); long PagesCount = Size / PageSize; while (PagesCount-- > 0) { PTEntry Entry = GetPTEntry(Position); Entry.Perm = Perm; SetPTEntry(Position, Entry); Position += PageSize; } }
public void MapMirror(long Src, long Dst, long Size, int Type) { Src = AMemoryHelper.PageRoundDown(Src); Dst = AMemoryHelper.PageRoundDown(Dst); Size = AMemoryHelper.PageRoundUp(Size); long PagesCount = Size / PageSize; while (PagesCount-- > 0) { PTEntry Entry = GetPTEntry(Src); Entry.Type = Type; Entry.Map = PTMap.Mirror; Entry.Position = Dst; SetPTEntry(Src, Entry); Src += PageSize; Dst += PageSize; } }