ReactOS 0.4.16-dev-2354-g16de117
filelockbytes.c File Reference
#include <assert.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include <limits.h>
#include "windef.h"
#include "winbase.h"
#include "winuser.h"
#include "winerror.h"
#include "objbase.h"
#include "ole2.h"
#include "storage32.h"
#include "wine/debug.h"
Include dependency graph for filelockbytes.c:

Go to the source code of this file.

Classes

struct  FileLockBytesImpl
 

Macros

#define COBJMACROS
 

Typedefs

typedef struct FileLockBytesImpl FileLockBytesImpl
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (storage)
 
static FileLockBytesImplimpl_from_ILockBytes (ILockBytes *iface)
 
static DWORD GetProtectMode (DWORD openFlags)
 
HRESULT FileLockBytesImpl_Construct (HANDLE hFile, DWORD openFlags, LPCWSTR pwcsName, ILockBytes **pLockBytes)
 
static HRESULT WINAPI FileLockBytesImpl_QueryInterface (ILockBytes *iface, REFIID riid, void **ppvObject)
 
static ULONG WINAPI FileLockBytesImpl_AddRef (ILockBytes *iface)
 
static ULONG WINAPI FileLockBytesImpl_Release (ILockBytes *iface)
 
static HRESULT WINAPI FileLockBytesImpl_ReadAt (ILockBytes *iface, ULARGE_INTEGER ulOffset, void *pv, ULONG cb, ULONG *pcbRead)
 
static HRESULT WINAPI FileLockBytesImpl_WriteAt (ILockBytes *iface, ULARGE_INTEGER ulOffset, const void *pv, ULONG cb, ULONG *pcbWritten)
 
static HRESULT WINAPI FileLockBytesImpl_Flush (ILockBytes *iface)
 
static HRESULT WINAPI FileLockBytesImpl_SetSize (ILockBytes *iface, ULARGE_INTEGER newSize)
 
static HRESULT get_lock_error (void)
 
