26 if (
_hFile != INVALID_HANDLE_VALUE)
34 HANDLE hFile = ::CreateFileW(pName, fWrite ? GENERIC_WRITE : GENERIC_READ, FILE_SHARE_READ,
35 NULL, fWrite ? CREATE_ALWAYS : OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
37 if (hFile == INVALID_HANDLE_VALUE)
38 return HRESULT_FROM_WIN32(GetLastError());
50 if (iid == __uuidof(IUnknown)
51 || iid == __uuidof(IStream)
52 || iid == __uuidof(ISequentialStream))
54 *ppvObject =
static_cast<IStream*
>(
this);
63 return (ULONG)InterlockedIncrement(&
_refcount);
68 ULONG res = (ULONG) InterlockedDecrement(&
_refcount);
76 BOOL rc = ReadFile(
_hFile, pv, cb, pcbRead, NULL);
77 return (rc) ? S_OK : HRESULT_FROM_WIN32(GetLastError());
82 BOOL rc = WriteFile(
_hFile, pv, cb, pcbWritten, NULL);
83 return rc ? S_OK : HRESULT_FROM_WIN32(GetLastError());
86 HRESULT STDMETHODCALLTYPE
FileStream::Seek(LARGE_INTEGER liDistanceToMove, DWORD dwOrigin,
87 ULARGE_INTEGER* lpNewFilePointer)
94 dwMoveMethod = FILE_BEGIN;
97 dwMoveMethod = FILE_CURRENT;
100 dwMoveMethod = FILE_END;
103 return STG_E_INVALIDFUNCTION;
107 if (SetFilePointerEx(
_hFile, liDistanceToMove, (PLARGE_INTEGER) lpNewFilePointer,
109 return HRESULT_FROM_WIN32(GetLastError());
115 if (GetFileSizeEx(
_hFile, (PLARGE_INTEGER) &pStatstg->cbSize) == 0)
116 return HRESULT_FROM_WIN32(GetLastError());
virtual ULONG STDMETHODCALLTYPE Release(void)
virtual HRESULT STDMETHODCALLTYPE Read(void *pv, ULONG cb, ULONG *pcbRead)
virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove, DWORD dwOrigin, ULARGE_INTEGER *lpNewFilePointer)
virtual HRESULT STDMETHODCALLTYPE Write(void const *pv, ULONG cb, ULONG *pcbWritten)
virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG *pStatstg, DWORD grfStatFlag)
virtual ULONG STDMETHODCALLTYPE AddRef(void)
virtual ~FileStream(void)
static HRESULT OpenFile(LPCWSTR pName, IStream **ppStream, bool fWrite)
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject)
FileStream(HANDLE hFile)
File-based implementation of IStream interface.