pdh: Implement and test PdhLookupPerfIndexByName{A, W} and PdhLookupPerfNameByIndex...
[wine] / dlls / pdh / tests / pdh.c
1 /*
2  * Tests for pdh.dll (Performance Data Helper)
3  *
4  * Copyright 2007 Hans Leidekker
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #include <stdio.h>
22
23 #include "windows.h"
24
25 #include "pdh.h"
26 #include "pdhmsg.h"
27
28 #include "wine/test.h"
29
30 static const WCHAR processor_time[] =
31     {'%',' ','P','r','o','c','e','s','s','o','r',' ','T','i','m','e',0};
32 static const WCHAR uptime[] =
33     {'S','y','s','t','e','m',' ','U','p',' ','T','i','m','e',0};
34
35 static const WCHAR system_uptime[] =
36     {'\\','S','y','s','t','e','m','\\','S','y','s','t','e','m',' ','U','p',' ','T','i','m','e',0};
37 static const WCHAR system_downtime[] = /* does not exist */
38     {'\\','S','y','s','t','e','m','\\','S','y','s','t','e','m',' ','D','o','w','n',' ','T','i','m','e',0};
39 static const WCHAR percentage_processor_time[] =
40     {'\\','P','r','o','c','e','s','s','o','r','(','_','T','o','t','a','l',')',
41      '\\','%',' ','P','r','o','c','e','s','s','o','r',' ','T','i','m','e',0};
42
43 static void test_PdhOpenQueryA( void )
44 {
45     PDH_STATUS ret;
46     PDH_HQUERY query;
47
48     ret = PdhOpenQueryA( NULL, 0, NULL );
49     ok(ret == PDH_INVALID_ARGUMENT, "PdhOpenQueryA failed 0x%08x\n", ret);
50
51     ret = PdhOpenQueryA( NULL, 0, &query );
52     ok(ret == ERROR_SUCCESS, "PdhOpenQueryA failed 0x%08x\n", ret);
53
54     ret = PdhCloseQuery( NULL );
55     ok(ret == PDH_INVALID_HANDLE, "PdhCloseQuery failed 0x%08x\n", ret);
56
57     ret = PdhCloseQuery( &query );
58     ok(ret == PDH_INVALID_HANDLE, "PdhCloseQuery failed 0x%08x\n", ret);
59
60     ret = PdhCloseQuery( query );
61     ok(ret == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", ret);
62
63     ret = PdhCloseQuery( query );
64     ok(ret == PDH_INVALID_HANDLE, "PdhCloseQuery failed 0x%08x\n", ret);
65 }
66
67 static void test_PdhOpenQueryW( void )
68 {
69     PDH_STATUS ret;
70     PDH_HQUERY query;
71
72     ret = PdhOpenQueryW( NULL, 0, NULL );
73     ok(ret == PDH_INVALID_ARGUMENT, "PdhOpenQueryW failed 0x%08x\n", ret);
74
75     ret = PdhOpenQueryW( NULL, 0, &query );
76     ok(ret == ERROR_SUCCESS, "PdhOpenQueryW failed 0x%08x\n", ret);
77
78     ret = PdhCloseQuery( NULL );
79     ok(ret == PDH_INVALID_HANDLE, "PdhCloseQuery failed 0x%08x\n", ret);
80
81     ret = PdhCloseQuery( &query );
82     ok(ret == PDH_INVALID_HANDLE, "PdhCloseQuery failed 0x%08x\n", ret);
83
84     ret = PdhCloseQuery( query );
85     ok(ret == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", ret);
86
87     ret = PdhCloseQuery( query );
88     ok(ret == PDH_INVALID_HANDLE, "PdhCloseQuery failed 0x%08x\n", ret);
89 }
90
91 static void test_PdhAddCounterA( void )
92 {
93     PDH_STATUS ret;
94     PDH_HQUERY query;
95     PDH_HCOUNTER counter;
96
97     ret = PdhOpenQueryA( NULL, 0, &query );
98     ok(ret == ERROR_SUCCESS, "PdhOpenQueryA failed 0x%08x\n", ret);
99
100     ret = PdhAddCounterA( NULL, "\\System\\System Up Time", 0, NULL );
101     ok(ret == PDH_INVALID_ARGUMENT, "PdhAddCounterA failed 0x%08x\n", ret);
102
103     ret = PdhAddCounterA( NULL, "\\System\\System Up Time", 0, &counter );
104     ok(ret == PDH_INVALID_HANDLE, "PdhAddCounterA failed 0x%08x\n", ret);
105
106     ret = PdhAddCounterA( query, NULL, 0, &counter );
107     ok(ret == PDH_INVALID_ARGUMENT, "PdhAddCounterA failed 0x%08x\n", ret);
108
109     ret = PdhAddCounterA( query, "\\System\\System Up Time", 0, NULL );
110     ok(ret == PDH_INVALID_ARGUMENT, "PdhAddCounterA failed 0x%08x\n", ret);
111
112     ret = PdhAddCounterA( query, "\\System\\System Down Time", 0, &counter );
113     ok(ret == PDH_CSTATUS_NO_COUNTER, "PdhAddCounterA failed 0x%08x\n", ret);
114     ok(!counter, "PdhAddCounterA failed %p\n", counter);
115
116     ret = PdhAddCounterA( query, "\\System\\System Up Time", 0, &counter );
117     ok(ret == ERROR_SUCCESS, "PdhAddCounterA failed 0x%08x\n", ret);
118
119     ret = PdhCollectQueryData( NULL );
120     ok(ret == PDH_INVALID_HANDLE, "PdhCollectQueryData failed 0x%08x\n", ret);
121
122     ret = PdhCollectQueryData( counter );
123     ok(ret == PDH_INVALID_HANDLE, "PdhCollectQueryData failed 0x%08x\n", ret);
124
125     ret = PdhCollectQueryData( query );
126     ok(ret == ERROR_SUCCESS, "PdhCollectQueryData failed 0x%08x\n", ret);
127
128     ret = PdhRemoveCounter( NULL );
129     ok(ret == PDH_INVALID_HANDLE, "PdhRemoveCounter failed 0x%08x\n", ret);
130
131     ret = PdhRemoveCounter( counter );
132     ok(ret == ERROR_SUCCESS, "PdhRemoveCounter failed 0x%08x\n", ret);
133
134     ret = PdhCloseQuery( query );
135     ok(ret == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", ret);
136 }
137
138 static void test_PdhAddCounterW( void )
139 {
140     PDH_STATUS ret;
141     PDH_HQUERY query;
142     PDH_HCOUNTER counter;
143
144     ret = PdhOpenQueryW( NULL, 0, &query );
145     ok(ret == ERROR_SUCCESS, "PdhOpenQueryW failed 0x%08x\n", ret);
146
147     ret = PdhAddCounterW( NULL, percentage_processor_time, 0, NULL );
148     ok(ret == PDH_INVALID_ARGUMENT, "PdhAddCounterW failed 0x%08x\n", ret);
149
150     ret = PdhAddCounterW( NULL, percentage_processor_time, 0, &counter );
151     ok(ret == PDH_INVALID_HANDLE, "PdhAddCounterW failed 0x%08x\n", ret);
152
153     ret = PdhAddCounterW( query, NULL, 0, &counter );
154     ok(ret == PDH_INVALID_ARGUMENT, "PdhAddCounterW failed 0x%08x\n", ret);
155
156     ret = PdhAddCounterW( query, percentage_processor_time, 0, NULL );
157     ok(ret == PDH_INVALID_ARGUMENT, "PdhAddCounterW failed 0x%08x\n", ret);
158
159     ret = PdhAddCounterW( query, system_downtime, 0, &counter );
160     ok(ret == PDH_CSTATUS_NO_COUNTER, "PdhAddCounterW failed 0x%08x\n", ret);
161     ok(!counter, "PdhAddCounterW failed %p\n", counter);
162
163     ret = PdhAddCounterW( query, percentage_processor_time, 0, &counter );
164     ok(ret == ERROR_SUCCESS, "PdhAddCounterW failed 0x%08x\n", ret);
165
166     ret = PdhCollectQueryData( NULL );
167     ok(ret == PDH_INVALID_HANDLE, "PdhCollectQueryData failed 0x%08x\n", ret);
168
169     ret = PdhCollectQueryData( counter );
170     ok(ret == PDH_INVALID_HANDLE, "PdhCollectQueryData failed 0x%08x\n", ret);
171
172     ret = PdhCollectQueryData( query );
173     ok(ret == ERROR_SUCCESS, "PdhCollectQueryData failed 0x%08x\n", ret);
174
175     ret = PdhRemoveCounter( NULL );
176     ok(ret == PDH_INVALID_HANDLE, "PdhRemoveCounter failed 0x%08x\n", ret);
177
178     ret = PdhRemoveCounter( counter );
179     ok(ret == ERROR_SUCCESS, "PdhRemoveCounter failed 0x%08x\n", ret);
180
181     ret = PdhCloseQuery( query );
182     ok(ret == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", ret);
183 }
184
185 static void test_PdhGetFormattedCounterValue( void )
186 {
187     PDH_STATUS ret;
188     PDH_HQUERY query;
189     PDH_HCOUNTER counter;
190     PDH_FMT_COUNTERVALUE value;
191
192     ret = PdhOpenQueryA( NULL, 0, &query );
193     ok(ret == ERROR_SUCCESS, "PdhOpenQueryA failed 0x%08x\n", ret);
194
195     ret = PdhAddCounterA( query, "\\System\\System Up Time", 0, &counter );
196     ok(ret == ERROR_SUCCESS, "PdhAddCounterA failed 0x%08x\n", ret);
197
198     ret = PdhGetFormattedCounterValue( NULL, PDH_FMT_LARGE, NULL, NULL );
199     ok(ret == PDH_INVALID_ARGUMENT, "PdhGetFormattedCounterValue failed 0x%08x\n", ret);
200
201     ret = PdhGetFormattedCounterValue( NULL, PDH_FMT_LARGE, NULL, &value );
202     ok(ret == PDH_INVALID_HANDLE, "PdhGetFormattedCounterValue failed 0x%08x\n", ret);
203
204     ret = PdhGetFormattedCounterValue( counter, PDH_FMT_LARGE, NULL, NULL );
205     ok(ret == PDH_INVALID_ARGUMENT, "PdhGetFormattedCounterValue failed 0x%08x\n", ret);
206
207     ret = PdhGetFormattedCounterValue( counter, PDH_FMT_LARGE, NULL, &value );
208     ok(ret == ERROR_SUCCESS, "PdhGetFormattedCounterValue failed 0x%08x\n", ret);
209
210     ret = PdhCollectQueryData( query );
211     ok(ret == ERROR_SUCCESS, "PdhCollectQueryData failed 0x%08x\n", ret);
212
213     ret = PdhGetFormattedCounterValue( counter, PDH_FMT_LARGE, NULL, &value );
214     ok(ret == ERROR_SUCCESS, "PdhGetFormattedCounterValue failed 0x%08x\n", ret);
215
216     ret = PdhGetFormattedCounterValue( counter, PDH_FMT_LARGE | PDH_FMT_NOSCALE, NULL, &value );
217     ok(ret == ERROR_SUCCESS, "PdhGetFormattedCounterValue failed 0x%08x\n", ret);
218
219     ret = PdhGetFormattedCounterValue( counter, PDH_FMT_LARGE | PDH_FMT_NOCAP100, NULL, &value );
220     ok(ret == ERROR_SUCCESS, "PdhGetFormattedCounterValue failed 0x%08x\n", ret);
221
222     ret = PdhGetFormattedCounterValue( counter, PDH_FMT_LARGE | PDH_FMT_1000, NULL, &value );
223     ok(ret == ERROR_SUCCESS, "PdhGetFormattedCounterValue failed 0x%08x\n", ret);
224
225     ret = PdhSetCounterScaleFactor( counter, 2 );
226     ok(ret == ERROR_SUCCESS, "PdhSetCounterScaleFactor failed 0x%08x\n", ret);
227
228     ret = PdhGetFormattedCounterValue( counter, PDH_FMT_LARGE, NULL, &value );
229     ok(ret == ERROR_SUCCESS, "PdhGetFormattedCounterValue failed 0x%08x\n", ret);
230
231     ret = PdhCloseQuery( query );
232     ok(ret == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", ret);
233 }
234
235 static void test_PdhGetRawCounterValue( void )
236 {
237     PDH_STATUS ret;
238     PDH_HQUERY query;
239     PDH_HCOUNTER counter;
240     PDH_RAW_COUNTER value;
241
242     ret = PdhOpenQueryA( NULL, 0, &query );
243     ok(ret == ERROR_SUCCESS, "PdhOpenQueryA failed 0x%08x\n", ret);
244
245     ret = PdhAddCounterA( query, "\\System\\System Up Time", 0, &counter );
246     ok(ret == ERROR_SUCCESS, "PdhAddCounterA failed 0x%08x\n", ret);
247
248     ret = PdhGetRawCounterValue( NULL, NULL, &value );
249     ok(ret == PDH_INVALID_HANDLE, "PdhGetRawCounterValue failed 0x%08x\n", ret);
250
251     ret = PdhGetRawCounterValue( counter, NULL, NULL );
252     ok(ret == PDH_INVALID_ARGUMENT, "PdhGetRawCounterValue failed 0x%08x\n", ret);
253
254     ret = PdhGetRawCounterValue( counter, NULL, &value );
255     ok(ret == ERROR_SUCCESS, "PdhGetRawCounterValue failed 0x%08x\n", ret);
256     ok(value.CStatus == ERROR_SUCCESS, "expected ERROR_SUCCESS got %x", value.CStatus);
257
258     ret = PdhCollectQueryData( query );
259     ok(ret == ERROR_SUCCESS, "PdhCollectQueryData failed 0x%08x\n", ret);
260
261     ret = PdhGetRawCounterValue( counter, NULL, &value );
262     ok(ret == ERROR_SUCCESS, "PdhGetRawCounterValue failed 0x%08x\n", ret);
263     ok(value.CStatus == ERROR_SUCCESS, "expected ERROR_SUCCESS got %x", value.CStatus);
264
265     ret = PdhCloseQuery( query );
266     ok(ret == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", ret);
267 }
268
269 static void test_PdhSetCounterScaleFactor( void )
270 {
271     PDH_STATUS ret;
272     PDH_HQUERY query;
273     PDH_HCOUNTER counter;
274
275     ret = PdhOpenQueryA( NULL, 0, &query );
276     ok(ret == ERROR_SUCCESS, "PdhOpenQueryA failed 0x%08x\n", ret);
277
278     ret = PdhAddCounterA( query, "\\System\\System Up Time", 0, &counter );
279     ok(ret == ERROR_SUCCESS, "PdhAddCounterA failed 0x%08x\n", ret);
280
281     ret = PdhSetCounterScaleFactor( NULL, 8 );
282     ok(ret == PDH_INVALID_HANDLE, "PdhSetCounterScaleFactor failed 0x%08x\n", ret);
283
284     ret = PdhSetCounterScaleFactor( NULL, 1 );
285     ok(ret == PDH_INVALID_HANDLE, "PdhSetCounterScaleFactor failed 0x%08x\n", ret);
286
287     ret = PdhSetCounterScaleFactor( counter, 8 );
288     ok(ret == PDH_INVALID_ARGUMENT, "PdhSetCounterScaleFactor failed 0x%08x\n", ret);
289
290     ret = PdhSetCounterScaleFactor( counter, -8 );
291     ok(ret == PDH_INVALID_ARGUMENT, "PdhSetCounterScaleFactor failed 0x%08x\n", ret);
292
293     ret = PdhSetCounterScaleFactor( counter, 7 );
294     ok(ret == ERROR_SUCCESS, "PdhSetCounterScaleFactor failed 0x%08x\n", ret);
295
296     ret = PdhSetCounterScaleFactor( counter, 0 );
297     ok(ret == ERROR_SUCCESS, "PdhSetCounterScaleFactor failed 0x%08x\n", ret);
298
299     ret = PdhCloseQuery( query );
300     ok(ret == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", ret);
301 }
302
303 static void test_PdhGetCounterTimeBase( void )
304 {
305     PDH_STATUS ret;
306     PDH_HQUERY query;
307     PDH_HCOUNTER counter;
308     LONGLONG base;
309
310     ret = PdhOpenQueryA( NULL, 0, &query );
311     ok(ret == ERROR_SUCCESS, "PdhOpenQueryA failed 0x%08x\n", ret);
312
313     ret = PdhAddCounterA( query, "\\System\\System Up Time", 0, &counter );
314     ok(ret == ERROR_SUCCESS, "PdhAddCounterA failed 0x%08x\n", ret);
315
316     ret = PdhGetCounterTimeBase( NULL, NULL );
317     ok(ret == PDH_INVALID_ARGUMENT, "PdhGetCounterTimeBase failed 0x%08x\n", ret);
318
319     ret = PdhGetCounterTimeBase( NULL, &base );
320     ok(ret == PDH_INVALID_HANDLE, "PdhGetCounterTimeBase failed 0x%08x\n", ret);
321
322     ret = PdhGetCounterTimeBase( counter, NULL );
323     ok(ret == PDH_INVALID_ARGUMENT, "PdhGetCounterTimeBase failed 0x%08x\n", ret);
324
325     ret = PdhGetCounterTimeBase( counter, &base );
326     ok(ret == ERROR_SUCCESS, "PdhGetCounterTimeBase failed 0x%08x\n", ret);
327
328     ret = PdhCloseQuery( query );
329     ok(ret == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", ret);
330 }
331
332 static void test_PdhGetCounterInfoA( void )
333 {
334     PDH_STATUS ret;
335     PDH_HQUERY query;
336     PDH_HCOUNTER counter;
337     PDH_COUNTER_INFO_A info;
338     DWORD size;
339
340     ret = PdhOpenQueryA( NULL, 0, &query );
341     ok(ret == ERROR_SUCCESS, "PdhOpenQueryA failed 0x%08x\n", ret);
342
343     ret = PdhAddCounterA( query, "\\System\\System Up Time", 0, &counter );
344     ok(ret == ERROR_SUCCESS, "PdhAddCounterA failed 0x%08x\n", ret);
345
346     ret = PdhGetCounterInfoA( NULL, 0, NULL, NULL );
347     ok(ret == PDH_INVALID_HANDLE, "PdhGetCounterInfoA failed 0x%08x\n", ret);
348
349     ret = PdhGetCounterInfoA( counter, 0, NULL, NULL );
350     ok(ret == PDH_INVALID_ARGUMENT, "PdhGetCounterInfoA failed 0x%08x\n", ret);
351
352     ret = PdhGetCounterInfoA( counter, 0, NULL, &info );
353     ok(ret == PDH_INVALID_ARGUMENT, "PdhGetCounterInfoA failed 0x%08x\n", ret);
354
355     size = sizeof(info) - 1;
356     ret = PdhGetCounterInfoA( counter, 0, &size, NULL );
357     ok(ret == PDH_MORE_DATA, "PdhGetCounterInfoA failed 0x%08x\n", ret);
358
359     size = sizeof(info);
360     ret = PdhGetCounterInfoA( counter, 0, &size, &info );
361     ok(ret == ERROR_SUCCESS, "PdhGetCounterInfoA failed 0x%08x\n", ret);
362     ok(size == sizeof(info), "PdhGetCounterInfoA failed %d\n", size);
363
364     ret = PdhGetCounterInfoA( counter, 0, &size, &info );
365     ok(ret == ERROR_SUCCESS, "PdhGetCounterInfoA failed 0x%08x\n", ret);
366     ok(info.lScale == 0, "lScale %d\n", info.lScale);
367
368     ret = PdhSetCounterScaleFactor( counter, 0 );
369     ok(ret == ERROR_SUCCESS, "PdhSetCounterScaleFactor failed 0x%08x\n", ret);
370
371     ret = PdhGetCounterInfoA( counter, 0, &size, &info );
372     ok(ret == ERROR_SUCCESS, "PdhGetCounterInfoA failed 0x%08x\n", ret);
373     ok(info.lScale == 0, "lScale %d\n", info.lScale);
374
375     ret = PdhSetCounterScaleFactor( counter, -5 );
376     ok(ret == ERROR_SUCCESS, "PdhSetCounterScaleFactor failed 0x%08x\n", ret);
377
378     ret = PdhGetCounterInfoA( counter, 0, &size, &info );
379     ok(ret == ERROR_SUCCESS, "PdhGetCounterInfoA failed 0x%08x\n", ret);
380     ok(info.lScale == -5, "lScale %d\n", info.lScale);
381
382     ret = PdhCloseQuery( query );
383     ok(ret == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", ret);
384 }
385
386 static void test_PdhGetCounterInfoW( void )
387 {
388     PDH_STATUS ret;
389     PDH_HQUERY query;
390     PDH_HCOUNTER counter;
391     PDH_COUNTER_INFO_W info;
392     DWORD size;
393
394     ret = PdhOpenQueryW( NULL, 0, &query );
395     ok(ret == ERROR_SUCCESS, "PdhOpenQueryW failed 0x%08x\n", ret);
396
397     ret = PdhAddCounterW( query, percentage_processor_time, 0, &counter );
398     ok(ret == ERROR_SUCCESS, "PdhAddCounterW failed 0x%08x\n", ret);
399
400     ret = PdhGetCounterInfoW( NULL, 0, NULL, NULL );
401     ok(ret == PDH_INVALID_HANDLE, "PdhGetCounterInfoW failed 0x%08x\n", ret);
402
403     ret = PdhGetCounterInfoW( counter, 0, NULL, NULL );
404     ok(ret == PDH_INVALID_ARGUMENT, "PdhGetCounterInfoW failed 0x%08x\n", ret);
405
406     ret = PdhGetCounterInfoW( counter, 0, NULL, &info );
407     ok(ret == PDH_INVALID_ARGUMENT, "PdhGetCounterInfoW failed 0x%08x\n", ret);
408
409     size = sizeof(info) - 1;
410     ret = PdhGetCounterInfoW( counter, 0, &size, NULL );
411     ok(ret == PDH_MORE_DATA, "PdhGetCounterInfoW failed 0x%08x\n", ret);
412
413     size = sizeof(info);
414     ret = PdhGetCounterInfoW( counter, 0, &size, &info );
415     ok(ret == ERROR_SUCCESS, "PdhGetCounterInfoW failed 0x%08x\n", ret);
416     ok(size == sizeof(info), "PdhGetCounterInfoW failed %d\n", size);
417
418     ret = PdhGetCounterInfoW( counter, 0, &size, &info );
419     ok(ret == ERROR_SUCCESS, "PdhGetCounterInfoW failed 0x%08x\n", ret);
420     ok(info.lScale == 0, "lScale %d\n", info.lScale);
421
422     ret = PdhSetCounterScaleFactor( counter, 0 );
423     ok(ret == ERROR_SUCCESS, "PdhSetCounterScaleFactor failed 0x%08x\n", ret);
424
425     ret = PdhGetCounterInfoW( counter, 0, &size, &info );
426     ok(ret == ERROR_SUCCESS, "PdhGetCounterInfoW failed 0x%08x\n", ret);
427     ok(info.lScale == 0, "lScale %d\n", info.lScale);
428
429     ret = PdhSetCounterScaleFactor( counter, -5 );
430     ok(ret == ERROR_SUCCESS, "PdhSetCounterScaleFactor failed 0x%08x\n", ret);
431
432     ret = PdhGetCounterInfoW( counter, 0, &size, &info );
433     ok(ret == ERROR_SUCCESS, "PdhGetCounterInfoW failed 0x%08x\n", ret);
434     ok(info.lScale == -5, "lScale %d\n", info.lScale);
435
436     ret = PdhCloseQuery( query );
437     ok(ret == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", ret);
438 }
439
440 static void test_PdhLookupPerfIndexByNameA( void )
441 {
442     PDH_STATUS ret;
443     DWORD index;
444
445     ret = PdhLookupPerfIndexByNameA( NULL, NULL, NULL );
446     ok(ret == PDH_INVALID_ARGUMENT, "PdhLookupPerfIndexByNameA failed 0x%08x\n", ret);
447
448     ret = PdhLookupPerfIndexByNameA( NULL, NULL, &index );
449     ok(ret == PDH_INVALID_ARGUMENT, "PdhLookupPerfIndexByNameA failed 0x%08x\n", ret);
450
451     ret = PdhLookupPerfIndexByNameA( NULL, "No Counter", &index );
452     ok(ret == PDH_STRING_NOT_FOUND, "PdhLookupPerfIndexByNameA failed 0x%08x\n", ret);
453
454     ret = PdhLookupPerfIndexByNameA( NULL, "% Processor Time", NULL );
455     ok(ret == PDH_INVALID_ARGUMENT, "PdhLookupPerfIndexByNameA failed 0x%08x\n", ret);
456
457     ret = PdhLookupPerfIndexByNameA( NULL, "% Processor Time", &index );
458     ok(ret == ERROR_SUCCESS, "PdhLookupPerfIndexByNameA failed 0x%08x\n", ret);
459     ok(index == 6, "PdhLookupPerfIndexByNameA failed %d\n", index);
460
461     ret = PdhLookupPerfIndexByNameA( NULL, "System Up Time", &index );
462     ok(ret == ERROR_SUCCESS, "PdhLookupPerfIndexByNameA failed 0x%08x\n", ret);
463     ok(index == 674, "PdhLookupPerfIndexByNameA failed %d\n", index);
464 }
465
466 static void test_PdhLookupPerfIndexByNameW( void )
467 {
468     PDH_STATUS ret;
469     DWORD index;
470
471     static const WCHAR no_counter[] = {'N','o',' ','C','o','u','n','t','e','r',0};
472
473     ret = PdhLookupPerfIndexByNameW( NULL, NULL, NULL );
474     ok(ret == PDH_INVALID_ARGUMENT, "PdhLookupPerfIndexByNameW failed 0x%08x\n", ret);
475
476     ret = PdhLookupPerfIndexByNameW( NULL, NULL, &index );
477     ok(ret == PDH_INVALID_ARGUMENT, "PdhLookupPerfIndexByNameW failed 0x%08x\n", ret);
478
479     ret = PdhLookupPerfIndexByNameW( NULL, no_counter, &index );
480     ok(ret == PDH_STRING_NOT_FOUND, "PdhLookupPerfIndexByNameW failed 0x%08x\n", ret);
481
482     ret = PdhLookupPerfIndexByNameW( NULL, processor_time, NULL );
483     ok(ret == PDH_INVALID_ARGUMENT, "PdhLookupPerfIndexByNameW failed 0x%08x\n", ret);
484
485     ret = PdhLookupPerfIndexByNameW( NULL, processor_time, &index );
486     ok(ret == ERROR_SUCCESS, "PdhLookupPerfIndexByNameW failed 0x%08x\n", ret);
487     ok(index == 6, "PdhLookupPerfIndexByNameW failed %d\n", index);
488
489     ret = PdhLookupPerfIndexByNameW( NULL, uptime, &index );
490     ok(ret == ERROR_SUCCESS, "PdhLookupPerfIndexByNameW failed 0x%08x\n", ret);
491     ok(index == 674, "PdhLookupPerfIndexByNameW failed %d\n", index);
492 }
493
494 static void test_PdhLookupPerfNameByIndexA( void )
495 {
496     PDH_STATUS ret;
497     char buffer[PDH_MAX_COUNTER_NAME] = "!!";
498     DWORD size;
499
500     ret = PdhLookupPerfNameByIndexA( NULL, 0, NULL, NULL );
501     ok(ret == PDH_INVALID_ARGUMENT, "PdhLookupPerfNameByIndexA failed 0x%08x\n", ret);
502
503     size = 1;
504     ret = PdhLookupPerfNameByIndexA( NULL, 0, NULL, &size );
505     ok(ret == ERROR_SUCCESS, "PdhLookupPerfNameByIndexA failed 0x%08x\n", ret);
506     ok(size == 1, "PdhLookupPerfNameByIndexA failed %d\n", size);
507
508     size = sizeof(buffer);
509     ret = PdhLookupPerfNameByIndexA( NULL, 0, buffer, &size );
510     ok(ret == ERROR_SUCCESS, "PdhLookupPerfNameByIndexA failed 0x%08x\n", ret);
511     ok(!strcmp(buffer, "!!"), "PdhLookupPerfNameByIndexA failed %s\n", buffer);
512
513     size = 0;
514     ret = PdhLookupPerfNameByIndexA( NULL, 6, buffer, &size );
515     ok(ret == PDH_MORE_DATA, "PdhLookupPerfNameByIndexA failed 0x%08x\n", ret);
516     ok(size == sizeof("% Processor Time"), "PdhLookupPerfNameByIndexA failed %d\n", size);
517
518     size = sizeof(buffer);
519     ret = PdhLookupPerfNameByIndexA( NULL, 6, buffer, &size );
520     ok(ret == ERROR_SUCCESS, "PdhLookupPerfNameByIndexA failed 0x%08x\n", ret);
521     ok(!lstrcmpA( buffer, "% Processor Time" ),
522        "PdhLookupPerfNameByIndexA failed, got %s expected \'%% Processor Time\'\n", buffer);
523     ok(size == sizeof("% Processor Time"), "PdhLookupPerfNameByIndexA failed %d\n", size);
524
525     size = 0;
526     ret = PdhLookupPerfNameByIndexA( NULL, 674, NULL, &size );
527     ok(ret == PDH_MORE_DATA, "PdhLookupPerfNameByIndexA failed 0x%08x\n", ret);
528     ok(size == sizeof("System Up Time"), "PdhLookupPerfNameByIndexA failed %d\n", size);
529
530     size = sizeof(buffer);
531     ret = PdhLookupPerfNameByIndexA( NULL, 674, buffer, &size );
532     ok(ret == ERROR_SUCCESS, "PdhLookupPerfNameByIndexA failed 0x%08x\n", ret);
533     ok(!lstrcmpA( buffer, "System Up Time" ),
534        "PdhLookupPerfNameByIndexA failed, got %s expected \'System Up Time\'\n", buffer);
535     ok(size == sizeof("System Up Time"), "PdhLookupPerfNameByIndexA failed %d\n", size);
536 }
537
538 static void test_PdhLookupPerfNameByIndexW( void )
539 {
540     PDH_STATUS ret;
541     WCHAR buffer[PDH_MAX_COUNTER_NAME];
542     DWORD size;
543
544     ret = PdhLookupPerfNameByIndexW( NULL, 0, NULL, NULL );
545     ok(ret == PDH_INVALID_ARGUMENT, "PdhLookupPerfNameByIndexW failed 0x%08x\n", ret);
546
547     size = 1;
548     ret = PdhLookupPerfNameByIndexW( NULL, 0, NULL, &size );
549     ok(ret == ERROR_SUCCESS, "PdhLookupPerfNameByIndexW failed 0x%08x\n", ret);
550     ok(size == 1, "PdhLookupPerfNameByIndexW failed %d\n", size);
551
552     size = sizeof(buffer) / sizeof(WCHAR);
553     ret = PdhLookupPerfNameByIndexW( NULL, 0, buffer, &size );
554     ok(ret == ERROR_SUCCESS, "PdhLookupPerfNameByIndexW failed 0x%08x\n", ret);
555
556     size = 0;
557     ret = PdhLookupPerfNameByIndexW( NULL, 6, buffer, &size );
558     ok(ret == PDH_MORE_DATA, "PdhLookupPerfNameByIndexW failed 0x%08x\n", ret);
559     ok(size == sizeof(processor_time) / sizeof(WCHAR), "PdhLookupPerfNameByIndexW failed %d\n", size);
560
561     size = sizeof(buffer) / sizeof(WCHAR);
562     ret = PdhLookupPerfNameByIndexW( NULL, 6, buffer, &size );
563     ok(ret == ERROR_SUCCESS, "PdhLookupPerfNameByIndexW failed 0x%08x\n", ret);
564     ok(size == sizeof(processor_time) / sizeof(WCHAR), "PdhLookupPerfNameByIndexW failed %d\n", size);
565
566     size = 0;
567     ret = PdhLookupPerfNameByIndexW( NULL, 674, NULL, &size );
568     ok(ret == PDH_MORE_DATA, "PdhLookupPerfNameByIndexW failed 0x%08x\n", ret);
569     ok(size == sizeof(uptime) / sizeof(WCHAR), "PdhLookupPerfNameByIndexW failed %d\n", size);
570
571     size = sizeof(buffer) / sizeof(WCHAR);
572     ret = PdhLookupPerfNameByIndexW( NULL, 674, buffer, &size );
573     ok(ret == ERROR_SUCCESS, "PdhLookupPerfNameByIndexW failed 0x%08x\n", ret);
574     ok(size == sizeof(uptime) / sizeof(WCHAR), "PdhLookupPerfNameByIndexW failed %d\n", size);
575 }
576
577 START_TEST(pdh)
578 {
579     test_PdhOpenQueryA();
580     test_PdhOpenQueryW();
581
582     test_PdhAddCounterA();
583     test_PdhAddCounterW();
584
585     test_PdhGetFormattedCounterValue();
586     test_PdhGetRawCounterValue();
587     test_PdhSetCounterScaleFactor();
588     test_PdhGetCounterTimeBase();
589
590     test_PdhGetCounterInfoA();
591     test_PdhGetCounterInfoW();
592
593     test_PdhLookupPerfIndexByNameA();
594     test_PdhLookupPerfIndexByNameW();
595
596     test_PdhLookupPerfNameByIndexA();
597     test_PdhLookupPerfNameByIndexW();
598 }