xref: /aosp_15_r20/external/cronet/base/process/process_handle_win.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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 Worker ProcessId GetCurrentProcId() {
18*6777b538SAndroid Build Coastguard Worker   return ::GetCurrentProcessId();
19*6777b538SAndroid Build Coastguard Worker }
20*6777b538SAndroid Build Coastguard Worker 
GetCurrentProcessHandle()21*6777b538SAndroid Build Coastguard Worker ProcessHandle 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 Worker ProcessId 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 Worker ProcessId 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