DragonNest/Common/Utility/MemoryMap.cpp

225 lines
13 KiB
C++
Raw Normal View History

2024-12-20 16:56:44 +08:00
<EFBFBD><EFBFBD>
///////////////////////////////////////////////////////////////////
// INCLUDE
///////////////////////////////////////////////////////////////////
#include "STDAFX.H"
#include "MEMORYMAP.H"
#include "COMMONMACROS.H"
#include "BASESET.H"
#include "DEBUGUTIL.H"
#include "SAFESTRINGMACROS.H"
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
///////////////////////////////////////////////////////////////////
// IMPLEMENTATION
///////////////////////////////////////////////////////////////////
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CMemoryMap::CMemoryMap
//*---------------------------------------------------------------
// DESC : <EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
CMemoryMap::CMemoryMap() :
m_hFile(INVALID_HANDLE_VALUE),m_hMemoryMap(INVALID_HANDLE_VALUE),
m_lpBaseAddr(0), m_dwSizeLow(0), m_dwSizeHigh(0)
{
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CMemoryMap::~CMemoryMap
//*---------------------------------------------------------------
// DESC : <EFBFBD><EFBFBD>x<EFBFBD><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
CMemoryMap::~CMemoryMap()
{
Close();
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CMemoryMap::Open
//*---------------------------------------------------------------
// DESC : Memory Map<<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>`<EFBFBD> <EFBFBD>|<EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>, <EFBFBD>)<EFBFBD>
// PARM : 1 . lpszFileName - Memory Map<<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>`<EFBFBD> <EFBFBD>|<EFBFBD>X<EFBFBD> <EFBFBD>
// 2 . dwFileOffsetHigh - <EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><EFBFBD> <EFBFBD> <EFBFBD>|<EFBFBD><EFBFBD>X<EFBFBD> (<EFBFBD><EFBFBD><EFBFBD>DWORD)
// 3 . dwFileOffsetLow - <EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><EFBFBD> <EFBFBD> <EFBFBD>|<EFBFBD><EFBFBD>X<EFBFBD> (X<EFBFBD><EFBFBD>DWORD)
// 4 . dwNumberOfBytesToMap - <EFBFBD><EFBFBD>Q<EFBFBD>X<EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>
// 5 . lpszMemoryMapName - Memory MapX<EFBFBD> <EFBFBD>
// 6 . dwDesiredAccess - <EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD>ܴ
// 7 . dwCreationDisposition - <EFBFBD>|<EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD>1<EFBFBD>`<EFBFBD> )<EFBFBD><EFBFBD><EFBFBD> (ex> CREATE_ALWAYS, OPEN_EXISTING <EFBFBD><EFBFBD>)
// RETV : TRUE - 1<EFBFBD><EFBFBD><EFBFBD> / FALSE - <EFBFBD><EFBFBD>(<EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
BOOL CMemoryMap::Open(
LPCTSTR lpszFileName,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
SIZE_T dwNumberOfBytesToMap,
LPCTSTR /*lpszMemoryMapName*/,
DWORD dwDesiredAccess,
DWORD dwCreationDisposition
)
{
if (m_hFile != INVALID_HANDLE_VALUE) {
return FALSE;
}
m_hFile = ::CreateFile(lpszFileName, dwDesiredAccess, FILE_SHARE_READ, 0, dwCreationDisposition, FILE_ATTRIBUTE_NORMAL, 0);
if (m_hFile == INVALID_HANDLE_VALUE) {
DN_TRACE(_T("m_hFile == INVALID_HANDLE_VALUE : %d - CMemoryMap::Open()"), GetLastError());
return FALSE;
}
m_hMemoryMap = ::CreateFileMapping(m_hFile, 0, PAGE_WRITECOPY, 0, 0, 0);
if (!m_hMemoryMap) {
DN_TRACE(_T("!m_hMemoryMap : %d - CMemoryMap::Open()"), GetLastError());
return FALSE;
}
m_lpBaseAddr = ::MapViewOfFile(m_hMemoryMap, FILE_MAP_COPY, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap);
if (!m_lpBaseAddr) {
DN_TRACE(_T("!m_lpBaseAddr : %d - CMemoryMap::Open()"), GetLastError());
return FALSE;
}
m_dwSizeLow = ::GetFileSize(m_hFile, &m_dwSizeHigh);
return TRUE;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CMemoryMap::Close
//*---------------------------------------------------------------
// DESC : Memory Map<<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>`<EFBFBD> <EFBFBD>|<EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD>L<EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
VOID CMemoryMap::Close()
{
if (m_lpBaseAddr != 0) {
::UnmapViewOfFile(m_lpBaseAddr);
m_lpBaseAddr = 0;
}
if (m_hMemoryMap != INVALID_HANDLE_VALUE) {
::CloseHandle(m_hMemoryMap);
m_hMemoryMap = INVALID_HANDLE_VALUE;
}
if (m_hFile != INVALID_HANDLE_VALUE) {
::CloseHandle(m_hFile);
m_hFile = INVALID_HANDLE_VALUE;
}
m_dwSizeLow = 0;
m_dwSizeHigh = 0;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CMemoryMap::ChangeMapView
//*---------------------------------------------------------------
// DESC : Memory MapX<EFBFBD> <EFBFBD><EFBFBD>X<EFBFBD> <EFBFBD>X<EFBFBD>̹ <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PARM : 1 . dwFileOffsetHigh - <EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><EFBFBD> <EFBFBD> <EFBFBD>|<EFBFBD><EFBFBD>X<EFBFBD> (<EFBFBD><EFBFBD><EFBFBD>DWORD)
// 2 . dwFileOffsetLow - <EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><EFBFBD> <EFBFBD> <EFBFBD>|<EFBFBD><EFBFBD>X<EFBFBD> (X<EFBFBD><EFBFBD>DWORD)
// 3 . dwNumberOfBytesToMap - <EFBFBD><EFBFBD>Q<EFBFBD>X<EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>
// RETV : TRUE - 1<EFBFBD><EFBFBD><EFBFBD> / FALSE - <EFBFBD><EFBFBD>(<EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
BOOL CMemoryMap::ChangeMapView(
DWORD dwFileOffsetHigh ,
DWORD dwFileOffsetLow,
SIZE_T dwNumberOfBytesToMap
)
{
if (m_hFile == INVALID_HANDLE_VALUE) {
return FALSE;
}
if (!m_hMemoryMap) {
return FALSE;
}
if (m_lpBaseAddr != 0) {
::UnmapViewOfFile(m_lpBaseAddr);
m_lpBaseAddr = 0;
}
m_lpBaseAddr = ::MapViewOfFile(m_hMemoryMap, FILE_MAP_COPY, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap);
if (!m_lpBaseAddr) {
DN_TRACE(_T("!m_lpBaseAddr : %d - CMemoryMap::ChangeMapView()"), GetLastError());
return FALSE;
}
return TRUE;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CMemoryMap::Flush
//*---------------------------------------------------------------
// DESC : Memory MapX<EFBFBD> <EFBFBD><EFBFBD>|<EFBFBD>|<EFBFBD> D<EFBFBD><EFBFBD><EFBFBD> (I/O <EFBFBD>̬<EFBFBD>)
// PARM : N/A
// RETV : TRUE - 1<EFBFBD><EFBFBD><EFBFBD> / FALSE - <EFBFBD><EFBFBD>(<EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
BOOL CMemoryMap::Flush()
{
if (::FlushViewOfFile(m_lpBaseAddr, 0) == FALSE) {
DN_TRACE(_T("::FlushViewOfFile(m_lpBaseAddr, 0) == FALSE : %d - CMemoryMap::Open()"), GetLastError());
return FALSE;
}
return TRUE;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CMemoryMap::GetBaseAddress
//*---------------------------------------------------------------
// DESC : Memory Map <EFBFBD>|<EFBFBD>X<EFBFBD> 0<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ȍ<EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD>L<EFBFBD>
// PARM : N/A
// RETV : Memory Map <EFBFBD>|<EFBFBD>X<EFBFBD> 0<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ȍ<EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
LPVOID CMemoryMap::GetBaseAddress()
{
return m_lpBaseAddr;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CMemoryMap::GetSize
//*---------------------------------------------------------------
// DESC : Memory Map <EFBFBD>|<EFBFBD>X<EFBFBD> l<EFBFBD>0<EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD>L<EFBFBD>
// PARM : N/A
// RETV : Memory Map <EFBFBD>|<EFBFBD>X<EFBFBD> l<EFBFBD>0<EFBFBD> (INT64)
// PRGM : B4nFter
//*---------------------------------------------------------------
UINT64 CMemoryMap::GetSize()
{
return MAKELONGLONG(m_dwSizeLow, m_dwSizeHigh);
}