static HRESULT WINAPI FileLockBytesImpl_LockRegion (ILockBytes *iface, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
 
static HRESULT WINAPI FileLockBytesImpl_UnlockRegion (ILockBytes *iface, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
 
static HRESULT WINAPI FileLockBytesImpl_Stat (ILockBytes *iface, STATSTG *pstatstg, DWORD grfStatFlag)
 

Variables

static const ILockBytesVtbl FileLockBytesImpl_Vtbl
 

Macro Definition Documentation

◆ COBJMACROS

#define COBJMACROS

Definition at line 30 of file filelockbytes.c.

Typedef Documentation

◆ FileLockBytesImpl

Function Documentation

◆ FileLockBytesImpl_AddRef()

static ULONG WINAPI FileLockBytesImpl_AddRef ( ILockBytes iface)
static

Definition at line 144 of file filelockbytes.c.

145{
147 return InterlockedIncrement(&This->ref);
148}
#define InterlockedIncrement
Definition: armddk.h:53
static FileLockBytesImpl * impl_from_ILockBytes(ILockBytes *iface)
Definition: filelockbytes.c:55

◆ FileLockBytesImpl_Construct()

HRESULT FileLockBytesImpl_Construct ( HANDLE  hFile,
DWORD  openFlags,
LPCWSTR  pwcsName,
ILockBytes **  pLockBytes 
)

Definition at line 86 of file filelockbytes.c.

87{
89 WCHAR fullpath[MAX_PATH];
90
92 return E_FAIL;
93
95
96 if (!This)
97 return E_OUTOFMEMORY;
98
99 This->ILockBytes_iface.lpVtbl = &FileLockBytesImpl_Vtbl;
100 This->ref = 1;
101 This->hfile = hFile;
102 This->flProtect = GetProtectMode(openFlags);
103
104 if(pwcsName) {
105 if (!GetFullPathNameW(pwcsName, MAX_PATH, fullpath, NULL))
106 {
107 lstrcpynW(fullpath, pwcsName, MAX_PATH);
108 }
109 This->pwcsName = HeapAlloc(GetProcessHeap(), 0,
110 (lstrlenW(fullpath)+1)*sizeof(WCHAR));
111 if (!This->pwcsName)
112 {
114 return E_OUTOFMEMORY;
115 }
116 lstrcpyW(This->pwcsName, fullpath);
117 }
118 else
119 This->pwcsName = NULL;
120
121 *pLockBytes = &This->ILockBytes_iface;
122
123 return S_OK;
124}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
#define GetProcessHeap()
Definition: compat.h:736
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define HeapAlloc
Definition: compat.h:733
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
#define lstrcpyW
Definition: compat.h:749
#define lstrcpynW
Definition: compat.h:738
#define lstrlenW
Definition: compat.h:750
DWORD WINAPI GetFullPathNameW(IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart)
Definition: path.c:1106
static const ILockBytesVtbl FileLockBytesImpl_Vtbl
Definition: filelockbytes.c:53
static DWORD GetProtectMode(DWORD openFlags)
Definition: filelockbytes.c:70
#define S_OK
Definition: intsafe.h:52
_In_ HANDLE hFile
Definition: mswsock.h:90
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by StorageImpl_Construct().

◆ FileLockBytesImpl_Flush()

static HRESULT WINAPI FileLockBytesImpl_Flush ( ILockBytes iface)
static

Definition at line 280 of file filelockbytes.c.

281{
282 return S_OK;
283}

◆ FileLockBytesImpl_LockRegion()

static HRESULT WINAPI FileLockBytesImpl_LockRegion ( ILockBytes iface,
ULARGE_INTEGER  libOffset,
ULARGE_INTEGER  cb,
DWORD  dwLockType 
)
static

Definition at line 321 of file filelockbytes.c.

323{
325 OVERLAPPED ol;
326 DWORD lock_flags = LOCKFILE_FAIL_IMMEDIATELY;
327
328 TRACE("ofs %lu count %lu flags %lx\n", libOffset.LowPart, cb.LowPart, dwLockType);
329
330 if (dwLockType & LOCK_WRITE)
332
333 if (dwLockType & (LOCK_EXCLUSIVE|LOCK_ONLYONCE))
334 lock_flags |= LOCKFILE_EXCLUSIVE_LOCK;
335
336 ol.hEvent = 0;
337 ol.Offset = libOffset.LowPart;
338 ol.OffsetHigh = libOffset.HighPart;
339
340 if (LockFileEx(This->hfile, lock_flags, 0, cb.LowPart, cb.HighPart, &ol))
341 return S_OK;
342 return get_lock_error();
343}
BOOL WINAPI LockFileEx(IN HANDLE hFile, IN DWORD dwFlags, IN DWORD dwReserved, IN DWORD nNumberOfBytesToLockLow, IN DWORD nNumberOfBytesToLockHigh, IN LPOVERLAPPED lpOverlapped)
Definition: lock.c:82
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
static HRESULT get_lock_error(void)
unsigned long DWORD
Definition: ntddk_ex.h:95
#define LOCKFILE_FAIL_IMMEDIATELY
Definition: minwinbase.h:100
#define LOCKFILE_EXCLUSIVE_LOCK
Definition: minwinbase.h:101
#define TRACE(s)
Definition: solgame.cpp:4
DWORD OffsetHigh
Definition: minwinbase.h:226
DWORD Offset
Definition: minwinbase.h:225
HANDLE hEvent
Definition: minwinbase.h:230
$ULONG LowPart
Definition: ntbasedef.h:581
$ULONG HighPart
Definition: ntbasedef.h:582
#define STG_E_INVALIDFUNCTION
Definition: winerror.h:3659

◆ FileLockBytesImpl_QueryInterface()

static HRESULT WINAPI FileLockBytesImpl_QueryInterface ( ILockBytes iface,
REFIID  riid,
void **  ppvObject 
)
static

Definition at line 128 of file filelockbytes.c.

130{
131 if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_ILockBytes))
132 *ppvObject = iface;
133 else
134 {
135 *ppvObject = NULL;
136 return E_NOINTERFACE;
137 }
138
139 IUnknown_AddRef((IUnknown*)*ppvObject);
140
141 return S_OK;
142}
const GUID IID_IUnknown
REFIID riid
Definition: atlbase.h:39
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define E_NOINTERFACE
Definition: winerror.h:3479

