On Tue, 2012-06-19 at 20:55 +0200, robert.van.h...@serioustoys.com wrote:
> > Yes, the concern is that the file could be changed or removed. We should
> > test what native does here but it probably means that we need to create a 
> > stream
> > on the file with a sharing mode that denies writing.
> 
> So... I tried this out. I do not understand what I found though!
> 
> On Windows, after MSI_RecordSetStreamFromFileW, you CAN call DeleteFile on 
> that file.
> But you cannot open the file for writing; that will give ERROR_ACCESS_DENIED.
> 
> I found in the specs of DeleteFile that this behaviour is understandable, 
> because 
> "
> The DeleteFile function marks a file for deletion on close. Therefore, the 
> file
> deletion does not occur until the last handle to the file is closed. 
> Subsequent
> calls to CreateFile to open the file fail with ERROR_ACCESS_DENIED.
> "
> 
> On the other hand, it says:
> "
> The DeleteFile function fails if an application attempts to delete a file that
> is open for normal I/O or as a memory-mapped file.
> "
> 
> So... I figured that somehow in the MS implementation of 
> RecordSetStreamFromFile
> they called SHCreateStreamOnFileEx with parameters that allowed it to be 
> scheduled
> for deletion through DeleteFile, and didn't allow the file to be opened again 
> for
> writing.
> 
> So far so good.
> 
> So I set out to find this combination of parameters and I cannot find it.  I 
> saw
> that for CreateFile, you can pass FILE_SHARE_DELETE, and I guess that that 
> allows
> for DeleteFile to be called. However, you cannot pass flags to 
> SHCreateStreamOnFileEx
> that will cause this flag to be set...

We don't have to call SHCreateStreamOnFileEx, we can add a suitable 
implementation to msi.




Reply via email to