ReactOS  0.4.14-dev-358-gbef841c
query.c
Go to the documentation of this file.
1 /*
2  * Copyright 2012 Hans Leidekker for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18 
19 #define COBJMACROS
20 
21 #include <stdio.h>
22 #include "windows.h"
23 #include "ocidl.h"
24 #include "sddl.h"
25 #include "initguid.h"
26 #include "objidl.h"
27 #include "wbemcli.h"
28 #include "wine/test.h"
29 
30 static const WCHAR wqlW[] = {'w','q','l',0};
31 
33 {
34  static const WCHAR captionW[] = {'C','a','p','t','i','o','n',0};
35  static const WCHAR descriptionW[] = {'D','e','s','c','r','i','p','t','i','o','n',0};
36  HRESULT hr;
40  ULONG count;
41 
42  hr = IWbemServices_ExecQuery( services, wql, query, flags, NULL, result );
43  if (hr == S_OK)
44  {
45  trace("%s\n", wine_dbgstr_w(str));
46  for (;;)
47  {
48  VARIANT var;
49 
50  IEnumWbemClassObject_Next( *result, 10000, 1, &obj, &count );
51  if (!count) break;
52 
53  if (IWbemClassObject_Get( obj, captionW, 0, &var, NULL, NULL ) == WBEM_S_NO_ERROR)
54  {
55  trace("caption: %s\n", wine_dbgstr_w(V_BSTR(&var)));
56  VariantClear( &var );
57  }
58  if (IWbemClassObject_Get( obj, descriptionW, 0, &var, NULL, NULL ) == WBEM_S_NO_ERROR)
59  {
60  trace("description: %s\n", wine_dbgstr_w(V_BSTR(&var)));
61  VariantClear( &var );
62  }
63  IWbemClassObject_Release( obj );
64  }
65  }
66  SysFreeString( wql );
68  return hr;
69 }
70 
72 {
73  static const WCHAR emptyW[] = {0};
74  static const WCHAR sqlW[] = {'S','Q','L',0};
75  static const WCHAR query1[] =
76  {'S','E','L','E','C','T',' ','H','O','T','F','I','X','I','D',' ','F','R','O','M',' ',
77  'W','i','n','3','2','_','Q','u','i','c','k','F','i','x','E','n','g','i','n','e','e','r','i','n','g',0};
78  static const WCHAR query2[] =
79  {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_','B','I','O','S',0};
80  static const WCHAR query3[] =
81  {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
82  'L','o','g','i','c','a','l','D','i','s','k',' ','W','H','E','R','E',' ',
83  '\"','N','T','F','S','\"',' ','=',' ','F','i','l','e','S','y','s','t','e','m',0};
84  static const WCHAR query4[] =
85  {'S','E','L','E','C','T',' ','a',' ','F','R','O','M',' ','b',0};
86  static const WCHAR query5[] =
87  {'S','E','L','E','C','T',' ','a',' ','F','R','O','M',' ','W','i','n','3','2','_','B','i','o','s',0};
88  static const WCHAR query6[] =
89  {'S','E','L','E','C','T',' ','D','e','s','c','r','i','p','t','i','o','n',' ','F','R','O','M',' ',
90  'W','i','n','3','2','_','B','i','o','s',0};
91  static const WCHAR query7[] =
92  {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
93  'P','r','o','c','e','s','s',' ','W','H','E','R','E',' ','C','a','p','t','i','o','n',' ',
94  'L','I','K','E',' ','\'','%','%','R','E','G','E','D','I','T','%','\'',0};
95  static const WCHAR query8[] =
96  {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
97  'D','i','s','k','D','r','i','v','e',' ','W','H','E','R','E',' ','D','e','v','i','c','e','I','D','=',
98  '\"','\\','\\','\\','\\','.','\\','\\','P','H','Y','S','I','C','A','L','D','R','I','V','E','0','\"',0};
99  static const WCHAR query9[] =
100  {'S','E','L','E','C','T','\n','a','\r','F','R','O','M','\t','b',0};
101  static const WCHAR query10[] =
102  {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
103  'P','r','o','c','e','s','s',' ','W','H','E','R','E',' ','C','a','p','t','i','o','n',' ',
104  'L','I','K','E',' ','"','%','f','i','r','e','f','o','x','.','e','x','e','"',0};
105  static const WCHAR query11[] =
106  {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
107  'W','i','n','3','2','_','V','i','d','e','o','C','o','n','t','r','o','l','l','e','r',' ','w','h','e','r','e',' ',
108  'a','v','a','i','l','a','b','i','l','i','t','y',' ','=',' ','\'','3','\'',0};
109  static const WCHAR query12[] =
110  {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_','B','I','O','S',
111  ' ','W','H','E','R','E',' ','N','A','M','E',' ','<','>',' ','N','U','L','L', 0};
112  static const WCHAR query13[] =
113  {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_','B','I','O','S',
114  ' ','W','H','E','R','E',' ','N','U','L','L',' ','=',' ','N','A','M','E', 0};
115  static const WCHAR *test[] = { query1, query2, query3, query4, query5, query6, query7, query8, query9, query10,
116  query11, query12, query13 };
117  HRESULT hr;
119  BSTR wql = SysAllocString( wqlW );
120  BSTR sql = SysAllocString( sqlW );
121  BSTR query = SysAllocString( query1 );
122  UINT i;
123 
124  hr = IWbemServices_ExecQuery( services, NULL, NULL, 0, NULL, &result );
125  ok( hr == WBEM_E_INVALID_PARAMETER, "query failed %08x\n", hr );
126 
127  hr = IWbemServices_ExecQuery( services, NULL, query, 0, NULL, &result );
128  ok( hr == WBEM_E_INVALID_PARAMETER, "query failed %08x\n", hr );
129 
130  hr = IWbemServices_ExecQuery( services, wql, NULL, 0, NULL, &result );
131  ok( hr == WBEM_E_INVALID_PARAMETER, "query failed %08x\n", hr );
132 
133  hr = IWbemServices_ExecQuery( services, sql, query, 0, NULL, &result );
134  ok( hr == WBEM_E_INVALID_QUERY_TYPE, "query failed %08x\n", hr );
135 
136  hr = IWbemServices_ExecQuery( services, sql, NULL, 0, NULL, &result );
137  ok( hr == WBEM_E_INVALID_PARAMETER, "query failed %08x\n", hr );
138 
139  SysFreeString( query );
141  hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
142  ok( hr == WBEM_E_INVALID_PARAMETER, "query failed %08x\n", hr );
143 
144  for (i = 0; i < ARRAY_SIZE( test ); i++)
145  {
146  hr = exec_query( services, test[i], &result );
147  ok( hr == S_OK, "query %u failed: %08x\n", i, hr );
148  if (result) IEnumWbemClassObject_Release( result );
149  }
150 
151  SysFreeString( wql );
152  SysFreeString( sql );
153  SysFreeString( query );
154 }
155 
157 {
158  static const WCHAR query1[] =
159  {'A','S','S','O','C','I','A','T','O','R','S',' ','O','F',' ','{','W','i','n','3','2','_',
160  'L','o','g','i','c','a','l','D','i','s','k','.','D','e','v','i','c','e','I','D','=','"','C',':','"','}',0};
161  static const WCHAR query2[] =
162  {'A','S','S','O','C','I','A','T','O','R','S',' ','O','F',' ','{','W','i','n','3','2','_',
163  'L','o','g','i','c','a','l','D','i','s','k','.','D','e','v','i','c','e','I','D','=','"','C',':','"','}',' ',
164  'W','H','E','R','E',' ','A','s','s','o','c','C','l','a','s','s',' ','=',' ','W','i','n','3','2','_',
165  'L','o','g','i','c','a','l','D','i','s','k','T','o','P','a','r','t','i','t','i','o','n',0};
166  static const WCHAR *test[] = { query1, query2 };
167  HRESULT hr;
169  UINT i;
170 
171  for (i = 0; i < ARRAY_SIZE( test ); i++)
172  {
173  hr = exec_query( services, test[i], &result );
174  todo_wine ok( hr == S_OK, "query %u failed: %08x\n", i, hr );
175  if (result) IEnumWbemClassObject_Release( result );
176  }
177 }
178 
180 {
181  static const WCHAR returnvalueW[] = {'R','e','t','u','r','n','V','a','l','u','e',0};
182  static const WCHAR pauseserviceW[] = {'P','a','u','s','e','S','e','r','v','i','c','e',0};
183  static const WCHAR resumeserviceW[] = {'R','e','s','u','m','e','S','e','r','v','i','c','e',0};
184  static const WCHAR startserviceW[] = {'S','t','a','r','t','S','e','r','v','i','c','e',0};
185  static const WCHAR stopserviceW[] = {'S','t','o','p','S','e','r','v','i','c','e',0};
186  static const WCHAR stateW[] = {'S','t','a','t','e',0};
187  static const WCHAR stoppedW[] = {'S','t','o','p','p','e','d',0};
188  static const WCHAR serviceW[] = {'W','i','n','3','2','_','S','e','r','v','i','c','e','.',
189  'N','a','m','e','=','"','S','p','o','o','l','e','r','"',0};
190  static const WCHAR emptyW[] = {0};
191  BSTR class = SysAllocString( serviceW ), empty = SysAllocString( emptyW ), method;
192  IWbemClassObject *service, *out;
193  VARIANT state, retval;
194  CIMTYPE type;
195  HRESULT hr;
196 
197  hr = IWbemServices_GetObject( services, class, 0, NULL, &service, NULL );
198  if (hr != S_OK)
199  {
200  win_skip( "Win32_Service not available\n" );
201  goto out;
202  }
203  type = 0xdeadbeef;
204  VariantInit( &state );
205  hr = IWbemClassObject_Get( service, stateW, 0, &state, &type, NULL );
206  ok( hr == S_OK, "failed to get service state %08x\n", hr );
207  ok( V_VT( &state ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &state ) );
208  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
209 
210  if (!lstrcmpW( V_BSTR( &state ), stoppedW ))
211  {
212  out = NULL;
213  method = SysAllocString( startserviceW );
214  hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL );
215  ok( hr == S_OK, "failed to execute method %08x\n", hr );
217 
218  VariantInit( &retval );
219  hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, NULL, NULL );
220  ok( hr == S_OK, "failed to get return value %08x\n", hr );
221  ok( !V_I4( &retval ), "unexpected error %u\n", V_UI4( &retval ) );
222  IWbemClassObject_Release( out );
223  }
224  out = NULL;
225  method = SysAllocString( pauseserviceW );
226  hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL );
227  ok( hr == S_OK, "failed to execute method %08x\n", hr );
229 
230  VariantInit( &retval );
231  hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, NULL, NULL );
232  ok( hr == S_OK, "failed to get return value %08x\n", hr );
233  ok( V_I4( &retval ), "unexpected success\n" );
234  IWbemClassObject_Release( out );
235 
236  out = NULL;
237  method = SysAllocString( resumeserviceW );
238  hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL );
239  ok( hr == S_OK, "failed to execute method %08x\n", hr );
241 
242  VariantInit( &retval );
243  hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, NULL, NULL );
244  ok( hr == S_OK, "failed to get return value %08x\n", hr );
245  ok( V_I4( &retval ), "unexpected success\n" );
246  IWbemClassObject_Release( out );
247 
248  if (!lstrcmpW( V_BSTR( &state ), stoppedW ))
249  {
250  out = NULL;
251  method = SysAllocString( stopserviceW );
252  hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL );
253  ok( hr == S_OK, "failed to execute method %08x\n", hr );
255 
256  VariantInit( &retval );
257  hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, NULL, NULL );
258  ok( hr == S_OK, "failed to get return value %08x\n", hr );
259  ok( !V_I4( &retval ), "unexpected error %u\n", V_UI4( &retval ) );
260  IWbemClassObject_Release( out );
261  }
262  VariantClear( &state );
263  IWbemClassObject_Release( service );
264 
265  service = NULL;
266  hr = IWbemServices_GetObject( services, NULL, 0, NULL, &service, NULL );
267  ok( hr == S_OK, "got %08x\n", hr );
268  if (service) IWbemClassObject_Release( service );
269 
270  service = NULL;
271  hr = IWbemServices_GetObject( services, empty, 0, NULL, &service, NULL );
272  ok( hr == S_OK, "got %08x\n", hr );
273  if (service) IWbemClassObject_Release( service );
274 
275 out:
276  SysFreeString( empty );
277  SysFreeString( class );
278 }
279 
281 {
282  static const WCHAR queryW[] =
283  {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_', 'B','i','o','s',0};
284  static const WCHAR descriptionW[] = {'D','e','s','c','r','i','p','t','i','o','n',0};
285  static const WCHAR identificationcodeW[] = {'I','d','e','n','t','i','f','i','c','a','t','i','o','n','C','o','d','e',0};
286  static const WCHAR manufacturerW[] = {'M','a','n','u','f','a','c','t','u','r','e','r',0};
287  static const WCHAR nameW[] = {'N','a','m','e',0};
288  static const WCHAR releasedateW[] = {'R','e','l','e','a','s','e','D','a','t','e',0};
289  static const WCHAR serialnumberW[] = {'S','e','r','i','a','l','N','u','m','b','e','r',0};
290  static const WCHAR smbiosbiosversionW[] = {'S','M','B','I','O','S','B','I','O','S','V','e','r','s','i','o','n',0};
291  static const WCHAR smbiosmajorversionW[] = {'S','M','B','I','O','S','M','a','j','o','r','V','e','r','s','i','o','n',0};
292  static const WCHAR smbiosminorversionW[] = {'S','M','B','I','O','S','M','i','n','o','r','V','e','r','s','i','o','n',0};
293  static const WCHAR versionW[] = {'V','e','r','s','i','o','n',0};
294  BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
297  CIMTYPE type;
298  ULONG count;
299  VARIANT val;
300  HRESULT hr;
301 
302  hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
303  ok( hr == S_OK, "IWbemServices_ExecQuery failed %08x\n", hr );
304 
305  hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
306  ok( hr == S_OK, "IEnumWbemClassObject_Next failed %08x\n", hr );
307 
308  type = 0xdeadbeef;
309  VariantInit( &val );
310  hr = IWbemClassObject_Get( obj, descriptionW, 0, &val, &type, NULL );
311  ok( hr == S_OK, "failed to get description %08x\n", hr );
312  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
313  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
314  trace( "description: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
315  VariantClear( &val );
316 
317  type = 0xdeadbeef;
318  VariantInit( &val );
319  hr = IWbemClassObject_Get( obj, identificationcodeW, 0, &val, &type, NULL );
320  ok( hr == S_OK, "failed to get identication code %08x\n", hr );
321  ok( V_VT( &val ) == VT_NULL, "unexpected variant type 0x%x\n", V_VT( &val ) );
322  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
323  VariantClear( &val );
324 
325  type = 0xdeadbeef;
326  VariantInit( &val );
327  hr = IWbemClassObject_Get( obj, manufacturerW, 0, &val, &type, NULL );
328  ok( hr == S_OK, "failed to get manufacturer %08x\n", hr );
329  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
330  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
331  trace( "manufacturer: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
332  VariantClear( &val );
333 
334  type = 0xdeadbeef;
335  VariantInit( &val );
336  hr = IWbemClassObject_Get( obj, nameW, 0, &val, &type, NULL );
337  ok( hr == S_OK, "failed to get name %08x\n", hr );
338  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
339  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
340  trace( "name: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
341  VariantClear( &val );
342 
343  type = 0xdeadbeef;
344  VariantInit( &val );
345  hr = IWbemClassObject_Get( obj, releasedateW, 0, &val, &type, NULL );
346  ok( hr == S_OK, "failed to get release date %08x\n", hr );
347  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
348  ok( type == CIM_DATETIME, "unexpected type 0x%x\n", type );
349  trace( "release date: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
350  VariantClear( &val );
351 
352  type = 0xdeadbeef;
353  VariantInit( &val );
354  hr = IWbemClassObject_Get( obj, serialnumberW, 0, &val, &type, NULL );
355  ok( hr == S_OK, "failed to get serial number %08x\n", hr );
356  ok( V_VT( &val ) == VT_BSTR || V_VT( &val ) == VT_NULL /* Testbot VMs */,
357  "unexpected variant type 0x%x\n", V_VT( &val ) );
358  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
359  VariantClear( &val );
360 
361  type = 0xdeadbeef;
362  VariantInit( &val );
363  hr = IWbemClassObject_Get( obj, smbiosbiosversionW, 0, &val, &type, NULL );
364  ok( hr == S_OK, "failed to get bios version %08x\n", hr );
365  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
366  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
367  trace( "bios version: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
368  VariantClear( &val );
369 
370  type = 0xdeadbeef;
371  VariantInit( &val );
372  hr = IWbemClassObject_Get( obj, smbiosmajorversionW, 0, &val, &type, NULL );
373  ok( hr == S_OK, "failed to get bios major version %08x\n", hr );
374  ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
375  ok( type == CIM_UINT16, "unexpected type 0x%x\n", type );
376  trace( "bios major version: %u\n", V_I4( &val ) );
377 
378  type = 0xdeadbeef;
379  VariantInit( &val );
380  hr = IWbemClassObject_Get( obj, smbiosminorversionW, 0, &val, &type, NULL );
381  ok( hr == S_OK, "failed to get bios minor version %08x\n", hr );
382  ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
383  ok( type == CIM_UINT16, "unexpected type 0x%x\n", type );
384  trace( "bios minor version: %u\n", V_I4( &val ) );
385 
386  type = 0xdeadbeef;
387  VariantInit( &val );
388  hr = IWbemClassObject_Get( obj, versionW, 0, &val, &type, NULL );
389  ok( hr == S_OK, "failed to get version %08x\n", hr );
390  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
391  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
392  trace( "version: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
393  VariantClear( &val );
394 
395  IWbemClassObject_Release( obj );
396  IEnumWbemClassObject_Release( result );
397  SysFreeString( query );
398  SysFreeString( wql );
399 }
400 
401 static void test_Win32_Process( IWbemServices *services, BOOL use_full_path )
402 {
403  static const WCHAR returnvalueW[] = {'R','e','t','u','r','n','V','a','l','u','e',0};
404  static const WCHAR getownerW[] = {'G','e','t','O','w','n','e','r',0};
405  static const WCHAR userW[] = {'U','s','e','r',0};
406  static const WCHAR domainW[] = {'D','o','m','a','i','n',0};
407  static const WCHAR processW[] = {'W','i','n','3','2','_','P','r','o','c','e','s','s',0};
408  static const WCHAR idW[] = {'I','D',0};
409  static const WCHAR fmtW[] = {'W','i','n','3','2','_','P','r','o','c','e','s','s','.',
410  'H','a','n','d','l','e','=','"','%','u','"',0};
411  static const WCHAR full_path_fmt[] =
412  {'\\','\\','%','s','\\','R','O','O','T','\\','C','I','M','V','2',':',0};
413  static const LONG expected_flavor = WBEM_FLAVOR_FLAG_PROPAGATE_TO_INSTANCE |
416  WCHAR full_path[MAX_COMPUTERNAME_LENGTH + ARRAY_SIZE(full_path_fmt)];
417  BSTR class, method;
418  IWbemClassObject *process, *sig_in, *out;
419  IWbemQualifierSet *qualifiers;
420  VARIANT user, domain, retval, val;
421  DWORD full_path_len = 0;
422  LONG flavor;
423  CIMTYPE type;
424  HRESULT hr;
425 
426  if (use_full_path)
427  {
429 
430  full_path_len = ARRAY_SIZE(server);
431  ok( GetComputerNameW(server, &full_path_len), "GetComputerName failed\n" );
432  full_path_len = wsprintfW(full_path, full_path_fmt, server);
433  }
434 
435  class = SysAllocStringLen( NULL, full_path_len + ARRAY_SIZE( processW ) );
436  memcpy( class, full_path, full_path_len * sizeof(WCHAR) );
437  memcpy( class + full_path_len, processW, sizeof(processW) );
438  hr = IWbemServices_GetObject( services, class, 0, NULL, &process, NULL );
439  SysFreeString( class );
440  if (hr != S_OK)
441  {
442  win_skip( "Win32_Process not available\n" );
443  return;
444  }
445  sig_in = (void*)0xdeadbeef;
446  hr = IWbemClassObject_GetMethod( process, getownerW, 0, &sig_in, NULL );
447  ok( hr == S_OK, "failed to get GetOwner method %08x\n", hr );
448  ok( !sig_in, "sig_in != NULL\n");
449  IWbemClassObject_Release( process );
450 
451  out = NULL;
452  method = SysAllocString( getownerW );
453  class = SysAllocStringLen( NULL, full_path_len + ARRAY_SIZE( fmtW ) + 10 );
454  memcpy( class, full_path, full_path_len * sizeof(WCHAR) );
455  wsprintfW( class + full_path_len, fmtW, GetCurrentProcessId() );
456  hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL );
457  ok( hr == S_OK, "failed to execute method %08x\n", hr );
459  SysFreeString( class );
460 
461  type = 0xdeadbeef;
462  VariantInit( &retval );
463  hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL );
464  ok( hr == S_OK, "failed to get return value %08x\n", hr );
465  ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) );
466  ok( !V_I4( &retval ), "unexpected error %u\n", V_I4( &retval ) );
467  ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
468 
469  type = 0xdeadbeef;
470  VariantInit( &user );
471  hr = IWbemClassObject_Get( out, userW, 0, &user, &type, NULL );
472  ok( hr == S_OK, "failed to get user %08x\n", hr );
473  ok( V_VT( &user ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &user ) );
474  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
475  trace("%s\n", wine_dbgstr_w(V_BSTR(&user)));
476 
477  type = 0xdeadbeef;
478  VariantInit( &domain );
479  hr = IWbemClassObject_Get( out, domainW, 0, &domain, &type, NULL );
480  ok( hr == S_OK, "failed to get domain %08x\n", hr );
481  ok( V_VT( &domain ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &domain ) );
482  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
483  trace("%s\n", wine_dbgstr_w(V_BSTR(&domain)));
484 
485  hr = IWbemClassObject_GetPropertyQualifierSet( out, userW, &qualifiers );
486  ok( hr == S_OK, "failed to get qualifier set %08x\n", hr );
487 
488  flavor = -1;
489  V_I4(&val) = -1;
490  V_VT(&val) = VT_ERROR;
491  hr = IWbemQualifierSet_Get( qualifiers, idW, 0, &val, &flavor );
492  ok( hr == S_OK, "got %08x\n", hr );
493  ok( flavor == expected_flavor, "got %d\n", flavor );
494  ok( V_VT(&val) == VT_I4, "got %u\n", V_VT(&val) );
495  ok( V_I4(&val) == 0, "got %u\n", V_I4(&val) );
496  VariantClear( &val );
497 
498  IWbemQualifierSet_Release( qualifiers );
499  hr = IWbemClassObject_GetPropertyQualifierSet( out, domainW, &qualifiers );
500  ok( hr == S_OK, "failed to get qualifier set %08x\n", hr );
501 
502  flavor = -1;
503  V_I4(&val) = -1;
504  V_VT(&val) = VT_ERROR;
505  hr = IWbemQualifierSet_Get( qualifiers, idW, 0, &val, &flavor );
506  ok( hr == S_OK, "got %08x\n", hr );
507  ok( flavor == expected_flavor, "got %d\n", flavor );
508  ok( V_VT(&val) == VT_I4, "got %u\n", V_VT(&val) );
509  ok( V_I4(&val) == 1, "got %u\n", V_I4(&val) );
510  VariantClear( &val );
511 
512  IWbemQualifierSet_Release( qualifiers );
513  hr = IWbemClassObject_GetPropertyQualifierSet( out, returnvalueW, &qualifiers );
514  ok( hr == S_OK, "failed to get qualifier set %08x\n", hr );
515 
516  hr = IWbemQualifierSet_Get( qualifiers, idW, 0, &val, &flavor );
517  ok( hr == WBEM_E_NOT_FOUND, "got %08x\n", hr );
518 
519  IWbemQualifierSet_Release( qualifiers );
520  VariantClear( &user );
521  VariantClear( &domain );
522  IWbemClassObject_Release( out );
523 }
524 
526 {
527  static const WCHAR backslashW[] = {'\\',0};
528  static const WCHAR memorytypeW[] = {'M','e','m','o','r','y','T','y','p','e',0};
529  static const WCHAR modelW[] = {'M','o','d','e','l',0};
530  static const WCHAR nameW[] = {'N','a','m','e',0};
531  static const WCHAR usernameW[] = {'U','s','e','r','N','a','m','e',0};
532  static const WCHAR queryW[] =
533  {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
534  'C','o','m','p','u','t','e','r','S','y','s','t','e','m',0};
535  BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
537  IWbemClassObject *service;
538  VARIANT value;
539  CIMTYPE type;
540  HRESULT hr;
541  WCHAR compname[MAX_COMPUTERNAME_LENGTH + 1];
542  WCHAR username[128];
543  DWORD len, count;
544 
545  len = ARRAY_SIZE( compname );
546  if (!GetComputerNameW( compname, &len ))
547  compname[0] = 0;
548 
549  lstrcpyW( username, compname );
552  if (!GetUserNameW( username + lstrlenW( username ), &len ))
553  username[0] = 0;
554 
555  if (!compname[0] || !username[0])
556  {
557  skip( "Failed to get user or computer name\n" );
558  goto out;
559  }
560 
561  hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
562  if (hr != S_OK)
563  {
564  win_skip( "Win32_ComputerSystem not available\n" );
565  goto out;
566  }
567 
568  hr = IEnumWbemClassObject_Next( result, 10000, 1, &service, &count );
569  ok( hr == S_OK, "got %08x\n", hr );
570 
571  type = 0xdeadbeef;
572  VariantInit( &value );
573  hr = IWbemClassObject_Get( service, memorytypeW, 0, &value, &type, NULL );
574  ok( hr == WBEM_E_NOT_FOUND, "got %08x\n", hr );
575 
576  type = 0xdeadbeef;
577  VariantInit( &value );
578  hr = IWbemClassObject_Get( service, modelW, 0, &value, &type, NULL );
579  ok( hr == S_OK, "failed to get model %08x\n", hr );
580  ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) );
581  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
582  trace( "model: %s\n", wine_dbgstr_w(V_BSTR( &value )) );
583  VariantClear( &value );
584 
585  type = 0xdeadbeef;
586  VariantInit( &value );
587  hr = IWbemClassObject_Get( service, nameW, 0, &value, &type, NULL );
588  ok( hr == S_OK, "failed to get computer name %08x\n", hr );
589  ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) );
590  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
591  ok( !lstrcmpiW( V_BSTR( &value ), compname ), "got %s, expected %s\n", wine_dbgstr_w(V_BSTR(&value)), wine_dbgstr_w(compname) );
592  VariantClear( &value );
593 
594  type = 0xdeadbeef;
595  VariantInit( &value );
596  hr = IWbemClassObject_Get( service, usernameW, 0, &value, &type, NULL );
597  ok( hr == S_OK, "failed to get computer name %08x\n", hr );
598  ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) );
599  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
600  ok( !lstrcmpiW( V_BSTR( &value ), username ), "got %s, expected %s\n", wine_dbgstr_w(V_BSTR(&value)), wine_dbgstr_w(username) );
601  VariantClear( &value );
602 
603  IWbemClassObject_Release( service );
604  IEnumWbemClassObject_Release( result );
605 out:
606  SysFreeString( query );
607  SysFreeString( wql );
608 }
609 
611 {
612  static const WCHAR queryW[] =
613  {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
614  'S','y','s','t','e','m','E','n','c','l','o','s','u','r','e',0};
615  static const WCHAR captionW[] = {'C','a','p','t','i','o','n',0};
616  static const WCHAR chassistypesW[] = {'C','h','a','s','s','i','s','T','y','p','e','s',0};
617  static const WCHAR descriptionW[] = {'D','e','s','c','r','i','p','t','i','o','n',0};
618  static const WCHAR lockpresentW[] = {'L','o','c','k','P','r','e','s','e','n','t',0};
619  static const WCHAR manufacturerW[] = {'M','a','n','u','f','a','c','t','u','r','e','r',0};
620  static const WCHAR nameW[] = {'N','a','m','e',0};
621  static const WCHAR tagW[] = {'T','a','g',0};
622  BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
625  CIMTYPE type;
626  ULONG count;
627  VARIANT val;
628  DWORD *data;
629  HRESULT hr;
630 
631  hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
632  ok( hr == S_OK, "IWbemServices_ExecQuery failed %08x\n", hr );
633 
634  hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
635  ok( hr == S_OK, "IEnumWbemClassObject_Next failed %08x\n", hr );
636 
637  type = 0xdeadbeef;
638  VariantInit( &val );
639  hr = IWbemClassObject_Get( obj, captionW, 0, &val, &type, NULL );
640  ok( hr == S_OK, "failed to get caption %08x\n", hr );
641  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
642  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
643  trace( "caption: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
644  VariantClear( &val );
645 
646  type = 0xdeadbeef;
647  VariantInit( &val );
648  hr = IWbemClassObject_Get( obj, chassistypesW, 0, &val, &type, NULL );
649  ok( hr == S_OK, "failed to get chassis types %08x\n", hr );
650  ok( V_VT( &val ) == (VT_I4|VT_ARRAY), "unexpected variant type 0x%x\n", V_VT( &val ) );
651  ok( type == (CIM_UINT16|CIM_FLAG_ARRAY), "unexpected type 0x%x\n", type );
652  hr = SafeArrayAccessData( V_ARRAY( &val ), (void **)&data );
653  ok( hr == S_OK, "SafeArrayAccessData failed %x\n", hr );
654  if (SUCCEEDED(hr))
655  {
656  LONG i, lower, upper;
657 
658  hr = SafeArrayGetLBound( V_ARRAY( &val ), 1, &lower );
659  ok( hr == S_OK, "SafeArrayGetLBound failed %x\n", hr );
660  hr = SafeArrayGetUBound( V_ARRAY( &val ), 1, &upper );
661  ok( hr == S_OK, "SafeArrayGetUBound failed %x\n", hr );
662  if (V_VT( &val ) == (VT_I4|VT_ARRAY))
663  {
664  for (i = 0; i < upper - lower + 1; i++)
665  trace( "chassis type: %u\n", data[i] );
666  }
668  ok( hr == S_OK, "SafeArrayUnaccessData failed %x\n", hr );
669  }
670  VariantClear( &val );
671 
672  type = 0xdeadbeef;
673  VariantInit( &val );
674  hr = IWbemClassObject_Get( obj, descriptionW, 0, &val, &type, NULL );
675  ok( hr == S_OK, "failed to get description %08x\n", hr );
676  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
677  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
678  trace( "description: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
679  VariantClear( &val );
680 
681  type = 0xdeadbeef;
682  VariantInit( &val );
683  hr = IWbemClassObject_Get( obj, lockpresentW, 0, &val, &type, NULL );
684  ok( hr == S_OK, "failed to get lockpresent %08x\n", hr );
685  ok( V_VT( &val ) == VT_BOOL, "unexpected variant type 0x%x\n", V_VT( &val ) );
686  ok( type == CIM_BOOLEAN, "unexpected type 0x%x\n", type );
687  trace( "lockpresent: %u\n", V_BOOL( &val ) );
688  VariantClear( &val );
689 
690  type = 0xdeadbeef;
691  VariantInit( &val );
692  hr = IWbemClassObject_Get( obj, manufacturerW, 0, &val, &type, NULL );
693  ok( hr == S_OK, "failed to get manufacturer %08x\n", hr );
694  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
695  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
696  trace( "manufacturer: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
697  VariantClear( &val );
698 
699  type = 0xdeadbeef;
700  VariantInit( &val );
701  hr = IWbemClassObject_Get( obj, nameW, 0, &val, &type, NULL );
702  ok( hr == S_OK, "failed to get name %08x\n", hr );
703  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
704  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
705  trace( "name: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
706  VariantClear( &val );
707 
708  type = 0xdeadbeef;
709  VariantInit( &val );
710  hr = IWbemClassObject_Get( obj, tagW, 0, &val, &type, NULL );
711  ok( hr == S_OK, "failed to get tag %08x\n", hr );
712  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
713  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
714  trace( "tag: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
715  VariantClear( &val );
716 
717  IWbemClassObject_Release( obj );
718  IEnumWbemClassObject_Release( result );
719  SysFreeString( query );
720  SysFreeString( wql );
721 }
722 
724 {
725  static const WCHAR createkeyW[] = {'C','r','e','a','t','e','K','e','y',0};
726  static const WCHAR enumkeyW[] = {'E','n','u','m','K','e','y',0};
727  static const WCHAR enumvaluesW[] = {'E','n','u','m','V','a','l','u','e','s',0};
728  static const WCHAR getstringvalueW[] = {'G','e','t','S','t','r','i','n','g','V','a','l','u','e',0};
729  static const WCHAR stdregprovW[] = {'S','t','d','R','e','g','P','r','o','v',0};
730  static const WCHAR defkeyW[] = {'h','D','e','f','K','e','y',0};
731  static const WCHAR subkeynameW[] = {'s','S','u','b','K','e','y','N','a','m','e',0};
732  static const WCHAR returnvalueW[] = {'R','e','t','u','r','n','V','a','l','u','e',0};
733  static const WCHAR namesW[] = {'s','N','a','m','e','s',0};
734  static const WCHAR typesW[] = {'T','y','p','e','s',0};
735  static const WCHAR valueW[] = {'s','V','a','l','u','e',0};
736  static const WCHAR valuenameW[] = {'s','V','a','l','u','e','N','a','m','e',0};
737  static const WCHAR programfilesW[] = {'P','r','o','g','r','a','m','F','i','l','e','s','D','i','r',0};
738  static const WCHAR windowsW[] =
739  {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\',
740  'W','i','n','d','o','w','s','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n',0};
741  static const WCHAR regtestW[] =
742  {'S','o','f','t','w','a','r','e','\\','S','t','d','R','e','g','P','r','o','v','T','e','s','t',0};
743  BSTR class = SysAllocString( stdregprovW ), method, name;
744  IWbemClassObject *reg, *sig_in, *sig_out, *in, *out;
745  VARIANT defkey, subkey, retval, names, types, value, valuename;
746  CIMTYPE type;
747  HRESULT hr;
748  LONG res;
749 
750  hr = IWbemServices_GetObject( services, class, 0, NULL, &reg, NULL );
751  if (hr != S_OK)
752  {
753  win_skip( "StdRegProv not available\n" );
754  return;
755  }
756 
757  hr = IWbemClassObject_BeginMethodEnumeration( reg, 0 );
758  ok( hr == S_OK, "got %08x\n", hr );
759 
760  while (IWbemClassObject_NextMethod( reg, 0, &name, &sig_in, &sig_out ) == S_OK)
761  {
762  SysFreeString( name );
763  IWbemClassObject_Release( sig_in );
764  IWbemClassObject_Release( sig_out );
765  }
766 
767  hr = IWbemClassObject_EndMethodEnumeration( reg );
768  ok( hr == S_OK, "got %08x\n", hr );
769 
770  hr = IWbemClassObject_BeginEnumeration( reg, 0 );
771  ok( hr == S_OK, "got %08x\n", hr );
772 
773  while (IWbemClassObject_Next( reg, 0, &name, NULL, NULL, NULL ) == S_OK)
774  SysFreeString( name );
775 
776  hr = IWbemClassObject_EndEnumeration( reg );
777  ok( hr == S_OK, "got %08x\n", hr );
778 
779  hr = IWbemClassObject_GetMethod( reg, createkeyW, 0, &sig_in, NULL );
780  ok( hr == S_OK, "failed to get CreateKey method %08x\n", hr );
781 
782  hr = IWbemClassObject_SpawnInstance( sig_in, 0, &in );
783  ok( hr == S_OK, "failed to spawn instance %08x\n", hr );
784 
785  V_VT( &defkey ) = VT_I4;
786  V_I4( &defkey ) = 0x80000001;
787  hr = IWbemClassObject_Put( in, defkeyW, 0, &defkey, 0 );
788  ok( hr == S_OK, "failed to set root %08x\n", hr );
789 
790  V_VT( &subkey ) = VT_BSTR;
791  V_BSTR( &subkey ) = SysAllocString( regtestW );
792  hr = IWbemClassObject_Put( in, subkeynameW, 0, &subkey, 0 );
793  ok( hr == S_OK, "failed to set subkey %08x\n", hr );
794 
795  out = NULL;
796  method = SysAllocString( createkeyW );
797  hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, in, &out, NULL );
798  ok( hr == S_OK, "failed to execute method %08x\n", hr );
800 
801  type = 0xdeadbeef;
802  VariantInit( &retval );
803  hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL );
804  ok( hr == S_OK, "failed to get return value %08x\n", hr );
805  ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) );
806  ok( !V_I4( &retval ), "unexpected error %u\n", V_UI4( &retval ) );
807  ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
808 
809  res = RegDeleteKeyW( HKEY_CURRENT_USER, regtestW );
810  ok( !res, "got %d\n", res );
811 
812  VariantClear( &subkey );
813  IWbemClassObject_Release( in );
814  IWbemClassObject_Release( out );
815  IWbemClassObject_Release( sig_in );
816 
817  hr = IWbemClassObject_GetMethod( reg, enumkeyW, 0, &sig_in, NULL );
818  ok( hr == S_OK, "failed to get EnumKey method %08x\n", hr );
819 
820  hr = IWbemClassObject_SpawnInstance( sig_in, 0, &in );
821  ok( hr == S_OK, "failed to spawn instance %08x\n", hr );
822 
823  V_VT( &defkey ) = VT_I4;
824  V_I4( &defkey ) = 0x80000002;
825  hr = IWbemClassObject_Put( in, defkeyW, 0, &defkey, 0 );
826  ok( hr == S_OK, "failed to set root %08x\n", hr );
827 
828  V_VT( &subkey ) = VT_BSTR;
829  V_BSTR( &subkey ) = SysAllocString( windowsW );
830  hr = IWbemClassObject_Put( in, subkeynameW, 0, &subkey, 0 );
831  ok( hr == S_OK, "failed to set subkey %08x\n", hr );
832 
833  out = NULL;
834  method = SysAllocString( enumkeyW );
835  hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, in, &out, NULL );
836  ok( hr == S_OK, "failed to execute method %08x\n", hr );
838 
839  type = 0xdeadbeef;
840  VariantInit( &retval );
841  hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL );
842  ok( hr == S_OK, "failed to get return value %08x\n", hr );
843  ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) );
844  ok( !V_I4( &retval ), "unexpected error %u\n", V_UI4( &retval ) );
845  ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
846 
847  type = 0xdeadbeef;
848  VariantInit( &names );
849  hr = IWbemClassObject_Get( out, namesW, 0, &names, &type, NULL );
850  ok( hr == S_OK, "failed to get names %08x\n", hr );
851  ok( V_VT( &names ) == (VT_BSTR|VT_ARRAY), "unexpected variant type 0x%x\n", V_VT( &names ) );
852  ok( type == (CIM_STRING|CIM_FLAG_ARRAY), "unexpected type 0x%x\n", type );
853 
854  VariantClear( &names );
855  VariantClear( &subkey );
856  IWbemClassObject_Release( in );
857  IWbemClassObject_Release( out );
858  IWbemClassObject_Release( sig_in );
859 
860  hr = IWbemClassObject_GetMethod( reg, enumvaluesW, 0, &sig_in, NULL );
861  ok( hr == S_OK, "failed to get EnumValues method %08x\n", hr );
862 
863  hr = IWbemClassObject_SpawnInstance( sig_in, 0, &in );
864  ok( hr == S_OK, "failed to spawn instance %08x\n", hr );
865 
866  V_VT( &defkey ) = VT_I4;
867  V_I4( &defkey ) = 0x80000002;
868  hr = IWbemClassObject_Put( in, defkeyW, 0, &defkey, 0 );
869  ok( hr == S_OK, "failed to set root %08x\n", hr );
870 
871  V_VT( &subkey ) = VT_BSTR;
872  V_BSTR( &subkey ) = SysAllocString( windowsW );
873  hr = IWbemClassObject_Put( in, subkeynameW, 0, &subkey, 0 );
874  ok( hr == S_OK, "failed to set subkey %08x\n", hr );
875 
876  out = NULL;
877  method = SysAllocString( enumvaluesW );
878  hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, in, &out, NULL );
879  ok( hr == S_OK, "failed to execute method %08x\n", hr );
881 
882  type = 0xdeadbeef;
883  VariantInit( &retval );
884  hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL );
885  ok( hr == S_OK, "failed to get return value %08x\n", hr );
886  ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) );
887  ok( !V_I4( &retval ), "unexpected error %u\n", V_I4( &retval ) );
888  ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
889 
890  type = 0xdeadbeef;
891  VariantInit( &names );
892  hr = IWbemClassObject_Get( out, namesW, 0, &names, &type, NULL );
893  ok( hr == S_OK, "failed to get names %08x\n", hr );
894  ok( V_VT( &names ) == (VT_BSTR|VT_ARRAY), "unexpected variant type 0x%x\n", V_VT( &names ) );
895  ok( type == (CIM_STRING|CIM_FLAG_ARRAY), "unexpected type 0x%x\n", type );
896 
897  type = 0xdeadbeef;
898  VariantInit( &types );
899  hr = IWbemClassObject_Get( out, typesW, 0, &types, &type, NULL );
900  ok( hr == S_OK, "failed to get names %08x\n", hr );
901  ok( V_VT( &types ) == (VT_I4|VT_ARRAY), "unexpected variant type 0x%x\n", V_VT( &types ) );
902  ok( type == (CIM_SINT32|CIM_FLAG_ARRAY), "unexpected type 0x%x\n", type );
903 
904  VariantClear( &types );
905  VariantClear( &names );
906  VariantClear( &subkey );
907  IWbemClassObject_Release( in );
908  IWbemClassObject_Release( out );
909  IWbemClassObject_Release( sig_in );
910 
911  hr = IWbemClassObject_GetMethod( reg, getstringvalueW, 0, &sig_in, NULL );
912  ok( hr == S_OK, "failed to get GetStringValue method %08x\n", hr );
913 
914  hr = IWbemClassObject_SpawnInstance( sig_in, 0, &in );
915  ok( hr == S_OK, "failed to spawn instance %08x\n", hr );
916 
917  V_VT( &defkey ) = VT_I4;
918  V_I4( &defkey ) = 0x80000002;
919  hr = IWbemClassObject_Put( in, defkeyW, 0, &defkey, 0 );
920  ok( hr == S_OK, "failed to set root %08x\n", hr );
921 
922  V_VT( &subkey ) = VT_BSTR;
923  V_BSTR( &subkey ) = SysAllocString( windowsW );
924  hr = IWbemClassObject_Put( in, subkeynameW, 0, &subkey, 0 );
925  ok( hr == S_OK, "failed to set subkey %08x\n", hr );
926 
927  V_VT( &valuename ) = VT_BSTR;
928  V_BSTR( &valuename ) = SysAllocString( programfilesW );
929  hr = IWbemClassObject_Put( in, valuenameW, 0, &valuename, 0 );
930  ok( hr == S_OK, "failed to set value name %08x\n", hr );
931 
932  out = NULL;
933  method = SysAllocString( getstringvalueW );
934  hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, in, &out, NULL );
935  ok( hr == S_OK, "failed to execute method %08x\n", hr );
937 
938  type = 0xdeadbeef;
939  VariantInit( &retval );
940  hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL );
941  ok( hr == S_OK, "failed to get return value %08x\n", hr );
942  ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) );
943  ok( !V_I4( &retval ), "unexpected error %u\n", V_I4( &retval ) );
944  ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
945 
946  type = 0xdeadbeef;
947  VariantInit( &value );
948  hr = IWbemClassObject_Get( out, valueW, 0, &value, &type, NULL );
949  ok( hr == S_OK, "failed to get value %08x\n", hr );
950  ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) );
951  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
952 
953  VariantClear( &value );
954  VariantClear( &valuename );
955  VariantClear( &subkey );
956  IWbemClassObject_Release( in );
957  IWbemClassObject_Release( out );
958  IWbemClassObject_Release( sig_in );
959 
960  IWbemClassObject_Release( reg );
961  SysFreeString( class );
962 }
963 
965  IWbemObjectSink *iface, REFIID riid, void **ppv )
966 {
967  *ppv = NULL;
968  if (IsEqualGUID( &IID_IUnknown, riid ) || IsEqualGUID( &IID_IWbemObjectSink, riid ))
969  {
970  *ppv = iface;
971  IWbemObjectSink_AddRef( iface );
972  return S_OK;
973  }
974  return E_NOINTERFACE;
975 }
976 
978 
980  IWbemObjectSink *iface )
981 {
982  return ++sink_refs;
983 }
984 
986  IWbemObjectSink *iface )
987 {
988  return --sink_refs;
989 }
990 
993 {
994  trace("Indicate: %d, %p\n", count, objects);
995  return S_OK;
996 }
997 
999  IWbemObjectSink *iface, LONG flags, HRESULT hresult, BSTR str_param, IWbemClassObject *obj_param )
1000 {
1001  trace("SetStatus: %08x, %08x, %s, %p\n", flags, hresult, wine_dbgstr_w(str_param), obj_param);
1002  return S_OK;
1003 }
1004 
1005 static IWbemObjectSinkVtbl sink_vtbl =
1006 {
1008  sink_AddRef,
1009  sink_Release,
1010  sink_Indicate,
1012 };
1013 
1015 
1017 {
1018  static const WCHAR queryW[] =
1019  {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
1020  'D','e','v','i','c','e','C','h','a','n','g','e','E','v','e','n','t',0};
1021  BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
1022  ULONG prev_sink_refs;
1023  HRESULT hr;
1024 
1025  hr = IWbemServices_ExecNotificationQueryAsync( services, wql, query, 0, NULL, NULL );
1026  ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
1027 
1028  prev_sink_refs = sink_refs;
1029  hr = IWbemServices_ExecNotificationQueryAsync( services, wql, query, 0, NULL, &sink );
1030  ok( hr == S_OK || broken(hr == WBEM_E_NOT_FOUND), "got %08x\n", hr );
1031  ok( sink_refs > prev_sink_refs || broken(!sink_refs), "got %u refs\n", sink_refs );
1032 
1033  hr = IWbemServices_CancelAsyncCall( services, &sink );
1034  ok( hr == S_OK || broken(hr == WBEM_E_NOT_FOUND), "got %08x\n", hr );
1035 
1036  SysFreeString( wql );
1037  SysFreeString( query );
1038 }
1039 
1041 {
1042  static const WCHAR queryW[] =
1043  {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
1044  'P','r','o','c','e','s','s',0};
1045  BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
1046  HRESULT hr;
1047 
1048  hr = IWbemServices_ExecQueryAsync( services, wql, query, 0, NULL, NULL );
1049  ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
1050 
1051  hr = IWbemServices_ExecQueryAsync( services, wql, query, 0, NULL, &sink );
1052  ok( hr == S_OK || broken(hr == WBEM_E_NOT_FOUND), "got %08x\n", hr );
1053 
1054  hr = IWbemServices_CancelAsyncCall( services, NULL );
1055  ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
1056 
1057  hr = IWbemServices_CancelAsyncCall( services, &sink );
1058  ok( hr == S_OK, "got %08x\n", hr );
1059 
1060  SysFreeString( wql );
1061  SysFreeString( query );
1062 }
1063 
1065 {
1066  static const WCHAR queryW[] =
1067  {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
1068  'O','p','e','r','a','t','i','n','g','S','y','s','t','e','m',0};
1069  BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
1071  HRESULT hr;
1072 
1073  hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
1074  ok( hr == S_OK, "got %08x\n", hr );
1075 
1076  for (;;)
1077  {
1079  SAFEARRAY *names;
1080  ULONG count;
1081  VARIANT val;
1082 
1083  IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
1084  if (!count) break;
1085 
1086  VariantInit( &val );
1087  hr = IWbemClassObject_GetNames( obj, NULL, WBEM_FLAG_NONSYSTEM_ONLY, &val, &names );
1088  ok( hr == S_OK, "got %08x\n", hr );
1089 
1091  IWbemClassObject_Release( obj );
1092  }
1093  IEnumWbemClassObject_Release( result );
1094  SysFreeString( query );
1095  SysFreeString( wql );
1096 }
1097 
1099 {
1100  static const WCHAR systemsecurityW[] = {'_','_','S','y','s','t','e','m','S','e','c','u','r','i','t','y',0};
1101  static const WCHAR getsdW[] = {'G','e','t','S','D',0};
1102  static const WCHAR returnvalueW[] = {'R','e','t','u','r','n','V','a','l','u','e',0};
1103  static const WCHAR sdW[] = {'S','D',0};
1104  BSTR class = SysAllocString( systemsecurityW ), method;
1106  VARIANT retval, var_sd;
1107  void *data;
1109  CIMTYPE type;
1110  HRESULT hr;
1111  BYTE sid_admin_buffer[SECURITY_MAX_SID_SIZE];
1112  SID *sid_admin = (SID*)sid_admin_buffer;
1113  DWORD sid_size;
1114  BOOL ret;
1115 
1116  hr = IWbemServices_GetObject( services, class, 0, NULL, &reg, NULL );
1117  if (hr != S_OK)
1118  {
1119  win_skip( "__SystemSecurity not available\n" );
1120  return;
1121  }
1122  IWbemClassObject_Release( reg );
1123 
1124  sid_size = sizeof(sid_admin_buffer);
1125  ret = CreateWellKnownSid( WinBuiltinAdministratorsSid, NULL, sid_admin, &sid_size );
1126  ok( ret, "CreateWellKnownSid failed\n" );
1127 
1128  out = NULL;
1129  method = SysAllocString( getsdW );
1130  hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL );
1131  ok( hr == S_OK || hr == WBEM_E_ACCESS_DENIED, "failed to execute method %08x\n", hr );
1132  SysFreeString( method );
1133 
1134  if (SUCCEEDED(hr))
1135  {
1136  type = 0xdeadbeef;
1137  VariantInit( &retval );
1138  hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL );
1139  ok( hr == S_OK, "failed to get return value %08x\n", hr );
1140  ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) );
1141  ok( !V_I4( &retval ), "unexpected error %u\n", V_UI4( &retval ) );
1142  ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
1143 
1144  type = 0xdeadbeef;
1145  VariantInit( &var_sd );
1146  hr = IWbemClassObject_Get( out, sdW, 0, &var_sd, &type, NULL );
1147  ok( hr == S_OK, "failed to get names %08x\n", hr );
1148  ok( V_VT( &var_sd ) == (VT_UI1|VT_ARRAY), "unexpected variant type 0x%x\n", V_VT( &var_sd ) );
1149  ok( type == (CIM_UINT8|CIM_FLAG_ARRAY), "unexpected type 0x%x\n", type );
1150 
1151  hr = SafeArrayAccessData( V_ARRAY( &var_sd ), &data );
1152  ok( hr == S_OK, "SafeArrayAccessData failed %x\n", hr );
1153  if (SUCCEEDED(hr))
1154  {
1155  sd = data;
1156 
1157  ok( (sd->Control & SE_SELF_RELATIVE) == SE_SELF_RELATIVE, "relative flag unset\n" );
1158  ok( sd->Owner != 0, "no owner SID\n");
1159  ok( sd->Group != 0, "no owner SID\n");
1160  ok( EqualSid( (PSID)((LPBYTE)sd + sd->Owner), sid_admin ), "unexpected owner SID\n" );
1161  ok( EqualSid( (PSID)((LPBYTE)sd + sd->Group), sid_admin ), "unexpected group SID\n" );
1162 
1163  hr = SafeArrayUnaccessData( V_ARRAY( &var_sd ) );
1164  ok( hr == S_OK, "SafeArrayUnaccessData failed %x\n", hr );
1165  }
1166 
1167  VariantClear( &var_sd );
1168  IWbemClassObject_Release( out );
1169  }
1170  else if (hr == WBEM_E_ACCESS_DENIED)
1171  win_skip( "insufficient privs to test __SystemSecurity\n" );
1172 
1173  SysFreeString( class );
1174 }
1175 
1177 {
1178  static const WCHAR queryW[] =
1179  {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
1180  'O','p','e','r','a','t','i','n','g','S','y','s','t','e','m',0};
1181  static const WCHAR buildnumberW[] = {'B','u','i','l','d','N','u','m','b','e','r',0};
1182  static const WCHAR captionW[] = {'C','a','p','t','i','o','n',0};
1183  static const WCHAR csdversionW[] = {'C','S','D','V','e','r','s','i','o','n',0};
1184  static const WCHAR freephysicalmemoryW[] = {'F','r','e','e','P','h','y','s','i','c','a','l','M','e','m','o','r','y',0};
1185  static const WCHAR nameW[] = {'N','a','m','e',0};
1186  static const WCHAR osproductsuiteW[] = {'O','S','P','r','o','d','u','c','t','S','u','i','t','e',0};
1187  static const WCHAR ostypeW[] = {'O','S','T','y','p','e',0};
1188  static const WCHAR suitemaskW[] = {'S','u','i','t','e','M','a','s','k',0};
1189  static const WCHAR versionW[] = {'V','e','r','s','i','o','n',0};
1190  static const WCHAR servicepackmajorW[] =
1191  {'S','e','r','v','i','c','e','P','a','c','k','M','a','j','o','r','V','e','r','s','i','o','n',0};
1192  static const WCHAR servicepackminorW[] =
1193  {'S','e','r','v','i','c','e','P','a','c','k','M','i','n','o','r','V','e','r','s','i','o','n',0};
1194  static const WCHAR totalvisiblememorysizeW[] =
1195  {'T','o','t','a','l','V','i','s','i','b','l','e','M','e','m','o','r','y','S','i','z','e',0};
1196  static const WCHAR totalvirtualmemorysizeW[] =
1197  {'T','o','t','a','l','V','i','r','t','u','a','l','M','e','m','o','r','y','S','i','z','e',0};
1198  BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
1201  CIMTYPE type;
1202  ULONG count;
1203  VARIANT val;
1204  HRESULT hr;
1205 
1206  hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
1207  ok( hr == S_OK, "IWbemServices_ExecQuery failed %08x\n", hr );
1208 
1209  hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
1210  ok( hr == S_OK, "IEnumWbemClassObject_Next failed %08x\n", hr );
1211 
1212  hr = IWbemClassObject_BeginEnumeration( obj, 0 );
1213  ok( hr == S_OK, "got %08x\n", hr );
1214 
1215  while (IWbemClassObject_Next( obj, 0, NULL, NULL, NULL, NULL ) == S_OK) {}
1216 
1217  hr = IWbemClassObject_EndEnumeration( obj );
1218  ok( hr == S_OK, "got %08x\n", hr );
1219 
1220  type = 0xdeadbeef;
1221  VariantInit( &val );
1222  hr = IWbemClassObject_Get( obj, buildnumberW, 0, &val, &type, NULL );
1223  ok( hr == S_OK, "failed to get buildnumber %08x\n", hr );
1224  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1225  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1226  trace( "buildnumber: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1227  VariantClear( &val );
1228 
1229  type = 0xdeadbeef;
1230  VariantInit( &val );
1231  hr = IWbemClassObject_Get( obj, captionW, 0, &val, &type, NULL );
1232  ok( hr == S_OK, "failed to get caption %08x\n", hr );
1233  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1234  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1235  trace( "caption: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1236  VariantClear( &val );
1237 
1238  type = 0xdeadbeef;
1239  VariantInit( &val );
1240  hr = IWbemClassObject_Get( obj, csdversionW, 0, &val, &type, NULL );
1241  ok( hr == S_OK, "failed to get csdversion %08x\n", hr );
1242  ok( V_VT( &val ) == VT_BSTR || V_VT( &val ) == VT_NULL, "unexpected variant type 0x%x\n", V_VT( &val ) );
1243  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1244  trace( "csdversion: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1245  VariantClear( &val );
1246 
1247  type = 0xdeadbeef;
1248  VariantInit( &val );
1249  hr = IWbemClassObject_Get( obj, freephysicalmemoryW, 0, &val, &type, NULL );
1250  ok( hr == S_OK, "failed to get free physical memory size %08x\n", hr );
1251  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1252  ok( type == CIM_UINT64, "unexpected type 0x%x\n", type );
1253  trace( "freephysicalmemory %s\n", wine_dbgstr_w(V_BSTR(&val)) );
1254  VariantClear( &val );
1255 
1256  type = 0xdeadbeef;
1257  VariantInit( &val );
1258  hr = IWbemClassObject_Get( obj, nameW, 0, &val, &type, NULL );
1259  ok( hr == S_OK, "failed to get name %08x\n", hr );
1260  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1261  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1262  trace( "name: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1263  VariantClear( &val );
1264 
1265  type = 0xdeadbeef;
1266  VariantInit( &val );
1267  hr = IWbemClassObject_Get( obj, osproductsuiteW, 0, &val, &type, NULL );
1268  ok( hr == S_OK, "failed to get osproductsuite %08x\n", hr );
1269  ok( V_VT( &val ) == VT_I4 || broken(V_VT( &val ) == VT_NULL) /* winxp */, "unexpected variant type 0x%x\n", V_VT( &val ) );
1270  ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
1271  trace( "osproductsuite: %d (%08x)\n", V_I4( &val ), V_I4( &val ) );
1272  VariantClear( &val );
1273 
1274  type = 0xdeadbeef;
1275  VariantInit( &val );
1276  hr = IWbemClassObject_Get( obj, ostypeW, 0, &val, &type, NULL );
1277  ok( hr == S_OK, "failed to get ostype %08x\n", hr );
1278  ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
1279  ok( type == CIM_UINT16, "unexpected type 0x%x\n", type );
1280  trace( "ostype: %d\n", V_I4( &val ) );
1281  VariantClear( &val );
1282 
1283  type = 0xdeadbeef;
1284  VariantInit( &val );
1285  hr = IWbemClassObject_Get( obj, servicepackmajorW, 0, &val, &type, NULL );
1286  ok( hr == S_OK, "failed to get servicepackmajor %08x\n", hr );
1287  ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
1288  ok( type == CIM_UINT16, "unexpected type 0x%x\n", type );
1289  trace( "servicepackmajor: %d\n", V_I4( &val ) );
1290  VariantClear( &val );
1291 
1292  type = 0xdeadbeef;
1293  VariantInit( &val );
1294  hr = IWbemClassObject_Get( obj, servicepackminorW, 0, &val, &type, NULL );
1295  ok( hr == S_OK, "failed to get servicepackminor %08x\n", hr );
1296  ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
1297  ok( type == CIM_UINT16, "unexpected type 0x%x\n", type );
1298  trace( "servicepackminor: %d\n", V_I4( &val ) );
1299  VariantClear( &val );
1300 
1301  type = 0xdeadbeef;
1302  VariantInit( &val );
1303  hr = IWbemClassObject_Get( obj, suitemaskW, 0, &val, &type, NULL );
1304  ok( hr == S_OK, "failed to get suitemask %08x\n", hr );
1305  ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
1306  ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
1307  trace( "suitemask: %d (%08x)\n", V_I4( &val ), V_I4( &val ) );
1308  VariantClear( &val );
1309 
1310  type = 0xdeadbeef;
1311  VariantInit( &val );
1312  hr = IWbemClassObject_Get( obj, versionW, 0, &val, &type, NULL );
1313  ok( hr == S_OK, "failed to get version %08x\n", hr );
1314  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1315  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1316  trace( "version: %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1317  VariantClear( &val );
1318 
1319  type = 0xdeadbeef;
1320  VariantInit( &val );
1321  hr = IWbemClassObject_Get( obj, totalvisiblememorysizeW, 0, &val, &type, NULL );
1322  ok( hr == S_OK, "failed to get visible memory size %08x\n", hr );
1323  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1324  ok( type == CIM_UINT64, "unexpected type 0x%x\n", type );
1325  trace( "totalvisiblememorysize %s\n", wine_dbgstr_w(V_BSTR(&val)) );
1326  VariantClear( &val );
1327 
1328  type = 0xdeadbeef;
1329  VariantInit( &val );
1330  hr = IWbemClassObject_Get( obj, totalvirtualmemorysizeW, 0, &val, &type, NULL );
1331  ok( hr == S_OK, "failed to get virtual memory size %08x\n", hr );
1332  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1333  ok( type == CIM_UINT64, "unexpected type 0x%x\n", type );
1334  trace( "totalvirtualmemorysize %s\n", wine_dbgstr_w(V_BSTR(&val)) );
1335  VariantClear( &val );
1336 
1337  IWbemClassObject_Release( obj );
1338  IEnumWbemClassObject_Release( result );
1339  SysFreeString( query );
1340  SysFreeString( wql );
1341 }
1342 
1344 {
1345  static const WCHAR identifyingnumberW[] =
1346  {'I','d','e','n','t','i','f','y','i','n','g','N','u','m','b','e','r',0};
1347  static const WCHAR nameW[] =
1348  {'N','a','m','e',0};
1349  static const WCHAR skunumberW[] =
1350  {'S','K','U','N','u','m','b','e','r',0};
1351  static const WCHAR uuidW[] =
1352  {'U','U','I','D',0};
1353  static const WCHAR vendorW[] =
1354  {'V','e','n','d','o','r',0};
1355  static const WCHAR versionW[] =
1356  {'V','e','r','s','i','o','n',0};
1357  static const WCHAR queryW[] =
1358  {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
1359  'C','o','m','p','u','t','e','r','S','y','s','t','e','m','P','r','o','d','u','c','t',0};
1360  BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
1363  VARIANT value;
1364  CIMTYPE type;
1365  HRESULT hr;
1366  DWORD count;
1367 
1368  hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
1369  if (hr != S_OK)
1370  {
1371  win_skip( "Win32_ComputerSystemProduct not available\n" );
1372  return;
1373  }
1374 
1375  hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
1376  ok( hr == S_OK, "got %08x\n", hr );
1377 
1378  type = 0xdeadbeef;
1379  VariantInit( &value );
1380  hr = IWbemClassObject_Get( obj, identifyingnumberW, 0, &value, &type, NULL );
1381  ok( hr == S_OK, "got %08x\n", hr );
1382  ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) );
1383  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1384  trace( "identifyingnumber %s\n", wine_dbgstr_w(V_BSTR(&value)) );
1385  VariantClear( &value );
1386 
1387  type = 0xdeadbeef;
1388  VariantInit( &value );
1389  hr = IWbemClassObject_Get( obj, nameW, 0, &value, &type, NULL );
1390  ok( hr == S_OK, "got %08x\n", hr );
1391  ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) );
1392  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1393  trace( "name %s\n", wine_dbgstr_w(V_BSTR(&value)) );
1394  VariantClear( &value );
1395 
1396  type = 0xdeadbeef;
1397  VariantInit( &value );
1398  hr = IWbemClassObject_Get( obj, skunumberW, 0, &value, &type, NULL );
1399  ok( hr == S_OK, "got %08x\n", hr );
1400  ok( V_VT( &value ) == VT_NULL, "unexpected variant type 0x%x\n", V_VT( &value ) );
1401  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1402  VariantClear( &value );
1403 
1404  type = 0xdeadbeef;
1405  VariantInit( &value );
1406  hr = IWbemClassObject_Get( obj, uuidW, 0, &value, &type, NULL );
1407  ok( hr == S_OK, "got %08x\n", hr );
1408  ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) );
1409  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1410  trace( "uuid %s\n", wine_dbgstr_w(V_BSTR(&value)) );
1411  VariantClear( &value );
1412 
1413  type = 0xdeadbeef;
1414  VariantInit( &value );
1415  hr = IWbemClassObject_Get( obj, vendorW, 0, &value, &type, NULL );
1416  ok( hr == S_OK, "got %08x\n", hr );
1417  ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) );
1418  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1419  trace( "vendor %s\n", wine_dbgstr_w(V_BSTR(&value)) );
1420  VariantClear( &value );
1421 
1422  type = 0xdeadbeef;
1423  VariantInit( &value );
1424  hr = IWbemClassObject_Get( obj, versionW, 0, &value, &type, NULL );
1425  ok( hr == S_OK, "got %08x\n", hr );
1426  ok( V_VT( &value ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &value ) );
1427  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1428  trace( "version %s\n", wine_dbgstr_w(V_BSTR(&value)) );
1429  VariantClear( &value );
1430 
1431  IWbemClassObject_Release( obj );
1432  IEnumWbemClassObject_Release( result );
1433  SysFreeString( query );
1434  SysFreeString( wql );
1435 }
1436 
1438 {
1439  static const WCHAR capacityW[] = {'C','a','p','a','c','i','t','y',0};
1440  static const WCHAR memorytypeW[] = {'M','e','m','o','r','y','T','y','p','e',0};
1441  static const WCHAR queryW[] =
1442  {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
1443  'P','h','y','s','i','c','a','l','M','e','m','o','r','y',0};
1444  BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
1447  VARIANT val;
1448  CIMTYPE type;
1449  HRESULT hr;
1450  DWORD count;
1451 
1452  hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
1453  if (hr != S_OK)
1454  {
1455  win_skip( "Win32_PhysicalMemory not available\n" );
1456  return;
1457  }
1458 
1459  hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
1460  ok( hr == S_OK, "got %08x\n", hr );
1461 
1462  if (count > 0)
1463  {
1464  type = 0xdeadbeef;
1465  VariantInit( &val );
1466  hr = IWbemClassObject_Get( obj, capacityW, 0, &val, &type, NULL );
1467  ok( hr == S_OK, "failed to get capacity %08x\n", hr );
1468  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1469  ok( type == CIM_UINT64, "unexpected type 0x%x\n", type );
1470  trace( "capacity %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1471  VariantClear( &val );
1472 
1473  type = 0xdeadbeef;
1474  VariantInit( &val );
1475  hr = IWbemClassObject_Get( obj, memorytypeW, 0, &val, &type, NULL );
1476  ok( hr == S_OK, "failed to get memory type %08x\n", hr );
1477  ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
1478  ok( type == CIM_UINT16, "unexpected type 0x%x\n", type );
1479  trace( "memorytype %u\n", V_I4( &val ) );
1480  VariantClear( &val );
1481 
1482  IWbemClassObject_Release( obj );
1483  }
1484  IEnumWbemClassObject_Release( result );
1485  SysFreeString( query );
1486  SysFreeString( wql );
1487 }
1488 
1490 {
1491  static const WCHAR destinationW[] = {'D','e','s','t','i','n','a','t','i','o','n',0};
1492  static const WCHAR interfaceindexW[] = {'I','n','t','e','r','f','a','c','e','I','n','d','e','x',0};
1493  static const WCHAR nexthopW[] = {'N','e','x','t','H','o','p',0};
1494  static const WCHAR queryW[] =
1495  {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
1496  'I','P','4','R','o','u','t','e','T','a','b','l','e',0};
1497  BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
1500  VARIANT val;
1501  CIMTYPE type;
1502  HRESULT hr;
1503  DWORD count;
1504 
1505  hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
1506  if (hr != S_OK)
1507  {
1508  win_skip( "Win32_IP4RouteTable not available\n" );
1509  return;
1510  }
1511 
1512  for (;;)
1513  {
1514  hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
1515  if (hr != S_OK) break;
1516 
1517  type = 0xdeadbeef;
1518  VariantInit( &val );
1519  hr = IWbemClassObject_Get( obj, destinationW, 0, &val, &type, NULL );
1520  ok( hr == S_OK, "failed to get destination %08x\n", hr );
1521  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1522  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1523  trace( "destination %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1524  VariantClear( &val );
1525 
1526  type = 0xdeadbeef;
1527  VariantInit( &val );
1528  hr = IWbemClassObject_Get( obj, interfaceindexW, 0, &val, &type, NULL );
1529  ok( hr == S_OK, "failed to get interface index %08x\n", hr );
1530  ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
1531  ok( type == CIM_SINT32, "unexpected type 0x%x\n", type );
1532  trace( "interfaceindex %d\n", V_I4( &val ) );
1533  VariantClear( &val );
1534 
1535  type = 0xdeadbeef;
1536  VariantInit( &val );
1537  hr = IWbemClassObject_Get( obj, nexthopW, 0, &val, &type, NULL );
1538  ok( hr == S_OK, "failed to get nexthop %08x\n", hr );
1539  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1540  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1541  trace( "nexthop %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1542  VariantClear( &val );
1543 
1544  IWbemClassObject_Release( obj );
1545  }
1546 
1547  IEnumWbemClassObject_Release( result );
1548  SysFreeString( query );
1549  SysFreeString( wql );
1550 }
1551 
1553 {
1554  static const WCHAR architectureW[] =
1555  {'A','r','c','h','i','t','e','c','t','u','r','e',0};
1556  static const WCHAR familyW[] =
1557  {'F','a','m','i','l','y',0};
1558  static const WCHAR levelW[] =
1559  {'L','e','v','e','l',0};
1560  static const WCHAR manufacturerW[] =
1561  {'M','a','n','u','f','a','c','t','u','r','e','r',0};
1562  static const WCHAR nameW[] =
1563  {'N','a','m','e',0};
1564  static const WCHAR processoridW[] =
1565  {'P','r','o','c','e','s','s','o','r','I','d',0};
1566  static const WCHAR revisionW[] =
1567  {'R','e','v','i','s','i','o','n',0};
1568  static const WCHAR versionW[] =
1569  {'V','e','r','s','i','o','n',0};
1570  static const WCHAR queryW[] =
1571  {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
1572  'P','r','o','c','e','s','s','o','r',0};
1573  BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
1576  VARIANT val;
1577  CIMTYPE type;
1578  HRESULT hr;
1579  DWORD count;
1580 
1581  hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
1582  ok( hr == S_OK, "got %08x\n", hr );
1583 
1584  for (;;)
1585  {
1586  hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
1587  if (hr != S_OK) break;
1588 
1589  type = 0xdeadbeef;
1590  VariantInit( &val );
1591  hr = IWbemClassObject_Get( obj, architectureW, 0, &val, &type, NULL );
1592  ok( hr == S_OK, "got %08x\n", hr );
1593  ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
1594  ok( type == CIM_UINT16, "unexpected type 0x%x\n", type );
1595  trace( "architecture %u\n", V_I4( &val ) );
1596 
1597  type = 0xdeadbeef;
1598  VariantInit( &val );
1599  hr = IWbemClassObject_Get( obj, familyW, 0, &val, &type, NULL );
1600  ok( hr == S_OK, "got %08x\n", hr );
1601  ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
1602  ok( type == CIM_UINT16, "unexpected type 0x%x\n", type );
1603  trace( "family %u\n", V_I4( &val ) );
1604 
1605  type = 0xdeadbeef;
1606  VariantInit( &val );
1607  hr = IWbemClassObject_Get( obj, levelW, 0, &val, &type, NULL );
1608  ok( hr == S_OK, "got %08x\n", hr );
1609  ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
1610  ok( type == CIM_UINT16, "unexpected type 0x%x\n", type );
1611  trace( "level %u\n", V_I4( &val ) );
1612 
1613  type = 0xdeadbeef;
1614  VariantInit( &val );
1615  hr = IWbemClassObject_Get( obj, manufacturerW, 0, &val, &type, NULL );
1616  ok( hr == S_OK, "got %08x\n", hr );
1617  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1618  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1619  trace( "manufacturer %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1620  VariantClear( &val );
1621 
1622  type = 0xdeadbeef;
1623  VariantInit( &val );
1624  hr = IWbemClassObject_Get( obj, nameW, 0, &val, &type, NULL );
1625  ok( hr == S_OK, "got %08x\n", hr );
1626  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1627  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1628  trace( "name %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1629  VariantClear( &val );
1630 
1631  type = 0xdeadbeef;
1632  VariantInit( &val );
1633  hr = IWbemClassObject_Get( obj, processoridW, 0, &val, &type, NULL );
1634  ok( hr == S_OK, "got %08x\n", hr );
1635  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1636  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1637  trace( "processorid %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1638  VariantClear( &val );
1639 
1640  type = 0xdeadbeef;
1641  VariantInit( &val );
1642  hr = IWbemClassObject_Get( obj, revisionW, 0, &val, &type, NULL );
1643  ok( hr == S_OK, "got %08x\n", hr );
1644  ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
1645  ok( type == CIM_UINT16, "unexpected type 0x%x\n", type );
1646  trace( "revision %u\n", V_I4( &val ) );
1647 
1648  type = 0xdeadbeef;
1649  VariantInit( &val );
1650  hr = IWbemClassObject_Get( obj, versionW, 0, &val, &type, NULL );
1651  ok( hr == S_OK, "got %08x\n", hr );
1652  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1653  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1654  trace( "version %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1655  VariantClear( &val );
1656 
1657  IWbemClassObject_Release( obj );
1658  }
1659 
1660  IEnumWbemClassObject_Release( result );
1661  SysFreeString( query );
1662  SysFreeString( wql );
1663 }
1664 
1666 {
1667  static const WCHAR configmanagererrorcodeW[] =
1668  {'C','o','n','f','i','g','M','a','n','a','g','e','r','E','r','r','o','r','C','o','d','e',0};
1669  static const WCHAR driverdateW[] =
1670  {'D','r','i','v','e','r','D','a','t','e',0};
1671  static const WCHAR installeddisplaydriversW[]=
1672  {'I','n','s','t','a','l','l','e','d','D','i','s','p','l','a','y','D','r','i','v','e','r','s',0};
1673  static const WCHAR statusW[] =
1674  {'S','t','a','t','u','s',0};
1675  static const WCHAR queryW[] =
1676  {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
1677  'V','i','d','e','o','C','o','n','t','r','o','l','l','e','r',0};
1678  BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
1681  VARIANT val;
1682  CIMTYPE type;
1683  HRESULT hr;
1684  DWORD count;
1685 
1686  hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
1687  if (hr != S_OK)
1688  {
1689  win_skip( "Win32_VideoController not available\n" );
1690  return;
1691  }
1692 
1693  for (;;)
1694  {
1695  hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
1696  if (hr != S_OK) break;
1697 
1698  type = 0xdeadbeef;
1699  VariantInit( &val );
1700  hr = IWbemClassObject_Get( obj, configmanagererrorcodeW, 0, &val, &type, NULL );
1701  ok( hr == S_OK, "got %08x\n", hr );
1702  ok( V_VT( &val ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &val ) );
1703  ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
1704  trace( "configmanagererrorcode %d\n", V_I4( &val ) );
1705 
1706  type = 0xdeadbeef;
1707  VariantInit( &val );
1708  hr = IWbemClassObject_Get( obj, driverdateW, 0, &val, &type, NULL );
1709  ok( hr == S_OK, "got %08x\n", hr );
1710  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1711  ok( type == CIM_DATETIME, "unexpected type 0x%x\n", type );
1712  trace( "driverdate %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1713  VariantClear( &val );
1714 
1715  type = 0xdeadbeef;
1716  VariantInit( &val );
1717  hr = IWbemClassObject_Get( obj, installeddisplaydriversW, 0, &val, &type, NULL );
1718  ok( hr == S_OK, "got %08x\n", hr );
1719  ok( V_VT( &val ) == VT_BSTR || V_VT( &val ) == VT_NULL, "unexpected variant type 0x%x\n", V_VT( &val ) );
1720  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1721  trace( "installeddisplaydrivers %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1722  VariantClear( &val );
1723 
1724  type = 0xdeadbeef;
1725  VariantInit( &val );
1726  hr = IWbemClassObject_Get( obj, statusW, 0, &val, &type, NULL );
1727  ok( hr == S_OK, "got %08x\n", hr );
1728  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1729  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1730  trace( "status %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1731  VariantClear( &val );
1732 
1733  IWbemClassObject_Release( obj );
1734  }
1735 
1736  IEnumWbemClassObject_Release( result );
1737  SysFreeString( query );
1738  SysFreeString( wql );
1739 }
1740 
1742 {
1743  static const WCHAR deviceidW[] =
1744  {'D','e','v','i','c','e','I','d',0};
1745  static const WCHAR locationW[] =
1746  {'L','o','c','a','t','i','o','n',0};
1747  static const WCHAR portnameW[] =
1748  {'P','o','r','t','N','a','m','e',0};
1749  static const WCHAR queryW[] =
1750  {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
1751  'P','r','i','n','t','e','r',0};
1752  BSTR wql = SysAllocString( wqlW ), query = SysAllocString( queryW );
1755  VARIANT val;
1756  CIMTYPE type;
1757  HRESULT hr;
1758  DWORD count;
1759 
1760  hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
1761  if (hr != S_OK)
1762  {
1763  win_skip( "Win32_Printer not available\n" );
1764  return;
1765  }
1766 
1767  for (;;)
1768  {
1769  hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count );
1770  if (hr != S_OK) break;
1771 
1772  type = 0xdeadbeef;
1773  memset( &val, 0, sizeof(val) );
1774  hr = IWbemClassObject_Get( obj, deviceidW, 0, &val, &type, NULL );
1775  ok( hr == S_OK, "got %08x\n", hr );
1776  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1777  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1778  trace( "deviceid %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1779  VariantClear( &val );
1780 
1781  type = 0xdeadbeef;
1782  memset( &val, 0, sizeof(val) );
1783  hr = IWbemClassObject_Get( obj, locationW, 0, &val, &type, NULL );
1784  ok( hr == S_OK, "got %08x\n", hr );
1785  ok( V_VT( &val ) == VT_BSTR || V_VT( &val ) == VT_NULL, "unexpected variant type 0x%x\n", V_VT( &val ) );
1786  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1787  trace( "location %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1788  VariantClear( &val );
1789 
1790  type = 0xdeadbeef;
1791  memset( &val, 0, sizeof(val) );
1792  hr = IWbemClassObject_Get( obj, portnameW, 0, &val, &type, NULL );
1793  ok( hr == S_OK, "got %08x\n", hr );
1794  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1795  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1796  trace( "portname %s\n", wine_dbgstr_w(V_BSTR( &val )) );
1797  VariantClear( &val );
1798 
1799  IWbemClassObject_Release( obj );
1800  }
1801 
1802  IEnumWbemClassObject_Release( result );
1803  SysFreeString( query );
1804  SysFreeString( wql );
1805 }
1806 
1808 {
1809  HRESULT hr;
1810  IEnumWbemClassObject *enm;
1812  VARIANT val;
1813  CIMTYPE type;
1814  ULONG count, i;
1815  BSTR bstr;
1816 
1817  static WCHAR win32_pnpentityW[] = {'W','i','n','3','2','_','P','n','P','E','n','t','i','t','y',0};
1818  static const WCHAR deviceidW[] = {'D','e','v','i','c','e','I','d',0};
1819 
1820  bstr = SysAllocString( win32_pnpentityW );
1821 
1822  hr = IWbemServices_CreateInstanceEnum( services, bstr, 0, NULL, &enm );
1823  ok( hr == S_OK, "got %08x\n", hr );
1824 
1825  SysFreeString( bstr );
1826  bstr = SysAllocString( deviceidW );
1827 
1828  while (1)
1829  {
1830  hr = IEnumWbemClassObject_Next( enm, 1000, 1, &obj, &count );
1831  ok( (count == 1 && (hr == WBEM_S_FALSE || hr == WBEM_S_NO_ERROR)) ||
1832  (count == 0 && (hr == WBEM_S_FALSE || hr == WBEM_S_TIMEDOUT)),
1833  "got %08x with %u objects returned\n", hr, count );
1834 
1835  if (count == 0)
1836  break;
1837 
1838  for (i = 0; i < count; ++i)
1839  {
1840  hr = IWbemClassObject_Get( obj, bstr, 0, &val, &type, NULL );
1841  ok( hr == S_OK, "got %08x\n", hr );
1842 
1843  if (SUCCEEDED( hr ))
1844  {
1845  ok( V_VT( &val ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &val ) );
1846  ok( type == CIM_STRING, "unexpected type 0x%x\n", type );
1847  VariantClear( &val );
1848  }
1849  }
1850  }
1851 
1852  SysFreeString( bstr );
1853 
1854  IEnumWbemClassObject_Release( enm );
1855 }
1856 
1858 {
1859  static const WCHAR cimv2W[] = {'R','O','O','T','\\','C','I','M','V','2',0};
1860  BSTR path = SysAllocString( cimv2W );
1863  HRESULT hr;
1864 
1865  CoInitialize( NULL );
1867  RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL );
1868  hr = CoCreateInstance( &CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, &IID_IWbemLocator,
1869  (void **)&locator );
1870  if (hr != S_OK)
1871  {
1872  win_skip("can't create instance of WbemLocator\n");
1873  return;
1874  }
1875  hr = IWbemLocator_ConnectServer( locator, path, NULL, NULL, NULL, 0, NULL, NULL, &services );
1876  ok( hr == S_OK, "failed to get IWbemServices interface %08x\n", hr );
1877 
1880  ok( hr == S_OK, "failed to set proxy blanket %08x\n", hr );
1881 
1882  test_select( services );
1903 
1904  SysFreeString( path );
1905  IWbemServices_Release( services );
1906  IWbemLocator_Release( locator );
1907  CoUninitialize();
1908 }
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
static void test_query_async(IWbemServices *services)
Definition: query.c:1040
#define RPC_C_AUTHN_WINNT
Definition: rpcdce.h:158
#define REFIID
Definition: guiddef.h:118
#define TRUE
Definition: types.h:120
static void test_GetNames(IWbemServices *services)
Definition: query.c:1064
#define E_NOINTERFACE
Definition: winerror.h:2364
Definition: compat.h:1947
static rfbScreenInfoPtr server
Definition: vnc.c:74
#define SE_SELF_RELATIVE
Definition: setypes.h:780
#define SECURITY_MAX_SID_SIZE
Definition: setypes.h:458
HRESULT hr
Definition: shlfolder.c:183
BSTR WINAPI SysAllocStringLen(const OLECHAR *str, unsigned int len)
Definition: oleaut.c:342
REFIID riid
Definition: precomp.h:44
static void test_Win32_ComputerSystemProduct(IWbemServices *services)
Definition: query.c:1343
char * wine_dbgstr_w(const wchar_t *wstr)
Definition: atltest.h:87
BOOL WINAPI EqualSid(PSID pSid1, PSID pSid2)
Definition: security.c:708
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:170
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define V_ARRAY(A)
Definition: oleauto.h:222
#define RPC_C_AUTHN_LEVEL_DEFAULT
Definition: rpcdce.h:145
GLsizei GLenum GLenum * types
Definition: glext.h:7753
LONG WINAPI RegDeleteKeyW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey)
Definition: reg.c:1237
static ULONG sink_refs
Definition: query.c:977
REFIID LPVOID * ppv
Definition: atlbase.h:39
static HANDLE process
Definition: process.c:76
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
static void test_Win32_VideoController(IWbemServices *services)
Definition: query.c:1665
#define test
Definition: rosglue.h:37
static void test_Win32_Bios(IWbemServices *services)
Definition: query.c:280
OLECHAR * BSTR
Definition: compat.h:1942
#define RPC_C_AUTHN_LEVEL_CALL
Definition: rpcdce.h:148
BOOL WINAPI GetComputerNameW(LPWSTR lpBuffer, LPDWORD lpnSize)
Definition: compname.c:440
void WINAPI VariantInit(VARIANTARG *pVarg)
Definition: variant.c:571
#define RPC_C_IMP_LEVEL_IMPERSONATE
Definition: rpcdce.h:176
static void test_Win32_Processor(IWbemServices *services)
Definition: query.c:1552
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
#define lstrlenW
Definition: compat.h:415
GLsizei GLenum GLboolean sink
Definition: glext.h:5672
static void test_Win32_Service(IWbemServices *services)
Definition: query.c:179
#define V_I4(A)
Definition: oleauto.h:247
int WINAPI lstrcmpiW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:194
GLsizei GLsizei GLuint * obj
Definition: glext.h:6042
GLuint GLuint * names
Definition: glext.h:11545
START_TEST(query)
Definition: query.c:516
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
static const CLSID * objects[]
Definition: apphelp.c:110
unsigned char * LPBYTE
Definition: typedefs.h:52
HRESULT WINAPI SafeArrayAccessData(SAFEARRAY *psa, void **ppvData)
Definition: safearray.c:1139
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
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
static const WCHAR valueW[]
Definition: object.c:48
GLuint GLfloat * val
Definition: glext.h:7180
static void test_Win32_SystemEnclosure(IWbemServices *services)
Definition: query.c:610
static const WCHAR nameW[]
Definition: main.c:46
static WCHAR username[]
Definition: url.c:32
static void test_Win32_Process(IWbemServices *services, BOOL use_full_path)
Definition: query.c:401
static HRESULT WINAPI sink_QueryInterface(IWbemObjectSink *iface, REFIID riid, void **ppv)
Definition: query.c:964
static const WCHAR backslashW[]
static IWbemObjectSinkVtbl sink_vtbl
Definition: query.c:1005
static HRESULT WINAPI sink_Indicate(IWbemObjectSink *iface, LONG count, IWbemClassObject **objects)
Definition: query.c:991
BOOL WINAPI GetUserNameW(LPWSTR lpszName, LPDWORD lpSize)
Definition: misc.c:291
static const struct StrToNameW namesW[]
Definition: str.c:828
#define trace
Definition: atltest.h:70
Definition: cmds.c:130
static const WCHAR processW[]
Definition: main.c:47
__wchar_t WCHAR
Definition: xmlstorage.h:180
static void test_Win32_PnPEntity(IWbemServices *services)
Definition: query.c:1807
LONG HRESULT
Definition: typedefs.h:77
const GUID IID_IUnknown
#define WINAPI
Definition: msvc.h:8
#define V_BOOL(A)
Definition: oleauto.h:224
static FILE * out
Definition: regtests2xml.c:44
HRESULT WINAPI SafeArrayGetLBound(SAFEARRAY *psa, UINT nDim, LONG *plLbound)
Definition: safearray.c:1068
unsigned long DWORD
Definition: ntddk_ex.h:95
static ULONG WINAPI sink_Release(IWbemObjectSink *iface)
Definition: query.c:985
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLbitfield flags
Definition: glext.h:7161
method
Definition: dragdrop.c:53
static ULONG WINAPI sink_AddRef(IWbemObjectSink *iface)
Definition: query.c:979
HRESULT WINAPI SafeArrayDestroy(SAFEARRAY *psa)
Definition: safearray.c:1349
#define V_UI4(A)
Definition: oleauto.h:270
static const WCHAR sd[]
Definition: suminfo.c:287
int ret
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:651
#define todo_wine
Definition: test.h:154
#define V_VT(A)
Definition: oleauto.h:211
static int state
Definition: maze.c:121
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static void test_notification_query_async(IWbemServices *services)
Definition: query.c:1016
GLenum GLsizei len
Definition: glext.h:6722
unsigned char BYTE
Definition: mem.h:68
long CIMTYPE
Definition: wbemcli.idl:258
GLsizei const GLfloat * value
Definition: glext.h:6069
#define V_BSTR(A)
Definition: oleauto.h:226
#define broken(x)
Definition: _sntprintf.h:21
static void test_SystemSecurity(IWbemServices *services)
Definition: query.c:1098
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
#define MAX_COMPUTERNAME_LENGTH
Definition: winbase.h:240
#define S_OK
Definition: intsafe.h:59
HRESULT WINAPI SafeArrayGetUBound(SAFEARRAY *psa, UINT nDim, LONG *plUbound)
Definition: safearray.c:1035
static const WCHAR emptyW[]
Definition: navigate.c:40
GLuint in
Definition: glext.h:9616
#define lstrcpyW
Definition: compat.h:414
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
#define ARRAY_SIZE(a)
Definition: main.h:24
static void test_select(IWbemServices *services)
Definition: query.c:71
#define ok(value,...)
Definition: atltest.h:57
Definition: services.c:325
static void test_Win32_Printer(IWbemServices *services)
Definition: query.c:1741
HRESULT exec_query(const WCHAR *str, IEnumWbemClassObject **result)
Definition: query.c:471
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:274
unsigned int UINT
Definition: ndis.h:50
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112
BOOL empty
Definition: button.c:170
static int reg
Definition: i386-dis.c:1275
#define skip(...)
Definition: atltest.h:64
static const WCHAR descriptionW[]
Definition: error.c:32
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
static void test_Win32_ComputerSystem(IWbemServices *services)
Definition: query.c:525
Definition: name.c:36
GLuint res
Definition: glext.h:9613
static void test_associators(IWbemServices *services)
Definition: query.c:156
unsigned int ULONG
Definition: retypes.h:1
static const WCHAR programfilesW[]
Definition: path.c:4141
static void test_Win32_IP4RouteTable(IWbemServices *services)
Definition: query.c:1489
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:274
static void test_Win32_OperatingSystem(IWbemServices *services)
Definition: query.c:1176
static void test_Win32_PhysicalMemory(IWbemServices *services)
Definition: query.c:1437
BOOL WINAPI CreateWellKnownSid(IN WELL_KNOWN_SID_TYPE WellKnownSidType, IN PSID DomainSid OPTIONAL, OUT PSID pSid, IN OUT DWORD *cbSid)
Definition: security.c:601
GLuint64EXT * result
Definition: glext.h:11304
#define memset(x, y, z)
Definition: compat.h:39
#define RPC_C_AUTHZ_NONE
Definition: rpcdce.h:167
HRESULT WINAPI CoSetProxyBlanket(IUnknown *pProxy, DWORD AuthnSvc, DWORD AuthzSvc, OLECHAR *pServerPrincName, DWORD AuthnLevel, DWORD ImpLevel, void *pAuthInfo, DWORD Capabilities)
Definition: compobj.c:4307
static const WCHAR versionW[]
Definition: name.c:50
#define win_skip
Definition: test.h:141
static HRESULT WINAPI sink_SetStatus(IWbemObjectSink *iface, LONG flags, HRESULT hresult, BSTR str_param, IWbemClassObject *obj_param)
Definition: query.c:998
void user(int argc, const char *argv[])
Definition: cmds.c:1350
HRESULT WINAPI SafeArrayUnaccessData(SAFEARRAY *psa)
Definition: safearray.c:1170
static ISAXLocator * locator
Definition: saxreader.c:1037
DWORD WINAPI GetCurrentProcessId(VOID)
Definition: proc.c:1158
#define SUCCEEDED(hr)
Definition: intsafe.h:57
static void test_StdRegProv(IWbemServices *services)
Definition: query.c:723