◆ FileLockBytesImpl_ReadAt()

static HRESULT WINAPI FileLockBytesImpl_ReadAt ( ILockBytes iface,
ULARGE_INTEGER  ulOffset,
void pv,
ULONG  cb,
ULONG pcbRead 
)
static

Definition at line 175 of file filelockbytes.c.

181{
183 ULONG bytes_left = cb;
184 LPBYTE readPtr = pv;
185 BOOL ret;
187 ULONG cbRead;
188
189 TRACE("%p, %ld, %p, %lu, %p.\n", iface, ulOffset.LowPart, pv, cb, pcbRead);
190
191 /* verify a sane environment */
192 if (!This) return E_FAIL;
193
194 if (pcbRead)
195 *pcbRead = 0;
196
197 offset.QuadPart = ulOffset.QuadPart;
198
200
201 if (!ret)
202 return STG_E_READFAULT;
203
204 while (bytes_left)
205 {
206 ret = ReadFile(This->hfile, readPtr, bytes_left, &cbRead, NULL);
207
208 if (!ret || cbRead == 0)
209 return STG_E_READFAULT;
210
211 if (pcbRead)
212 *pcbRead += cbRead;
213
214 bytes_left -= cbRead;
215 readPtr += cbRead;
216 }
217
218 TRACE("finished\n");
219 return S_OK;
220}
#define FILE_BEGIN
Definition: compat.h:761
#define ReadFile(a, b, c, d, e)
Definition: compat.h:742
BOOL WINAPI SetFilePointerEx(HANDLE hFile, LARGE_INTEGER liDistanceToMove, PLARGE_INTEGER lpNewFilePointer, DWORD dwMoveMethod)
Definition: fileinfo.c:177
return ret
Definition: mutex.c:146
unsigned int BOOL
Definition: ntddk_ex.h:94
GLintptr offset
Definition: glext.h:5920
ULONGLONG QuadPart
Definition: ms-dtyp.idl:185
unsigned char * LPBYTE
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
#define STG_E_READFAULT
Definition: winerror.h:3671

◆ FileLockBytesImpl_Release()

static ULONG WINAPI FileLockBytesImpl_Release ( ILockBytes iface)
static

Definition at line 150 of file filelockbytes.c.

151{
153 ULONG ref;
154
156
157 if (ref == 0)
158 {
159 CloseHandle(This->hfile);
160 HeapFree(GetProcessHeap(), 0, This->pwcsName);
162 }
163
164 return ref;
165}
#define InterlockedDecrement
Definition: armddk.h:52
#define CloseHandle
Definition: compat.h:739
Definition: send.c:48

◆ FileLockBytesImpl_SetSize()

static HRESULT WINAPI FileLockBytesImpl_SetSize ( ILockBytes iface,
ULARGE_INTEGER  newSize 
)
static

Definition at line 291 of file filelockbytes.c.

292{
294 HRESULT hr = S_OK;
295 LARGE_INTEGER newpos;
296
297 TRACE("new size %lu\n", newSize.LowPart);
298
299 newpos.QuadPart = newSize.QuadPart;
300 if (SetFilePointerEx(This->hfile, newpos, NULL, FILE_BEGIN))
301 {
302 SetEndOfFile(This->hfile);
303 }
304
305 return hr;
306}
BOOL WINAPI SetEndOfFile(HANDLE hFile)
Definition: fileinfo.c:988
HRESULT hr
Definition: shlfolder.c:183
LONGLONG QuadPart
Definition: typedefs.h:114

