200 lines
4.4 KiB
C++
200 lines
4.4 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 2000.
|
||
|
//
|
||
|
// File: Mfr.cxx
|
||
|
//
|
||
|
// Contents: The implementation of the CMappedFileRead class
|
||
|
//
|
||
|
//
|
||
|
// Objects:
|
||
|
//
|
||
|
// Coupling:
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
// History: 03-May-2001 WeiyouC Copied from dev code and minor rewite
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
#include <nt.h>
|
||
|
#include <ntrtl.h>
|
||
|
#include <nturtl.h>
|
||
|
#include <windows.h>
|
||
|
#include <stdio.h>
|
||
|
#include <shellapi.h>
|
||
|
#include <srdefs.h>
|
||
|
#include <srshell.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
|