/*
* Check that we're compatible with the parent's storage mode
*/
- if ( !(This->openFlags & STGM_TRANSACTED) &&
- STGM_ACCESS_MODE( grfMode ) > STGM_ACCESS_MODE( This->openFlags ) )
+ if (This->openFlags & STGM_TRANSACTED)
+ {
+ if ( (STGM_ACCESS_MODE( grfMode ) != STGM_WRITE &&
+ STGM_SHARE_MODE( grfMode ) == STGM_SHARE_EXCLUSIVE) &&
+ STGM_ACCESS_MODE( This->openFlags ) == STGM_WRITE )
+ {
+ WARN("grfMode %x is not compatible with %x\n", grfMode, This->openFlags);
+ return STG_E_INVALIDFLAG;
+ }
+ }
+ else if ( STGM_ACCESS_MODE( grfMode ) > STGM_ACCESS_MODE( This->openFlags ) )
{
WARN("access denied\n");
return STG_E_ACCESSDENIED;
/*
* An element with this name already exists
*/
- if (STGM_CREATE_MODE(grfMode) == STGM_CREATE &&
- ((This->openFlags & STGM_TRANSACTED) ||
+ if ((This->openFlags & STGM_TRANSACTED) ||
+ (STGM_CREATE_MODE(grfMode) == STGM_CREATE &&
STGM_ACCESS_MODE(This->openFlags) != STGM_READ))
{
hr = IStorage_DestroyElement(iface, pwcsName);
if ((plkbyt == 0) || (ppstgOpen == 0))
return STG_E_INVALIDPOINTER;
- if ( FAILED( validateSTGM(grfMode) ))
+ if ( FAILED( validateSTGM(grfMode) ) ||
+ STGM_CREATE_MODE(grfMode) == STGM_CREATE )
return STG_E_INVALIDFLAG;
*ppstgOpen = 0;
return E_FAIL;
}
+ if ( (share == STGM_SHARE_DENY_NONE || share == STGM_SHARE_DENY_READ ||
+ (share == STGM_SHARE_DENY_WRITE && access != STGM_READ)) &&
+ !(stgm & STGM_TRANSACTED) )
+ return E_FAIL;
+
/*
* STGM_DIRECT | STGM_TRANSACTED | STGM_SIMPLE
*/