Module: wine Branch: master Commit: fc173ccca8734f6c6d54fcf56e763d4557e9eb48 URL: https://source.winehq.org/git/wine.git/?a=commit;h=fc173ccca8734f6c6d54fcf56...
Author: Alexandre Julliard julliard@winehq.org Date: Tue May 26 13:23:33 2020 +0200
kernel32: Reimplement GetProcessVersion() in kernelbase.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/kernel32/kernel32.spec | 2 +- dlls/kernel32/process.c | 55 ----------------------------------------- dlls/kernelbase/kernelbase.spec | 2 +- dlls/kernelbase/process.c | 23 +++++++++++++++++ 4 files changed, 25 insertions(+), 57 deletions(-)
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index a095a85e66..1a6fdbab01 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -793,7 +793,7 @@ # @ stub GetProcessorSystemCycleTime @ stdcall -import GetProcessTimes(long ptr ptr ptr ptr) # @ stub GetProcessUserModeExceptionPolicy -@ stdcall GetProcessVersion(long) +@ stdcall -import GetProcessVersion(long) @ stdcall GetProcessWorkingSetSize(long ptr ptr) @ stdcall -import GetProcessWorkingSetSizeEx(long ptr ptr ptr) @ stdcall -import GetProductInfo(long long long long ptr) diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c index f628f96f36..1c3ed9938f 100644 --- a/dlls/kernel32/process.c +++ b/dlls/kernel32/process.c @@ -451,61 +451,6 @@ BOOL WINAPI GetProcessAffinityMask( HANDLE hProcess, PDWORD_PTR process_mask, PD }
-/*********************************************************************** - * GetProcessVersion (KERNEL32.@) - */ -DWORD WINAPI GetProcessVersion( DWORD pid ) -{ - HANDLE process; - NTSTATUS status; - PROCESS_BASIC_INFORMATION pbi; - SIZE_T count; - PEB peb; - IMAGE_DOS_HEADER dos; - IMAGE_NT_HEADERS nt; - DWORD ver = 0; - - if (!pid || pid == GetCurrentProcessId()) - { - IMAGE_NT_HEADERS *pnt; - - if ((pnt = RtlImageNtHeader( NtCurrentTeb()->Peb->ImageBaseAddress ))) - return ((pnt->OptionalHeader.MajorSubsystemVersion << 16) | - pnt->OptionalHeader.MinorSubsystemVersion); - return 0; - } - - process = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, FALSE, pid); - if (!process) return 0; - - status = NtQueryInformationProcess(process, ProcessBasicInformation, &pbi, sizeof(pbi), NULL); - if (status) goto err; - - status = NtReadVirtualMemory(process, pbi.PebBaseAddress, &peb, sizeof(peb), &count); - if (status || count != sizeof(peb)) goto err; - - memset(&dos, 0, sizeof(dos)); - status = NtReadVirtualMemory(process, peb.ImageBaseAddress, &dos, sizeof(dos), &count); - if (status || count != sizeof(dos)) goto err; - if (dos.e_magic != IMAGE_DOS_SIGNATURE) goto err; - - memset(&nt, 0, sizeof(nt)); - status = NtReadVirtualMemory(process, (char *)peb.ImageBaseAddress + dos.e_lfanew, &nt, sizeof(nt), &count); - if (status || count != sizeof(nt)) goto err; - if (nt.Signature != IMAGE_NT_SIGNATURE) goto err; - - ver = MAKELONG(nt.OptionalHeader.MinorSubsystemVersion, nt.OptionalHeader.MajorSubsystemVersion); - -err: - CloseHandle(process); - - if (status != STATUS_SUCCESS) - SetLastError(RtlNtStatusToDosError(status)); - - return ver; -} - - /*********************************************************************** * SetProcessWorkingSetSize [KERNEL32.@] * Sets the min/max working set sizes for a specified process. diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index d85c36c6e5..986cd851ed 100644 --- a/dlls/kernelbase/kernelbase.spec +++ b/dlls/kernelbase/kernelbase.spec @@ -636,7 +636,7 @@ @ stdcall GetProcessPriorityBoost(long ptr) @ stdcall GetProcessShutdownParameters(ptr ptr) @ stdcall GetProcessTimes(long ptr ptr ptr ptr) -@ stdcall GetProcessVersion(long) kernel32.GetProcessVersion +@ stdcall GetProcessVersion(long) @ stdcall GetProcessWorkingSetSizeEx(long ptr ptr ptr) # @ stub GetProcessorSystemCycleTime @ stdcall GetProductInfo(long long long long ptr) diff --git a/dlls/kernelbase/process.c b/dlls/kernelbase/process.c index 66e115ce69..a3b168543f 100644 --- a/dlls/kernelbase/process.c +++ b/dlls/kernelbase/process.c @@ -814,6 +814,29 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetProcessTimes( HANDLE process, FILETIME *create, }
+/*********************************************************************** + * GetProcessVersion (kernelbase.@) + */ +DWORD WINAPI DECLSPEC_HOTPATCH GetProcessVersion( DWORD pid ) +{ + SECTION_IMAGE_INFORMATION info; + NTSTATUS status; + HANDLE process; + + if (pid && pid != GetCurrentProcessId()) + { + if (!(process = OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, pid ))) return 0; + status = NtQueryInformationProcess( process, ProcessImageInformation, &info, sizeof(info), NULL ); + CloseHandle( process ); + } + else status = NtQueryInformationProcess( GetCurrentProcess(), ProcessImageInformation, + &info, sizeof(info), NULL ); + + if (!set_ntstatus( status )) return 0; + return MAKELONG( info.SubsystemVersionLow, info.SubsystemVersionHigh ); +} + + /*********************************************************************** * GetProcessWorkingSetSizeEx (kernelbase.@) */