xref: /aosp_15_r20/external/cronet/base/win/wmi.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2010 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 // WMI (Windows Management and Instrumentation) is a big, complex, COM-based
6*6777b538SAndroid Build Coastguard Worker // API that can be used to perform all sorts of things. Sometimes is the best
7*6777b538SAndroid Build Coastguard Worker // way to accomplish something under windows but its lack of an approachable
8*6777b538SAndroid Build Coastguard Worker // C++ interface prevents its use. This collection of functions is a step in
9*6777b538SAndroid Build Coastguard Worker // that direction.
10*6777b538SAndroid Build Coastguard Worker // There are two classes; WMIUtil and WMIProcessUtil. The first
11*6777b538SAndroid Build Coastguard Worker // one contains generic helpers and the second one contains the only
12*6777b538SAndroid Build Coastguard Worker // functionality that is needed right now which is to use WMI to launch a
13*6777b538SAndroid Build Coastguard Worker // process.
14*6777b538SAndroid Build Coastguard Worker // To use any function on this header you must call CoInitialize or
15*6777b538SAndroid Build Coastguard Worker // CoInitializeEx beforehand.
16*6777b538SAndroid Build Coastguard Worker //
17*6777b538SAndroid Build Coastguard Worker // For more information about WMI programming:
18*6777b538SAndroid Build Coastguard Worker // https://docs.microsoft.com/en-us/windows/win32/wmisdk
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker #ifndef BASE_WIN_WMI_H_
21*6777b538SAndroid Build Coastguard Worker #define BASE_WIN_WMI_H_
22*6777b538SAndroid Build Coastguard Worker 
23*6777b538SAndroid Build Coastguard Worker #include <wbemidl.h>
24*6777b538SAndroid Build Coastguard Worker #include <wrl/client.h>
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker #include <optional>
27*6777b538SAndroid Build Coastguard Worker #include <string>
28*6777b538SAndroid Build Coastguard Worker #include <string_view>
29*6777b538SAndroid Build Coastguard Worker 
30*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h"
31*6777b538SAndroid Build Coastguard Worker 
32*6777b538SAndroid Build Coastguard Worker namespace base {
33*6777b538SAndroid Build Coastguard Worker namespace win {
34*6777b538SAndroid Build Coastguard Worker 
35*6777b538SAndroid Build Coastguard Worker // Enumeration of errors that can arise when connecting to a WMI server and
36*6777b538SAndroid Build Coastguard Worker // running a query.
37*6777b538SAndroid Build Coastguard Worker // Do not change ordering. This enum is captured as `WmiQueryError` in
38*6777b538SAndroid Build Coastguard Worker // enums.xml.
39*6777b538SAndroid Build Coastguard Worker enum class WmiError {
40*6777b538SAndroid Build Coastguard Worker   kFailedToCreateInstance = 0,
41*6777b538SAndroid Build Coastguard Worker   kFailedToConnectToWMI = 1,
42*6777b538SAndroid Build Coastguard Worker   kFailedToSetSecurityBlanket = 2,
43*6777b538SAndroid Build Coastguard Worker   kFailedToExecWMIQuery = 3,
44*6777b538SAndroid Build Coastguard Worker   kMaxValue = kFailedToExecWMIQuery
45*6777b538SAndroid Build Coastguard Worker };
46*6777b538SAndroid Build Coastguard Worker 
47*6777b538SAndroid Build Coastguard Worker // String used to connect to the CIMV2 WMI server.
48*6777b538SAndroid Build Coastguard Worker BASE_EXPORT extern const wchar_t kCimV2ServerName[];
49*6777b538SAndroid Build Coastguard Worker 
50*6777b538SAndroid Build Coastguard Worker // String used to connect to the SecurityCenter2 WMI server.
51*6777b538SAndroid Build Coastguard Worker BASE_EXPORT extern const wchar_t kSecurityCenter2ServerName[];
52*6777b538SAndroid Build Coastguard Worker 
53*6777b538SAndroid Build Coastguard Worker // Connects to a server named `server_name` on the local computer through COM
54*6777b538SAndroid Build Coastguard Worker // and run the given WQL `query`. Sets `enumerator` with the values returned by
55*6777b538SAndroid Build Coastguard Worker // that `query`. Will return a WmiError value if an error occurs, else returns
56*6777b538SAndroid Build Coastguard Worker // std::nullopt.
57*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::optional<WmiError> RunWmiQuery(
58*6777b538SAndroid Build Coastguard Worker     const std::wstring& server_name,
59*6777b538SAndroid Build Coastguard Worker     const std::wstring& query,
60*6777b538SAndroid Build Coastguard Worker     Microsoft::WRL::ComPtr<IEnumWbemClassObject>* enumerator);
61*6777b538SAndroid Build Coastguard Worker 
62*6777b538SAndroid Build Coastguard Worker // Creates an instance of the WMI service connected to the local computer and
63*6777b538SAndroid Build Coastguard Worker // returns its COM interface. If |set_blanket| is set to true, the basic COM
64*6777b538SAndroid Build Coastguard Worker // security blanket is applied to the returned interface. This is almost
65*6777b538SAndroid Build Coastguard Worker // always desirable unless you set the parameter to false and apply a custom
66*6777b538SAndroid Build Coastguard Worker // COM security blanket.
67*6777b538SAndroid Build Coastguard Worker // Returns true if succeeded and |wmi_services|: the pointer to the service.
68*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool CreateLocalWmiConnection(
69*6777b538SAndroid Build Coastguard Worker     bool set_blanket,
70*6777b538SAndroid Build Coastguard Worker     Microsoft::WRL::ComPtr<IWbemServices>* wmi_services);
71*6777b538SAndroid Build Coastguard Worker 
72*6777b538SAndroid Build Coastguard Worker // Creates an instance of the WMI service connected to the resource and
73*6777b538SAndroid Build Coastguard Worker // returns its COM interface. If |set_blanket| is set to true, the basic COM
74*6777b538SAndroid Build Coastguard Worker // security blanket is applied to the returned interface. This is almost
75*6777b538SAndroid Build Coastguard Worker // always desirable unless you set the parameter to false and apply a custom
76*6777b538SAndroid Build Coastguard Worker // COM security blanket.
77*6777b538SAndroid Build Coastguard Worker // Returns a valid ComPtr<IWbemServices> on success, nullptr on failure.
78*6777b538SAndroid Build Coastguard Worker BASE_EXPORT Microsoft::WRL::ComPtr<IWbemServices> CreateWmiConnection(
79*6777b538SAndroid Build Coastguard Worker     bool set_blanket,
80*6777b538SAndroid Build Coastguard Worker     const std::wstring& resource);
81*6777b538SAndroid Build Coastguard Worker 
82*6777b538SAndroid Build Coastguard Worker // Creates a WMI method using from a WMI class named |class_name| that
83*6777b538SAndroid Build Coastguard Worker // contains a method named |method_name|. Only WMI classes that are CIM
84*6777b538SAndroid Build Coastguard Worker // classes can be created using this function.
85*6777b538SAndroid Build Coastguard Worker // Returns true if succeeded and |class_instance| returns a pointer to the
86*6777b538SAndroid Build Coastguard Worker // WMI method that you can fill with parameter values using SetParameter.
87*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool CreateWmiClassMethodObject(
88*6777b538SAndroid Build Coastguard Worker     IWbemServices* wmi_services,
89*6777b538SAndroid Build Coastguard Worker     std::wstring_view class_name,
90*6777b538SAndroid Build Coastguard Worker     std::wstring_view method_name,
91*6777b538SAndroid Build Coastguard Worker     Microsoft::WRL::ComPtr<IWbemClassObject>* class_instance);
92*6777b538SAndroid Build Coastguard Worker 
93*6777b538SAndroid Build Coastguard Worker // Creates a new process from |command_line|. The advantage over CreateProcess
94*6777b538SAndroid Build Coastguard Worker // is that it allows you to always break out from a Job object that the caller
95*6777b538SAndroid Build Coastguard Worker // is attached to even if the Job object flags prevent that.
96*6777b538SAndroid Build Coastguard Worker // Returns true and the process id in process_id if the process is launched
97*6777b538SAndroid Build Coastguard Worker // successful. False otherwise.
98*6777b538SAndroid Build Coastguard Worker // Note that a fully qualified path must be specified in most cases unless
99*6777b538SAndroid Build Coastguard Worker // the program is not in the search path of winmgmt.exe.
100*6777b538SAndroid Build Coastguard Worker // Processes created this way are children of wmiprvse.exe and run with the
101*6777b538SAndroid Build Coastguard Worker // caller credentials.
102*6777b538SAndroid Build Coastguard Worker // More info: http://msdn2.microsoft.com/en-us/library/aa394372(VS.85).aspx
103*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool WmiLaunchProcess(const std::wstring& command_line,
104*6777b538SAndroid Build Coastguard Worker                                   int* process_id);
105*6777b538SAndroid Build Coastguard Worker 
106*6777b538SAndroid Build Coastguard Worker // An encapsulation of information retrieved from the 'Win32_ComputerSystem' and
107*6777b538SAndroid Build Coastguard Worker // 'Win32_Bios' WMI classes; see :
108*6777b538SAndroid Build Coastguard Worker // https://docs.microsoft.com/en-us/windows/desktop/CIMWin32Prov/win32-computersystem
109*6777b538SAndroid Build Coastguard Worker // https://docs.microsoft.com/en-us/windows/desktop/CIMWin32Prov/win32-systembios
110*6777b538SAndroid Build Coastguard Worker // Note that while model and manufacturer can be obtained through WMI, it is
111*6777b538SAndroid Build Coastguard Worker // more efficient to obtain them via SysInfo::GetHardwareInfo() which uses the
112*6777b538SAndroid Build Coastguard Worker // registry.
113*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT WmiComputerSystemInfo {
114*6777b538SAndroid Build Coastguard Worker  public:
115*6777b538SAndroid Build Coastguard Worker   static WmiComputerSystemInfo Get();
116*6777b538SAndroid Build Coastguard Worker 
serial_number()117*6777b538SAndroid Build Coastguard Worker   const std::wstring& serial_number() const { return serial_number_; }
118*6777b538SAndroid Build Coastguard Worker 
119*6777b538SAndroid Build Coastguard Worker  private:
120*6777b538SAndroid Build Coastguard Worker   void PopulateSerialNumber(
121*6777b538SAndroid Build Coastguard Worker       const Microsoft::WRL::ComPtr<IEnumWbemClassObject>& enumerator_bios);
122*6777b538SAndroid Build Coastguard Worker 
123*6777b538SAndroid Build Coastguard Worker   std::wstring serial_number_;
124*6777b538SAndroid Build Coastguard Worker };
125*6777b538SAndroid Build Coastguard Worker 
126*6777b538SAndroid Build Coastguard Worker }  // namespace win
127*6777b538SAndroid Build Coastguard Worker }  // namespace base
128*6777b538SAndroid Build Coastguard Worker 
129*6777b538SAndroid Build Coastguard Worker #endif  // BASE_WIN_WMI_H_
130