The stub is enough for TokenViewer.exe to start up and display its user interface.
Based on a patch by Nikolay Sivov.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45119
-- v4: ntdll: Add NtGetNextProcess stub.
From: Alex Henrie alexhenrie24@gmail.com
The stub is enough for TokenViewer.exe to start up and display its user interface.
Based on a patch by Nikolay Sivov.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45119 --- dlls/ntdll/ntdll.spec | 1 + dlls/ntdll/unix/loader.c | 1 + dlls/ntdll/unix/process.c | 12 ++++++++++++ dlls/wow64/process.c | 21 +++++++++++++++++++++ dlls/wow64/syscall.h | 1 + include/winternl.h | 1 + 6 files changed, 37 insertions(+)
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 293a0ab290e..9344ea6e479 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -230,6 +230,7 @@ @ stdcall -norelay -syscall NtGetContextThread(long ptr) @ stdcall -syscall NtGetCurrentProcessorNumber() # @ stub NtGetDevicePowerState +@ stdcall -syscall NtGetNextProcess(ptr long long long ptr) @ stdcall -syscall NtGetNextThread(ptr ptr long long long ptr) @ stdcall -syscall NtGetNlsSectionPtr(long long long ptr ptr) # @ stub NtGetPlugPlayEvent diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c index 38aaf778ff5..87c6e815945 100644 --- a/dlls/ntdll/unix/loader.c +++ b/dlls/ntdll/unix/loader.c @@ -193,6 +193,7 @@ static void * const syscalls[] = NtFsControlFile, NtGetContextThread, NtGetCurrentProcessorNumber, + NtGetNextProcess, NtGetNextThread, NtGetNlsSectionPtr, NtGetWriteWatch, diff --git a/dlls/ntdll/unix/process.c b/dlls/ntdll/unix/process.c index 4c7e545695c..b145cc88a51 100644 --- a/dlls/ntdll/unix/process.c +++ b/dlls/ntdll/unix/process.c @@ -1769,6 +1769,18 @@ NTSTATUS WINAPI NtResumeProcess( HANDLE handle ) }
+/********************************************************************** + * NtGetNextProcess (NTDLL.@) + */ +NTSTATUS WINAPI NtGetNextProcess( HANDLE process, ACCESS_MASK access, ULONG attributes, + ULONG flags, HANDLE *handle ) +{ + FIXME( "process %p, access %#x, attributes %#x, flags %#x, handle %p. stub!\n", + process, (int)access, (int)attributes, (int)flags, handle ); + return STATUS_NOT_IMPLEMENTED; +} + + /********************************************************************** * NtDebugActiveProcess (NTDLL.@) */ diff --git a/dlls/wow64/process.c b/dlls/wow64/process.c index 880b7623b10..857e8ea2f96 100644 --- a/dlls/wow64/process.c +++ b/dlls/wow64/process.c @@ -436,6 +436,27 @@ NTSTATUS WINAPI wow64_NtFlushProcessWriteBuffers( UINT *args ) }
+/********************************************************************** + * wow64_NtGetNextProcess + */ +NTSTATUS WINAPI wow64_NtGetNextProcess( UINT *args ) +{ + HANDLE process = get_handle( &args ); + ACCESS_MASK access = get_ulong( &args ); + ULONG attributes = get_ulong( &args ); + ULONG flags = get_ulong( &args ); + ULONG *handle_ptr = get_ptr( &args ); + + HANDLE handle = 0; + NTSTATUS status; + + *handle_ptr = 0; + status = NtGetNextProcess( process, access, attributes, flags, &handle ); + put_handle( handle_ptr, handle ); + return status; +} + + /********************************************************************** * wow64_NtGetNextThread */ diff --git a/dlls/wow64/syscall.h b/dlls/wow64/syscall.h index fce71395439..0ea30531037 100644 --- a/dlls/wow64/syscall.h +++ b/dlls/wow64/syscall.h @@ -97,6 +97,7 @@ SYSCALL_ENTRY( NtFsControlFile ) \ SYSCALL_ENTRY( NtGetContextThread ) \ SYSCALL_ENTRY( NtGetCurrentProcessorNumber ) \ + SYSCALL_ENTRY( NtGetNextProcess ) \ SYSCALL_ENTRY( NtGetNextThread ) \ SYSCALL_ENTRY( NtGetNlsSectionPtr ) \ SYSCALL_ENTRY( NtGetWriteWatch ) \ diff --git a/include/winternl.h b/include/winternl.h index d0f37c2bada..5244d9c0088 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -4410,6 +4410,7 @@ NTSYSAPI NTSTATUS WINAPI NtFreeVirtualMemory(HANDLE,PVOID*,SIZE_T*,ULONG); NTSYSAPI NTSTATUS WINAPI NtFsControlFile(HANDLE,HANDLE,PIO_APC_ROUTINE,PVOID,PIO_STATUS_BLOCK,ULONG,PVOID,ULONG,PVOID,ULONG); NTSYSAPI NTSTATUS WINAPI NtGetContextThread(HANDLE,CONTEXT*); NTSYSAPI ULONG WINAPI NtGetCurrentProcessorNumber(void); +NTSYSAPI NTSTATUS WINAPI NtGetNextProcess(HANDLE,ACCESS_MASK,ULONG,ULONG,HANDLE*); NTSYSAPI NTSTATUS WINAPI NtGetNextThread(HANDLE,HANDLE,ACCESS_MASK,ULONG,ULONG,HANDLE*); NTSYSAPI NTSTATUS WINAPI NtGetNlsSectionPtr(ULONG,ULONG,void*,void**,SIZE_T*); NTSYSAPI NTSTATUS WINAPI NtGetPlugPlayEvent(ULONG,ULONG,PVOID,ULONG);