Jacek Caban : ntoskrnl.exe: Implement PsGetProcessInheritedFromUniqueProcessId.

Alexandre Julliard julliard at winehq.org
Thu May 16 16:26:59 CDT 2019


Module: wine
Branch: master
Commit: 850fd237bd30969ede93cd409d8c112fdf87a671
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=850fd237bd30969ede93cd409d8c112fdf87a671

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu May 16 19:50:27 2019 +0200

ntoskrnl.exe: Implement PsGetProcessInheritedFromUniqueProcessId.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntoskrnl.exe/ntoskrnl.c        |  9 +++++++++
 dlls/ntoskrnl.exe/ntoskrnl.exe.spec |  4 ++--
 dlls/ntoskrnl.exe/tests/driver.c    | 16 ++++++++++++++++
 include/ddk/wdm.h                   |  1 +
 4 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index 49d628d..3df7e4e 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -2589,6 +2589,15 @@ HANDLE WINAPI PsGetProcessId(PEPROCESS process)
     return (HANDLE)process->info.UniqueProcessId;
 }
 
+/*********************************************************************
+ *           PsGetProcessInheritedFromUniqueProcessId  (NTOSKRNL.@)
+ */
+HANDLE WINAPI PsGetProcessInheritedFromUniqueProcessId( PEPROCESS process )
+{
+    HANDLE id = (HANDLE)process->info.InheritedFromUniqueProcessId;
+    TRACE( "%p -> %p\n", process, id );
+    return id;
+}
 
 static void *create_thread_object( HANDLE handle )
 {
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
index 87ec397..0105afb 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
+++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
@@ -888,7 +888,7 @@
 @ stub PsGetProcessExitTime
 @ stdcall PsGetProcessId(ptr)
 @ stub PsGetProcessImageFileName
-@ stub PsGetProcessInheritedFromUniqueProcessId
+@ stdcall PsGetProcessInheritedFromUniqueProcessId(ptr)
 @ stub PsGetProcessJob
 @ stub PsGetProcessPeb
 @ stub PsGetProcessPriorityClass
@@ -1374,7 +1374,7 @@
 @ stdcall -private ZwQueryFullAttributesFile(ptr ptr) NtQueryFullAttributesFile
 @ stdcall -private ZwQueryInformationFile(long ptr ptr long long) NtQueryInformationFile
 @ stdcall -private ZwQueryInformationJobObject(long long ptr long ptr) NtQueryInformationJobObject
-@ stdcall -private ZwQueryInformationProcess(long long ptr long ptr) NtQueryInformationProcess
+@ stdcall ZwQueryInformationProcess(long long ptr long ptr) NtQueryInformationProcess
 @ stdcall -private ZwQueryInformationThread(long long ptr long ptr) NtQueryInformationThread
 @ stdcall -private ZwQueryInformationToken(long long ptr long ptr) NtQueryInformationToken
 @ stdcall -private ZwQueryInstallUILanguage(ptr) NtQueryInstallUILanguage
diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c
index b4624e9..1ad468e 100644
--- a/dlls/ntoskrnl.exe/tests/driver.c
+++ b/dlls/ntoskrnl.exe/tests/driver.c
@@ -55,6 +55,8 @@ static PEPROCESS *pPsInitialSystemProcess;
 
 void WINAPI ObfReferenceObject( void *obj );
 
+NTSTATUS WINAPI ZwQueryInformationProcess(HANDLE,PROCESSINFOCLASS,void*,ULONG,ULONG*);
+
 extern int CDECL _vsnprintf(char *str, size_t len, const char *format, __ms_va_list argptr);
 
 static void kvprintf(const char *format, __ms_va_list ap)
@@ -323,7 +325,9 @@ static NTSTATUS wait_single_handle(HANDLE handle, ULONGLONG timeout)
 
 static void test_current_thread(BOOL is_system)
 {
+    PROCESS_BASIC_INFORMATION info;
     DISPATCHER_HEADER *header;
+    HANDLE process_handle, id;
     PEPROCESS current;
     PETHREAD thread;
     NTSTATUS ret;
@@ -349,6 +353,18 @@ static void test_current_thread(BOOL is_system)
 
     ok(PsGetThreadId((PETHREAD)KeGetCurrentThread()) == PsGetCurrentThreadId(), "thread IDs don't match\n");
     ok(PsIsSystemThread((PETHREAD)KeGetCurrentThread()) == is_system, "unexpected system thread\n");
+
+    ret = ObOpenObjectByPointer(current, OBJ_KERNEL_HANDLE, NULL, PROCESS_QUERY_INFORMATION, NULL, KernelMode, &process_handle);
+    ok(!ret, "ObOpenObjectByPointer failed: %#x\n", ret);
+
+    ret = ZwQueryInformationProcess(process_handle, ProcessBasicInformation, &info, sizeof(info), NULL);
+    ok(!ret, "ZwQueryInformationProcess failed: %#x\n", ret);
+
+    id = PsGetProcessInheritedFromUniqueProcessId(current);
+    ok(id == (HANDLE)info.InheritedFromUniqueProcessId, "unexpected process id %p\n", id);
+
+    ret = ZwClose(process_handle);
+    ok(!ret, "ZwClose failed: %#x\n", ret);
 }
 
 static void sleep(void)
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
index 4dae97b..90a8bae 100644
--- a/include/ddk/wdm.h
+++ b/include/ddk/wdm.h
@@ -1663,6 +1663,7 @@ NTSTATUS  WINAPI PsCreateSystemThread(PHANDLE,ULONG,POBJECT_ATTRIBUTES,HANDLE,PC
 #define          PsGetCurrentThread() ((PETHREAD)KeGetCurrentThread())
 HANDLE    WINAPI PsGetCurrentProcessId(void);
 HANDLE    WINAPI PsGetCurrentThreadId(void);
+HANDLE    WINAPI PsGetProcessInheritedFromUniqueProcessId(PEPROCESS);
 BOOLEAN   WINAPI PsGetVersion(ULONG*,ULONG*,ULONG*,UNICODE_STRING*);
 NTSTATUS  WINAPI PsTerminateSystemThread(NTSTATUS);
 




More information about the wine-cvs mailing list