◆ FileLockBytesImpl_Stat()

static HRESULT WINAPI FileLockBytesImpl_Stat ( ILockBytes iface,
STATSTG *  pstatstg,
DWORD  grfStatFlag 
)
static

Definition at line 365 of file filelockbytes.c.

367{
369
370 if (!(STATFLAG_NONAME & grfStatFlag) && This->pwcsName)
371 {
372 pstatstg->pwcsName =
373 CoTaskMemAlloc((lstrlenW(This->pwcsName)+1)*sizeof(WCHAR));
374
375 lstrcpyW(pstatstg->pwcsName, This->pwcsName);
376 }
377 else
378 pstatstg->pwcsName = NULL;
379
380 pstatstg->type = STGTY_LOCKBYTES;
381
382 pstatstg->cbSize.LowPart = GetFileSize(This->hfile, &pstatstg->cbSize.HighPart);
383 /* FIXME: If the implementation is exported, we'll need to set other fields. */
384
385 pstatstg->grfLocksSupported = LOCK_EXCLUSIVE|LOCK_ONLYONCE|WINE_LOCK_READ;
386
387 return S_OK;
388}
DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh)
Definition: fileinfo.c:331
void *WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: malloc.c:381
#define WINE_LOCK_READ
Definition: storage32.h:523

◆ FileLockBytesImpl_UnlockRegion()

static HRESULT WINAPI FileLockBytesImpl_UnlockRegion ( ILockBytes iface,
ULARGE_INTEGER  libOffset,
ULARGE_INTEGER  cb,
DWORD  dwLockType 
)
static

Definition at line 345 of file filelockbytes.c.

347{
349 OVERLAPPED ol;
350
351 TRACE("ofs %lu count %lu flags %lx\n", libOffset.LowPart, cb.LowPart, dwLockType);
352
353 if (dwLockType & LOCK_WRITE)
355
356 ol.hEvent = 0;
357 ol.Offset = libOffset.LowPart;
358 ol.OffsetHigh = libOffset.HighPart;
359
360 if (UnlockFileEx(This->hfile, 0, cb.LowPart, cb.HighPart, &ol))
361 return S_OK;
362 return get_lock_error();
363}
BOOL WINAPI UnlockFileEx(IN HANDLE hFile, IN DWORD dwReserved, IN DWORD nNumberOfBytesToUnLockLow, IN DWORD nNumberOfBytesToUnLockHigh, IN LPOVERLAPPED lpOverlapped)
Definition: lock.c:183

◆ FileLockBytesImpl_WriteAt()

static HRESULT WINAPI FileLockBytesImpl_WriteAt ( ILockBytes iface,
ULARGE_INTEGER  ulOffset,
const void pv,
ULONG  cb,
ULONG pcbWritten 
)
static

Definition at line 230 of file filelockbytes.c.

236{
238 ULONG bytes_left = cb;
239 const BYTE *writePtr = pv;
240 BOOL ret;
242 ULONG cbWritten;
243
244 TRACE("%p, %ld, %p, %lu, %p.\n", iface, ulOffset.LowPart, pv, cb, pcbWritten);
245
246 /* verify a sane environment */
247 if (!This) return E_FAIL;
248
249 if (This->flProtect != PAGE_READWRITE)
250 return STG_E_ACCESSDENIED;
251
252 if (pcbWritten)
253 *pcbWritten = 0;
254
255 offset.QuadPart = ulOffset.QuadPart;
256
258
259 if (!ret)
260 return STG_E_WRITEFAULT;
261
262 while (bytes_left)
263 {
264 ret = WriteFile(This->hfile, writePtr, bytes_left, &cbWritten, NULL);
265
266 if (!ret)
267 return STG_E_WRITEFAULT;
268
269 if (pcbWritten)
270 *pcbWritten += cbWritten;
271
272 bytes_left -= cbWritten;
273 writePtr += cbWritten;
274 }
275
276 TRACE("finished\n");
277 return S_OK;
278}
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
#define PAGE_READWRITE
Definition: nt_native.h:1307
#define STG_E_ACCESSDENIED
Definition: winerror.h:3663
#define STG_E_WRITEFAULT
Definition: winerror.h:3670
unsigned char BYTE
Definition: xxhash.c:193

