#define NDEBUG
#include <kernel32/kernel32.h>
+/* GLOBALS *******************************************************************/
+
+WINBOOL STDCALL
+InternalGetProcessId (HANDLE hProcess, LPDWORD lpProcessId);
+
+HANDLE STDCALL
+DuplicateConsoleHandle (HANDLE hConsole,
+ DWORD dwDesiredAccess,
+ BOOL bInheritHandle,
+ DWORD dwOptions);
+
/* FUNCTIONS *****************************************************************/
+/*
+ * @implemented
+ */
WINBOOL WINAPI GetHandleInformation(HANDLE hObject, LPDWORD lpdwFlags)
{
OBJECT_DATA_INFORMATION HandleInfo;
}
+/*
+ * @implemented
+ */
WINBOOL STDCALL SetHandleInformation(HANDLE hObject,
DWORD dwMask,
DWORD dwFlags)
}
+/*
+ * @implemented
+ */
WINBOOL STDCALL CloseHandle(HANDLE hObject)
/*
* FUNCTION: Closes an open object handle
}
+/*
+ * @implemented
+ */
WINBOOL STDCALL DuplicateHandle(HANDLE hSourceProcessHandle,
HANDLE hSourceHandle,
HANDLE hTargetProcessHandle,
DWORD dwOptions)
{
NTSTATUS errCode;
+ DWORD SourceProcessId, TargetProcessId;
if (IsConsoleHandle(hSourceHandle))
{
- /* FIXME: call CSRSS for console handle duplication */
- if (hSourceProcessHandle == hTargetProcessHandle)
+ if (FALSE == InternalGetProcessId(hSourceProcessHandle, &SourceProcessId) ||
+ FALSE == InternalGetProcessId(hTargetProcessHandle, &TargetProcessId) ||
+ SourceProcessId != TargetProcessId ||
+ SourceProcessId != GetCurrentProcessId())
{
- *lpTargetHandle = hSourceHandle;
- return TRUE;
- }
- else
- {
- return FALSE;
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
}
+
+ *lpTargetHandle = DuplicateConsoleHandle(hSourceHandle, dwDesiredAccess, bInheritHandle, dwOptions);
+ return *lpTargetHandle != INVALID_HANDLE_VALUE ? TRUE : FALSE;
}
errCode = NtDuplicateObject(hSourceProcessHandle,
return TRUE;
}
+
+/*
+ * @implemented
+ */
UINT STDCALL SetHandleCount(UINT nCount)
{
return(nCount);
}
-
/* EOF */