<div dir="ltr"><div dir="ltr">Signed-off-by: Derek Lesho <dereklesho52@Gmail.com><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Apr 11, 2019 at 2:27 PM Derek Lesho <<a href="mailto:dereklesho52@gmail.com">dereklesho52@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Jacek says that duplicating and closing the sent handle in<br>
kernel_object_from_handle every time would add unecessary overhead.<br>
---<br>
 dlls/ntoskrnl.exe/ntoskrnl.c | 17 +++++++++++++++--<br>
 1 file changed, 15 insertions(+), 2 deletions(-)<br>
<br>
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c<br>
index 80a6fa89f7..03f6d78759 100644<br>
--- a/dlls/ntoskrnl.exe/ntoskrnl.c<br>
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c<br>
@@ -2500,6 +2500,7 @@ PEPROCESS WINAPI IoGetCurrentProcess(void)<br>
<br>
 static void *create_thread_object( HANDLE handle )<br>
 {<br>
+    NTSTATUS status;<br>
     THREAD_BASIC_INFORMATION info;<br>
     struct _KTHREAD *thread;<br>
<br>
@@ -2508,8 +2509,20 @@ static void *create_thread_object( HANDLE handle )<br>
     thread->header.Type = 6;<br>
     thread->header.WaitListHead.Blink = INVALID_HANDLE_VALUE; /* mark as kernel object */<br>
<br>
-    if (!NtQueryInformationThread( handle, ThreadBasicInformation, &info, sizeof(info), NULL ))<br>
+    if (!(status = NtQueryInformationThread( handle, ThreadBasicInformation, &info, sizeof(info), NULL )))<br>
         thread->id = info.ClientId;<br>
+    else if (status == STATUS_ACCESS_DENIED)<br>
+    {<br>
+        HANDLE info_handle;<br>
+        <br>
+        DuplicateHandle( GetCurrentProcess(), handle, GetCurrentProcess(), <br>
+                    &info_handle, THREAD_QUERY_LIMITED_INFORMATION, FALSE, 0);<br>
+<br>
+        if (!NtQueryInformationThread( handle, ThreadBasicInformation, &info, sizeof(info), NULL ))<br>
+            thread->id = info.ClientId;<br>
+<br>
+        NtClose( info_handle );<br>
+    }<br>
<br>
     thread->critical_region = FALSE;<br>
<br>
@@ -2539,7 +2552,7 @@ PRKTHREAD WINAPI KeGetCurrentThread(void)<br>
         HANDLE handle = GetCurrentThread();<br>
<br>
         /* FIXME: we shouldn't need it, GetCurrentThread() should be client thread already */<br>
-        if (GetCurrentThreadId() == request_thread) handle = OpenThread( 0, FALSE, client_tid );<br>
+        if (GetCurrentThreadId() == request_thread) handle = OpenThread( THREAD_QUERY_LIMITED_INFORMATION, FALSE, client_tid );<br>
<br>
         kernel_object_from_handle( handle, PsThreadType, (void**)&thread );<br>
         if (handle != GetCurrentThread()) NtClose( handle );<br>
-- <br>
2.20.1<br>
<br>
</blockquote></div>