/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: ProcessSectionFileMapView.NT.cpp Date: 2022-08-09 Author: Reece ***/ #include #include "AuProcessSectionFileMapView.NT.hpp" #include "AuProcessSectionViewReserved.NT.hpp" #include "AuProcessSectionView.NT.hpp" namespace Aurora::Process { ProcessSectionFileMapView::~ProcessSectionFileMapView() { Unmap(); } ProcessSectionFileMapView::ProcessSectionFileMapView(AuUInt uAddress, HANDLE hSection) : uAddress(uAddress), hFileSection(hSection) { } void ProcessSectionFileMapView::Unmap() { if (AuExchange(this->bIsDead_, true)) { return; } if (this->uAddress) { if (this->pSharedSectionHint) { SysAssert(AuStaticCast(this->pSharedSectionHint)->ReleaseAndCoaleceAddress(this->uOffset, this->uLength)); } else { ::UnmapViewOfFile((PVOID)this->uAddress); } this->uAddress = 0; } AuWin32CloseHandle(this->hFileSection); this->pSharedSectionHint.reset(); this->pProcessGlobalHint = nullptr; } bool ProcessSectionFileMapView::Flush(AuUInt offset, AuUInt length) { return ::FlushViewOfFile(this->GetPointer(offset), length); } AuUInt ProcessSectionFileMapView::GetBaseAddress() { return this->uAddress; } AuUInt ProcessSectionFileMapView::GetAddress(AuUInt offset) { return this->uAddress ? this->uAddress + offset : 0; } AuUInt8 *ProcessSectionFileMapView::GetBasePointer() { return AuReinterpretCast(this->uAddress); } AuUInt8 *ProcessSectionFileMapView::GetPointer(AuUInt offset) { return this->uAddress ? AuReinterpretCast(this->uAddress) + offset : 0; } bool ProcessSectionFileMapView::LockSwap() { if (!this->uAddress) { return false; } return AuMemory::SwapLock::Lock({ { this->uAddress, this->uLength} }); } bool ProcessSectionFileMapView::UnlockSwap() { if (!this->uAddress) { return false; } return AuMemory::SwapLock::Unlock({ { this->uAddress, this->uLength} }); } }