kernel32: Adapt last error of WriteConsoleInput to better match win8 behaviour
André Hentschel
nerv at dawncrow.de
Wed Jan 1 19:09:07 CST 2014
---
dlls/kernel32/console.c | 10 ++++--
dlls/kernel32/tests/console.c | 78 ++++++++++++++++++++++---------------------
2 files changed, 48 insertions(+), 40 deletions(-)
diff --git a/dlls/kernel32/console.c b/dlls/kernel32/console.c
index 67c353b..d823348 100644
--- a/dlls/kernel32/console.c
+++ b/dlls/kernel32/console.c
@@ -488,7 +488,10 @@ BOOL WINAPI WriteConsoleInputA( HANDLE handle, const INPUT_RECORD *buffer,
{
if (!buffer)
{
- SetLastError( ERROR_INVALID_ACCESS );
+ if (written && handle != INVALID_HANDLE_VALUE)
+ SetLastError(ERROR_NOACCESS);
+ else
+ SetLastError(ERROR_INVALID_ACCESS);
return FALSE;
}
@@ -521,7 +524,10 @@ BOOL WINAPI WriteConsoleInputW( HANDLE handle, const INPUT_RECORD *buffer,
if (count > 0 && !buffer)
{
- SetLastError(ERROR_INVALID_ACCESS);
+ if (written && handle != INVALID_HANDLE_VALUE)
+ SetLastError(ERROR_NOACCESS);
+ else
+ SetLastError(ERROR_INVALID_ACCESS);
return FALSE;
}
diff --git a/dlls/kernel32/tests/console.c b/dlls/kernel32/tests/console.c
index cd7ac23..7c43663 100644
--- a/dlls/kernel32/tests/console.c
+++ b/dlls/kernel32/tests/console.c
@@ -1375,7 +1375,7 @@ static void test_WriteConsoleInputA(HANDLE input_handle)
INPUT_RECORD event_list[5];
MOUSE_EVENT_RECORD mouse_event = { {0, 0}, 0, 0, MOUSE_MOVED };
KEY_EVENT_RECORD key_event;
- DWORD count, console_mode;
+ DWORD count, console_mode, gle;
BOOL ret;
int i;
@@ -1386,31 +1386,31 @@ static void test_WriteConsoleInputA(HANDLE input_handle)
DWORD count;
LPDWORD written;
DWORD expected_count;
- DWORD last_error;
+ DWORD gle, gle2;
int win_crash;
} invalid_table[] =
{
- {NULL, NULL, 0, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
+ {NULL, NULL, 0, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 0, 1},
{NULL, NULL, 0, &count, 0, ERROR_INVALID_HANDLE},
- {NULL, NULL, 1, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
- {NULL, NULL, 1, &count, 0xdeadbeef, ERROR_INVALID_ACCESS},
- {NULL, &event, 0, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
+ {NULL, NULL, 1, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 0, 1},
+ {NULL, NULL, 1, &count, 0xdeadbeef, ERROR_NOACCESS, ERROR_INVALID_ACCESS},
+ {NULL, &event, 0, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 0, 1},
{NULL, &event, 0, &count, 0, ERROR_INVALID_HANDLE},
- {NULL, &event, 1, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
+ {NULL, &event, 1, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 0, 1},
{NULL, &event, 1, &count, 0, ERROR_INVALID_HANDLE},
- {INVALID_HANDLE_VALUE, NULL, 0, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
+ {INVALID_HANDLE_VALUE, NULL, 0, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 0, 1},
{INVALID_HANDLE_VALUE, NULL, 0, &count, 0, ERROR_INVALID_HANDLE},
- {INVALID_HANDLE_VALUE, NULL, 1, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
+ {INVALID_HANDLE_VALUE, NULL, 1, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 0, 1},
{INVALID_HANDLE_VALUE, NULL, 1, &count, 0xdeadbeef, ERROR_INVALID_ACCESS},
- {INVALID_HANDLE_VALUE, &event, 0, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
+ {INVALID_HANDLE_VALUE, &event, 0, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 0, 1},
{INVALID_HANDLE_VALUE, &event, 0, &count, 0, ERROR_INVALID_HANDLE},
- {INVALID_HANDLE_VALUE, &event, 1, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
+ {INVALID_HANDLE_VALUE, &event, 1, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 0, 1},
{INVALID_HANDLE_VALUE, &event, 1, &count, 0, ERROR_INVALID_HANDLE},
- {input_handle, NULL, 0, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
- {input_handle, NULL, 1, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
- {input_handle, NULL, 1, &count, 0xdeadbeef, ERROR_INVALID_ACCESS},
- {input_handle, &event, 0, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
- {input_handle, &event, 1, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
+ {input_handle, NULL, 0, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 0, 1},
+ {input_handle, NULL, 1, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 0, 1},
+ {input_handle, NULL, 1, &count, 0xdeadbeef, ERROR_NOACCESS, ERROR_INVALID_ACCESS},
+ {input_handle, &event, 0, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 0, 1},
+ {input_handle, &event, 1, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 0, 1},
};
/* Suppress external sources of input events for the duration of the test. */
@@ -1455,9 +1455,10 @@ static void test_WriteConsoleInputA(HANDLE input_handle)
"[%d] Expected output count to be %u, got %u\n",
i, invalid_table[i].expected_count, count);
}
- ok(GetLastError() == invalid_table[i].last_error,
- "[%d] Expected last error to be %u, got %u\n",
- i, invalid_table[i].last_error, GetLastError());
+ gle = GetLastError();
+ ok(gle == invalid_table[i].gle || (gle != 0 && gle == invalid_table[i].gle2),
+ "[%d] Expected last error to be %u or %u, got %u\n",
+ i, invalid_table[i].gle, invalid_table[i].gle2, gle);
}
count = 0xdeadbeef;
@@ -1618,7 +1619,7 @@ static void test_WriteConsoleInputW(HANDLE input_handle)
INPUT_RECORD event_list[5];
MOUSE_EVENT_RECORD mouse_event = { {0, 0}, 0, 0, MOUSE_MOVED };
KEY_EVENT_RECORD key_event;
- DWORD count, console_mode;
+ DWORD count, console_mode, gle;
BOOL ret;
int i;
@@ -1629,31 +1630,31 @@ static void test_WriteConsoleInputW(HANDLE input_handle)
DWORD count;
LPDWORD written;
DWORD expected_count;
- DWORD last_error;
+ DWORD gle, gle2;
int win_crash;
} invalid_table[] =
{
- {NULL, NULL, 0, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
+ {NULL, NULL, 0, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 0, 1},
{NULL, NULL, 0, &count, 0, ERROR_INVALID_HANDLE},
- {NULL, NULL, 1, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
- {NULL, NULL, 1, &count, 0xdeadbeef, ERROR_INVALID_ACCESS},
- {NULL, &event, 0, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
+ {NULL, NULL, 1, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 0, 1},
+ {NULL, NULL, 1, &count, 0xdeadbeef, ERROR_NOACCESS, ERROR_INVALID_ACCESS},
+ {NULL, &event, 0, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 0, 1},
{NULL, &event, 0, &count, 0, ERROR_INVALID_HANDLE},
- {NULL, &event, 1, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
+ {NULL, &event, 1, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 0, 1},
{NULL, &event, 1, &count, 0, ERROR_INVALID_HANDLE},
- {INVALID_HANDLE_VALUE, NULL, 0, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
+ {INVALID_HANDLE_VALUE, NULL, 0, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 0, 1},
{INVALID_HANDLE_VALUE, NULL, 0, &count, 0, ERROR_INVALID_HANDLE},
- {INVALID_HANDLE_VALUE, NULL, 1, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
+ {INVALID_HANDLE_VALUE, NULL, 1, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 0, 1},
{INVALID_HANDLE_VALUE, NULL, 1, &count, 0xdeadbeef, ERROR_INVALID_ACCESS},
- {INVALID_HANDLE_VALUE, &event, 0, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
+ {INVALID_HANDLE_VALUE, &event, 0, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 0, 1},
{INVALID_HANDLE_VALUE, &event, 0, &count, 0, ERROR_INVALID_HANDLE},
- {INVALID_HANDLE_VALUE, &event, 1, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
+ {INVALID_HANDLE_VALUE, &event, 1, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 0, 1},
{INVALID_HANDLE_VALUE, &event, 1, &count, 0, ERROR_INVALID_HANDLE},
- {input_handle, NULL, 0, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
- {input_handle, NULL, 1, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
- {input_handle, NULL, 1, &count, 0xdeadbeef, ERROR_INVALID_ACCESS},
- {input_handle, &event, 0, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
- {input_handle, &event, 1, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 1},
+ {input_handle, NULL, 0, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 0, 1},
+ {input_handle, NULL, 1, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 0, 1},
+ {input_handle, NULL, 1, &count, 0xdeadbeef, ERROR_NOACCESS, ERROR_INVALID_ACCESS},
+ {input_handle, &event, 0, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 0, 1},
+ {input_handle, &event, 1, NULL, 0xdeadbeef, ERROR_INVALID_ACCESS, 0, 1},
};
/* Suppress external sources of input events for the duration of the test. */
@@ -1698,9 +1699,10 @@ static void test_WriteConsoleInputW(HANDLE input_handle)
"[%d] Expected output count to be %u, got %u\n",
i, invalid_table[i].expected_count, count);
}
- ok(GetLastError() == invalid_table[i].last_error,
- "[%d] Expected last error to be %u, got %u\n",
- i, invalid_table[i].last_error, GetLastError());
+ gle = GetLastError();
+ ok(gle == invalid_table[i].gle || (gle != 0 && gle == invalid_table[i].gle2),
+ "[%d] Expected last error to be %u or %u, got %u\n",
+ i, invalid_table[i].gle, invalid_table[i].gle2, gle);
}
count = 0xdeadbeef;
--
1.8.1.2
More information about the wine-patches
mailing list