1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #include "base/process/process_handle.h" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker #include <windows.h> 8*6777b538SAndroid Build Coastguard Worker 9*6777b538SAndroid Build Coastguard Worker #include <winternl.h> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include <ostream> 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker #include "base/check.h" 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker namespace base { 16*6777b538SAndroid Build Coastguard Worker GetCurrentProcId()17*6777b538SAndroid Build Coastguard WorkerProcessId GetCurrentProcId() { 18*6777b538SAndroid Build Coastguard Worker return ::GetCurrentProcessId(); 19*6777b538SAndroid Build Coastguard Worker } 20*6777b538SAndroid Build Coastguard Worker GetCurrentProcessHandle()21*6777b538SAndroid Build Coastguard WorkerProcessHandle GetCurrentProcessHandle() { 22*6777b538SAndroid Build Coastguard Worker return ::GetCurrentProcess(); 23*6777b538SAndroid Build Coastguard Worker } 24*6777b538SAndroid Build Coastguard Worker GetProcId(ProcessHandle process)25*6777b538SAndroid Build Coastguard WorkerProcessId GetProcId(ProcessHandle process) { 26*6777b538SAndroid Build Coastguard Worker if (process == base::kNullProcessHandle) 27*6777b538SAndroid Build Coastguard Worker return 0; 28*6777b538SAndroid Build Coastguard Worker // This returns 0 if we have insufficient rights to query the process handle. 29*6777b538SAndroid Build Coastguard Worker // Invalid handles or non-process handles will cause a hard failure. 30*6777b538SAndroid Build Coastguard Worker ProcessId result = GetProcessId(process); 31*6777b538SAndroid Build Coastguard Worker CHECK(result != 0 || GetLastError() != ERROR_INVALID_HANDLE) 32*6777b538SAndroid Build Coastguard Worker << "process handle = " << process; 33*6777b538SAndroid Build Coastguard Worker return result; 34*6777b538SAndroid Build Coastguard Worker } 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker // Local definition to include InheritedFromUniqueProcessId which contains a 37*6777b538SAndroid Build Coastguard Worker // unique identifier for the parent process. See documentation at: 38*6777b538SAndroid Build Coastguard Worker // https://learn.microsoft.com/en-us/windows/win32/api/winternl/nf-winternl-ntqueryinformationprocess 39*6777b538SAndroid Build Coastguard Worker typedef struct _PROCESS_BASIC_INFORMATION { 40*6777b538SAndroid Build Coastguard Worker PVOID Reserved1; 41*6777b538SAndroid Build Coastguard Worker PPEB PebBaseAddress; 42*6777b538SAndroid Build Coastguard Worker PVOID Reserved2[2]; 43*6777b538SAndroid Build Coastguard Worker ULONG_PTR UniqueProcessId; 44*6777b538SAndroid Build Coastguard Worker ULONG_PTR InheritedFromUniqueProcessId; 45*6777b538SAndroid Build Coastguard Worker } PROCESS_BASIC_INFORMATION; 46*6777b538SAndroid Build Coastguard Worker GetParentProcessId(ProcessHandle process)47*6777b538SAndroid Build Coastguard WorkerProcessId GetParentProcessId(ProcessHandle process) { 48*6777b538SAndroid Build Coastguard Worker HINSTANCE ntdll = GetModuleHandle(L"ntdll.dll"); 49*6777b538SAndroid Build Coastguard Worker decltype(NtQueryInformationProcess)* nt_query_information_process = 50*6777b538SAndroid Build Coastguard Worker reinterpret_cast<decltype(NtQueryInformationProcess)*>( 51*6777b538SAndroid Build Coastguard Worker GetProcAddress(ntdll, "NtQueryInformationProcess")); 52*6777b538SAndroid Build Coastguard Worker if (!nt_query_information_process) { 53*6777b538SAndroid Build Coastguard Worker return 0u; 54*6777b538SAndroid Build Coastguard Worker } 55*6777b538SAndroid Build Coastguard Worker 56*6777b538SAndroid Build Coastguard Worker PROCESS_BASIC_INFORMATION pbi = {}; 57*6777b538SAndroid Build Coastguard Worker // TODO(zijiehe): To match other platforms, -1 (UINT32_MAX) should be returned 58*6777b538SAndroid Build Coastguard Worker // if the parent process id cannot be found. 59*6777b538SAndroid Build Coastguard Worker ProcessId pid = 0u; 60*6777b538SAndroid Build Coastguard Worker if (NT_SUCCESS(nt_query_information_process(process, ProcessBasicInformation, 61*6777b538SAndroid Build Coastguard Worker &pbi, sizeof(pbi), nullptr))) { 62*6777b538SAndroid Build Coastguard Worker pid = static_cast<ProcessId>(pbi.InheritedFromUniqueProcessId); 63*6777b538SAndroid Build Coastguard Worker } 64*6777b538SAndroid Build Coastguard Worker 65*6777b538SAndroid Build Coastguard Worker return pid; 66*6777b538SAndroid Build Coastguard Worker } 67*6777b538SAndroid Build Coastguard Worker 68*6777b538SAndroid Build Coastguard Worker } // namespace base 69