ReactOS 0.4.15-dev-7906-g1b85a5f
main.c
Go to the documentation of this file.
1/*
2 * Copyright 2010 Louis Lenders
3 * Copyright 2012 Hans Leidekker for CodeWeavers
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18 */
19
20#define COBJMACROS
21
22#include <stdio.h>
23#include "windows.h"
24#include "ocidl.h"
25#include "initguid.h"
26#include "objidl.h"
27#include "wbemcli.h"
28#include "wmic.h"
29
30#include "wine/debug.h"
31#include "wine/unicode.h"
32
34
35static const WCHAR biosW[] =
36 {'b','i','o','s',0};
37static const WCHAR computersystemW[] =
38 {'c','o','m','p','u','t','e','r','s','y','s','t','e','m',0};
39static const WCHAR cpuW[] =
40 {'c','p','u',0};
41static const WCHAR logicaldiskW[] =
42 {'L','o','g','i','c','a','l','D','i','s','k',0};
43static const WCHAR nicW[] =
44 {'n','i','c',0};
45static const WCHAR osW[] =
46 {'o','s',0};
47static const WCHAR processW[] =
48 {'p','r','o','c','e','s','s',0};
49
50static const WCHAR win32_biosW[] =
51 {'W','i','n','3','2','_','B','I','O','S',0};
53 {'W','i','n','3','2','_','C','o','m','p','u','t','e','r','S','y','s','t','e','m',0};
54static const WCHAR win32_logicaldiskW[] =
55 {'W','i','n','3','2','_','L','o','g','i','c','a','l','D','i','s','k',0};
57 {'W','i','n','3','2','_','N','e','t','w','o','r','k','A','d','a','p','t','e','r',0};
59 {'W','i','n','3','2','_','O','p','e','r','a','t','i','n','g','S','y','s','t','e','m',0};
60static const WCHAR win32_processW[] =
61 {'W','i','n','3','2','_','P','r','o','c','e','s','s',0};
62static const WCHAR win32_processorW[] =
63 {'W','i','n','3','2','_','P','r','o','c','e','s','s','o','r',0};
64
65static const struct
66{
67 const WCHAR *alias;
68 const WCHAR *class;
69}
70alias_map[] =
71{
72 { biosW, win32_biosW },
79};
80
81static const WCHAR *find_class( const WCHAR *alias )
82{
83 unsigned int i;
84
85 for (i = 0; i < ARRAY_SIZE(alias_map); i++)
86 {
87 if (!strcmpiW( alias, alias_map[i].alias )) return alias_map[i].class;
88 }
89 return NULL;
90}
91
92static inline WCHAR *strdupW( const WCHAR *src )
93{
94 WCHAR *dst;
95 if (!src) return NULL;
96 if (!(dst = HeapAlloc( GetProcessHeap(), 0, (strlenW( src ) + 1) * sizeof(WCHAR) ))) return NULL;
97 strcpyW( dst, src );
98 return dst;
99}
100
101static WCHAR *find_prop( IWbemClassObject *class, const WCHAR *prop )
102{
103 SAFEARRAY *sa;
104 WCHAR *ret = NULL;
105 LONG i, last_index = 0;
106 BSTR str;
107
108 if (IWbemClassObject_GetNames( class, NULL, WBEM_FLAG_ALWAYS, NULL, &sa ) != S_OK) return NULL;
109
110 SafeArrayGetUBound( sa, 1, &last_index );
111 for (i = 0; i <= last_index; i++)
112 {
114 if (!strcmpiW( str, prop ))
115 {
116 ret = strdupW( str );
117 break;
118 }
119 }
121 return ret;
122}
123
124static int output_string( HANDLE handle, const WCHAR *msg, ... )
125{
126 va_list va_args;
127 int len;
128 DWORD count;
129 WCHAR buffer[8192];
130
131 va_start( va_args, msg );
132 len = vsnprintfW( buffer, ARRAY_SIZE(buffer), msg, va_args );
133 va_end( va_args );
134
136 WriteFile( handle, buffer, len * sizeof(WCHAR), &count, FALSE );
137
138 return count;
139}
140
141static int output_error( int msg )
142{
143 static const WCHAR fmtW[] = {'%','s',0};
144 WCHAR buffer[8192];
145
148}
149
150static int output_header( const WCHAR *prop, ULONG column_width )
151{
152 static const WCHAR bomW[] = {0xfeff}, fmtW[] = {'%','-','*','s','\r','\n',0};
153 int len;
154 DWORD count;
155 WCHAR buffer[8192];
156
157 len = snprintfW( buffer, ARRAY_SIZE(buffer), fmtW, column_width, prop );
158
159 if (!WriteConsoleW( GetStdHandle(STD_OUTPUT_HANDLE), buffer, len, &count, NULL )) /* redirected */
160 {
161 WriteFile( GetStdHandle(STD_OUTPUT_HANDLE), bomW, sizeof(bomW), &count, FALSE );
163 count += sizeof(bomW);
164 }
165
166 return count;
167}
168
169static int output_line( const WCHAR *str, ULONG column_width )
170{
171 static const WCHAR fmtW[] = {'%','-','*','s','\r','\n',0};
172 return output_string( GetStdHandle(STD_OUTPUT_HANDLE), fmtW, column_width, str );
173}
174
175static int query_prop( const WCHAR *class, const WCHAR *propname )
176{
177 static const WCHAR select_allW[] = {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',0};
178 static const WCHAR cimv2W[] = {'R','O','O','T','\\','C','I','M','V','2',0};
179 static const WCHAR wqlW[] = {'W','Q','L',0};
180 HRESULT hr;
185 BSTR path = NULL, wql = NULL, query = NULL;
186 WCHAR *prop = NULL;
187 BOOL first = TRUE;
188 int len, ret = -1;
190 ULONG count, width = 0;
191 VARIANT v;
192
193 WINE_TRACE("%s, %s\n", debugstr_w(class), debugstr_w(propname));
194
198
199 hr = CoCreateInstance( &CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, &IID_IWbemLocator,
200 (void **)&locator );
201 if (hr != S_OK) goto done;
202
203 if (!(path = SysAllocString( cimv2W ))) goto done;
204 hr = IWbemLocator_ConnectServer( locator, path, NULL, NULL, NULL, 0, NULL, NULL, &services );
205 if (hr != S_OK) goto done;
206
207 len = strlenW( class ) + ARRAY_SIZE(select_allW);
208 if (!(query = SysAllocStringLen( NULL, len ))) goto done;
209 strcpyW( query, select_allW );
210 strcatW( query, class );
211
212 if (!(wql = SysAllocString( wqlW ))) goto done;
213 hr = IWbemServices_ExecQuery( services, wql, query, flags, NULL, &result );
214 if (hr != S_OK) goto done;
215
216 for (;;) /* get column width */
217 {
218 IEnumWbemClassObject_Next( result, WBEM_INFINITE, 1, &obj, &count );
219 if (!count) break;
220
221 if (!prop && !(prop = find_prop( obj, propname )))
222 {
224 goto done;
225 }
226 if (IWbemClassObject_Get( obj, prop, 0, &v, NULL, NULL ) == WBEM_S_NO_ERROR)
227 {
228 VariantChangeType( &v, &v, 0, VT_BSTR );
229 width = max( strlenW( V_BSTR( &v ) ), width );
230 VariantClear( &v );
231 }
232 IWbemClassObject_Release( obj );
233 }
234 width += 2;
235
236 IEnumWbemClassObject_Reset( result );
237 for (;;)
238 {
239 IEnumWbemClassObject_Next( result, WBEM_INFINITE, 1, &obj, &count );
240 if (!count) break;
241
242 if (first)
243 {
244 output_header( prop, width );
245 first = FALSE;
246 }
247 if (IWbemClassObject_Get( obj, prop, 0, &v, NULL, NULL ) == WBEM_S_NO_ERROR)
248 {
249 VariantChangeType( &v, &v, 0, VT_BSTR );
250 output_line( V_BSTR( &v ), width );
251 VariantClear( &v );
252 }
253 IWbemClassObject_Release( obj );
254 }
255 ret = 0;
256
257done:
258 if (result) IEnumWbemClassObject_Release( result );
259 if (services) IWbemServices_Release( services );
260 if (locator) IWbemLocator_Release( locator );
263 SysFreeString( wql );
264 HeapFree( GetProcessHeap(), 0, prop );
266 return ret;
267}
268
269int wmain(int argc, WCHAR *argv[])
270{
271 static const WCHAR getW[] = {'g','e','t',0};
272 static const WCHAR quitW[] = {'q','u','i','t',0};
273 static const WCHAR exitW[] = {'e','x','i','t',0};
274 static const WCHAR pathW[] = {'p','a','t','h',0};
275 static const WCHAR classW[] = {'c','l','a','s','s',0};
276 static const WCHAR contextW[] = {'c','o','n','t','e','x','t',0};
277 const WCHAR *class, *value;
278 int i;
279
280 for (i = 1; i < argc && argv[i][0] == '/'; i++)
281 WINE_FIXME( "command line switch %s not supported\n", debugstr_w(argv[i]) );
282
283 if (i >= argc)
284 goto not_supported;
285
286 if (!strcmpiW( argv[i], quitW ) ||
287 !strcmpiW( argv[i], exitW ))
288 {
289 return 0;
290 }
291
292 if (!strcmpiW( argv[i], classW) ||
293 !strcmpiW( argv[i], contextW ))
294 {
295 WINE_FIXME( "command %s not supported\n", debugstr_w(argv[i]) );
296 goto not_supported;
297 }
298
299 if (!strcmpiW( argv[i], pathW ))
300 {
301 if (++i >= argc)
302 {
304 return 1;
305 }
306 class = argv[i];
307 }
308 else
309 {
310 class = find_class( argv[i] );
311 if (!class)
312 {
314 return 1;
315 }
316 }
317
318 if (++i >= argc)
319 goto not_supported;
320
321 if (!strcmpiW( argv[i], getW ))
322 {
323 if (++i >= argc)
324 goto not_supported;
325 value = argv[i];
326 return query_prop( class, value );
327 }
328
329not_supported:
331 return 1;
332}
static int argc
Definition: ServiceArgs.c:12
char * va_list
Definition: acmsvcex.h:78
#define va_end(ap)
Definition: acmsvcex.h:90
#define va_start(ap, A)
Definition: acmsvcex.h:91
static struct sockaddr_in sa
Definition: adnsresfilter.c:69
#define msg(x)
Definition: auth_time.c:54
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
const WCHAR * alias
Definition: main.c:67
static int query_prop(const WCHAR *class, const WCHAR *propname)
Definition: main.c:175
static const WCHAR win32_networkadapterW[]
Definition: main.c:56
static int output_string(HANDLE handle, const WCHAR *msg,...)
Definition: main.c:124
static int output_error(int msg)
Definition: main.c:141
static const WCHAR processW[]
Definition: main.c:47
static int output_line(const WCHAR *str, ULONG column_width)
Definition: main.c:169
static const WCHAR nicW[]
Definition: main.c:43
static WCHAR * find_prop(IWbemClassObject *class, const WCHAR *prop)
Definition: main.c:101
static int output_header(const WCHAR *prop, ULONG column_width)
Definition: main.c:150
static const WCHAR win32_operatingsystemW[]
Definition: main.c:58
static const WCHAR computersystemW[]
Definition: main.c:37
static const WCHAR biosW[]
Definition: main.c:35
static const WCHAR win32_processW[]
Definition: main.c:60
static const WCHAR cpuW[]
Definition: main.c:39
static const WCHAR logicaldiskW[]
Definition: main.c:41
static WCHAR * strdupW(const WCHAR *src)
Definition: main.c:92
static const WCHAR win32_biosW[]
Definition: main.c:50
static const WCHAR * find_class(const WCHAR *alias)
Definition: main.c:81
static const WCHAR win32_processorW[]
Definition: main.c:62
static const WCHAR win32_computersystemW[]
Definition: main.c:52
static const WCHAR win32_logicaldiskW[]
Definition: main.c:54
static const WCHAR osW[]
Definition: main.c:45
static const struct @4 alias_map[]
#define ARRAY_SIZE(A)
Definition: main.h:33
HANDLE WINAPI GetStdHandle(IN DWORD nStdHandle)
Definition: console.c:203
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
OLECHAR * BSTR
Definition: compat.h:2293
#define HeapFree(x, y, z)
Definition: compat.h:735
@ VT_BSTR
Definition: compat.h:2303
static const WCHAR getW[]
Definition: object.c:50
BOOL WINAPI DECLSPEC_HOTPATCH WriteConsoleW(IN HANDLE hConsoleOutput, IN CONST VOID *lpBuffer, IN DWORD nNumberOfCharsToWrite, OUT LPDWORD lpNumberOfCharsWritten, LPVOID lpReserved)
Definition: readwrite.c:1447
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
HRESULT WINAPI CoInitializeSecurity(PSECURITY_DESCRIPTOR pSecDesc, LONG cAuthSvc, SOLE_AUTHENTICATION_SERVICE *asAuthSvc, void *pReserved1, DWORD dwAuthnLevel, DWORD dwImpLevel, void *pReserved2, DWORD dwCapabilities, void *pReserved3)
Definition: compobj.c:4122
HRESULT WINAPI SafeArrayGetUBound(SAFEARRAY *psa, UINT nDim, LONG *plUbound)
Definition: safearray.c:1033
HRESULT WINAPI SafeArrayGetElement(SAFEARRAY *psa, LONG *rgIndices, void *pvData)
Definition: safearray.c:947
HRESULT WINAPI SafeArrayDestroy(SAFEARRAY *psa)
Definition: safearray.c:1347
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
const GLdouble * v
Definition: gl.h:2040
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLint GLint GLsizei width
Definition: gl.h:1546
GLenum src
Definition: glext.h:6340
GLuint buffer
Definition: glext.h:5915
GLenum GLenum dst
Definition: glext.h:6340
GLbitfield flags
Definition: glext.h:7161
const GLint * first
Definition: glext.h:5794
GLenum GLsizei len
Definition: glext.h:6722
GLuint64EXT * result
Definition: glext.h:11304
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define S_OK
Definition: intsafe.h:52
#define debugstr_w
Definition: kernel32.h:32
static const WCHAR wqlW[]
Definition: query.c:30
#define argv
Definition: mplay32.c:18
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:238
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
BSTR WINAPI SysAllocStringLen(const OLECHAR *str, unsigned int len)
Definition: oleaut.c:339
#define V_BSTR(A)
Definition: oleauto.h:226
long LONG
Definition: pedump.c:60
int wmain()
#define strcmpiW(s1, s2)
Definition: unicode.h:39
#define strlenW(s)
Definition: unicode.h:28
#define strcatW(d, s)
Definition: unicode.h:30
#define vsnprintfW
Definition: unicode.h:61
#define snprintfW
Definition: unicode.h:60
#define strcpyW(d, s)
Definition: unicode.h:29
const WCHAR * str
#define RPC_C_AUTHN_LEVEL_DEFAULT
Definition: rpcdce.h:145
#define RPC_C_IMP_LEVEL_IMPERSONATE
Definition: rpcdce.h:176
#define WINE_TRACE
Definition: debug.h:354
#define WINE_FIXME
Definition: debug.h:366
HRESULT hr
Definition: shlfolder.c:183
#define max(a, b)
Definition: svc.c:63
uint32_t ULONG
Definition: typedefs.h:59
Definition: pdh_main.c:94
HRESULT WINAPI DECLSPEC_HOTPATCH VariantChangeType(VARIANTARG *pvargDest, VARIANTARG *pvargSrc, USHORT wFlags, VARTYPE vt)
Definition: variant.c:962
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:648
static const WCHAR classW[]
Definition: lex.c:40
static const WCHAR exitW[]
Definition: lex.c:52
@ WBEM_FLAG_RETURN_IMMEDIATELY
Definition: wbemcli.idl:325
@ WBEM_FLAG_FORWARD_ONLY
Definition: wbemcli.idl:326
@ WBEM_INFINITE
Definition: wbemcli.idl:189
@ WBEM_FLAG_ALWAYS
Definition: wbemcli.idl:194
@ WBEM_S_NO_ERROR
Definition: wbemcli.idl:37
int ret
#define STD_OUTPUT_HANDLE
Definition: winbase.h:268
#define STD_ERROR_HANDLE
Definition: winbase.h:269
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
#define STRING_ALIAS_NOT_FOUND
Definition: wmic.h:22
#define STRING_CMDLINE_NOT_SUPPORTED
Definition: wmic.h:21
#define STRING_INVALID_QUERY
Definition: wmic.h:23
#define STRING_INVALID_PATH
Definition: wmic.h:24
__wchar_t WCHAR
Definition: xmlstorage.h:180