[*] Updated AuProcess mapping API to use file handles
This commit is contained in:
parent
4ad2a54ccf
commit
9f78555693
@ -39,14 +39,14 @@ namespace Aurora::Process
|
|||||||
Aurora::IO::FS::EFileOpenMode mode,
|
Aurora::IO::FS::EFileOpenMode mode,
|
||||||
Aurora::IO::FS::EFileAdvisoryLockLevel processLockLevel) = 0;
|
Aurora::IO::FS::EFileAdvisoryLockLevel processLockLevel) = 0;
|
||||||
|
|
||||||
virtual AuSPtr<IProcessSectionMapView> MapFileByObject(const AuSPtr<Aurora::IO::FS::IFileStream> &pStream,
|
virtual AuSPtr<IProcessSectionMapView> MapFileByObject(const AuSPtr<IO::IIOHandle> &pIOHandle,
|
||||||
AuUInt64 uOffset,
|
AuUInt64 uOffset,
|
||||||
AuUInt uLength,
|
AuUInt uLength,
|
||||||
Aurora::IO::FS::EFileOpenMode mode,
|
Aurora::IO::FS::EFileOpenMode mode,
|
||||||
Aurora::IO::FS::EFileAdvisoryLockLevel processLockLevel) = 0;
|
Aurora::IO::FS::EFileAdvisoryLockLevel processLockLevel) = 0;
|
||||||
|
|
||||||
virtual AuSPtr<IProcessSectionMapView> MapFileByObjectEx(AuUInt uViewOffset,
|
virtual AuSPtr<IProcessSectionMapView> MapFileByObjectEx(AuUInt uViewOffset,
|
||||||
const AuSPtr<Aurora::IO::FS::IFileStream> &pStream,
|
const AuSPtr<IO::IIOHandle> &pIOHandle,
|
||||||
AuUInt64 uOffset,
|
AuUInt64 uOffset,
|
||||||
AuUInt uLength,
|
AuUInt uLength,
|
||||||
Aurora::IO::FS::EFileOpenMode mode,
|
Aurora::IO::FS::EFileOpenMode mode,
|
||||||
|
@ -40,11 +40,29 @@ namespace Aurora::Process
|
|||||||
AuFS::EFileOpenMode mode,
|
AuFS::EFileOpenMode mode,
|
||||||
AuFS::EFileAdvisoryLockLevel sectionLock)
|
AuFS::EFileAdvisoryLockLevel sectionLock)
|
||||||
{
|
{
|
||||||
auto file = AuFS::OpenShared(str, mode, AuFS::EFileAdvisoryLockLevel::eNoSafety);
|
auto pHandle = AuIO::IOHandleShared();
|
||||||
return file ? this->MapFileByObject(file, uOffset, uLength, mode, sectionLock) : AuSPtr<IProcessSectionMapView> {};
|
if (!pHandle)
|
||||||
|
{
|
||||||
|
SysPushErrorMemory();
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
AuIO::IIOHandle::HandleCreate createhandle(str);
|
||||||
|
createhandle.eAdvisoryLevel = AuFS::EFileAdvisoryLockLevel::eNoSafety;
|
||||||
|
createhandle.eMode = mode;
|
||||||
|
createhandle.bFailIfNonEmptyFile = false;
|
||||||
|
createhandle.bDirectIOMode = false;
|
||||||
|
createhandle.bAsyncHandle = false;
|
||||||
|
|
||||||
|
if (!pHandle->InitFromPath(createhandle))
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this->MapFileByObject(pHandle, uOffset, uLength, mode, sectionLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
AuSPtr<IProcessSectionMapView> ProcessSectionView::MapFileByObject(const AuSPtr<AuFS::IFileStream> &pStream,
|
AuSPtr<IProcessSectionMapView> ProcessSectionView::MapFileByObject(const AuSPtr<IO::IIOHandle> &pIOHandle,
|
||||||
AuUInt64 uOffset,
|
AuUInt64 uOffset,
|
||||||
AuUInt uLength,
|
AuUInt uLength,
|
||||||
AuFS::EFileOpenMode mode,
|
AuFS::EFileOpenMode mode,
|
||||||
@ -53,7 +71,7 @@ namespace Aurora::Process
|
|||||||
HANDLE hFileMap;
|
HANDLE hFileMap;
|
||||||
ULONG desiredAccess {}, pageAttributes {};
|
ULONG desiredAccess {}, pageAttributes {};
|
||||||
|
|
||||||
if (!pStream)
|
if (!pIOHandle)
|
||||||
{
|
{
|
||||||
SysPushErrorArg();
|
SysPushErrorArg();
|
||||||
return {};
|
return {};
|
||||||
@ -65,7 +83,6 @@ namespace Aurora::Process
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
auto pFileStream = AuStaticCast<AuFS::WinFileStream>(pStream);
|
|
||||||
if (processLockLevel != AuFS::EFileAdvisoryLockLevel::eNoSafety)
|
if (processLockLevel != AuFS::EFileAdvisoryLockLevel::eNoSafety)
|
||||||
{
|
{
|
||||||
DWORD dwFlags {};
|
DWORD dwFlags {};
|
||||||
@ -81,7 +98,7 @@ namespace Aurora::Process
|
|||||||
overlapped.Offset = AuBitsToLower(uOffset);
|
overlapped.Offset = AuBitsToLower(uOffset);
|
||||||
overlapped.OffsetHigh = AuBitsToHigher(uOffset);
|
overlapped.OffsetHigh = AuBitsToHigher(uOffset);
|
||||||
|
|
||||||
if (!::LockFileEx(pFileStream->GetHandle(),
|
if (!::LockFileEx((HANDLE)pIOHandle->GetOSHandle(),
|
||||||
dwFlags,
|
dwFlags,
|
||||||
0,
|
0,
|
||||||
AuBitsToLower(uLength),
|
AuBitsToLower(uLength),
|
||||||
@ -113,7 +130,7 @@ namespace Aurora::Process
|
|||||||
return {};
|
return {};
|
||||||
};
|
};
|
||||||
|
|
||||||
hFileMap = ::CreateFileMappingA(pFileStream->GetHandle(),
|
hFileMap = ::CreateFileMappingA((HANDLE)pIOHandle->GetOSHandle(),
|
||||||
nullptr,
|
nullptr,
|
||||||
pageAttributes,
|
pageAttributes,
|
||||||
#if defined(AURORA_IS_64BIT)
|
#if defined(AURORA_IS_64BIT)
|
||||||
@ -369,7 +386,7 @@ namespace Aurora::Process
|
|||||||
}
|
}
|
||||||
|
|
||||||
AuSPtr<IProcessSectionMapView> ProcessSectionView::MapFileByObjectEx(AuUInt viewOffset,
|
AuSPtr<IProcessSectionMapView> ProcessSectionView::MapFileByObjectEx(AuUInt viewOffset,
|
||||||
const AuSPtr<Aurora::IO::FS::IFileStream> &pStream,
|
const AuSPtr<IO::IIOHandle> &pIOHandle,
|
||||||
AuUInt64 uOffset,
|
AuUInt64 uOffset,
|
||||||
AuUInt uLength,
|
AuUInt uLength,
|
||||||
Aurora::IO::FS::EFileOpenMode mode,
|
Aurora::IO::FS::EFileOpenMode mode,
|
||||||
@ -378,7 +395,7 @@ namespace Aurora::Process
|
|||||||
SysAssert(this->bPanicOnEx, "Windows 7/8 called a Windows 10 RS4 memory management routine. "
|
SysAssert(this->bPanicOnEx, "Windows 7/8 called a Windows 10 RS4 memory management routine. "
|
||||||
"Applications requiring explicit and pre-reserved memory maps cannot run on unmodified unsupported versions of Windows."
|
"Applications requiring explicit and pre-reserved memory maps cannot run on unmodified unsupported versions of Windows."
|
||||||
"We lied about reserving a region of bytes with a ProcessSectionView. Unable to gurantee uOffset.");
|
"We lied about reserving a region of bytes with a ProcessSectionView. Unable to gurantee uOffset.");
|
||||||
return this->MapFileByObject(pStream, uOffset, uLength, mode, processLockLevel);
|
return this->MapFileByObject(pIOHandle, uOffset, uLength, mode, processLockLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
AuSPtr<IProcessSectionMapView> ProcessSectionView::MapIPCMemoryEx(AuUInt viewOffset,
|
AuSPtr<IProcessSectionMapView> ProcessSectionView::MapIPCMemoryEx(AuUInt viewOffset,
|
||||||
|
@ -29,7 +29,7 @@ namespace Aurora::Process
|
|||||||
AuFS::EFileOpenMode mode,
|
AuFS::EFileOpenMode mode,
|
||||||
AuFS::EFileAdvisoryLockLevel sectionLock) override;
|
AuFS::EFileAdvisoryLockLevel sectionLock) override;
|
||||||
|
|
||||||
AuSPtr<IProcessSectionMapView> MapFileByObject(const AuSPtr<Aurora::IO::FS::IFileStream> &pStream,
|
AuSPtr<IProcessSectionMapView> MapFileByObject(const AuSPtr<IO::IIOHandle> &pIOHandle,
|
||||||
AuUInt64 uOffset,
|
AuUInt64 uOffset,
|
||||||
AuUInt uLength,
|
AuUInt uLength,
|
||||||
Aurora::IO::FS::EFileOpenMode mode,
|
Aurora::IO::FS::EFileOpenMode mode,
|
||||||
@ -52,7 +52,7 @@ namespace Aurora::Process
|
|||||||
Aurora::IO::FS::EFileAdvisoryLockLevel processLockLevel) override;
|
Aurora::IO::FS::EFileAdvisoryLockLevel processLockLevel) override;
|
||||||
|
|
||||||
AuSPtr<IProcessSectionMapView> MapFileByObjectEx(AuUInt viewOffset,
|
AuSPtr<IProcessSectionMapView> MapFileByObjectEx(AuUInt viewOffset,
|
||||||
const AuSPtr<Aurora::IO::FS::IFileStream> &pStream,
|
const AuSPtr<IO::IIOHandle> &pIOHandle,
|
||||||
AuUInt64 uOffset,
|
AuUInt64 uOffset,
|
||||||
AuUInt uLength,
|
AuUInt uLength,
|
||||||
Aurora::IO::FS::EFileOpenMode mode,
|
Aurora::IO::FS::EFileOpenMode mode,
|
||||||
|
@ -186,13 +186,13 @@ namespace Aurora::Process
|
|||||||
return this->MapFileByPathEx(-1, str, uOffset, uLength, mode, sectionLock);
|
return this->MapFileByPathEx(-1, str, uOffset, uLength, mode, sectionLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
AuSPtr<IProcessSectionMapView> ProcessSectionViewReserved::MapFileByObject(const AuSPtr<AuFS::IFileStream> &pStream,
|
AuSPtr<IProcessSectionMapView> ProcessSectionViewReserved::MapFileByObject(const AuSPtr<IO::IIOHandle> &pIOHandle,
|
||||||
AuUInt64 uOffset,
|
AuUInt64 uOffset,
|
||||||
AuUInt uLength,
|
AuUInt uLength,
|
||||||
AuFS::EFileOpenMode mode,
|
AuFS::EFileOpenMode mode,
|
||||||
AuFS::EFileAdvisoryLockLevel processLockLevel)
|
AuFS::EFileAdvisoryLockLevel processLockLevel)
|
||||||
{
|
{
|
||||||
return this->MapFileByObjectEx(-1, pStream, uOffset, uLength, mode, processLockLevel);
|
return this->MapFileByObjectEx(-1, pIOHandle, uOffset, uLength, mode, processLockLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
AuSPtr<IProcessSectionMapView> ProcessSectionViewReserved::MapIPCMemory(const AuString &handleString,
|
AuSPtr<IProcessSectionMapView> ProcessSectionViewReserved::MapIPCMemory(const AuString &handleString,
|
||||||
@ -305,12 +305,30 @@ namespace Aurora::Process
|
|||||||
Aurora::IO::FS::EFileOpenMode mode,
|
Aurora::IO::FS::EFileOpenMode mode,
|
||||||
Aurora::IO::FS::EFileAdvisoryLockLevel sectionLock)
|
Aurora::IO::FS::EFileAdvisoryLockLevel sectionLock)
|
||||||
{
|
{
|
||||||
auto file = AuFS::OpenShared(str, mode, AuFS::EFileAdvisoryLockLevel::eNoSafety);
|
auto pHandle = AuIO::IOHandleShared();
|
||||||
return file ? this->MapFileByObjectEx(viewOffset, file, uOffset, uLength, mode, sectionLock) : AuSPtr<IProcessSectionMapView> {};
|
if (!pHandle)
|
||||||
|
{
|
||||||
|
SysPushErrorMemory();
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
AuIO::IIOHandle::HandleCreate createhandle(str);
|
||||||
|
createhandle.eAdvisoryLevel = AuFS::EFileAdvisoryLockLevel::eNoSafety;
|
||||||
|
createhandle.eMode = mode;
|
||||||
|
createhandle.bFailIfNonEmptyFile = false;
|
||||||
|
createhandle.bDirectIOMode = false;
|
||||||
|
createhandle.bAsyncHandle = false;
|
||||||
|
|
||||||
|
if (!pHandle->InitFromPath(createhandle))
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this->MapFileByObjectEx(viewOffset, pHandle, uOffset, uLength, mode, sectionLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
AuSPtr<IProcessSectionMapView> ProcessSectionViewReserved::MapFileByObjectEx(AuUInt viewOffset,
|
AuSPtr<IProcessSectionMapView> ProcessSectionViewReserved::MapFileByObjectEx(AuUInt viewOffset,
|
||||||
const AuSPtr<Aurora::IO::FS::IFileStream> &pStream,
|
const AuSPtr<IO::IIOHandle> &pIOHandle,
|
||||||
AuUInt64 uOffset,
|
AuUInt64 uOffset,
|
||||||
AuUInt uLength,
|
AuUInt uLength,
|
||||||
Aurora::IO::FS::EFileOpenMode mode,
|
Aurora::IO::FS::EFileOpenMode mode,
|
||||||
@ -320,7 +338,7 @@ namespace Aurora::Process
|
|||||||
ULONG desiredAccess {}, pageAttributes {};
|
ULONG desiredAccess {}, pageAttributes {};
|
||||||
AuUInt uAddressOut;
|
AuUInt uAddressOut;
|
||||||
|
|
||||||
if (!pStream)
|
if (!pIOHandle)
|
||||||
{
|
{
|
||||||
SysPushErrorArg();
|
SysPushErrorArg();
|
||||||
return {};
|
return {};
|
||||||
@ -337,7 +355,6 @@ namespace Aurora::Process
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
auto pFileStream = AuStaticCast<AuFS::WinFileStream>(pStream);
|
|
||||||
if (processLockLevel != AuFS::EFileAdvisoryLockLevel::eNoSafety)
|
if (processLockLevel != AuFS::EFileAdvisoryLockLevel::eNoSafety)
|
||||||
{
|
{
|
||||||
DWORD dwFlags {};
|
DWORD dwFlags {};
|
||||||
@ -353,7 +370,7 @@ namespace Aurora::Process
|
|||||||
overlapped.Offset = AuBitsToLower(uOffset);
|
overlapped.Offset = AuBitsToLower(uOffset);
|
||||||
overlapped.OffsetHigh = AuBitsToHigher(uOffset);
|
overlapped.OffsetHigh = AuBitsToHigher(uOffset);
|
||||||
|
|
||||||
if (!::LockFileEx(pFileStream->GetHandle(),
|
if (!::LockFileEx((HANDLE)pIOHandle->GetOSHandle(),
|
||||||
dwFlags,
|
dwFlags,
|
||||||
0,
|
0,
|
||||||
AuBitsToLower(uLength),
|
AuBitsToLower(uLength),
|
||||||
@ -385,7 +402,7 @@ namespace Aurora::Process
|
|||||||
return {};
|
return {};
|
||||||
};
|
};
|
||||||
|
|
||||||
hFileMap = ::CreateFileMappingA(pFileStream->GetHandle(),
|
hFileMap = ::CreateFileMappingA((HANDLE)pIOHandle->GetOSHandle(),
|
||||||
nullptr,
|
nullptr,
|
||||||
pageAttributes,
|
pageAttributes,
|
||||||
#if defined(AURORA_IS_64BIT)
|
#if defined(AURORA_IS_64BIT)
|
||||||
|
@ -32,7 +32,7 @@ namespace Aurora::Process
|
|||||||
AuFS::EFileOpenMode mode,
|
AuFS::EFileOpenMode mode,
|
||||||
AuFS::EFileAdvisoryLockLevel sectionLock) override;
|
AuFS::EFileAdvisoryLockLevel sectionLock) override;
|
||||||
|
|
||||||
AuSPtr<IProcessSectionMapView> MapFileByObject(const AuSPtr<Aurora::IO::FS::IFileStream> &pStream,
|
AuSPtr<IProcessSectionMapView> MapFileByObject(const AuSPtr<IO::IIOHandle> &pIOHandle,
|
||||||
AuUInt64 uOffset,
|
AuUInt64 uOffset,
|
||||||
AuUInt uLength,
|
AuUInt uLength,
|
||||||
Aurora::IO::FS::EFileOpenMode mode,
|
Aurora::IO::FS::EFileOpenMode mode,
|
||||||
@ -59,7 +59,7 @@ namespace Aurora::Process
|
|||||||
Aurora::IO::FS::EFileAdvisoryLockLevel processLockLevel) override;
|
Aurora::IO::FS::EFileAdvisoryLockLevel processLockLevel) override;
|
||||||
|
|
||||||
AuSPtr<IProcessSectionMapView> MapFileByObjectEx(AuUInt viewOffset,
|
AuSPtr<IProcessSectionMapView> MapFileByObjectEx(AuUInt viewOffset,
|
||||||
const AuSPtr<Aurora::IO::FS::IFileStream> &stream,
|
const AuSPtr<IO::IIOHandle> &pIOHandle,
|
||||||
AuUInt64 uOffset,
|
AuUInt64 uOffset,
|
||||||
AuUInt uLength,
|
AuUInt uLength,
|
||||||
Aurora::IO::FS::EFileOpenMode mode,
|
Aurora::IO::FS::EFileOpenMode mode,
|
||||||
|
Loading…
Reference in New Issue
Block a user