CreateFile access/sharing problem

Michael Ost most at museresearch.com
Mon Oct 3 13:20:16 CDT 2005


Any suggestions for how to handle a difference in file access and
sharing handling between Wine (20050830) and WinXP? A program
demonstrating the problem is attached below.

A 3rd party installer program for a VST plugin is calling CreateFile
with dwDesiredAccess = 0x1f01ff and dwSharedMode = FILE_SHARE_WRITE. It
then calls ReadFile, which fails in Wine (error 5) but succeeds in
WinXP.

My "solution" (polite term) was to force GENERIC_READ|GENERIC_WRITE
access in ntdll/NtCreateFile if the sharing type is FILE_SHARE_WRITE. 

I have not been able to figure out from the header files what named
constants the program used for dwDesiredAccess, so I hard coded it with
the values the program used in my example. 

But I did notice that FILE_ALL_ACCESS is a different value in Wine and
my VC98 headers from DevStudio 6. In Wine it is:
(STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x1ff)
In VC98:
(STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3ff)
Is this a Wine bug?

The "access" and "sharing" parameters to CreateFile are making me feel
stupid. I read and read and read the docs at 
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/createfile.asp
and still can't really figure out what they are supposed to do! I am
pretty sure that my hack wouldn't stand and would love to hear the right
way to fix this problem.

Thanks... mo

#include <stdio.h>		// printf
#include <windows.h>

int main(int argc, char *argv[])
{
	if (argc < 2) {
		puts("usage: wine file-access-test.exe.so PATH");
		puts("Tests the access used by the Ivory Library Tools program that doesn't work with wine.");
		return(1);
	}

	HANDLE file = ::CreateFile(argv[1], 0x1f01ff, FILE_SHARE_WRITE, NULL, 
		OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	if (file != INVALID_HANDLE_VALUE) {
		DWORD bytesRead;
		char bufr[32];

		// passes in winxp; fails (error 5) in wine
		if (::ReadFile(file, bufr, sizeof(bufr), &bytesRead, NULL))
			printf("Read %ld bytes\n", bytesRead);
		else
			printf("ReadFile error: %d\n", ::GetLastError());
		::CloseHandle(file);
	}
	else
		printf("CreateFile error: %d\n", ::GetLastError());

	return(0);
}





More information about the wine-devel mailing list