#include "stdafx.h" #include "rwfile.h" CRWFile::CRWFile() { IRWFile::m_hFile = INVALID_HANDLE_VALUE; } CRWFile::~CRWFile() { if( IRWFile::m_hFile != INVALID_HANDLE_VALUE ) { CloseHandle( IRWFile::m_hFile ); } } HRESULT CRWFile::InitFile ( IN LPCTSTR lpFileName, IN DWORD dwDesiredAccess, IN DWORD dwShareMode, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes, IN DWORD dwCreationDisposition, IN DWORD dwFlagsAndAttributes, IN HANDLE hTemplateFile ) { _ASSERTE( lpFileName != NULL ); HRESULT hr = E_FAIL; __try { if( !lpFileName ) { hr = E_INVALIDARG; goto qInitFile; } m_hFile = CreateFile( lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile ); if( m_hFile == INVALID_HANDLE_VALUE ) { hr = HRESULT_FROM_WIN32(GetLastError()); goto qInitFile; } hr = S_OK; qInitFile: if( FAILED(hr) ) {} } __except ( EXCEPTION_EXECUTE_HANDLER, 1 ) { hr = E_UNEXPECTED; _ASSERTE( false ); } return hr; } HRESULT CRWFile::Read ( OUT LPVOID lpBuffer, IN DWORD nNumberOfBytesToRead, OUT LPDWORD lpNumberOfBytesRead, OUT LPOVERLAPPED lpOverlapped ) { _ASSERTE( lpBuffer != NULL ); _ASSERTE( nNumberOfBytesToRead > 0 ); HRESULT hr = E_FAIL; BOOL bRet = false; __try { if( !lpBuffer || nNumberOfBytesToRead <= 0 ){ hr = E_INVALIDARG; goto qRead; } bRet = ReadFile( m_hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped ); if( bRet && *lpNumberOfBytesRead == 0 ) { // crossed beyond the end of the file. hr = S_FALSE; goto qRead; } if( !bRet ) { hr = HRESULT_FROM_WIN32(GetLastError()); goto qRead; } hr = S_OK; qRead: if( FAILED(hr) ){} } __except ( EXCEPTION_EXECUTE_HANDLER, 1 ) { hr = E_UNEXPECTED; _ASSERTE( false ); } return hr; } HRESULT CRWFile::Write ( OUT LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite, OUT LPDWORD lpNumberOfBytesWritten, OUT LPOVERLAPPED lpOverLapped ) { _ASSERTE( lpBuffer != NULL ); HRESULT hr = E_FAIL; BOOL bRet = false; __try { if( !lpBuffer ) { hr = E_INVALIDARG; goto qWrite; } bRet = WriteFile( m_hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, lpOverLapped ); if( !bRet ) { hr = HRESULT_FROM_WIN32(GetLastError()); goto qWrite; } hr = S_OK; qWrite: if( FAILED(hr) ){} } __except ( EXCEPTION_EXECUTE_HANDLER, 1 ) { hr = E_UNEXPECTED; _ASSERTE( false ); } return hr; }