Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

128 lines
3.1 KiB

#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;
}
}