◆ get_lock_error()

static HRESULT get_lock_error ( void  )
static

Definition at line 308 of file filelockbytes.c.

309{
310 switch (GetLastError())
311 {
312 case ERROR_LOCK_VIOLATION: return STG_E_LOCKVIOLATION; break;
313 case ERROR_ACCESS_DENIED: return STG_E_ACCESSDENIED; break;
314 case ERROR_NOT_SUPPORTED: return STG_E_INVALIDFUNCTION; break;
315 default:
316 FIXME("no mapping for error %ld\n", GetLastError());
318 }
319}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define ERROR_NOT_SUPPORTED
Definition: compat.h:100
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define STG_E_LOCKVIOLATION
Definition: winerror.h:3673
#define ERROR_LOCK_VIOLATION
Definition: winerror.h:258

Referenced by FileLockBytesImpl_LockRegion(), and FileLockBytesImpl_UnlockRegion().

◆ GetProtectMode()

static DWORD GetProtectMode ( DWORD  openFlags)
static

Definition at line 70 of file filelockbytes.c.

71{
72 switch(STGM_ACCESS_MODE(openFlags))
73 {
74 case STGM_WRITE:
75 case STGM_READWRITE:
76 return PAGE_READWRITE;
77 }
78 return PAGE_READONLY;
79}
#define PAGE_READONLY
Definition: compat.h:138
#define STGM_READWRITE
Definition: objbase.h:936
#define STGM_WRITE
Definition: objbase.h:935
#define STGM_ACCESS_MODE(stgm)
Definition: storage32.h:115

Referenced by FileLockBytesImpl_Construct().

◆ impl_from_ILockBytes()

static FileLockBytesImpl * impl_from_ILockBytes ( ILockBytes iface)
inlinestatic

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( storage  )

Variable Documentation

◆ FileLockBytesImpl_Vtbl

static const ILockBytesVtbl FileLockBytesImpl_Vtbl
static
Initial value:
= {
}
static ULONG WINAPI FileLockBytesImpl_Release(ILockBytes *iface)
static HRESULT WINAPI FileLockBytesImpl_UnlockRegion(ILockBytes *iface, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
static ULONG WINAPI FileLockBytesImpl_AddRef(ILockBytes *iface)
static HRESULT WINAPI FileLockBytesImpl_WriteAt(ILockBytes *iface, ULARGE_INTEGER ulOffset, const void *pv, ULONG cb, ULONG *pcbWritten)
static HRESULT WINAPI FileLockBytesImpl_Flush(ILockBytes *iface)
static HRESULT WINAPI FileLockBytesImpl_Stat(ILockBytes *iface, STATSTG *pstatstg, DWORD grfStatFlag)
static HRESULT WINAPI FileLockBytesImpl_ReadAt(ILockBytes *iface, ULARGE_INTEGER ulOffset, void *pv, ULONG cb, ULONG *pcbRead)
static HRESULT WINAPI FileLockBytesImpl_SetSize(ILockBytes *iface, ULARGE_INTEGER newSize)
static HRESULT WINAPI FileLockBytesImpl_LockRegion(ILockBytes *iface, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
static HRESULT WINAPI FileLockBytesImpl_QueryInterface(ILockBytes *iface, REFIID riid, void **ppvObject)

Definition at line 53 of file filelockbytes.c.

Referenced by FileLockBytesImpl_Construct().