Commit 950773dc authored by Alexandre Julliard's avatar Alexandre Julliard

kernel32: Move some handle functions to kernelbase.

parent 73ed539a
...@@ -19,4 +19,4 @@ ...@@ -19,4 +19,4 @@
@ stdcall SetEnvironmentVariableA(str str) kernel32.SetEnvironmentVariableA @ stdcall SetEnvironmentVariableA(str str) kernel32.SetEnvironmentVariableA
@ stdcall SetEnvironmentVariableW(wstr wstr) kernel32.SetEnvironmentVariableW @ stdcall SetEnvironmentVariableW(wstr wstr) kernel32.SetEnvironmentVariableW
@ stdcall SetStdHandle(long long) kernel32.SetStdHandle @ stdcall SetStdHandle(long long) kernel32.SetStdHandle
@ stub SetStdHandleEx @ stdcall SetStdHandleEx(long long ptr) kernel32.SetStdHandleEx
...@@ -21,4 +21,4 @@ ...@@ -21,4 +21,4 @@
@ stdcall SetEnvironmentVariableA(str str) kernel32.SetEnvironmentVariableA @ stdcall SetEnvironmentVariableA(str str) kernel32.SetEnvironmentVariableA
@ stdcall SetEnvironmentVariableW(wstr wstr) kernel32.SetEnvironmentVariableW @ stdcall SetEnvironmentVariableW(wstr wstr) kernel32.SetEnvironmentVariableW
@ stdcall SetStdHandle(long long) kernel32.SetStdHandle @ stdcall SetStdHandle(long long) kernel32.SetStdHandle
@ stub SetStdHandleEx @ stdcall SetStdHandleEx(long long ptr) kernel32.SetStdHandleEx
...@@ -223,7 +223,7 @@ ...@@ -223,7 +223,7 @@
@ stdcall -import ClearCommBreak(long) @ stdcall -import ClearCommBreak(long)
@ stdcall -import ClearCommError(long ptr ptr) @ stdcall -import ClearCommError(long ptr ptr)
@ stdcall CloseConsoleHandle(long) @ stdcall CloseConsoleHandle(long)
@ stdcall CloseHandle(long) @ stdcall -import CloseHandle(long)
# @ stub ClosePrivateNamespace # @ stub ClosePrivateNamespace
@ stdcall CloseProfileUserMapping() @ stdcall CloseProfileUserMapping()
@ stub CloseSystemHandle @ stub CloseSystemHandle
...@@ -385,7 +385,7 @@ ...@@ -385,7 +385,7 @@
# @ stub DosPathToSessionPathA # @ stub DosPathToSessionPathA
# @ stub DosPathToSessionPathW # @ stub DosPathToSessionPathW
@ stdcall DuplicateConsoleHandle(long long long long) @ stdcall DuplicateConsoleHandle(long long long long)
@ stdcall DuplicateHandle(long long long ptr long long long) @ stdcall -import DuplicateHandle(long long long ptr long long long)
# @ stub EnableThreadProfiling # @ stub EnableThreadProfiling
@ stdcall EncodePointer(ptr) ntdll.RtlEncodePointer @ stdcall EncodePointer(ptr) ntdll.RtlEncodePointer
@ stdcall EncodeSystemPointer(ptr) ntdll.RtlEncodeSystemPointer @ stdcall EncodeSystemPointer(ptr) ntdll.RtlEncodeSystemPointer
...@@ -695,7 +695,7 @@ ...@@ -695,7 +695,7 @@
@ stdcall GetGeoInfoA(long long ptr long long) @ stdcall GetGeoInfoA(long long ptr long long)
@ stdcall GetGeoInfoW(long long ptr long long) @ stdcall GetGeoInfoW(long long ptr long long)
@ stdcall GetHandleContext(long) @ stdcall GetHandleContext(long)
@ stdcall GetHandleInformation(long ptr) @ stdcall -import GetHandleInformation(long ptr)
@ stub -i386 GetLSCallbackTarget @ stub -i386 GetLSCallbackTarget
@ stub -i386 GetLSCallbackTemplate @ stub -i386 GetLSCallbackTemplate
@ stdcall GetLargePageMinimum() @ stdcall GetLargePageMinimum()
...@@ -1411,7 +1411,7 @@ ...@@ -1411,7 +1411,7 @@
# @ stub SetFirmwareEnvironmentVariableW # @ stub SetFirmwareEnvironmentVariableW
@ stdcall SetHandleContext(long long) @ stdcall SetHandleContext(long long)
@ stdcall SetHandleCount(long) @ stdcall SetHandleCount(long)
@ stdcall SetHandleInformation(long long long) @ stdcall -import SetHandleInformation(long long long)
@ stdcall SetInformationJobObject(long long ptr long) @ stdcall SetInformationJobObject(long long ptr long)
@ stub SetLastConsoleEventActive @ stub SetLastConsoleEventActive
@ stdcall SetLastError(long) RtlSetLastWin32Error @ stdcall SetLastError(long) RtlSetLastWin32Error
......
...@@ -3197,115 +3197,6 @@ DWORD WINAPI GetProcessFlags( DWORD processid ) ...@@ -3197,115 +3197,6 @@ DWORD WINAPI GetProcessFlags( DWORD processid )
} }
/*********************************************************************
* CloseHandle (KERNEL32.@)
*
* Closes a handle.
*
* PARAMS
* handle [I] Handle to close.
*
* RETURNS
* Success: TRUE.
* Failure: FALSE, check GetLastError().
*/
BOOL WINAPI CloseHandle( HANDLE handle )
{
NTSTATUS status;
/* stdio handles need special treatment */
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);
status = NtClose( handle );
if (status) SetLastError( RtlNtStatusToDosError(status) );
return !status;
}
/*********************************************************************
* GetHandleInformation (KERNEL32.@)
*/
BOOL WINAPI GetHandleInformation( HANDLE handle, LPDWORD flags )
{
OBJECT_DATA_INFORMATION info;
NTSTATUS status = NtQueryObject( handle, ObjectDataInformation, &info, sizeof(info), NULL );
if (status) SetLastError( RtlNtStatusToDosError(status) );
else if (flags)
{
*flags = 0;
if (info.InheritHandle) *flags |= HANDLE_FLAG_INHERIT;
if (info.ProtectFromClose) *flags |= HANDLE_FLAG_PROTECT_FROM_CLOSE;
}
return !status;
}
/*********************************************************************
* SetHandleInformation (KERNEL32.@)
*/
BOOL WINAPI SetHandleInformation( HANDLE handle, DWORD mask, DWORD flags )
{
OBJECT_DATA_INFORMATION info;
NTSTATUS status;
/* if not setting both fields, retrieve current value first */
if ((mask & (HANDLE_FLAG_INHERIT | HANDLE_FLAG_PROTECT_FROM_CLOSE)) !=
(HANDLE_FLAG_INHERIT | HANDLE_FLAG_PROTECT_FROM_CLOSE))
{
if ((status = NtQueryObject( handle, ObjectDataInformation, &info, sizeof(info), NULL )))
{
SetLastError( RtlNtStatusToDosError(status) );
return FALSE;
}
}
if (mask & HANDLE_FLAG_INHERIT)
info.InheritHandle = (flags & HANDLE_FLAG_INHERIT) != 0;
if (mask & HANDLE_FLAG_PROTECT_FROM_CLOSE)
info.ProtectFromClose = (flags & HANDLE_FLAG_PROTECT_FROM_CLOSE) != 0;
status = NtSetInformationObject( handle, ObjectDataInformation, &info, sizeof(info) );
if (status) SetLastError( RtlNtStatusToDosError(status) );
return !status;
}
/*********************************************************************
* DuplicateHandle (KERNEL32.@)
*/
BOOL WINAPI DuplicateHandle( HANDLE source_process, HANDLE source,
HANDLE dest_process, HANDLE *dest,
DWORD access, BOOL inherit, DWORD options )
{
NTSTATUS status;
if (is_console_handle(source))
{
/* FIXME: this test is not sufficient, we need to test process ids, not handles */
if (source_process != dest_process ||
source_process != GetCurrentProcess())
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
*dest = DuplicateConsoleHandle( source, access, inherit, options );
return (*dest != INVALID_HANDLE_VALUE);
}
status = NtDuplicateObject( source_process, source, dest_process, dest,
access, inherit ? OBJ_INHERIT : 0, options );
if (status) SetLastError( RtlNtStatusToDosError(status) );
return !status;
}
/*********************************************************************** /***********************************************************************
* ConvertToGlobalHandle (KERNEL32.@) * ConvertToGlobalHandle (KERNEL32.@)
*/ */
......
...@@ -56,12 +56,6 @@ static CRITICAL_SECTION console_section = { &critsect_debug, -1, 0, 0, 0, 0 }; ...@@ -56,12 +56,6 @@ static CRITICAL_SECTION console_section = { &critsect_debug, -1, 0, 0, 0, 0 };
static WCHAR input_exe[MAX_PATH + 1]; static WCHAR input_exe[MAX_PATH + 1];
/* map a real wineserver handle onto a kernel32 console handle */
static inline HANDLE console_handle_map( HANDLE h )
{
return h != INVALID_HANDLE_VALUE ? (HANDLE)((UINT_PTR)h ^ 3) : INVALID_HANDLE_VALUE;
}
/* map a kernel32 console handle onto a real wineserver handle */ /* map a kernel32 console handle onto a real wineserver handle */
static inline obj_handle_t console_handle_unmap( HANDLE h ) static inline obj_handle_t console_handle_unmap( HANDLE h )
{ {
......
...@@ -36,6 +36,12 @@ static inline BOOL is_console_handle(HANDLE h) ...@@ -36,6 +36,12 @@ static inline BOOL is_console_handle(HANDLE h)
return h != INVALID_HANDLE_VALUE && ((UINT_PTR)h & 3) == 3; return h != INVALID_HANDLE_VALUE && ((UINT_PTR)h & 3) == 3;
} }
/* map between ntdll handle and kernel32 console handle */
static inline HANDLE console_handle_map( HANDLE h )
{
return h != INVALID_HANDLE_VALUE ? (HANDLE)((UINT_PTR)h ^ 3) : INVALID_HANDLE_VALUE;
}
static inline BOOL set_ntstatus( NTSTATUS status ) static inline BOOL set_ntstatus( NTSTATUS status )
{ {
if (status) SetLastError( RtlNtStatusToDosError( status )); if (status) SetLastError( RtlNtStatusToDosError( status ));
......
...@@ -135,7 +135,7 @@ ...@@ -135,7 +135,7 @@
@ stdcall ClearCommBreak(long) @ stdcall ClearCommBreak(long)
@ stdcall ClearCommError(long ptr ptr) @ stdcall ClearCommError(long ptr ptr)
# @ stub CloseGlobalizationUserSettingsKey # @ stub CloseGlobalizationUserSettingsKey
@ stdcall CloseHandle(long) kernel32.CloseHandle @ stdcall CloseHandle(long)
# @ stub ClosePackageInfo # @ stub ClosePackageInfo
# @ stub ClosePrivateNamespace # @ stub ClosePrivateNamespace
# @ stub CloseState # @ stub CloseState
...@@ -279,7 +279,7 @@ ...@@ -279,7 +279,7 @@
# @ stub DsReadNgcKeyW # @ stub DsReadNgcKeyW
# @ stub DsUnBindW # @ stub DsUnBindW
# @ stub DsWriteNgcKeyW # @ stub DsWriteNgcKeyW
@ stdcall DuplicateHandle(long long long ptr long long long) kernel32.DuplicateHandle @ stdcall DuplicateHandle(long long long ptr long long long)
# @ stub DuplicateStateContainerHandle # @ stub DuplicateStateContainerHandle
@ stdcall DuplicateToken(long long ptr) @ stdcall DuplicateToken(long long ptr)
@ stdcall DuplicateTokenEx(long long ptr long long ptr) @ stdcall DuplicateTokenEx(long long ptr long long ptr)
...@@ -531,7 +531,7 @@ ...@@ -531,7 +531,7 @@
# @ stub GetGPOListInternalA # @ stub GetGPOListInternalA
# @ stub GetGPOListInternalW # @ stub GetGPOListInternalW
@ stdcall GetGeoInfoW(long long ptr long long) kernel32.GetGeoInfoW @ stdcall GetGeoInfoW(long long ptr long long) kernel32.GetGeoInfoW
@ stdcall GetHandleInformation(long ptr) kernel32.GetHandleInformation @ stdcall GetHandleInformation(long ptr)
# @ stub GetHivePath # @ stub GetHivePath
# @ stub GetIntegratedDisplaySize # @ stub GetIntegratedDisplaySize
# @ stub GetIsEdpEnabled # @ stub GetIsEdpEnabled
...@@ -1440,8 +1440,8 @@ ...@@ -1440,8 +1440,8 @@
@ stdcall SetFileSecurityW(wstr long ptr) @ stdcall SetFileSecurityW(wstr long ptr)
@ stdcall SetFileTime(long ptr ptr ptr) @ stdcall SetFileTime(long ptr ptr ptr)
@ stdcall SetFileValidData(ptr int64) @ stdcall SetFileValidData(ptr int64)
@ stdcall SetHandleCount(long) kernel32.SetHandleCount @ stdcall SetHandleCount(long)
@ stdcall SetHandleInformation(long long long) kernel32.SetHandleInformation @ stdcall SetHandleInformation(long long long)
# @ stub SetIsDeveloperModeEnabled # @ stub SetIsDeveloperModeEnabled
# @ stub SetIsSideloadingEnabled # @ stub SetIsSideloadingEnabled
@ stdcall SetKernelObjectSecurity(long long ptr) @ stdcall SetKernelObjectSecurity(long long ptr)
......
...@@ -42,6 +42,44 @@ static DWORD shutdown_priority = 0x280; ...@@ -42,6 +42,44 @@ static DWORD shutdown_priority = 0x280;
***********************************************************************/ ***********************************************************************/
/*********************************************************************
* CloseHandle (kernelbase.@)
*/
BOOL WINAPI DECLSPEC_HOTPATCH CloseHandle( HANDLE 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 )) handle = console_handle_map( handle );
return set_ntstatus( NtClose( handle ));
}
/*********************************************************************
* DuplicateHandle (kernelbase.@)
*/
BOOL WINAPI DECLSPEC_HOTPATCH DuplicateHandle( HANDLE source_process, HANDLE source,
HANDLE dest_process, HANDLE *dest,
DWORD access, BOOL inherit, DWORD options )
{
if (is_console_handle( source ))
{
source = console_handle_map( source );
if (!set_ntstatus( NtDuplicateObject( source_process, source, dest_process, dest,
access, inherit ? OBJ_INHERIT : 0, options )))
return FALSE;
*dest = console_handle_map( *dest );
return TRUE;
}
return set_ntstatus( NtDuplicateObject( source_process, source, dest_process, dest,
access, inherit ? OBJ_INHERIT : 0, options ));
}
/**************************************************************************** /****************************************************************************
* FlushInstructionCache (kernelbase.@) * FlushInstructionCache (kernelbase.@)
*/ */
...@@ -96,6 +134,26 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetExitCodeProcess( HANDLE process, LPDWORD exit_c ...@@ -96,6 +134,26 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetExitCodeProcess( HANDLE process, LPDWORD exit_c
} }
/*********************************************************************
* GetHandleInformation (kernelbase.@)
*/
BOOL WINAPI DECLSPEC_HOTPATCH GetHandleInformation( HANDLE handle, DWORD *flags )
{
OBJECT_DATA_INFORMATION info;
if (!set_ntstatus( NtQueryObject( handle, ObjectDataInformation, &info, sizeof(info), NULL )))
return FALSE;
if (flags)
{
*flags = 0;
if (info.InheritHandle) *flags |= HANDLE_FLAG_INHERIT;
if (info.ProtectFromClose) *flags |= HANDLE_FLAG_PROTECT_FROM_CLOSE;
}
return TRUE;
}
/*********************************************************************** /***********************************************************************
* GetPriorityClass (kernelbase.@) * GetPriorityClass (kernelbase.@)
*/ */
...@@ -254,6 +312,38 @@ UINT WINAPI DECLSPEC_HOTPATCH SetErrorMode( UINT mode ) ...@@ -254,6 +312,38 @@ UINT WINAPI DECLSPEC_HOTPATCH SetErrorMode( UINT mode )
} }
/*************************************************************************
* SetHandleCount (kernelbase.@)
*/
UINT WINAPI DECLSPEC_HOTPATCH SetHandleCount( UINT count )
{
return count;
}
/*********************************************************************
* SetHandleInformation (kernelbase.@)
*/
BOOL WINAPI DECLSPEC_HOTPATCH SetHandleInformation( HANDLE handle, DWORD mask, DWORD flags )
{
OBJECT_DATA_INFORMATION info;
/* if not setting both fields, retrieve current value first */
if ((mask & (HANDLE_FLAG_INHERIT | HANDLE_FLAG_PROTECT_FROM_CLOSE)) !=
(HANDLE_FLAG_INHERIT | HANDLE_FLAG_PROTECT_FROM_CLOSE))
{
if (!set_ntstatus( NtQueryObject( handle, ObjectDataInformation, &info, sizeof(info), NULL )))
return FALSE;
}
if (mask & HANDLE_FLAG_INHERIT)
info.InheritHandle = (flags & HANDLE_FLAG_INHERIT) != 0;
if (mask & HANDLE_FLAG_PROTECT_FROM_CLOSE)
info.ProtectFromClose = (flags & HANDLE_FLAG_PROTECT_FROM_CLOSE) != 0;
return set_ntstatus( NtSetInformationObject( handle, ObjectDataInformation, &info, sizeof(info) ));
}
/*********************************************************************** /***********************************************************************
* SetPriorityClass (kernelbase.@) * SetPriorityClass (kernelbase.@)
*/ */
......
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