ole32: STGM_PRIORITY allows other IStorage objects to be opened in transacted mode with read/write access.
This commit is contained in:
parent
6c6ce70260
commit
6dd5dbef64
@ -5914,7 +5914,6 @@ HRESULT WINAPI StgOpenStorage(
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* STGM_PRIORITY implies exclusive access */
|
|
||||||
if (grfMode & STGM_PRIORITY)
|
if (grfMode & STGM_PRIORITY)
|
||||||
{
|
{
|
||||||
if (grfMode & (STGM_TRANSACTED|STGM_SIMPLE|STGM_NOSCRATCH|STGM_NOSNAPSHOT))
|
if (grfMode & (STGM_TRANSACTED|STGM_SIMPLE|STGM_NOSCRATCH|STGM_NOSNAPSHOT))
|
||||||
@ -5924,13 +5923,20 @@ HRESULT WINAPI StgOpenStorage(
|
|||||||
if(STGM_ACCESS_MODE(grfMode) != STGM_READ)
|
if(STGM_ACCESS_MODE(grfMode) != STGM_READ)
|
||||||
return STG_E_INVALIDFLAG;
|
return STG_E_INVALIDFLAG;
|
||||||
grfMode &= ~0xf0; /* remove the existing sharing mode */
|
grfMode &= ~0xf0; /* remove the existing sharing mode */
|
||||||
grfMode |= STGM_SHARE_DENY_WRITE;
|
grfMode |= STGM_SHARE_DENY_NONE;
|
||||||
|
|
||||||
|
/* STGM_PRIORITY stops other IStorage objects on the same file from
|
||||||
|
* committing until the STGM_PRIORITY IStorage is closed. it also
|
||||||
|
* stops non-transacted mode StgOpenStorage calls with write access from
|
||||||
|
* succeeding. obviously, both of these cannot be achieved through just
|
||||||
|
* file share flags */
|
||||||
|
FIXME("STGM_PRIORITY mode not implemented correctly\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Validate the sharing mode
|
* Validate the sharing mode
|
||||||
*/
|
*/
|
||||||
if (!(grfMode & STGM_TRANSACTED))
|
if (!(grfMode & (STGM_TRANSACTED|STGM_PRIORITY)))
|
||||||
switch(STGM_SHARE_MODE(grfMode))
|
switch(STGM_SHARE_MODE(grfMode))
|
||||||
{
|
{
|
||||||
case STGM_SHARE_EXCLUSIVE:
|
case STGM_SHARE_EXCLUSIVE:
|
||||||
|
@ -626,6 +626,7 @@ static void test_storage_refcount(void)
|
|||||||
static const WCHAR szDot[] = { '.',0 };
|
static const WCHAR szDot[] = { '.',0 };
|
||||||
WCHAR filename[MAX_PATH];
|
WCHAR filename[MAX_PATH];
|
||||||
IStorage *stg = NULL;
|
IStorage *stg = NULL;
|
||||||
|
IStorage *stgprio = NULL;
|
||||||
HRESULT r;
|
HRESULT r;
|
||||||
IStream *stm = NULL;
|
IStream *stm = NULL;
|
||||||
static const WCHAR stmname[] = { 'C','O','N','T','E','N','T','S',0 };
|
static const WCHAR stmname[] = { 'C','O','N','T','E','N','T','S',0 };
|
||||||
@ -673,10 +674,24 @@ static void test_storage_refcount(void)
|
|||||||
r = IStream_Release(stm);
|
r = IStream_Release(stm);
|
||||||
ok (r == 0, "stream not released\n");
|
ok (r == 0, "stream not released\n");
|
||||||
|
|
||||||
/* test for grfMode open issue */
|
/* tests that STGM_PRIORITY doesn't prevent readwrite access from other
|
||||||
|
* StgOpenStorage calls in transacted mode */
|
||||||
|
r = StgOpenStorage( filename, NULL, STGM_PRIORITY, NULL, 0, &stgprio);
|
||||||
|
ok(r==S_OK, "StgOpenStorage failed with error 0x%08lx\n", r);
|
||||||
|
|
||||||
|
todo_wine {
|
||||||
|
/* non-transacted mode read/write fails */
|
||||||
|
r = StgOpenStorage( filename, NULL, STGM_SHARE_EXCLUSIVE|STGM_READWRITE, NULL, 0, &stg);
|
||||||
|
ok(r==STG_E_LOCKVIOLATION, "StgOpenStorage should return STG_E_LOCKVIOLATION instead of 0x%08lx\n", r);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* non-transacted mode read-only succeeds */
|
||||||
|
r = StgOpenStorage( filename, NULL, STGM_SHARE_DENY_WRITE|STGM_READ, NULL, 0, &stg);
|
||||||
|
ok(r==S_OK, "StgOpenStorage failed with error 0x%08lx\n", r);
|
||||||
|
IStorage_Release(stg);
|
||||||
|
|
||||||
r = StgOpenStorage( filename, NULL, STGM_TRANSACTED|STGM_SHARE_DENY_WRITE|STGM_READWRITE, NULL, 0, &stg);
|
r = StgOpenStorage( filename, NULL, STGM_TRANSACTED|STGM_SHARE_DENY_WRITE|STGM_READWRITE, NULL, 0, &stg);
|
||||||
ok(r==S_OK, "StgOpenStorage failed\n");
|
ok(r==S_OK, "StgOpenStorage failed with error 0x%08lx\n", r);
|
||||||
if(stg)
|
if(stg)
|
||||||
{
|
{
|
||||||
static const WCHAR stgname[] = { ' ',' ',' ','2','9',0 };
|
static const WCHAR stgname[] = { ' ',' ',' ','2','9',0 };
|
||||||
@ -727,6 +742,7 @@ static void test_storage_refcount(void)
|
|||||||
r = IStorage_Release(stg);
|
r = IStorage_Release(stg);
|
||||||
ok(r == 0, "wrong ref count\n");
|
ok(r == 0, "wrong ref count\n");
|
||||||
}
|
}
|
||||||
|
IStorage_Release(stgprio);
|
||||||
|
|
||||||
DeleteFileW(filename);
|
DeleteFileW(filename);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user