kernel32: Fix last error value of GetStdHandle/SetStdHandle when called with wrong std handle.

This commit is contained in:
Peter Oberndorfer 2010-09-22 19:54:38 +02:00 committed by Alexandre Julliard
parent 297b054e74
commit 9d74a70ad5
2 changed files with 38 additions and 2 deletions

View File

@ -396,7 +396,7 @@ HANDLE WINAPI GetStdHandle( DWORD std_handle )
case STD_OUTPUT_HANDLE: return NtCurrentTeb()->Peb->ProcessParameters->hStdOutput; case STD_OUTPUT_HANDLE: return NtCurrentTeb()->Peb->ProcessParameters->hStdOutput;
case STD_ERROR_HANDLE: return NtCurrentTeb()->Peb->ProcessParameters->hStdError; case STD_ERROR_HANDLE: return NtCurrentTeb()->Peb->ProcessParameters->hStdError;
} }
SetLastError( ERROR_INVALID_PARAMETER ); SetLastError( ERROR_INVALID_HANDLE );
return INVALID_HANDLE_VALUE; return INVALID_HANDLE_VALUE;
} }
@ -412,7 +412,7 @@ BOOL WINAPI SetStdHandle( DWORD std_handle, HANDLE handle )
case STD_OUTPUT_HANDLE: NtCurrentTeb()->Peb->ProcessParameters->hStdOutput = handle; return TRUE; case STD_OUTPUT_HANDLE: NtCurrentTeb()->Peb->ProcessParameters->hStdOutput = handle; return TRUE;
case STD_ERROR_HANDLE: NtCurrentTeb()->Peb->ProcessParameters->hStdError = handle; return TRUE; case STD_ERROR_HANDLE: NtCurrentTeb()->Peb->ProcessParameters->hStdError = handle; return TRUE;
} }
SetLastError( ERROR_INVALID_PARAMETER ); SetLastError( ERROR_INVALID_HANDLE );
return FALSE; return FALSE;
} }

View File

@ -1134,6 +1134,41 @@ static void test_VerifyConsoleIoHandle(void)
ok(error == 0xdeadbeef, "wrong GetLastError() %d\n", error); ok(error == 0xdeadbeef, "wrong GetLastError() %d\n", error);
} }
static void test_GetSetStdHandle(void)
{
HANDLE handle;
DWORD error;
BOOL ret;
/* get invalid std handle */
SetLastError(0xdeadbeef);
handle = GetStdHandle(42);
error = GetLastError();
ok(error == ERROR_INVALID_HANDLE || broken(error == ERROR_INVALID_FUNCTION)/* Win9x */,
"wrong GetLastError() %d\n", error);
ok(handle == INVALID_HANDLE_VALUE, "expected INVALID_HANDLE_VALUE\n");
/* get valid */
SetLastError(0xdeadbeef);
handle = GetStdHandle(STD_INPUT_HANDLE);
error = GetLastError();
ok(error == 0xdeadbeef, "wrong GetLastError() %d\n", error);
/* set invalid std handle */
SetLastError(0xdeadbeef);
ret = SetStdHandle(42, handle);
error = GetLastError();
ok(!ret, "expected SetStdHandle to fail\n");
ok(error == ERROR_INVALID_HANDLE || broken(error == ERROR_INVALID_FUNCTION)/* Win9x */,
"wrong GetLastError() %d\n", error);
/* set valid (restore old value) */
SetLastError(0xdeadbeef);
ret = SetStdHandle(STD_INPUT_HANDLE, handle);
error = GetLastError();
ok(ret, "expected SetStdHandle to succeed\n");
ok(error == 0xdeadbeef, "wrong GetLastError() %d\n", error);
}
START_TEST(console) START_TEST(console)
{ {
@ -1187,4 +1222,5 @@ START_TEST(console)
test_GetConsoleProcessList(); test_GetConsoleProcessList();
test_OpenConsoleW(); test_OpenConsoleW();
test_VerifyConsoleIoHandle(); test_VerifyConsoleIoHandle();
test_GetSetStdHandle();
} }