From ac7b9d3797d19594c252234c5b4dc470e0e185cc Mon Sep 17 00:00:00 2001
From: Alexandre Julliard <julliard@winehq.org>
Date: Mon, 16 Sep 2002 19:32:50 +0000
Subject: [PATCH] Implemented NtDuplicateObject.

---
 dlls/ntdll/ntdll.spec |  4 ++--
 dlls/ntdll/om.c       | 36 +++++++++++++++++++++++-------------
 include/winternl.h    |  1 +
 scheduler/handle.c    | 27 ++++++---------------------
 4 files changed, 32 insertions(+), 36 deletions(-)

diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index c7db90d8937..fdc0ffa1318 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -99,7 +99,7 @@
 @ stdcall NtDeleteValueKey(long ptr) NtDeleteValueKey
 @ stdcall NtDeviceIoControlFile(long long long long long long long long long long) NtDeviceIoControlFile
 @ stdcall NtDisplayString(ptr)NtDisplayString
-@ stdcall NtDuplicateObject(long long long long long long long) NtDuplicateObject
+@ stdcall NtDuplicateObject(long long long ptr long long long) NtDuplicateObject
 @ stdcall NtDuplicateToken(long long long long long long) NtDuplicateToken
 @ stub NtEnumerateBus
 @ stdcall NtEnumerateKey (long long long long long long) NtEnumerateKey
@@ -616,7 +616,7 @@
 @ stdcall ZwDeleteValueKey(long ptr) NtDeleteValueKey
 @ stdcall ZwDeviceIoControlFile(long long long long long long long long long long) NtDeviceIoControlFile
 @ stub ZwDisplayString
-@ stdcall ZwDuplicateObject(long long long long long long long) NtDuplicateObject
+@ stdcall ZwDuplicateObject(long long long ptr long long long) NtDuplicateObject
 @ stdcall ZwDuplicateToken(long long long long long long) NtDuplicateToken
 @ stub ZwEnumerateBus
 @ stdcall ZwEnumerateKey(long long long ptr long ptr) NtEnumerateKey
diff --git a/dlls/ntdll/om.c b/dlls/ntdll/om.c
index fbcefa278e9..14efc7d64c2 100644
--- a/dlls/ntdll/om.c
+++ b/dlls/ntdll/om.c
@@ -213,24 +213,34 @@ NtQuerySecurityObject(
 
 	return STATUS_SUCCESS;
 }
+
+
 /******************************************************************************
  *  NtDuplicateObject		[NTDLL.@]
  *  ZwDuplicateObject		[NTDLL.@]
  */
-NTSTATUS WINAPI NtDuplicateObject(
-	IN HANDLE SourceProcessHandle,
-	IN PHANDLE SourceHandle,
-	IN HANDLE TargetProcessHandle,
-	OUT PHANDLE TargetHandle,
-	IN ACCESS_MASK DesiredAccess,
-	IN BOOLEAN InheritHandle,
-	ULONG Options)
+NTSTATUS WINAPI NtDuplicateObject( HANDLE source_process, HANDLE source,
+                                   HANDLE dest_process, PHANDLE dest,
+                                   ACCESS_MASK access, ULONG attributes, ULONG options )
 {
-	FIXME("(0x%08x,%p,0x%08x,%p,0x%08lx,0x%08x,0x%08lx) stub!\n",
-	SourceProcessHandle,SourceHandle,TargetProcessHandle,TargetHandle,
-	DesiredAccess,InheritHandle,Options);
-	*TargetHandle = 0;
-	return 0;
+    NTSTATUS ret;
+    SERVER_START_REQ( dup_handle )
+    {
+        req->src_process = source_process;
+        req->src_handle  = source;
+        req->dst_process = dest_process;
+        req->access      = access;
+        req->inherit     = (attributes & OBJ_INHERIT) != 0;
+        req->options     = options;
+
+        if (!(ret = wine_server_call( req )))
+        {
+            if (dest) *dest = reply->handle;
+            if (reply->fd != -1) close( reply->fd );
+        }
+    }
+    SERVER_END_REQ;
+    return ret;
 }
 
 /**************************************************************************
diff --git a/include/winternl.h b/include/winternl.h
index 4c32a7f055f..43ddb17d364 100644
--- a/include/winternl.h
+++ b/include/winternl.h
@@ -762,6 +762,7 @@ NTSTATUS  WINAPI NtCreateSemaphore(PHANDLE,ACCESS_MASK,const OBJECT_ATTRIBUTES*,
 NTSTATUS  WINAPI NtDeleteKey(HANDLE);
 NTSTATUS  WINAPI NtDeleteValueKey(HANDLE,const UNICODE_STRING *);
 NTSTATUS  WINAPI NtDeviceIoControlFile(HANDLE,HANDLE,PIO_APC_ROUTINE,PVOID,PIO_STATUS_BLOCK,ULONG,PVOID,ULONG,PVOID,ULONG);
+NTSTATUS  WINAPI NtDuplicateObject(HANDLE,HANDLE,HANDLE,PHANDLE,ACCESS_MASK,ULONG,ULONG);
 NTSTATUS  WINAPI NtEnumerateKey(HANDLE,ULONG,KEY_INFORMATION_CLASS,void *,DWORD,DWORD *);
 NTSTATUS  WINAPI NtEnumerateValueKey(HANDLE,ULONG,KEY_VALUE_INFORMATION_CLASS,PVOID,ULONG,PULONG);
 NTSTATUS  WINAPI NtFlushKey(HANDLE);
diff --git a/scheduler/handle.c b/scheduler/handle.c
index 3e828fef416..1155da9c0d8 100644
--- a/scheduler/handle.c
+++ b/scheduler/handle.c
@@ -98,28 +98,13 @@ BOOL WINAPI SetHandleInformation( HANDLE handle, DWORD mask, DWORD flags )
  *           DuplicateHandle   (KERNEL32.@)
  */
 BOOL WINAPI DuplicateHandle( HANDLE source_process, HANDLE source,
-                               HANDLE dest_process, HANDLE *dest,
-                               DWORD access, BOOL inherit, DWORD options )
+                             HANDLE dest_process, HANDLE *dest,
+                             DWORD access, BOOL inherit, DWORD options )
 {
-    BOOL ret;
-    SERVER_START_REQ( dup_handle )
-    {
-        req->src_process = source_process;
-        req->src_handle  = source;
-        req->dst_process = dest_process;
-        req->access      = access;
-        req->inherit     = inherit;
-        req->options     = options;
-
-        ret = !wine_server_call_err( req );
-        if (ret)
-        {
-            if (dest) *dest = reply->handle;
-            if (reply->fd != -1) close( reply->fd );
-        }
-    }
-    SERVER_END_REQ;
-    return ret;
+    NTSTATUS status = NtDuplicateObject( source_process, source, dest_process, dest,
+                                         access, inherit ? OBJ_INHERIT : 0, options );
+    if (status) SetLastError( RtlNtStatusToDosError(status) );
+    return !status;
 }
 
 
-- 
GitLab