Rewrote Get/SetHandleInformation to call the corresponding ntdll
functions.
diff --git a/dlls/kernel/process.c b/dlls/kernel/process.c
index bb190e0..40e32d5 100644
--- a/dlls/kernel/process.c
+++ b/dlls/kernel/process.c
@@ -2489,18 +2489,17 @@
*/
BOOL WINAPI GetHandleInformation( HANDLE handle, LPDWORD flags )
{
- BOOL ret;
- SERVER_START_REQ( set_handle_info )
+ OBJECT_DATA_INFORMATION info;
+ NTSTATUS status = NtQueryObject( handle, ObjectDataInformation, &info, sizeof(info), NULL );
+
+ if (status) SetLastError( RtlNtStatusToDosError(status) );
+ else if (flags)
{
- req->handle = handle;
- req->flags = 0;
- req->mask = 0;
- req->fd = -1;
- ret = !wine_server_call_err( req );
- if (ret && flags) *flags = reply->old_flags;
+ *flags = 0;
+ if (info.InheritHandle) *flags |= HANDLE_FLAG_INHERIT;
+ if (info.ProtectFromClose) *flags |= HANDLE_FLAG_PROTECT_FROM_CLOSE;
}
- SERVER_END_REQ;
- return ret;
+ return !status;
}
@@ -2509,17 +2508,27 @@
*/
BOOL WINAPI SetHandleInformation( HANDLE handle, DWORD mask, DWORD flags )
{
- BOOL ret;
- SERVER_START_REQ( set_handle_info )
+ OBJECT_DATA_INFORMATION info;
+ NTSTATUS status;
+
+ /* if not setting both fields, retrieve current value first */
+ if ((mask & (HANDLE_FLAG_INHERIT | HANDLE_FLAG_PROTECT_FROM_CLOSE)) !=
+ (HANDLE_FLAG_INHERIT | HANDLE_FLAG_PROTECT_FROM_CLOSE))
{
- req->handle = handle;
- req->flags = flags;
- req->mask = mask;
- req->fd = -1;
- ret = !wine_server_call_err( req );
+ if ((status = NtQueryObject( handle, ObjectDataInformation, &info, sizeof(info), NULL )))
+ {
+ SetLastError( RtlNtStatusToDosError(status) );
+ return FALSE;
+ }
}
- SERVER_END_REQ;
- return ret;
+ if (mask & HANDLE_FLAG_INHERIT)
+ info.InheritHandle = (flags & HANDLE_FLAG_INHERIT) != 0;
+ if (mask & HANDLE_FLAG_PROTECT_FROM_CLOSE)
+ info.ProtectFromClose = (flags & HANDLE_FLAG_PROTECT_FROM_CLOSE) != 0;
+
+ status = NtSetInformationObject( handle, ObjectDataInformation, &info, sizeof(info) );
+ if (status) SetLastError( RtlNtStatusToDosError(status) );
+ return !status;
}