mirror of https://github.com/tongzx/nt5src
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.
253 lines
5.4 KiB
253 lines
5.4 KiB
// EmFile.cpp : Implementation of CEmFile
|
|
#include "stdafx.h"
|
|
#include "Emsvc.h"
|
|
#include "EmFile.h"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CEmFile
|
|
|
|
STDMETHODIMP CEmFile::InterfaceSupportsErrorInfo(REFIID riid)
|
|
{
|
|
static const IID* arr[] =
|
|
{
|
|
&IID_IEmFile
|
|
};
|
|
for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
|
|
{
|
|
if (::InlineIsEqualGUID(*arr[i],riid))
|
|
return S_OK;
|
|
}
|
|
return S_FALSE;
|
|
}
|
|
|
|
CEmFile::CEmFile()
|
|
{
|
|
m_hEmFile = INVALID_HANDLE_VALUE;
|
|
m_bstrFileName = NULL;
|
|
}
|
|
|
|
CEmFile::~CEmFile()
|
|
{
|
|
if( m_hEmFile != INVALID_HANDLE_VALUE ) {
|
|
|
|
CloseHandle( m_hEmFile );
|
|
m_hEmFile = INVALID_HANDLE_VALUE;
|
|
}
|
|
|
|
if( m_bstrFileName ) { SysFreeString( m_bstrFileName ); m_bstrFileName = NULL; }
|
|
}
|
|
|
|
STDMETHODIMP CEmFile::Read(void *pv, ULONG cb, ULONG *pcbRead)
|
|
{
|
|
_ASSERTE( pv != NULL );
|
|
_ASSERTE( cb != 0L );
|
|
_ASSERTE( m_hEmFile != INVALID_HANDLE_VALUE );
|
|
|
|
HRESULT hr = E_FAIL;
|
|
|
|
__try
|
|
{
|
|
if( pv == NULL || cb == 0L ) { hr = E_INVALIDARG; goto qRead; }
|
|
if( m_hEmFile == INVALID_HANDLE_VALUE ) { hr = EMERROR_OBJECTNOTINITIALIZED; goto qRead; }
|
|
|
|
if( ReadFile(
|
|
m_hEmFile,
|
|
pv,
|
|
cb,
|
|
pcbRead,
|
|
NULL
|
|
) == false ) {
|
|
|
|
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;
|
|
}
|
|
|
|
STDMETHODIMP CEmFile::Write(void const *pv, ULONG cb, ULONG *pcbWritten)
|
|
{
|
|
// TODO: Add your implementation code here
|
|
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP CEmFile::Seek(LARGE_INTEGER dlibMove, ULONG dwOrigin, ULARGE_INTEGER *plibNewPosition)
|
|
{
|
|
// TODO: Add your implementation code here
|
|
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP CEmFile::SetSize(ULARGE_INTEGER libNewSize)
|
|
{
|
|
// TODO: Add your implementation code here
|
|
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP CEmFile::CopyTo(IStream *pstm, ULARGE_INTEGER cb, ULARGE_INTEGER *pcbRead, ULARGE_INTEGER *pcbWritten)
|
|
{
|
|
// TODO: Add your implementation code here
|
|
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP CEmFile::Commit(DWORD grfCommitFlags)
|
|
{
|
|
// TODO: Add your implementation code here
|
|
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP CEmFile::Revert()
|
|
{
|
|
// TODO: Add your implementation code here
|
|
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP CEmFile::LockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
|
|
{
|
|
// TODO: Add your implementation code here
|
|
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP CEmFile::UnlockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
|
|
{
|
|
// TODO: Add your implementation code here
|
|
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP CEmFile::Stat(STATSTG *pstatstg, DWORD grfStatFlag)
|
|
{
|
|
// TODO: Add your implementation code here
|
|
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP CEmFile::Clone(IStream **ppstm)
|
|
{
|
|
// TODO: Add your implementation code here
|
|
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHODIMP CEmFile::InitFile(BSTR bstrFileName)
|
|
{
|
|
_ASSERTE( bstrFileName != NULL );
|
|
|
|
HRESULT hr = E_FAIL;
|
|
|
|
__try
|
|
{
|
|
|
|
if( bstrFileName == NULL ){ hr = E_INVALIDARG; goto qInitFile; }
|
|
|
|
m_bstrFileName = SysAllocString( bstrFileName );
|
|
_ASSERTE( m_bstrFileName != NULL );
|
|
|
|
if( m_bstrFileName == NULL ) { hr = E_OUTOFMEMORY; goto qInitFile; }
|
|
|
|
hr = CreateEmFile();
|
|
if( FAILED(hr) ) { goto qInitFile; }
|
|
|
|
hr = S_OK;
|
|
|
|
qInitFile:
|
|
|
|
if( FAILED(hr) ) {
|
|
|
|
if( m_bstrFileName ) { SysFreeString( m_bstrFileName ); m_bstrFileName = NULL; }
|
|
}
|
|
|
|
}
|
|
__except ( EXCEPTION_EXECUTE_HANDLER, 1 ) {
|
|
|
|
hr = E_UNEXPECTED;
|
|
|
|
if( m_bstrFileName ) { SysFreeString( m_bstrFileName ); m_bstrFileName = NULL; }
|
|
|
|
_ASSERTE( false );
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT
|
|
CEmFile::CreateEmFile
|
|
(
|
|
IN DWORD dwDesiredAccess /*= GENERIC_READ*/,
|
|
IN DWORD dwShareMode /*= FILE_SHARE_READ*/,
|
|
IN LPSECURITY_ATTRIBUTES lpSecurityAttributes /*= NULL*/,
|
|
IN DWORD dwCreationDisposition /*= OPEN_EXISTING*/,
|
|
IN DWORD dwFlagsAndAttributes /*= FILE_ATTRIBUTE_NORMAL*/,
|
|
IN HANDLE hTemplateFile /*= NULL*/
|
|
)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
DWORD dwLastRet = 0L;
|
|
|
|
__try
|
|
{
|
|
|
|
m_hEmFile = ::CreateFile (
|
|
m_bstrFileName,
|
|
dwDesiredAccess,
|
|
dwShareMode,
|
|
lpSecurityAttributes,
|
|
dwCreationDisposition,
|
|
dwFlagsAndAttributes,
|
|
hTemplateFile
|
|
);
|
|
|
|
if( m_hEmFile == INVALID_HANDLE_VALUE ) {
|
|
|
|
hr = HRESULT_FROM_WIN32( GetLastError() );
|
|
goto qCreateEmFile;
|
|
}
|
|
|
|
hr = S_OK;
|
|
|
|
qCreateEmFile:
|
|
|
|
if( FAILED(hr) ) {
|
|
|
|
if( m_hEmFile != INVALID_HANDLE_VALUE ) {
|
|
|
|
CloseHandle( m_hEmFile );
|
|
m_hEmFile = INVALID_HANDLE_VALUE;
|
|
}
|
|
}
|
|
}
|
|
__except ( EXCEPTION_EXECUTE_HANDLER, 1 ) {
|
|
|
|
hr = E_UNEXPECTED;
|
|
|
|
if( m_hEmFile != INVALID_HANDLE_VALUE ) {
|
|
|
|
CloseHandle( m_hEmFile );
|
|
m_hEmFile = INVALID_HANDLE_VALUE;
|
|
}
|
|
|
|
_ASSERTE( false );
|
|
}
|
|
|
|
return hr;
|
|
}
|