ReactOS 0.4.17-dev-414-ge848ce1
wmi.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS NetSh
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: Network Shell WMI info functions
5 * COPYRIGHT: Copyright 2026 Eric Kohl <eric.kohl@reactos.org>
6 */
7
8/* INCLUDES *******************************************************************/
9
10#define COBJMACROS
11
12#include "precomp.h"
13
14#include <strsafe.h>
15#include <initguid.h>
16#include <objbase.h>
17#include <wbemcli.h>
18
19#define NDEBUG
20#include <debug.h>
21
22/* GLOBALS ********************************************************************/
23
31
32/* FUNCTIONS ******************************************************************/
33
34static
38{
41 BSTR Wql = NULL;
42 BSTR Query = NULL;
43 BSTR Name;
47 HRESULT hr;
48
49 Wql = SysAllocString(L"WQL");
50 if (Wql == NULL)
51 return E_OUTOFMEMORY;
52
53 Query = SysAllocString(L"SELECT * FROM Win32_OperatingSystem");
54 if (Query == NULL)
55 {
57 goto done;
58 }
59
60 hr = IWbemServices_ExecQuery(Services, Wql, Query, 0, NULL, &Result);
61 if (hr != S_OK)
62 {
63 DPRINT1("IWbemServices_ExecQuery failed %08x\n", hr);
64 goto done;
65 }
66
67 hr = IEnumWbemClassObject_Next(Result, 10000, 1, &Object, &Count);
68 if (hr != S_OK)
69 {
70 DPRINT1("IEnumWbemClassObject_Next failed %08x\n", hr);
71 goto done;
72 }
73
74 hr = IWbemClassObject_BeginEnumeration(Object, 0);
75 if (hr != S_OK)
76 {
77 DPRINT1("IWbemClassObject_BeginEnumeration returned %08x\n", hr);
78 goto done;
79 }
80
81 while (IWbemClassObject_Next(Object, 0, &Name, &Value, &Type, NULL) == S_OK)
82 {
83 DPRINT1("Name: %S\n", Name);
84 if (_wcsicmp(Name, L"BuildNumber") == 0)
85 {
86 DPRINT1("BuildNumber %S\n", V_BSTR(&Value));
88 }
89 else if (_wcsicmp(Name, L"OSProductSuite") == 0)
90 {
91 DPRINT1("OSProductSuite 0x%x\n", V_UINT(&Value));
93 }
94 else if (_wcsicmp(Name, L"OSType") == 0)
95 {
96 DPRINT1("OSType %u\n", V_UINT(&Value));
98 }
99 else if (_wcsicmp(Name, L"ServicePackMajorVersion") == 0)
100 {
101 DPRINT1("ServicePackMajorVersion %S\n", V_BSTR(&Value));
103 }
104 else if (_wcsicmp(Name, L"ServicePackMinorVersion") == 0)
105 {
106 DPRINT1("ServicePackMinorVersion %S\n", V_BSTR(&Value));
108 }
109 else if (_wcsicmp(Name, L"Version") == 0)
110 {
111 DPRINT1("Version %S\n", V_BSTR(&Value));
113 }
114
117 }
118
119 hr = IWbemClassObject_EndEnumeration(Object);
120 if (hr != S_OK)
121 {
122 DPRINT1("got %08x\n", hr);
123 goto done;
124 }
125
126done:
127 if (Object)
128 IWbemClassObject_Release(Object);
129
130 if (Result)
131 IEnumWbemClassObject_Release(Result);
132
133 if (Query)
135
136 if (Wql)
137 SysFreeString(Wql);
138
139 return hr;
140}
141
142
143static
147{
150 BSTR Wql = NULL;
151 BSTR Query = NULL;
152 BSTR Name;
154 ULONG Count;
156 HRESULT hr;
157
158 Wql = SysAllocString(L"WQL");
159 if (Wql == NULL)
160 return E_OUTOFMEMORY;
161
162 Query = SysAllocString(L"SELECT * FROM Win32_Processor");
163 if (Query == NULL)
164 {
166 goto done;
167 }
168
169 hr = IWbemServices_ExecQuery(Services, Wql, Query, 0, NULL, &Result);
170 if (hr != S_OK)
171 {
172 DPRINT1("IWbemServices_ExecQuery failed %08x\n", hr);
173 goto done;
174 }
175
176 hr = IEnumWbemClassObject_Next(Result, 10000, 1, &Object, &Count);
177 if (hr != S_OK)
178 {
179 DPRINT1("IEnumWbemClassObject_Next failed %08x\n", hr);
180 goto done;
181 }
182
183 hr = IWbemClassObject_BeginEnumeration(Object, 0);
184 if (hr != S_OK)
185 {
186 DPRINT1("IWbemClassObject_BeginEnumeration returned %08x\n", hr);
187 goto done;
188 }
189
190 while (IWbemClassObject_Next(Object, 0, &Name, &Value, &Type, NULL) == S_OK)
191 {
192 DPRINT1("Name: %S\n", Name);
193 if (_wcsicmp(Name, L"Architecture") == 0)
194 {
195 DPRINT1("Architecture %u\n", V_UINT(&Value));
196 }
197
200 }
201
202 hr = IWbemClassObject_EndEnumeration(Object);
203 if (hr != S_OK)
204 {
205 DPRINT1("got %08x\n", hr);
206 goto done;
207 }
208
209done:
210 if (Object)
211 IWbemClassObject_Release(Object);
212
213 if (Result)
214 IEnumWbemClassObject_Release(Result);
215
216 if (Query)
218
219 if (Wql)
220 SysFreeString(Wql);
221
222 return hr;
223}
224
227{
228 BSTR Path = NULL;
229 IWbemLocator *Locator = NULL;
231 HRESULT hr;
232
234
237 hr = CoCreateInstance(&CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER,
238 &IID_IWbemLocator, (void **)&Locator);
239 if (hr != S_OK)
240 {
241 DPRINT1("Can't create instance of WbemLocator\n");
242 return hr;
243 }
244
245 Path = SysAllocString(L"ROOT\\CIMV2");
246 if (Path == NULL)
247 {
249 goto done;
250 }
251
252 hr = IWbemLocator_ConnectServer(Locator, Path, NULL, NULL, NULL, 0, NULL, NULL, &Services);
253 if (hr != S_OK)
254 {
255 DPRINT1("Failed to get IWbemServices interface %08x\n", hr);
256 goto done;
257 }
258
261 if (hr != S_OK)
262 {
263 DPRINT1("Failed to set proxy blanket %08x\n", hr);
264 goto done;
265 }
266
269
270done:
271 if (Path)
273
274 if (Services)
275 IWbemServices_Release(Services);
276
277 if (Locator)
278 IWbemLocator_Release(Locator);
279
281
282 return hr;
283}
PRTL_UNICODE_STRING_BUFFER Path
Type
Definition: Type.h:7
WCHAR VersionInfoBuildNumber[MAX_PATH]
Definition: wmi.c:28
static HRESULT QueryOperatingSystemInfo(_In_ IWbemServices *Services)
Definition: wmi.c:36
static HRESULT QueryProcessorInfo(_In_ IWbemServices *Services)
Definition: wmi.c:145
UINT VersionInfoArchitecture
Definition: wmi.c:24
WCHAR VersionInfoServicePackMinorVersion[MAX_PATH]
Definition: wmi.c:30
UINT VersionInfoOsProductSuite
Definition: wmi.c:25
HRESULT GetWmiVersionInfo(VOID)
Definition: wmi.c:226
UINT VersionInfoVersion
Definition: wmi.c:27
UINT VersionInfoOsType
Definition: wmi.c:26
WCHAR VersionInfoServicePackMajorVersion[MAX_PATH]
Definition: wmi.c:29
#define DPRINT1
Definition: precomp.h:8
BOOL Query(LPCTSTR *ServiceArgs, DWORD ArgCount, BOOL bExtended)
Definition: query.c:292
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
HRESULT hr
Definition: delayimp.cpp:582
LPWSTR Name
Definition: desk.c:124
#define NULL
Definition: types.h:112
HRESULT WINAPI CoSetProxyBlanket(IUnknown *proxy, DWORD authn_service, DWORD authz_service, OLECHAR *servername, DWORD authn_level, DWORD imp_level, void *auth_info, DWORD capabilities)
Definition: combase.c:1055
HRESULT WINAPI CoInitializeSecurity(PSECURITY_DESCRIPTOR sd, LONG cAuthSvc, SOLE_AUTHENTICATION_SERVICE *asAuthSvc, void *reserved1, DWORD authn_level, DWORD imp_level, void *reserved2, DWORD capabilities, void *reserved3)
Definition: combase.c:1163
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: combase.c:2842
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
OLECHAR * BSTR
Definition: compat.h:2293
#define MAX_PATH
Definition: compat.h:34
_ACRTIMP int __cdecl _wcsicmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:164
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:531
#define L(x)
Definition: resources.c:13
#define S_OK
Definition: intsafe.h:52
unsigned int UINT
Definition: ndis.h:50
#define _In_
Definition: no_sal2.h:158
int Count
Definition: noreturn.cpp:7
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:238
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
#define V_BSTR(A)
Definition: oleauto.h:226
#define V_UINT(A)
Definition: oleauto.h:264
short WCHAR
Definition: pedump.c:58
#define RPC_C_AUTHZ_NONE
Definition: rpcdce.h:167
#define RPC_C_AUTHN_LEVEL_DEFAULT
Definition: rpcdce.h:145
#define RPC_C_AUTHN_LEVEL_CALL
Definition: rpcdce.h:148
#define RPC_C_IMP_LEVEL_IMPERSONATE
Definition: rpcdce.h:176
#define RPC_C_AUTHN_WINNT
Definition: rpcdce.h:158
STRSAFEAPI StringCbCopyW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:166
static SERVICES Services[NUM_SERVICES]
Definition: tcpsvcs.c:26
uint32_t ULONG
Definition: typedefs.h:59
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:648
long CIMTYPE
Definition: wbemcli.idl:258
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409