2024-12-21 10:04:04 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
|
|
// 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 : <20><><EFBFBD><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 : <20>Ҹ<EFBFBD><D2B8><EFBFBD>
|
|
|
|
|
|
// PARM : N/A
|
|
|
|
|
|
// RETV : N/A
|
|
|
|
|
|
// PRGM : B4nFter
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
CMemoryMap::~CMemoryMap()
|
|
|
|
|
|
{
|
|
|
|
|
|
Close();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// TYPE : FUNCTION
|
|
|
|
|
|
// NAME : CMemoryMap::Open
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// DESC : Memory Map<61><70><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// PARM : 1 . lpszFileName - Memory Map<61><70><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD>
|
|
|
|
|
|
// 2 . dwFileOffsetHigh - <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ (<28><><EFBFBD><EFBFBD>DWORD)
|
|
|
|
|
|
// 3 . dwFileOffsetLow - <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ (<28><><EFBFBD><EFBFBD>DWORD)
|
|
|
|
|
|
// 4 . dwNumberOfBytesToMap - <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><>
|
|
|
|
|
|
// 5 . lpszMemoryMapName - Memory Map<61><70> <20≯<EFBFBD>
|
|
|
|
|
|
// 6 . dwDesiredAccess - <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// 7 . dwCreationDisposition - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (ex> CREATE_ALWAYS, OPEN_EXISTING <20><>)
|
|
|
|
|
|
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><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<61><70><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><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 Map<61><70> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// PARM : 1 . dwFileOffsetHigh - <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ (<28><><EFBFBD><EFBFBD>DWORD)
|
|
|
|
|
|
// 2 . dwFileOffsetLow - <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ (<28><><EFBFBD><EFBFBD>DWORD)
|
|
|
|
|
|
// 3 . dwNumberOfBytesToMap - <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><>
|
|
|
|
|
|
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><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 Map<61><70> <20><><EFBFBD>۸<EFBFBD> <20><><EFBFBD><EFBFBD> (I/O ó<><C3B3>)
|
|
|
|
|
|
// PARM : N/A
|
|
|
|
|
|
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><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 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>⺻ <20>ּҸ<D6BC> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// PARM : N/A
|
|
|
|
|
|
// RETV : Memory Map <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>⺻ <20>ּ<EFBFBD>
|
|
|
|
|
|
// PRGM : B4nFter
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
LPVOID CMemoryMap::GetBaseAddress()
|
|
|
|
|
|
{
|
|
|
|
|
|
return m_lpBaseAddr;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// TYPE : FUNCTION
|
|
|
|
|
|
// NAME : CMemoryMap::GetSize
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// DESC : Memory Map <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<>⸦ <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// PARM : N/A
|
|
|
|
|
|
// RETV : Memory Map <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><C5A9> (INT64)
|
|
|
|
|
|
// PRGM : B4nFter
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
UINT64 CMemoryMap::GetSize()
|
|
|
|
|
|
{
|
|
|
|
|
|
return MAKELONGLONG(m_dwSizeLow, m_dwSizeHigh);
|
|
|
|
|
|
}
|
|
|
|
|
|
|