Bernhard Loos : kernel32: CreateFile uses an nonalertable io mode.
Alexandre Julliard
julliard at winehq.org
Tue Aug 23 12:45:06 CDT 2011
Module: wine
Branch: master
Commit: c19d166529008dcc48ab4f713febff4a9922c810
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c19d166529008dcc48ab4f713febff4a9922c810
Author: Bernhard Loos <bernhardloos at googlemail.com>
Date: Tue Aug 23 11:33:51 2011 +0200
kernel32: CreateFile uses an nonalertable io mode.
---
dlls/kernel32/file.c | 2 +-
dlls/kernel32/tests/file.c | 18 ++++++++++++++++++
2 files changed, 19 insertions(+), 1 deletions(-)
diff --git a/dlls/kernel32/file.c b/dlls/kernel32/file.c
index 79cfc97..194960b 100644
--- a/dlls/kernel32/file.c
+++ b/dlls/kernel32/file.c
@@ -1361,7 +1361,7 @@ HANDLE WINAPI CreateFileW( LPCWSTR filename, DWORD access, DWORD sharing,
if (attributes & FILE_FLAG_NO_BUFFERING)
options |= FILE_NO_INTERMEDIATE_BUFFERING;
if (!(attributes & FILE_FLAG_OVERLAPPED))
- options |= FILE_SYNCHRONOUS_IO_ALERT;
+ options |= FILE_SYNCHRONOUS_IO_NONALERT;
if (attributes & FILE_FLAG_RANDOM_ACCESS)
options |= FILE_RANDOM_ACCESS;
attributes &= FILE_ATTRIBUTE_VALID_FLAGS;
diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c
index 59803c6..df2ab37 100644
--- a/dlls/kernel32/tests/file.c
+++ b/dlls/kernel32/tests/file.c
@@ -38,6 +38,7 @@ static BOOL (WINAPI *pReplaceFileA)(LPCSTR, LPCSTR, LPCSTR, DWORD, LPVOID, LPVOI
static BOOL (WINAPI *pReplaceFileW)(LPCWSTR, LPCWSTR, LPCWSTR, DWORD, LPVOID, LPVOID);
static UINT (WINAPI *pGetSystemWindowsDirectoryA)(LPSTR, UINT);
static BOOL (WINAPI *pGetVolumeNameForVolumeMountPointA)(LPCSTR, LPSTR, DWORD);
+static DWORD WINAPI (*pQueueUserAPC)(PAPCFUNC pfnAPC, HANDLE hThread, ULONG_PTR dwData);
/* keep filename and filenameW the same */
static const char filename[] = "testfile.xxx";
@@ -71,6 +72,7 @@ static void InitFunctionPointers(void)
pReplaceFileW=(void*)GetProcAddress(hkernel32, "ReplaceFileW");
pGetSystemWindowsDirectoryA=(void*)GetProcAddress(hkernel32, "GetSystemWindowsDirectoryA");
pGetVolumeNameForVolumeMountPointA = (void *) GetProcAddress(hkernel32, "GetVolumeNameForVolumeMountPointA");
+ pQueueUserAPC = (void *) GetProcAddress(hkernel32, "QueueUserAPC");
}
static void test__hread( void )
@@ -2362,6 +2364,12 @@ static void test_async_file_errors(void)
HeapFree(GetProcessHeap(), 0, lpBuffer);
}
+static BOOL user_apc_ran;
+static void CALLBACK user_apc(ULONG_PTR param)
+{
+ user_apc_ran = TRUE;
+}
+
static void test_read_write(void)
{
DWORD bytes, ret, old_prot;
@@ -2382,6 +2390,12 @@ static void test_read_write(void)
CREATE_ALWAYS, FILE_FLAG_RANDOM_ACCESS, 0);
ok(hFile != INVALID_HANDLE_VALUE, "CreateFileA: error %d\n", GetLastError());
+ user_apc_ran = FALSE;
+ if (pQueueUserAPC) {
+ trace("Queueing an user APC\n"); /* verify the file is non alerable */
+ ok(pQueueUserAPC(&user_apc, GetCurrentThread(), 0), "QueueUserAPC failed: %d\n", GetLastError());
+ }
+
SetLastError(12345678);
bytes = 12345678;
ret = WriteFile(hFile, NULL, 0, &bytes, NULL);
@@ -2418,6 +2432,10 @@ static void test_read_write(void)
"ret = %d, error %d\n", ret, GetLastError());
ok(!bytes, "bytes = %d\n", bytes);
+ ok(user_apc_ran == FALSE, "UserAPC ran, file using alertable io mode\n");
+ if (pQueueUserAPC)
+ SleepEx(0, TRUE); /* get rid of apc */
+
/* test passing protected memory as buffer */
mem = VirtualAlloc( NULL, 0x4000, MEM_COMMIT, PAGE_READWRITE );
More information about the wine-cvs
mailing list