diff --git a/reactos/dll/win32/kernel32/client/handle.c b/reactos/dll/win32/kernel32/client/handle.c index 3f5eef262f7..9cd17590b60 100644 --- a/reactos/dll/win32/kernel32/client/handle.c +++ b/reactos/dll/win32/kernel32/client/handle.c @@ -1,209 +1,206 @@ -/* $Id$ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS system libraries - * FILE: lib/kernel32/misc/handle.c - * PURPOSE: Object functions - * PROGRAMMER: Ariadne ( ariadne@xs4all.nl) - * UPDATE HISTORY: - * Created 01/11/98 +/* + * PROJECT: ReactOS Win32 Base API + * LICENSE: See COPYING in the top level directory + * FILE: dll/win32/kernel32/client/handle.c + * PURPOSE: Object Handle Functions + * PROGRAMMERS: Ariadne ( ariadne@xs4all.nl) */ -/* INCLUDES ******************************************************************/ +/* INCLUDES *******************************************************************/ #include #define NDEBUG #include -/* GLOBALS *******************************************************************/ +/* PRIVATE FUNCTIONS **********************************************************/ -HANDLE WINAPI -DuplicateConsoleHandle (HANDLE hConsole, - DWORD dwDesiredAccess, - BOOL bInheritHandle, - DWORD dwOptions); - -/* FUNCTIONS *****************************************************************/ - -HANDLE FASTCALL -TranslateStdHandle(HANDLE hHandle) +HANDLE +FASTCALL +TranslateStdHandle(IN HANDLE hHandle) { - PRTL_USER_PROCESS_PARAMETERS Ppb = NtCurrentPeb()->ProcessParameters; + PRTL_USER_PROCESS_PARAMETERS Ppb = NtCurrentPeb()->ProcessParameters; - switch ((ULONG)hHandle) + switch ((ULONG)hHandle) { - case STD_INPUT_HANDLE: return Ppb->StandardInput; - case STD_OUTPUT_HANDLE: return Ppb->StandardOutput; - case STD_ERROR_HANDLE: return Ppb->StandardError; + case STD_INPUT_HANDLE: return Ppb->StandardInput; + case STD_OUTPUT_HANDLE: return Ppb->StandardOutput; + case STD_ERROR_HANDLE: return Ppb->StandardError; } - return hHandle; + return hHandle; } +/* PUBLIC FUNCTIONS ***********************************************************/ + /* * @implemented */ -BOOL WINAPI -GetHandleInformation (HANDLE hObject, - LPDWORD lpdwFlags) +BOOL +WINAPI +GetHandleInformation(IN HANDLE hObject, + OUT LPDWORD lpdwFlags) { - OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo; - ULONG BytesWritten; - NTSTATUS Status; - DWORD Flags; + OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo; + ULONG BytesWritten; + NTSTATUS Status; + DWORD Flags; - hObject = TranslateStdHandle(hObject); + hObject = TranslateStdHandle(hObject); - Status = NtQueryObject (hObject, - ObjectHandleFlagInformation, - &HandleInfo, - sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION), - &BytesWritten); - if (NT_SUCCESS(Status)) - { - Flags = 0; - if (HandleInfo.Inherit) - Flags |= HANDLE_FLAG_INHERIT; - if (HandleInfo.ProtectFromClose) - Flags |= HANDLE_FLAG_PROTECT_FROM_CLOSE; - - *lpdwFlags = Flags; - - return TRUE; - } - else - { - BaseSetLastNTError (Status); - return FALSE; - } -} - - -/* - * @implemented - */ -BOOL WINAPI -SetHandleInformation (HANDLE hObject, - DWORD dwMask, - DWORD dwFlags) -{ - OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo; - ULONG BytesWritten; - NTSTATUS Status; - - hObject = TranslateStdHandle(hObject); - - Status = NtQueryObject (hObject, - ObjectHandleFlagInformation, - &HandleInfo, - sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION), - &BytesWritten); - if (NT_SUCCESS(Status)) - { - if (dwMask & HANDLE_FLAG_INHERIT) - HandleInfo.Inherit = (dwFlags & HANDLE_FLAG_INHERIT) != 0; - if (dwMask & HANDLE_FLAG_PROTECT_FROM_CLOSE) - HandleInfo.ProtectFromClose = (dwFlags & HANDLE_FLAG_PROTECT_FROM_CLOSE) != 0; - - Status = NtSetInformationObject (hObject, - ObjectHandleFlagInformation, - &HandleInfo, - sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION)); - if(!NT_SUCCESS(Status)) + if (IsConsoleHandle(hObject)) { - BaseSetLastNTError (Status); - return FALSE; - } - - return TRUE; - } - else - { - BaseSetLastNTError (Status); - return FALSE; - } -} - - -/* - * @implemented - */ -BOOL WINAPI CloseHandle(HANDLE hObject) -/* - * FUNCTION: Closes an open object handle - * PARAMETERS: - * hObject = Identifies an open object handle - * RETURNS: If the function succeeds, the return value is nonzero - * If the function fails, the return value is zero - */ -{ - NTSTATUS Status; - - hObject = TranslateStdHandle(hObject); - - if (IsConsoleHandle(hObject)) - { - return(CloseConsoleHandle(hObject)); - } - - Status = NtClose(hObject); - if (!NT_SUCCESS(Status)) - { - BaseSetLastNTError (Status); - return FALSE; - } - - return TRUE; -} - - -/* - * @implemented - */ -BOOL WINAPI DuplicateHandle(HANDLE hSourceProcessHandle, - HANDLE hSourceHandle, - HANDLE hTargetProcessHandle, - LPHANDLE lpTargetHandle, - DWORD dwDesiredAccess, - BOOL bInheritHandle, - DWORD dwOptions) -{ - DWORD SourceProcessId, TargetProcessId; - NTSTATUS Status; - - hSourceHandle = TranslateStdHandle(hSourceHandle); - - if (IsConsoleHandle(hSourceHandle)) - { - SourceProcessId = GetProcessId(hSourceProcessHandle); - TargetProcessId = GetProcessId(hTargetProcessHandle); - if (!SourceProcessId || !TargetProcessId || - SourceProcessId != TargetProcessId || - SourceProcessId != GetCurrentProcessId()) - { - SetLastError(ERROR_INVALID_PARAMETER); + /* FIXME: GetConsoleHandleInformation required */ + UNIMPLEMENTED; + BaseSetLastNTError(STATUS_NOT_IMPLEMENTED); return FALSE; - } + } - *lpTargetHandle = DuplicateConsoleHandle(hSourceHandle, dwDesiredAccess, bInheritHandle, dwOptions); - return *lpTargetHandle != INVALID_HANDLE_VALUE; - } + Status = NtQueryObject(hObject, + ObjectHandleFlagInformation, + &HandleInfo, + sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION), + &BytesWritten); + if (!NT_SUCCESS(Status)) + { + BaseSetLastNTError(Status); + return FALSE; + } - Status = NtDuplicateObject(hSourceProcessHandle, - hSourceHandle, - hTargetProcessHandle, - lpTargetHandle, - dwDesiredAccess, - bInheritHandle ? OBJ_INHERIT : 0, - dwOptions); - if (!NT_SUCCESS(Status)) - { - BaseSetLastNTError (Status); - return FALSE; - } + Flags = 0; + if (HandleInfo.Inherit) Flags |= HANDLE_FLAG_INHERIT; + if (HandleInfo.ProtectFromClose) Flags |= HANDLE_FLAG_PROTECT_FROM_CLOSE; + *lpdwFlags = Flags; + return TRUE; +} - return TRUE; +/* + * @implemented + */ +BOOL +WINAPI +SetHandleInformation(IN HANDLE hObject, + IN DWORD dwMask, + IN DWORD dwFlags) +{ + OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo; + ULONG BytesWritten; + NTSTATUS Status; + + hObject = TranslateStdHandle(hObject); + + if (IsConsoleHandle(hObject)) + { + /* FIXME: SetConsoleHandleInformation required */ + UNIMPLEMENTED; + BaseSetLastNTError(STATUS_NOT_IMPLEMENTED); + return FALSE; + } + + Status = NtQueryObject(hObject, + ObjectHandleFlagInformation, + &HandleInfo, + sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION), + &BytesWritten); + if (!NT_SUCCESS(Status)) + { + BaseSetLastNTError(Status); + return FALSE; + } + + if (dwMask & HANDLE_FLAG_INHERIT) + { + HandleInfo.Inherit = (dwFlags & HANDLE_FLAG_INHERIT) != 0; + } + + if (dwMask & HANDLE_FLAG_PROTECT_FROM_CLOSE) + { + HandleInfo.ProtectFromClose = (dwFlags & HANDLE_FLAG_PROTECT_FROM_CLOSE) != 0; + } + + Status = NtSetInformationObject(hObject, + ObjectHandleFlagInformation, + &HandleInfo, + sizeof(HandleInfo)); + if (NT_SUCCESS(Status)) return TRUE; + + BaseSetLastNTError(Status); + return FALSE; +} + +/* + * @implemented + */ +BOOL +WINAPI +CloseHandle(IN HANDLE hObject) +{ + NTSTATUS Status; + + hObject = TranslateStdHandle(hObject); + + if (IsConsoleHandle(hObject)) return CloseConsoleHandle(hObject); + + Status = NtClose(hObject); + if (NT_SUCCESS(Status)) return TRUE; + + BaseSetLastNTError(Status); + return FALSE; +} + +/* + * @implemented + */ +BOOL +WINAPI +DuplicateHandle(IN HANDLE hSourceProcessHandle, + IN HANDLE hSourceHandle, + IN HANDLE hTargetProcessHandle, + OUT LPHANDLE lpTargetHandle, + IN DWORD dwDesiredAccess, + IN BOOL bInheritHandle, + IN DWORD dwOptions) +{ + NTSTATUS Status; + HANDLE hTargetHandle; + + hSourceHandle = TranslateStdHandle(hSourceHandle); + + if ((IsConsoleHandle(hSourceHandle)) && + ((hSourceHandle != NtCurrentProcess()) && + (hSourceHandle != NtCurrentThread()))) + { + if ((hSourceProcessHandle != NtCurrentProcess()) && + (hTargetProcessHandle != NtCurrentProcess())) + { + BaseSetLastNTError(STATUS_INVALID_PARAMETER); + return FALSE; + } + + hTargetHandle = DuplicateConsoleHandle(hSourceHandle, + dwDesiredAccess, + bInheritHandle, + dwOptions); + if (hTargetHandle != INVALID_HANDLE_VALUE) + { + if (lpTargetHandle) *lpTargetHandle = hTargetHandle; + return TRUE; + } + + return FALSE; + } + + Status = NtDuplicateObject(hSourceProcessHandle, + hSourceHandle, + hTargetProcessHandle, + lpTargetHandle, + dwDesiredAccess, + bInheritHandle ? OBJ_INHERIT : 0, + dwOptions); + if (NT_SUCCESS(Status)) return Status; + + BaseSetLastNTError(Status); + return FALSE; } /* @@ -211,9 +208,9 @@ BOOL WINAPI DuplicateHandle(HANDLE hSourceProcessHandle, */ UINT WINAPI -SetHandleCount(UINT nCount) +SetHandleCount(IN UINT nCount) { - return nCount; + return nCount; } /* @@ -240,7 +237,6 @@ CreateSocketHandle(VOID) DbgPrintEx(0, 0, "Unsupported API - kernel32!CreateSocketHandle() called\n"); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; - } /*