mirror of
git://source.winehq.org/git/wine.git
synced 2024-07-21 19:34:10 +00:00
kernelbase: Also pass CreateFile2 file flags to CreateFileW.
Instead of just attributes. Otherwise we may miss important flags like FILE_FLAG_OVERLAPPED and open the file for synchronous I/O, causing a deadlock in Flight Simulator. Signed-off-by: Rémi Bernon <rbernon@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
e447e86ae2
commit
1445ae79e6
|
@ -1675,14 +1675,14 @@ static void test_CreateFileW(void)
|
|||
|
||||
static void test_CreateFile2(void)
|
||||
{
|
||||
HANDLE hFile;
|
||||
HANDLE hFile, iocp;
|
||||
WCHAR temp_path[MAX_PATH];
|
||||
WCHAR filename[MAX_PATH];
|
||||
CREATEFILE2_EXTENDED_PARAMETERS exparams;
|
||||
static const WCHAR emptyW[]={'\0'};
|
||||
static const WCHAR prefix[] = {'p','f','x',0};
|
||||
static const WCHAR bogus[] = { '\\', '\\', '.', '\\', 'B', 'O', 'G', 'U', 'S', 0 };
|
||||
DWORD ret;
|
||||
DWORD i, ret;
|
||||
|
||||
if (!pCreateFile2)
|
||||
{
|
||||
|
@ -1699,8 +1699,8 @@ static void test_CreateFile2(void)
|
|||
|
||||
SetLastError(0xdeadbeef);
|
||||
exparams.dwSize = sizeof(exparams);
|
||||
exparams.dwFileAttributes = FILE_FLAG_RANDOM_ACCESS;
|
||||
exparams.dwFileFlags = 0;
|
||||
exparams.dwFileAttributes = 0;
|
||||
exparams.dwFileFlags = FILE_FLAG_RANDOM_ACCESS;
|
||||
exparams.dwSecurityQosFlags = 0;
|
||||
exparams.lpSecurityAttributes = NULL;
|
||||
exparams.hTemplateFile = 0;
|
||||
|
@ -1744,14 +1744,46 @@ static void test_CreateFile2(void)
|
|||
|
||||
ret = CreateDirectoryW(filename, NULL);
|
||||
ok(ret == TRUE, "couldn't create temporary directory\n");
|
||||
exparams.dwFileAttributes = FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS;
|
||||
exparams.dwFileAttributes = FILE_ATTRIBUTE_NORMAL;
|
||||
exparams.dwFileFlags = FILE_FLAG_BACKUP_SEMANTICS;
|
||||
SetLastError(0xdeadbeef);
|
||||
hFile = pCreateFile2(filename, GENERIC_READ | GENERIC_WRITE, 0, OPEN_ALWAYS, &exparams);
|
||||
todo_wine
|
||||
ok(hFile == INVALID_HANDLE_VALUE,
|
||||
"expected CreateFile2 to fail on existing directory, error: %d\n", GetLastError());
|
||||
ok(hFile != INVALID_HANDLE_VALUE,
|
||||
"CreateFile2 failed with FILE_FLAG_BACKUP_SEMANTICS on existing directory, error: %d\n", GetLastError());
|
||||
CloseHandle(hFile);
|
||||
ret = RemoveDirectoryW(filename);
|
||||
ok(ret, "DeleteFileW: error %d\n", GetLastError());
|
||||
|
||||
for (i = 0; i < 2; ++i)
|
||||
{
|
||||
memset(&exparams, 0, sizeof(exparams));
|
||||
exparams.dwSize = sizeof(exparams);
|
||||
if (i == 0)
|
||||
{
|
||||
exparams.dwFileAttributes = FILE_ATTRIBUTE_NORMAL;
|
||||
exparams.dwFileFlags = FILE_FLAG_OVERLAPPED | FILE_FLAG_DELETE_ON_CLOSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
exparams.dwFileFlags = FILE_ATTRIBUTE_NORMAL;
|
||||
exparams.dwFileAttributes = FILE_FLAG_OVERLAPPED | FILE_FLAG_DELETE_ON_CLOSE;
|
||||
}
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
hFile = pCreateFile2(filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, CREATE_ALWAYS, &exparams);
|
||||
ok(hFile != INVALID_HANDLE_VALUE && GetLastError() == 0, "%d: hFile %p, last error %u\n", i, hFile, GetLastError());
|
||||
|
||||
iocp = CreateIoCompletionPort(hFile, NULL, 0, 2);
|
||||
if (i == 1) ok(iocp == NULL && GetLastError() == ERROR_INVALID_PARAMETER, "%d: CreateIoCompletionPort returned %p, error %u\n", i, iocp, GetLastError());
|
||||
else ok(iocp != INVALID_HANDLE_VALUE && GetLastError() == 0, "%d: CreateIoCompletionPort returned %p, error %u\n", i, iocp, GetLastError());
|
||||
|
||||
CloseHandle(iocp);
|
||||
CloseHandle(hFile);
|
||||
|
||||
ret = DeleteFileW(filename);
|
||||
if (i == 1) ok(ret, "%d: unexpected DeleteFileW failure, error %u\n", i, GetLastError());
|
||||
else ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND, "%d: unexpected DeleteFileW result, ret %d error %u\n", i, ret, GetLastError());
|
||||
}
|
||||
}
|
||||
|
||||
static void test_GetTempFileNameA(void)
|
||||
|
|
|
@ -655,13 +655,39 @@ BOOL WINAPI DECLSPEC_HOTPATCH CreateDirectoryExW( LPCWSTR template, LPCWSTR path
|
|||
HANDLE WINAPI DECLSPEC_HOTPATCH CreateFile2( LPCWSTR name, DWORD access, DWORD sharing, DWORD creation,
|
||||
CREATEFILE2_EXTENDED_PARAMETERS *params )
|
||||
{
|
||||
static const DWORD attributes_mask = FILE_ATTRIBUTE_READONLY |
|
||||
FILE_ATTRIBUTE_HIDDEN |
|
||||
FILE_ATTRIBUTE_SYSTEM |
|
||||
FILE_ATTRIBUTE_ARCHIVE |
|
||||
FILE_ATTRIBUTE_NORMAL |
|
||||
FILE_ATTRIBUTE_TEMPORARY |
|
||||
FILE_ATTRIBUTE_OFFLINE |
|
||||
FILE_ATTRIBUTE_ENCRYPTED |
|
||||
FILE_ATTRIBUTE_INTEGRITY_STREAM;
|
||||
static const DWORD flags_mask = FILE_FLAG_BACKUP_SEMANTICS |
|
||||
FILE_FLAG_DELETE_ON_CLOSE |
|
||||
FILE_FLAG_NO_BUFFERING |
|
||||
FILE_FLAG_OPEN_NO_RECALL |
|
||||
FILE_FLAG_OPEN_REPARSE_POINT |
|
||||
FILE_FLAG_OVERLAPPED |
|
||||
FILE_FLAG_POSIX_SEMANTICS |
|
||||
FILE_FLAG_RANDOM_ACCESS |
|
||||
FILE_FLAG_SEQUENTIAL_SCAN |
|
||||
FILE_FLAG_WRITE_THROUGH;
|
||||
|
||||
LPSECURITY_ATTRIBUTES sa = params ? params->lpSecurityAttributes : NULL;
|
||||
DWORD attributes = params ? params->dwFileAttributes : 0;
|
||||
HANDLE template = params ? params->hTemplateFile : NULL;
|
||||
DWORD attributes = params ? params->dwFileAttributes : 0;
|
||||
DWORD flags = params ? params->dwFileFlags : 0;
|
||||
|
||||
FIXME( "(%s %x %x %x %p), partial stub\n", debugstr_w(name), access, sharing, creation, params );
|
||||
|
||||
return CreateFileW( name, access, sharing, sa, creation, attributes, template );
|
||||
if (attributes & ~attributes_mask) FIXME( "unsupported attributes %#x\n", attributes );
|
||||
if (flags & ~flags_mask) FIXME( "unsupported flags %#x\n", flags );
|
||||
attributes &= attributes_mask;
|
||||
flags &= flags_mask;
|
||||
|
||||
return CreateFileW( name, access, sharing, sa, creation, flags | attributes, template );
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue