/* INCLUDES ******************************************************************/
-#include <ddk/ntddk.h>
-#include <windows.h>
+#include <k32.h>
#define NDEBUG
#include <kernel32/kernel32.h>
-#include <kernel32/error.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)
}
if (dwMask & HANDLE_FLAG_INHERIT)
{
- HandleInfo.bInheritHandle = TRUE;
+ HandleInfo.bInheritHandle = dwFlags & HANDLE_FLAG_INHERIT;
}
if (dwMask & HANDLE_FLAG_PROTECT_FROM_CLOSE)
{
- HandleInfo.bProtectFromClose = TRUE;
+ HandleInfo.bProtectFromClose = dwFlags & HANDLE_FLAG_PROTECT_FROM_CLOSE;
}
errCode = NtSetInformationObject(hObject,
}
+/*
+ * @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 */