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.
 
 
 
 
 
 

171 lines
3.8 KiB

#include "stdwin.h"
#include "mfr.h"
/////////////////////////////////////////////////////////////////////////////
//
// CMappedFileRead class
//
/////////////////////////////////////////////////////////////////////////////
CMappedFileRead::CMappedFileRead()
{
m_szPath[0] = L'\0';
m_dwSize = 0;
m_hFile = INVALID_HANDLE_VALUE;
m_hMap = INVALID_HANDLE_VALUE;
m_pBuf = NULL;
}
CMappedFileRead::~CMappedFileRead()
{
Close();
}
/////////////////////////////////////////////////////////////////////////////
BOOL CMappedFileRead::Open( LPCWSTR cszPath )
{
BOOL fRet = FALSE;
Close();
m_hFile = ::CreateFile( cszPath, GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL );
if ( m_hFile == INVALID_HANDLE_VALUE )
{
fprintf(stderr, "CMappedFileRead::Open\n ::CreateFile failed, err=%u\n", ::GetLastError());
goto Exit;
}
m_dwSize = ::GetFileSize( m_hFile, NULL );
if ( m_dwSize == 0xFFFFFFFF )
{
fprintf(stderr, "CMappedFileRead::Open\n ::GetFileSize failed, err=%u\n", ::GetLastError());
goto Exit;
}
m_hMap = ::CreateFileMapping( m_hFile, NULL, PAGE_READONLY, 0, 0, NULL );
if ( m_hFile == INVALID_HANDLE_VALUE )
{
fprintf(stderr, "CMappedFileRead::Open\n ::CreateFileMapping failed, err=%u\n", ::GetLastError());
goto Exit;
}
m_pBuf = (LPBYTE)::MapViewOfFile( m_hMap, FILE_MAP_READ, 0, 0, 0 );
if ( m_pBuf == NULL )
{
fprintf(stderr, "CMappedFileRead::Open\n ::MapViewOfFile failed, err=%u\n", ::GetLastError());
goto Exit;
}
::lstrcpy( m_szPath, cszPath );
m_pCur = m_pBuf;
m_dwAvail = m_dwSize;
fRet = TRUE;
Exit:
if ( !fRet )
Close();
return( fRet );
}
/////////////////////////////////////////////////////////////////////////////
void CMappedFileRead::Close()
{
if ( m_pBuf != NULL )
{
::UnmapViewOfFile( m_pBuf );
m_pBuf = NULL;
}
if ( m_hMap != INVALID_HANDLE_VALUE )
{
::CloseHandle( m_hMap );
m_hMap = INVALID_HANDLE_VALUE;
}
if ( m_hFile != INVALID_HANDLE_VALUE )
{
::CloseHandle( m_hFile );
m_hFile = INVALID_HANDLE_VALUE;
}
}
/////////////////////////////////////////////////////////////////////////////
BOOL CMappedFileRead::Read( LPVOID pBuf, DWORD cbBuf )
{
BOOL fRet = FALSE;
if ( cbBuf > m_dwAvail )
{
fprintf(stderr, "CMappedFileRead::Read(LPVOID,DWORD)\n Insufficient data - %d bytes (need=%d bytes)\n", m_dwAvail, cbBuf);
goto Exit;
}
::CopyMemory( pBuf, m_pCur, cbBuf );
m_pCur += cbBuf;
m_dwAvail -= cbBuf;
fRet = TRUE;
Exit:
return( fRet );
}
/////////////////////////////////////////////////////////////////////////////
BOOL CMappedFileRead::Read( DWORD *pdw )
{
BOOL fRet = FALSE;
if ( sizeof(DWORD) > m_dwAvail )
{
fprintf(stderr, "CMappedFileRead::Read(DWORD)\n Insufficient data - %d bytes (need=%d bytes)\n", m_dwAvail, sizeof(DWORD));
goto Exit;
}
*pdw = *((LPDWORD)m_pCur);
m_pCur += sizeof(DWORD);
m_dwAvail -= sizeof(DWORD);
fRet = TRUE;
Exit:
return( fRet );
}
/////////////////////////////////////////////////////////////////////////////
BOOL CMappedFileRead::ReadDynStrW( LPWSTR szBuf, DWORD cchMax )
{
BOOL fRet = FALSE;
DWORD dwLen;
if ( !Read( &dwLen ) )
goto Exit;
if ( dwLen == 0 )
{
szBuf[0] = L'\0';
goto Done;
}
if ( dwLen > cchMax*sizeof(WCHAR) )
{
fprintf(stderr, "CMappedFileRead::ReadDynStrW\n Invalid string length - %d (max=%d)\n", dwLen, cchMax);
goto Exit;
}
if ( !Read( szBuf, dwLen ) )
goto Exit;
Done:
fRet = TRUE;
Exit:
return( fRet );
}
// end of file