ReactOS  0.4.13-dev-92-gf251225
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 
35 static const WCHAR biosW[] =
36  {'b','i','o','s',0};
37 static const WCHAR computersystemW[] =
38  {'c','o','m','p','u','t','e','r','s','y','s','t','e','m',0};
39 static const WCHAR cpuW[] =
40  {'c','p','u',0};
41 static const WCHAR logicaldiskW[] =
42  {'L','o','g','i','c','a','l','D','i','s','k',0};
43 static const WCHAR nicW[] =
44  {'n','i','c',0};
45 static const WCHAR osW[] =
46  {'o','s',0};
47 static const WCHAR processW[] =
48  {'p','r','o','c','e','s','s',0};
49 
50 static const WCHAR win32_biosW[] =
51  {'W','i','n','3','2','_','B','I','O','S',0};
52 static const WCHAR win32_computersystemW[] =
53  {'W','i','n','3','2','_','C','o','m','p','u','t','e','r','S','y','s','t','e','m',0};
54 static const WCHAR win32_logicaldiskW[] =
55  {'W','i','n','3','2','_','L','o','g','i','c','a','l','D','i','s','k',0};
56 static const WCHAR win32_networkadapterW[] =
57  {'W','i','n','3','2','_','N','e','t','w','o','r','k','A','d','a','p','t','e','r',0};
58 static const WCHAR win32_operatingsystemW[] =
59  {'W','i','n','3','2','_','O','p','e','r','a','t','i','n','g','S','y','s','t','e','m',0};
60 static const WCHAR win32_processW[] =
61  {'W','i','n','3','2','_','P','r','o','c','e','s','s',0};
62 static const WCHAR win32_processorW[] =
63  {'W','i','n','3','2','_','P','r','o','c','e','s','s','o','r',0};
64 
65 static const struct
66 {
67  const WCHAR *alias;
68  const WCHAR *class;
69 }
70 alias_map[] =
71 {
72  { biosW, win32_biosW },
79 };
80 
81 static 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 
92 static 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 
101 static 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  {
113  SafeArrayGetElement( sa, &i, &str );
114  if (!strcmpiW( str, prop ))
115  {
116  ret = strdupW( str );
117  break;
118  }
119  }
120  SafeArrayDestroy( sa );
121  return ret;
122 }
123 
124 static 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 
135  if (!WriteConsoleW( handle, buffer, len, &count, NULL ))
136  WriteFile( handle, buffer, len * sizeof(WCHAR), &count, FALSE );
137 
138  return count;
139 }
140 
141 static int output_error( int msg )
142 {
143  static const WCHAR fmtW[] = {'%','s',0};
144  WCHAR buffer[8192];
145 
148 }
149 
150 static 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 
169 static 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 
175 static 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 
195  CoInitialize( NULL );
197  RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL );
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 
257 done:
258  if (result) IEnumWbemClassObject_Release( result );
259  if (services) IWbemServices_Release( services );
260  if (locator) IWbemLocator_Release( locator );
261  SysFreeString( path );
262  SysFreeString( query );
263  SysFreeString( wql );
264  HeapFree( GetProcessHeap(), 0, prop );
265  CoUninitialize();
266  return ret;
267 }
268 
269 int 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 
329 not_supported:
331  return 1;
332 }
static const WCHAR classW[]
Definition: lex.c:38
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
static int argc
Definition: ServiceArgs.c:12
static const WCHAR * find_class(const WCHAR *alias)
Definition: main.c:81
GLint GLint GLsizei width
Definition: gl.h:1546
#define max(a, b)
Definition: svc.c:63
HRESULT WINAPI DECLSPEC_HOTPATCH VariantChangeType(VARIANTARG *pvargDest, VARIANTARG *pvargSrc, USHORT wFlags, VARTYPE vt)
Definition: variant.c:965
#define TRUE
Definition: types.h:120
static const WCHAR cpuW[]
Definition: main.c:39
#define snprintfW
Definition: unicode.h:60
static const WCHAR win32_logicaldiskW[]
Definition: main.c:54
WINE_UNICODE_INLINE unsigned int strlenW(const WCHAR *str)
Definition: unicode.h:212
HRESULT hr
Definition: shlfolder.c:183
BSTR WINAPI SysAllocStringLen(const OLECHAR *str, unsigned int len)
Definition: oleaut.c:342
WINE_DEFAULT_DEBUG_CHANNEL(wmic)
static const WCHAR win32_computersystemW[]
Definition: main.c:52
static WCHAR * find_prop(IWbemClassObject *class, const WCHAR *prop)
Definition: main.c:101
static const WCHAR osW[]
Definition: main.c:45
static WCHAR * strdupW(const WCHAR *src)
Definition: main.c:92
BOOL WINAPI DECLSPEC_HOTPATCH WriteConsoleW(IN HANDLE hConsoleOutput, IN CONST VOID *lpBuffer, IN DWORD nNumberOfCharsToWrite, OUT LPDWORD lpNumberOfCharsWritten, LPVOID lpReserved)
Definition: readwrite.c:1449
GLuint GLuint GLsizei count
Definition: gl.h:1545
const GLint * first
Definition: glext.h:5794
#define RPC_C_AUTHN_LEVEL_DEFAULT
Definition: rpcdce.h:145
#define WINE_TRACE
Definition: debug.h:353
HANDLE WINAPI GetStdHandle(IN DWORD nStdHandle)
Definition: console.c:152
GLuint buffer
Definition: glext.h:5915
HRESULT WINAPI SafeArrayGetElement(SAFEARRAY *psa, LONG *rgIndices, void *pvData)
Definition: safearray.c:949
OLECHAR * BSTR
Definition: compat.h:1934
#define RPC_C_IMP_LEVEL_IMPERSONATE
Definition: rpcdce.h:176
#define argv
Definition: mplay32.c:18
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:4031
int wmain(int argc, WCHAR *argv[])
Definition: main.c:269
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
GLsizei GLsizei GLuint * obj
Definition: glext.h:6042
static const struct @5 alias_map[]
static const WCHAR biosW[]
Definition: main.c:35
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 va_end(ap)
Definition: acmsvcex.h:90
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
static int output_string(HANDLE handle, const WCHAR *msg,...)
Definition: main.c:124
#define debugstr_w
Definition: kernel32.h:32
static const WCHAR wqlW[]
Definition: query.c:30
const WCHAR * str
smooth NULL
Definition: ftsmooth.c:416
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:241
char * va_list
Definition: acmsvcex.h:78
static const WCHAR win32_operatingsystemW[]
Definition: main.c:58
#define GetProcessHeap()
Definition: compat.h:395
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
static const WCHAR processW[]
Definition: main.c:47
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:77
static const WCHAR win32_biosW[]
Definition: main.c:50
#define STD_ERROR_HANDLE
Definition: winbase.h:266
unsigned long DWORD
Definition: ntddk_ex.h:95
static const WCHAR computersystemW[]
Definition: main.c:37
GLbitfield flags
Definition: glext.h:7161
#define STRING_INVALID_QUERY
Definition: wmic.h:23
HRESULT WINAPI SafeArrayDestroy(SAFEARRAY *psa)
Definition: safearray.c:1349
int ret
static const WCHAR exitW[]
Definition: lex.c:50
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:651
GLenum GLsizei len
Definition: glext.h:6722
static const WCHAR logicaldiskW[]
Definition: main.c:41
#define STRING_CMDLINE_NOT_SUPPORTED
Definition: wmic.h:21
#define STD_OUTPUT_HANDLE
Definition: winbase.h:265
GLenum src
Definition: glext.h:6340
static int query_prop(const WCHAR *class, const WCHAR *propname)
Definition: main.c:175
GLsizei const GLfloat * value
Definition: glext.h:6069
const WCHAR * alias
Definition: main.c:67
#define V_BSTR(A)
Definition: oleauto.h:226
static const WCHAR nicW[]
Definition: main.c:43
#define strcmpiW(s1, s2)
Definition: unicode.h:39
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3234
#define S_OK
Definition: intsafe.h:59
HRESULT WINAPI SafeArrayGetUBound(SAFEARRAY *psa, UINT nDim, LONG *plUbound)
Definition: safearray.c:1035
WINE_UNICODE_INLINE WCHAR * strcpyW(WCHAR *dst, const WCHAR *src)
Definition: unicode.h:219
const GLdouble * v
Definition: gl.h:2040
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:1991
#define ARRAY_SIZE(a)
Definition: main.h:24
Definition: services.c:325
GLenum GLenum dst
Definition: glext.h:6340
WINE_UNICODE_INLINE WCHAR * strcatW(WCHAR *dst, const WCHAR *src)
Definition: unicode.h:242
#define vsnprintfW
Definition: unicode.h:61
static const WCHAR win32_networkadapterW[]
Definition: main.c:56
#define va_start(ap, A)
Definition: acmsvcex.h:91
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:274
#define STRING_INVALID_PATH
Definition: wmic.h:24
static int output_error(int msg)
Definition: main.c:141
static const WCHAR win32_processorW[]
Definition: main.c:62
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1897
#define msg(x)
Definition: auth_time.c:54
unsigned int ULONG
Definition: retypes.h:1
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:845
static int output_line(const WCHAR *str, ULONG column_width)
Definition: main.c:169
static const WCHAR getW[]
Definition: lex.c:55
#define STRING_ALIAS_NOT_FOUND
Definition: wmic.h:22
GLuint64EXT * result
Definition: glext.h:11304
static const WCHAR win32_processW[]
Definition: main.c:60
#define HeapFree(x, y, z)
Definition: compat.h:394
static struct sockaddr_in sa
Definition: adnsresfilter.c:69
static int output_header(const WCHAR *prop, ULONG column_width)
Definition: main.c:150
#define WINE_FIXME
Definition: debug.h:365