Commit 775e5f7b authored by Alexandre Julliard's avatar Alexandre Julliard

kernel32: Reset stdio handles when they are closed.

parent 5d4a7433
......@@ -2713,10 +2713,12 @@ BOOL WINAPI CloseHandle( HANDLE handle )
NTSTATUS status;
/* stdio handles need special treatment */
if ((handle == (HANDLE)STD_INPUT_HANDLE) ||
(handle == (HANDLE)STD_OUTPUT_HANDLE) ||
(handle == (HANDLE)STD_ERROR_HANDLE))
handle = GetStdHandle( HandleToULong(handle) );
if (handle == (HANDLE)STD_INPUT_HANDLE)
handle = InterlockedExchangePointer( &NtCurrentTeb()->Peb->ProcessParameters->hStdInput, 0 );
else if (handle == (HANDLE)STD_OUTPUT_HANDLE)
handle = InterlockedExchangePointer( &NtCurrentTeb()->Peb->ProcessParameters->hStdOutput, 0 );
else if (handle == (HANDLE)STD_ERROR_HANDLE)
handle = InterlockedExchangePointer( &NtCurrentTeb()->Peb->ProcessParameters->hStdError, 0 );
if (is_console_handle(handle))
return CloseConsoleHandle(handle);
......
......@@ -1742,6 +1742,7 @@ static void test_ProcessName(void)
static void test_Handles(void)
{
HANDLE handle = GetCurrentProcess();
HANDLE h2;
BOOL ret;
DWORD code;
......@@ -1769,6 +1770,15 @@ static void test_Handles(void)
ok( !ret, "GetExitCodeProcess succeeded for %p\n", handle );
ok( GetLastError() == ERROR_INVALID_HANDLE, "wrong error %u\n", GetLastError() );
#endif
handle = GetStdHandle( STD_ERROR_HANDLE );
ok( handle != 0, "handle %p\n", handle );
CloseHandle( (HANDLE)STD_ERROR_HANDLE );
h2 = GetStdHandle( STD_ERROR_HANDLE );
ok( h2 == 0 ||
broken( h2 == handle) || /* nt4, w2k */
broken( h2 == INVALID_HANDLE_VALUE), /* win9x */
"wrong handle %p/%p\n", h2, handle );
}
static void test_SystemInfo(void)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment