Add a test for ReadFile/WriteFile fault handling, make it pass under Wine.
diff --git a/dlls/kernel/tests/file.c b/dlls/kernel/tests/file.c index 4bfae61..2ce3243 100644 --- a/dlls/kernel/tests/file.c +++ b/dlls/kernel/tests/file.c
@@ -1265,6 +1265,61 @@ /*printf("Error = %ld\n", GetLastError());*/ } +static void test_read_write(void) +{ + DWORD bytes, ret; + HANDLE hFile; + char temp_path[MAX_PATH]; + char filename[MAX_PATH]; + static const char prefix[] = "pfx"; + + ret = GetTempPathA(MAX_PATH, temp_path); + ok(ret != 0, "GetTempPathA error %ld\n", GetLastError()); + ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n"); + + ret = GetTempFileNameA(temp_path, prefix, 0, filename); + ok(ret != 0, "GetTempFileNameA error %ld\n", GetLastError()); + + hFile = CreateFileA(filename, GENERIC_READ | GENERIC_WRITE, 0, NULL, + CREATE_ALWAYS, FILE_FLAG_RANDOM_ACCESS, 0); + ok(hFile != INVALID_HANDLE_VALUE, "CreateFileA: error %ld\n", GetLastError()); + + SetLastError(12345678); + bytes = 12345678; + ret = WriteFile(hFile, NULL, 0, &bytes, NULL); + ok(ret && GetLastError() == 12345678, + "ret = %ld, error %ld\n", ret, GetLastError()); + ok(!bytes, "bytes = %ld\n", bytes); + + SetLastError(12345678); + bytes = 12345678; + ret = WriteFile(hFile, NULL, 10, &bytes, NULL); + ok((!ret && GetLastError() == ERROR_INVALID_USER_BUFFER) || /* Win2k */ + (ret && GetLastError() == 12345678), /* Win9x */ + "ret = %ld, error %ld\n", ret, GetLastError()); + ok(!bytes || /* Win2k */ + bytes == 10, /* Win9x */ + "bytes = %ld\n", bytes); + + SetLastError(12345678); + bytes = 12345678; + ret = ReadFile(hFile, NULL, 0, &bytes, NULL); + ok(ret && GetLastError() == 12345678, + "ret = %ld, error %ld\n", ret, GetLastError()); + ok(!bytes, "bytes = %ld\n", bytes); + + SetLastError(12345678); + bytes = 12345678; + ret = ReadFile(hFile, NULL, 10, &bytes, NULL); + ok(!ret && (GetLastError() == ERROR_NOACCESS || /* Win2k */ + GetLastError() == ERROR_INVALID_PARAMETER), /* Win9x */ + "ret = %ld, error %ld\n", ret, GetLastError()); + ok(!bytes, "bytes = %ld\n", bytes); + + ok(CloseHandle(hFile), "CloseHandle: error %ld\n", GetLastError()); + ok(DeleteFileA(filename), "DeleteFileA: error %ld\n", GetLastError()); +} + START_TEST(file) { test__hread( ); @@ -1292,4 +1347,5 @@ test_MapFile(); test_GetFileType(); test_async_file_errors(); + test_read_write(); }