#define NDEBUG
#include <kernel32/kernel32.h>
+/* GLOBALS *******************************************************************/
+
+WINBOOL STDCALL
+GetProcessId (HANDLE hProcess, LPDWORD lpProcessId);
+
+HANDLE STDCALL
+DuplicateConsoleHandle (HANDLE hConsole,
+ DWORD dwDesiredAccess,
+ BOOL bInheritHandle,
+ DWORD dwOptions);
+
/* FUNCTIONS *****************************************************************/
WINBOOL WINAPI GetHandleInformation(HANDLE hObject, LPDWORD lpdwFlags)
DWORD dwOptions)
{
NTSTATUS errCode;
+ DWORD SourceProcessId, TargetProcessId;
if (IsConsoleHandle(hSourceHandle))
{
- /* FIXME: call CSRSS for console handle duplication */
- if (hSourceProcessHandle == hTargetProcessHandle)
+ if (FALSE == GetProcessId(hSourceProcessHandle, &SourceProcessId) ||
+ FALSE == GetProcessId(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,