129 lines
3.1 KiB
C++
129 lines
3.1 KiB
C++
#include "pch.h"
|
|
#pragma hdrstop
|
|
|
|
#include "mapfile.h"
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// MappedFile
|
|
//
|
|
// A simple encapsulation of opening a mapped file in memory.
|
|
// The file is opened with READ access only.
|
|
// Client calls Base() to retrieve the base pointer of the mapped file.
|
|
//-----------------------------------------------------------------------------
|
|
MappedFile::MappedFile(
|
|
VOID
|
|
) : m_hFile(INVALID_HANDLE_VALUE),
|
|
m_hFileMapping(INVALID_HANDLE_VALUE),
|
|
m_pbBase(NULL),
|
|
m_llSize(0)
|
|
{
|
|
DBGTRACE((DM_MAPFILE, DL_HIGH, TEXT("MappedFile::MappedFile")));
|
|
}
|
|
|
|
|
|
MappedFile::~MappedFile(
|
|
VOID
|
|
)
|
|
{
|
|
DBGTRACE((DM_MAPFILE, DL_HIGH, TEXT("MappedFile::~MappedFile")));
|
|
Close();
|
|
}
|
|
|
|
|
|
LONGLONG
|
|
MappedFile::Size(
|
|
VOID
|
|
) const
|
|
{
|
|
DBGTRACE((DM_MAPFILE, DL_MID, TEXT("MappedFile::Size")));
|
|
return m_llSize;
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Open the file. Caller retrieves the base pointer through the
|
|
// Base() member function.
|
|
//
|
|
HRESULT
|
|
MappedFile::Open(
|
|
LPCTSTR pszFile
|
|
)
|
|
{
|
|
DBGTRACE((DM_MAPFILE, DL_HIGH, TEXT("MappedFile::Open")));
|
|
DBGPRINT((DM_MAPFILE, DL_HIGH, TEXT("\topening \"%s\""), pszFile));
|
|
|
|
HRESULT hr = NO_ERROR;
|
|
|
|
m_hFile = CreateFile(pszFile,
|
|
GENERIC_READ,
|
|
FILE_SHARE_READ,
|
|
NULL,
|
|
OPEN_EXISTING,
|
|
0,
|
|
NULL);
|
|
|
|
if (INVALID_HANDLE_VALUE == m_hFile)
|
|
{
|
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
|
}
|
|
else
|
|
{
|
|
if ((m_hFileMapping = CreateFileMapping(m_hFile,
|
|
NULL,
|
|
PAGE_READONLY,
|
|
0,
|
|
0,
|
|
NULL)) == NULL)
|
|
{
|
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
|
}
|
|
else
|
|
{
|
|
m_pbBase = (LPBYTE)MapViewOfFile(m_hFileMapping,
|
|
FILE_MAP_READ,
|
|
0,
|
|
0,
|
|
0);
|
|
if (NULL == m_pbBase)
|
|
{
|
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
|
}
|
|
else
|
|
{
|
|
ULARGE_INTEGER liSize;
|
|
liSize.LowPart = GetFileSize(m_hFile, &liSize.HighPart);
|
|
m_llSize = liSize.QuadPart;
|
|
}
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// Close the file mapping and the file.
|
|
//
|
|
VOID
|
|
MappedFile::Close(
|
|
VOID
|
|
)
|
|
{
|
|
DBGTRACE((DM_MAPFILE, DL_HIGH, TEXT("MappedFile::Close")));
|
|
if (NULL != m_pbBase)
|
|
{
|
|
UnmapViewOfFile(m_pbBase);
|
|
m_pbBase = NULL;
|
|
}
|
|
if (INVALID_HANDLE_VALUE != m_hFileMapping)
|
|
{
|
|
CloseHandle(m_hFileMapping);
|
|
m_hFileMapping = INVALID_HANDLE_VALUE;
|
|
}
|
|
if (INVALID_HANDLE_VALUE != m_hFile)
|
|
{
|
|
CloseHandle(m_hFile);
|
|
m_hFile = INVALID_HANDLE_VALUE;
|
|
}
|
|
}
|
|
|