mirror of
https://github.com/reactos/reactos.git
synced 2024-12-27 17:44:45 +00:00
fixed GetHandleInformation(), SetHandleInformation() and minor fixes to CloseHandle() and DuplicateHandle()
svn path=/trunk/; revision=11165
This commit is contained in:
parent
d8ea61531d
commit
c0f9c7505c
1 changed files with 109 additions and 49 deletions
|
@ -1,4 +1,4 @@
|
|||
/* $Id: handle.c,v 1.16 2004/01/23 21:16:03 ekohl Exp $
|
||||
/* $Id: handle.c,v 1.17 2004/10/03 10:05:56 weiden Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS system libraries
|
||||
|
@ -36,28 +36,48 @@ BOOL WINAPI
|
|||
GetHandleInformation (HANDLE hObject,
|
||||
LPDWORD lpdwFlags)
|
||||
{
|
||||
PRTL_USER_PROCESS_PARAMETERS Ppb;
|
||||
OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo;
|
||||
ULONG BytesWritten;
|
||||
NTSTATUS Status;
|
||||
DWORD Flags;
|
||||
|
||||
Ppb = NtCurrentPeb()->ProcessParameters;
|
||||
switch ((ULONG)hObject)
|
||||
{
|
||||
case STD_INPUT_HANDLE:
|
||||
hObject = Ppb->hStdInput;
|
||||
break;
|
||||
case STD_OUTPUT_HANDLE:
|
||||
hObject = Ppb->hStdOutput;
|
||||
break;
|
||||
case STD_ERROR_HANDLE:
|
||||
hObject = Ppb->hStdError;
|
||||
break;
|
||||
}
|
||||
|
||||
Status = NtQueryObject (hObject,
|
||||
ObjectHandleInformation,
|
||||
&HandleInfo,
|
||||
sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION),
|
||||
&BytesWritten);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
SetLastErrorByStatus (Status);
|
||||
return FALSE;
|
||||
}
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
Flags = 0;
|
||||
if (HandleInfo.Inherit)
|
||||
Flags |= HANDLE_FLAG_INHERIT;
|
||||
if (HandleInfo.ProtectFromClose)
|
||||
Flags |= HANDLE_FLAG_PROTECT_FROM_CLOSE;
|
||||
|
||||
if (HandleInfo.Inherit)
|
||||
*lpdwFlags &= HANDLE_FLAG_INHERIT;
|
||||
*lpdwFlags = Flags;
|
||||
|
||||
if (HandleInfo.ProtectFromClose)
|
||||
*lpdwFlags &= HANDLE_FLAG_PROTECT_FROM_CLOSE;
|
||||
|
||||
return TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
SetLastErrorByStatus (Status);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -69,42 +89,51 @@ SetHandleInformation (HANDLE hObject,
|
|||
DWORD dwMask,
|
||||
DWORD dwFlags)
|
||||
{
|
||||
PRTL_USER_PROCESS_PARAMETERS Ppb;
|
||||
OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo;
|
||||
ULONG BytesWritten;
|
||||
NTSTATUS Status;
|
||||
|
||||
Ppb = NtCurrentPeb()->ProcessParameters;
|
||||
switch ((ULONG)hObject)
|
||||
{
|
||||
case STD_INPUT_HANDLE:
|
||||
hObject = Ppb->hStdInput;
|
||||
break;
|
||||
case STD_OUTPUT_HANDLE:
|
||||
hObject = Ppb->hStdOutput;
|
||||
break;
|
||||
case STD_ERROR_HANDLE:
|
||||
hObject = Ppb->hStdError;
|
||||
break;
|
||||
}
|
||||
|
||||
Status = NtQueryObject (hObject,
|
||||
ObjectHandleInformation,
|
||||
&HandleInfo,
|
||||
sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION),
|
||||
&BytesWritten);
|
||||
if (!NT_SUCCESS(Status))
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
HandleInfo.Inherit = ((dwFlags & HANDLE_FLAG_INHERIT) ? TRUE : FALSE);
|
||||
HandleInfo.ProtectFromClose = ((dwFlags & HANDLE_FLAG_PROTECT_FROM_CLOSE) ? TRUE : FALSE);
|
||||
Status = NtSetInformationObject (hObject,
|
||||
ObjectHandleInformation,
|
||||
&HandleInfo,
|
||||
sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION));
|
||||
if(!NT_SUCCESS(Status))
|
||||
{
|
||||
SetLastErrorByStatus (Status);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (dwMask & HANDLE_FLAG_INHERIT)
|
||||
{
|
||||
HandleInfo.Inherit = dwFlags & HANDLE_FLAG_INHERIT;
|
||||
}
|
||||
|
||||
if (dwMask & HANDLE_FLAG_PROTECT_FROM_CLOSE)
|
||||
{
|
||||
HandleInfo.ProtectFromClose = dwFlags & HANDLE_FLAG_PROTECT_FROM_CLOSE;
|
||||
}
|
||||
|
||||
Status = NtSetInformationObject (hObject,
|
||||
ObjectHandleInformation,
|
||||
&HandleInfo,
|
||||
sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION));
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
SetLastErrorByStatus (Status);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
SetLastErrorByStatus (Status);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -120,17 +149,32 @@ BOOL STDCALL CloseHandle(HANDLE hObject)
|
|||
* If the function fails, the return value is zero
|
||||
*/
|
||||
{
|
||||
NTSTATUS errCode;
|
||||
PRTL_USER_PROCESS_PARAMETERS Ppb;
|
||||
NTSTATUS Status;
|
||||
|
||||
Ppb = NtCurrentPeb()->ProcessParameters;
|
||||
switch ((ULONG)hObject)
|
||||
{
|
||||
case STD_INPUT_HANDLE:
|
||||
hObject = Ppb->hStdInput;
|
||||
break;
|
||||
case STD_OUTPUT_HANDLE:
|
||||
hObject = Ppb->hStdOutput;
|
||||
break;
|
||||
case STD_ERROR_HANDLE:
|
||||
hObject = Ppb->hStdError;
|
||||
break;
|
||||
}
|
||||
|
||||
if (IsConsoleHandle(hObject))
|
||||
{
|
||||
return(CloseConsoleHandle(hObject));
|
||||
}
|
||||
|
||||
errCode = NtClose(hObject);
|
||||
if (!NT_SUCCESS(errCode))
|
||||
Status = NtClose(hObject);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
SetLastErrorByStatus (errCode);
|
||||
SetLastErrorByStatus (Status);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
@ -149,8 +193,24 @@ BOOL STDCALL DuplicateHandle(HANDLE hSourceProcessHandle,
|
|||
BOOL bInheritHandle,
|
||||
DWORD dwOptions)
|
||||
{
|
||||
NTSTATUS errCode;
|
||||
PRTL_USER_PROCESS_PARAMETERS Ppb;
|
||||
DWORD SourceProcessId, TargetProcessId;
|
||||
NTSTATUS Status;
|
||||
|
||||
Ppb = NtCurrentPeb()->ProcessParameters;
|
||||
switch ((ULONG)hSourceHandle)
|
||||
{
|
||||
case STD_INPUT_HANDLE:
|
||||
hSourceHandle = Ppb->hStdInput;
|
||||
break;
|
||||
case STD_OUTPUT_HANDLE:
|
||||
hSourceHandle = Ppb->hStdOutput;
|
||||
break;
|
||||
case STD_ERROR_HANDLE:
|
||||
hSourceHandle = Ppb->hStdError;
|
||||
break;
|
||||
}
|
||||
|
||||
if (IsConsoleHandle(hSourceHandle))
|
||||
{
|
||||
if (FALSE == InternalGetProcessId(hSourceProcessHandle, &SourceProcessId) ||
|
||||
|
@ -166,16 +226,16 @@ BOOL STDCALL DuplicateHandle(HANDLE hSourceProcessHandle,
|
|||
return *lpTargetHandle != INVALID_HANDLE_VALUE ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
errCode = NtDuplicateObject(hSourceProcessHandle,
|
||||
hSourceHandle,
|
||||
hTargetProcessHandle,
|
||||
lpTargetHandle,
|
||||
dwDesiredAccess,
|
||||
(BOOLEAN)bInheritHandle,
|
||||
dwOptions);
|
||||
if (!NT_SUCCESS(errCode))
|
||||
Status = NtDuplicateObject(hSourceProcessHandle,
|
||||
hSourceHandle,
|
||||
hTargetProcessHandle,
|
||||
lpTargetHandle,
|
||||
dwDesiredAccess,
|
||||
(BOOLEAN)bInheritHandle,
|
||||
dwOptions);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
SetLastErrorByStatus (errCode);
|
||||
SetLastErrorByStatus (Status);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue