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 HMODULE pdh; 31 32 static PDH_STATUS (WINAPI *pPdhAddEnglishCounterA)(PDH_HQUERY, LPCSTR, DWORD_PTR, PDH_HCOUNTER *); 33 static PDH_STATUS (WINAPI *pPdhAddEnglishCounterW)(PDH_HQUERY, LPCWSTR, DWORD_PTR, PDH_HCOUNTER *); 34 static PDH_STATUS (WINAPI *pPdhCollectQueryDataWithTime)(PDH_HQUERY, LONGLONG *); 35 static PDH_STATUS (WINAPI *pPdhValidatePathExA)(PDH_HLOG, LPCSTR); 36 static PDH_STATUS (WINAPI *pPdhValidatePathExW)(PDH_HLOG, LPCWSTR); 37 38 #define GETFUNCPTR(func) p##func = (void *)GetProcAddress( pdh, #func ); 39 40 41 /* Returns true if the user interface is in English. Note that this does not 42 * presume of the formatting of dates, numbers, etc. 43 */ 44 static BOOL is_lang_english(void) 45 { 46 static HMODULE hkernel32 = NULL; 47 static LANGID (WINAPI *pGetThreadUILanguage)(void) = NULL; 48 static LANGID (WINAPI *pGetUserDefaultUILanguage)(void) = NULL; 49 50 if (!hkernel32) 51 { 52 hkernel32 = GetModuleHandleA("kernel32.dll"); 53 pGetThreadUILanguage = (void*)GetProcAddress(hkernel32, "GetThreadUILanguage"); 54 pGetUserDefaultUILanguage = (void*)GetProcAddress(hkernel32, "GetUserDefaultUILanguage"); 55 } 56 if (pGetThreadUILanguage) 57 return PRIMARYLANGID(pGetThreadUILanguage()) == LANG_ENGLISH; 58 if (pGetUserDefaultUILanguage) 59 return PRIMARYLANGID(pGetUserDefaultUILanguage()) == LANG_ENGLISH; 60 61 return PRIMARYLANGID(GetUserDefaultLangID()) == LANG_ENGLISH; 62 } 63 64 static void init_function_ptrs( void ) 65 { 66 pdh = GetModuleHandleA( "pdh" ); 67 GETFUNCPTR( PdhAddEnglishCounterA ) 68 GETFUNCPTR( PdhAddEnglishCounterW ) 69 GETFUNCPTR( PdhCollectQueryDataWithTime ) 70 GETFUNCPTR( PdhValidatePathExA ) 71 GETFUNCPTR( PdhValidatePathExW ) 72 } 73 74 static const WCHAR processor_time[] = 75 {'%',' ','P','r','o','c','e','s','s','o','r',' ','T','i','m','e',0}; 76 static const WCHAR uptime[] = 77 {'S','y','s','t','e','m',' ','U','p',' ','T','i','m','e',0}; 78 79 static const WCHAR system_uptime[] = 80 {'\\','S','y','s','t','e','m','\\','S','y','s','t','e','m',' ','U','p',' ','T','i','m','e',0}; 81 static const WCHAR nonexistent_counter[] = 82 {'\\','S','y','s','t','e','m','\\','S','y','s','t','e','m',' ','D','o','w','n',' ','T','i','m','e',0}; 83 static const WCHAR percentage_processor_time[] = 84 {'\\','P','r','o','c','e','s','s','o','r','(','_','T','o','t','a','l',')', 85 '\\','%',' ','P','r','o','c','e','s','s','o','r',' ','T','i','m','e',0}; 86 87 static void test_PdhOpenQueryA( void ) 88 { 89 PDH_STATUS ret; 90 PDH_HQUERY query; 91 92 ret = PdhOpenQueryA( NULL, 0, NULL ); 93 ok(ret == PDH_INVALID_ARGUMENT, "PdhOpenQueryA failed 0x%08x\n", ret); 94 95 ret = PdhOpenQueryA( NULL, 0, &query ); 96 ok(ret == ERROR_SUCCESS, "PdhOpenQueryA failed 0x%08x\n", ret); 97 98 ret = PdhCloseQuery( NULL ); 99 ok(ret == PDH_INVALID_HANDLE, "PdhCloseQuery failed 0x%08x\n", ret); 100 101 ret = PdhCloseQuery( &query ); 102 ok(ret == PDH_INVALID_HANDLE, "PdhCloseQuery failed 0x%08x\n", ret); 103 104 ret = PdhCloseQuery( query ); 105 ok(ret == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", ret); 106 107 ret = PdhCloseQuery( query ); 108 ok(ret == PDH_INVALID_HANDLE, "PdhCloseQuery failed 0x%08x\n", ret); 109 } 110 111 static void test_PdhOpenQueryW( void ) 112 { 113 PDH_STATUS ret; 114 PDH_HQUERY query; 115 116 ret = PdhOpenQueryW( NULL, 0, NULL ); 117 ok(ret == PDH_INVALID_ARGUMENT, "PdhOpenQueryW failed 0x%08x\n", ret); 118 119 ret = PdhOpenQueryW( NULL, 0, &query ); 120 ok(ret == ERROR_SUCCESS, "PdhOpenQueryW failed 0x%08x\n", ret); 121 122 ret = PdhCloseQuery( NULL ); 123 ok(ret == PDH_INVALID_HANDLE, "PdhCloseQuery failed 0x%08x\n", ret); 124 125 ret = PdhCloseQuery( &query ); 126 ok(ret == PDH_INVALID_HANDLE, "PdhCloseQuery failed 0x%08x\n", ret); 127 128 ret = PdhCloseQuery( query ); 129 ok(ret == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", ret); 130 131 ret = PdhCloseQuery( query ); 132 ok(ret == PDH_INVALID_HANDLE, "PdhCloseQuery failed 0x%08x\n", ret); 133 } 134 135 static void test_PdhAddCounterA( void ) 136 { 137 PDH_STATUS ret; 138 PDH_HQUERY query; 139 PDH_HCOUNTER counter; 140 141 ret = PdhOpenQueryA( NULL, 0, &query ); 142 ok(ret == ERROR_SUCCESS, "PdhOpenQueryA failed 0x%08x\n", ret); 143 144 ret = PdhAddCounterA( NULL, "\\System\\System Up Time", 0, NULL ); 145 ok(ret == PDH_INVALID_ARGUMENT, "PdhAddCounterA failed 0x%08x\n", ret); 146 147 ret = PdhAddCounterA( NULL, "\\System\\System Up Time", 0, &counter ); 148 ok(ret == PDH_INVALID_HANDLE, "PdhAddCounterA failed 0x%08x\n", ret); 149 150 ret = PdhAddCounterA( query, NULL, 0, &counter ); 151 ok(ret == PDH_INVALID_ARGUMENT, "PdhAddCounterA failed 0x%08x\n", ret); 152 153 ret = PdhAddCounterA( query, "\\System\\System Up Time", 0, NULL ); 154 ok(ret == PDH_INVALID_ARGUMENT, "PdhAddCounterA failed 0x%08x\n", ret); 155 156 ret = PdhAddCounterA( query, "\\System\\Nonexistent Counter", 0, &counter ); 157 ok(ret == PDH_CSTATUS_NO_COUNTER || 158 broken(ret == PDH_INVALID_PATH), /* Win2K */ 159 "PdhAddCounterA failed 0x%08x\n", ret); 160 ok(!counter, "PdhAddCounterA failed %p\n", counter); 161 162 ret = PdhAddCounterA( query, "\\System\\System Up Time", 0, &counter ); 163 ok(ret == ERROR_SUCCESS, "PdhAddCounterA failed 0x%08x\n", ret); 164 165 ret = PdhCollectQueryData( NULL ); 166 ok(ret == PDH_INVALID_HANDLE, "PdhCollectQueryData failed 0x%08x\n", ret); 167 168 ret = PdhCollectQueryData( counter ); 169 ok(ret == PDH_INVALID_HANDLE, "PdhCollectQueryData failed 0x%08x\n", ret); 170 171 ret = PdhCollectQueryData( query ); 172 ok(ret == ERROR_SUCCESS, "PdhCollectQueryData failed 0x%08x\n", ret); 173 174 ret = PdhRemoveCounter( NULL ); 175 ok(ret == PDH_INVALID_HANDLE, "PdhRemoveCounter failed 0x%08x\n", ret); 176 177 ret = PdhRemoveCounter( counter ); 178 ok(ret == ERROR_SUCCESS, "PdhRemoveCounter failed 0x%08x\n", ret); 179 180 ret = PdhCloseQuery( query ); 181 ok(ret == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", ret); 182 } 183 184 static void test_PdhAddCounterW( void ) 185 { 186 PDH_STATUS ret; 187 PDH_HQUERY query; 188 PDH_HCOUNTER counter; 189 190 ret = PdhOpenQueryW( NULL, 0, &query ); 191 ok(ret == ERROR_SUCCESS, "PdhOpenQueryW failed 0x%08x\n", ret); 192 193 ret = PdhAddCounterW( NULL, percentage_processor_time, 0, NULL ); 194 ok(ret == PDH_INVALID_ARGUMENT, "PdhAddCounterW failed 0x%08x\n", ret); 195 196 ret = PdhAddCounterW( NULL, percentage_processor_time, 0, &counter ); 197 ok(ret == PDH_INVALID_HANDLE, "PdhAddCounterW failed 0x%08x\n", ret); 198 199 ret = PdhAddCounterW( query, NULL, 0, &counter ); 200 ok(ret == PDH_INVALID_ARGUMENT, "PdhAddCounterW failed 0x%08x\n", ret); 201 202 ret = PdhAddCounterW( query, percentage_processor_time, 0, NULL ); 203 ok(ret == PDH_INVALID_ARGUMENT, "PdhAddCounterW failed 0x%08x\n", ret); 204 205 ret = PdhAddCounterW( query, nonexistent_counter, 0, &counter ); 206 ok(ret == PDH_CSTATUS_NO_COUNTER || 207 broken(ret == PDH_INVALID_PATH), /* Win2K */ 208 "PdhAddCounterW failed 0x%08x\n", ret); 209 ok(!counter, "PdhAddCounterW failed %p\n", counter); 210 211 ret = PdhAddCounterW( query, percentage_processor_time, 0, &counter ); 212 ok(ret == ERROR_SUCCESS, "PdhAddCounterW failed 0x%08x\n", ret); 213 214 ret = PdhCollectQueryData( NULL ); 215 ok(ret == PDH_INVALID_HANDLE, "PdhCollectQueryData failed 0x%08x\n", ret); 216 217 ret = PdhCollectQueryData( counter ); 218 ok(ret == PDH_INVALID_HANDLE, "PdhCollectQueryData failed 0x%08x\n", ret); 219 220 ret = PdhCollectQueryData( query ); 221 ok(ret == ERROR_SUCCESS, "PdhCollectQueryData failed 0x%08x\n", ret); 222 223 ret = PdhRemoveCounter( NULL ); 224 ok(ret == PDH_INVALID_HANDLE, "PdhRemoveCounter failed 0x%08x\n", ret); 225 226 ret = PdhRemoveCounter( counter ); 227 ok(ret == ERROR_SUCCESS, "PdhRemoveCounter failed 0x%08x\n", ret); 228 229 ret = PdhCloseQuery( query ); 230 ok(ret == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", ret); 231 } 232 233 static void test_PdhAddEnglishCounterA( void ) 234 { 235 PDH_STATUS ret; 236 PDH_HQUERY query; 237 PDH_HCOUNTER counter; 238 239 ret = PdhOpenQueryA( NULL, 0, &query ); 240 ok(ret == ERROR_SUCCESS, "PdhOpenQueryA failed 0x%08x\n", ret); 241 242 ret = PdhCollectQueryData( query ); 243 ok(ret == PDH_NO_DATA, "PdhCollectQueryData failed 0x%08x\n", ret); 244 245 ret = pPdhAddEnglishCounterA( NULL, "\\System\\System Up Time", 0, NULL ); 246 ok(ret == PDH_INVALID_ARGUMENT, "PdhAddEnglishCounterA failed 0x%08x\n", ret); 247 248 ret = pPdhAddEnglishCounterA( NULL, "\\System\\System Up Time", 0, &counter ); 249 ok(ret == PDH_INVALID_ARGUMENT, "PdhAddEnglishCounterA failed 0x%08x\n", ret); 250 251 ret = pPdhAddEnglishCounterA( query, NULL, 0, &counter ); 252 ok(ret == PDH_INVALID_ARGUMENT, "PdhAddEnglishCounterA failed 0x%08x\n", ret); 253 254 ret = pPdhAddEnglishCounterA( query, "\\System\\System Up Time", 0, NULL ); 255 ok(ret == PDH_INVALID_ARGUMENT, "PdhAddEnglishCounterA failed 0x%08x\n", ret); 256 257 ret = pPdhAddEnglishCounterA( query, "\\System\\System Down Time", 0, &counter ); 258 ok(ret == PDH_CSTATUS_NO_COUNTER, "PdhAddEnglishCounterA failed 0x%08x\n", ret); 259 ok(!counter, "PdhAddEnglishCounterA failed %p\n", counter); 260 261 ret = pPdhAddEnglishCounterA( query, "\\System\\System Up Time", 0, &counter ); 262 ok(ret == ERROR_SUCCESS, "PdhAddEnglishCounterA failed 0x%08x\n", ret); 263 264 ret = PdhCollectQueryData( query ); 265 ok(ret == ERROR_SUCCESS, "PdhCollectQueryData failed 0x%08x\n", ret); 266 267 ret = PdhRemoveCounter( counter ); 268 ok(ret == ERROR_SUCCESS, "PdhRemoveCounter failed 0x%08x\n", ret); 269 270 ret = PdhCloseQuery( query ); 271 ok(ret == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", ret); 272 } 273 274 static void test_PdhAddEnglishCounterW( void ) 275 { 276 PDH_STATUS ret; 277 PDH_HQUERY query; 278 PDH_HCOUNTER counter; 279 280 ret = PdhOpenQueryW( NULL, 0, &query ); 281 ok(ret == ERROR_SUCCESS, "PdhOpenQueryW failed 0x%08x\n", ret); 282 283 ret = PdhCollectQueryData( query ); 284 ok(ret == PDH_NO_DATA, "PdhCollectQueryData failed 0x%08x\n", ret); 285 286 ret = pPdhAddEnglishCounterW( NULL, system_uptime, 0, NULL ); 287 ok(ret == PDH_INVALID_ARGUMENT, "PdhAddEnglishCounterW failed 0x%08x\n", ret); 288 289 ret = pPdhAddEnglishCounterW( NULL, system_uptime, 0, &counter ); 290 ok(ret == PDH_INVALID_ARGUMENT, "PdhAddEnglishCounterW failed 0x%08x\n", ret); 291 292 ret = pPdhAddEnglishCounterW( query, NULL, 0, &counter ); 293 ok(ret == PDH_INVALID_ARGUMENT, "PdhAddEnglishCounterW failed 0x%08x\n", ret); 294 295 ret = pPdhAddEnglishCounterW( query, system_uptime, 0, NULL ); 296 ok(ret == PDH_INVALID_ARGUMENT, "PdhAddEnglishCounterW failed 0x%08x\n", ret); 297 298 ret = pPdhAddEnglishCounterW( query, nonexistent_counter, 0, &counter ); 299 ok(ret == PDH_CSTATUS_NO_COUNTER, "PdhAddEnglishCounterW failed 0x%08x\n", ret); 300 ok(!counter, "PdhAddEnglishCounterA failed %p\n", counter); 301 302 ret = pPdhAddEnglishCounterW( query, system_uptime, 0, &counter ); 303 ok(ret == ERROR_SUCCESS, "PdhAddEnglishCounterW failed 0x%08x\n", ret); 304 305 ret = PdhCollectQueryData( query ); 306 ok(ret == ERROR_SUCCESS, "PdhCollectQueryData failed 0x%08x\n", ret); 307 308 ret = PdhRemoveCounter( counter ); 309 ok(ret == ERROR_SUCCESS, "PdhRemoveCounter failed 0x%08x\n", ret); 310 311 ret = PdhCloseQuery( query ); 312 ok(ret == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", ret); 313 } 314 315 static void test_PdhCollectQueryDataWithTime( void ) 316 { 317 PDH_STATUS ret; 318 PDH_HQUERY query; 319 PDH_HCOUNTER counter; 320 LONGLONG time; 321 322 ret = PdhOpenQueryA( NULL, 0, &query ); 323 ok(ret == ERROR_SUCCESS, "PdhOpenQueryA failed 0x%08x\n", ret); 324 325 ret = PdhCollectQueryData( query ); 326 ok(ret == PDH_NO_DATA, "PdhCollectQueryData failed 0x%08x\n", ret); 327 328 ret = PdhAddCounterA( query, "\\System\\System Up Time", 0, &counter ); 329 ok(ret == ERROR_SUCCESS, "PdhAddCounterA failed 0x%08x\n", ret); 330 331 ret = pPdhCollectQueryDataWithTime( NULL, NULL ); 332 ok(ret == PDH_INVALID_ARGUMENT, "PdhCollectQueryDataWithTime failed 0x%08x\n", ret); 333 334 ret = pPdhCollectQueryDataWithTime( query, NULL ); 335 ok(ret == PDH_INVALID_ARGUMENT, "PdhCollectQueryDataWithTime failed 0x%08x\n", ret); 336 337 ret = pPdhCollectQueryDataWithTime( NULL, &time ); 338 ok(ret == PDH_INVALID_HANDLE, "PdhCollectQueryDataWithTime failed 0x%08x\n", ret); 339 340 ret = pPdhCollectQueryDataWithTime( query, &time ); 341 ok(ret == ERROR_SUCCESS, "PdhCollectQueryDataWithTime failed 0x%08x\n", ret); 342 343 ret = PdhCloseQuery( query ); 344 ok(ret == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", ret); 345 } 346 347 static void test_PdhGetFormattedCounterValue( void ) 348 { 349 PDH_STATUS ret; 350 PDH_HQUERY query; 351 PDH_HCOUNTER counter; 352 PDH_FMT_COUNTERVALUE value; 353 354 ret = PdhOpenQueryA( NULL, 0, &query ); 355 ok(ret == ERROR_SUCCESS, "PdhOpenQueryA failed 0x%08x\n", ret); 356 357 ret = PdhAddCounterA( query, "\\System\\System Up Time", 0, &counter ); 358 ok(ret == ERROR_SUCCESS, "PdhAddCounterA failed 0x%08x\n", ret); 359 360 ret = PdhGetFormattedCounterValue( NULL, PDH_FMT_LARGE, NULL, NULL ); 361 ok(ret == PDH_INVALID_ARGUMENT, "PdhGetFormattedCounterValue failed 0x%08x\n", ret); 362 363 ret = PdhGetFormattedCounterValue( NULL, PDH_FMT_LARGE, NULL, &value ); 364 ok(ret == PDH_INVALID_HANDLE, "PdhGetFormattedCounterValue failed 0x%08x\n", ret); 365 366 ret = PdhGetFormattedCounterValue( counter, PDH_FMT_LARGE, NULL, NULL ); 367 ok(ret == PDH_INVALID_ARGUMENT, "PdhGetFormattedCounterValue failed 0x%08x\n", ret); 368 369 ret = PdhGetFormattedCounterValue( counter, PDH_FMT_LARGE, NULL, &value ); 370 ok(ret == ERROR_SUCCESS, "PdhGetFormattedCounterValue failed 0x%08x\n", ret); 371 372 ret = PdhCollectQueryData( query ); 373 ok(ret == ERROR_SUCCESS, "PdhCollectQueryData failed 0x%08x\n", ret); 374 375 ret = PdhGetFormattedCounterValue( counter, PDH_FMT_LARGE, NULL, &value ); 376 ok(ret == ERROR_SUCCESS, "PdhGetFormattedCounterValue failed 0x%08x\n", ret); 377 378 ret = PdhGetFormattedCounterValue( counter, PDH_FMT_LARGE | PDH_FMT_NOSCALE, NULL, &value ); 379 ok(ret == ERROR_SUCCESS, "PdhGetFormattedCounterValue failed 0x%08x\n", ret); 380 381 ret = PdhGetFormattedCounterValue( counter, PDH_FMT_LARGE | PDH_FMT_NOCAP100, NULL, &value ); 382 ok(ret == ERROR_SUCCESS, "PdhGetFormattedCounterValue failed 0x%08x\n", ret); 383 384 ret = PdhGetFormattedCounterValue( counter, PDH_FMT_LARGE | PDH_FMT_1000, NULL, &value ); 385 ok(ret == ERROR_SUCCESS, "PdhGetFormattedCounterValue failed 0x%08x\n", ret); 386 387 ret = PdhSetCounterScaleFactor( counter, 2 ); 388 ok(ret == ERROR_SUCCESS, "PdhSetCounterScaleFactor failed 0x%08x\n", ret); 389 390 ret = PdhGetFormattedCounterValue( counter, PDH_FMT_LARGE, NULL, &value ); 391 ok(ret == ERROR_SUCCESS, "PdhGetFormattedCounterValue failed 0x%08x\n", ret); 392 393 ret = PdhCloseQuery( query ); 394 ok(ret == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", ret); 395 } 396 397 static void test_PdhGetRawCounterValue( void ) 398 { 399 PDH_STATUS ret; 400 PDH_HQUERY query; 401 PDH_HCOUNTER counter; 402 PDH_RAW_COUNTER value; 403 404 ret = PdhOpenQueryA( NULL, 0, &query ); 405 ok(ret == ERROR_SUCCESS, "PdhOpenQueryA failed 0x%08x\n", ret); 406 407 ret = PdhAddCounterA( query, "\\System\\System Up Time", 0, &counter ); 408 ok(ret == ERROR_SUCCESS, "PdhAddCounterA failed 0x%08x\n", ret); 409 410 ret = PdhGetRawCounterValue( NULL, NULL, &value ); 411 ok(ret == PDH_INVALID_HANDLE, "PdhGetRawCounterValue failed 0x%08x\n", ret); 412 413 ret = PdhGetRawCounterValue( counter, NULL, NULL ); 414 ok(ret == PDH_INVALID_ARGUMENT, "PdhGetRawCounterValue failed 0x%08x\n", ret); 415 416 ret = PdhGetRawCounterValue( counter, NULL, &value ); 417 ok(ret == ERROR_SUCCESS, "PdhGetRawCounterValue failed 0x%08x\n", ret); 418 ok(value.CStatus == ERROR_SUCCESS, "expected ERROR_SUCCESS got %x\n", value.CStatus); 419 420 ret = PdhCollectQueryData( query ); 421 ok(ret == ERROR_SUCCESS, "PdhCollectQueryData failed 0x%08x\n", ret); 422 423 ret = PdhGetRawCounterValue( counter, NULL, &value ); 424 ok(ret == ERROR_SUCCESS, "PdhGetRawCounterValue failed 0x%08x\n", ret); 425 ok(value.CStatus == ERROR_SUCCESS, "expected ERROR_SUCCESS got %x\n", value.CStatus); 426 427 ret = PdhCloseQuery( query ); 428 ok(ret == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", ret); 429 } 430 431 static void test_PdhSetCounterScaleFactor( void ) 432 { 433 PDH_STATUS ret; 434 PDH_HQUERY query; 435 PDH_HCOUNTER counter; 436 437 ret = PdhOpenQueryA( NULL, 0, &query ); 438 ok(ret == ERROR_SUCCESS, "PdhOpenQueryA failed 0x%08x\n", ret); 439 440 ret = PdhAddCounterA( query, "\\System\\System Up Time", 0, &counter ); 441 ok(ret == ERROR_SUCCESS, "PdhAddCounterA failed 0x%08x\n", ret); 442 443 ret = PdhSetCounterScaleFactor( NULL, 8 ); 444 ok(ret == PDH_INVALID_HANDLE, "PdhSetCounterScaleFactor failed 0x%08x\n", ret); 445 446 ret = PdhSetCounterScaleFactor( NULL, 1 ); 447 ok(ret == PDH_INVALID_HANDLE, "PdhSetCounterScaleFactor failed 0x%08x\n", ret); 448 449 ret = PdhSetCounterScaleFactor( counter, 8 ); 450 ok(ret == PDH_INVALID_ARGUMENT, "PdhSetCounterScaleFactor failed 0x%08x\n", ret); 451 452 ret = PdhSetCounterScaleFactor( counter, -8 ); 453 ok(ret == PDH_INVALID_ARGUMENT, "PdhSetCounterScaleFactor failed 0x%08x\n", ret); 454 455 ret = PdhSetCounterScaleFactor( counter, 7 ); 456 ok(ret == ERROR_SUCCESS, "PdhSetCounterScaleFactor failed 0x%08x\n", ret); 457 458 ret = PdhSetCounterScaleFactor( counter, 0 ); 459 ok(ret == ERROR_SUCCESS, "PdhSetCounterScaleFactor failed 0x%08x\n", ret); 460 461 ret = PdhCloseQuery( query ); 462 ok(ret == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", ret); 463 } 464 465 static void test_PdhGetCounterTimeBase( void ) 466 { 467 PDH_STATUS ret; 468 PDH_HQUERY query; 469 PDH_HCOUNTER counter; 470 LONGLONG base; 471 472 ret = PdhOpenQueryA( NULL, 0, &query ); 473 ok(ret == ERROR_SUCCESS, "PdhOpenQueryA failed 0x%08x\n", ret); 474 475 ret = PdhAddCounterA( query, "\\System\\System Up Time", 0, &counter ); 476 ok(ret == ERROR_SUCCESS, "PdhAddCounterA failed 0x%08x\n", ret); 477 478 ret = PdhGetCounterTimeBase( NULL, NULL ); 479 ok(ret == PDH_INVALID_ARGUMENT, "PdhGetCounterTimeBase failed 0x%08x\n", ret); 480 481 ret = PdhGetCounterTimeBase( NULL, &base ); 482 ok(ret == PDH_INVALID_HANDLE, "PdhGetCounterTimeBase failed 0x%08x\n", ret); 483 484 ret = PdhGetCounterTimeBase( counter, NULL ); 485 ok(ret == PDH_INVALID_ARGUMENT, "PdhGetCounterTimeBase failed 0x%08x\n", ret); 486 487 ret = PdhGetCounterTimeBase( counter, &base ); 488 ok(ret == ERROR_SUCCESS, "PdhGetCounterTimeBase failed 0x%08x\n", ret); 489 490 ret = PdhCloseQuery( query ); 491 ok(ret == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", ret); 492 } 493 494 static void test_PdhGetCounterInfoA( void ) 495 { 496 PDH_STATUS ret; 497 PDH_HQUERY query; 498 PDH_HCOUNTER counter; 499 PDH_COUNTER_INFO_A info; 500 DWORD size; 501 502 ret = PdhOpenQueryA( NULL, 0, &query ); 503 ok(ret == ERROR_SUCCESS, "PdhOpenQueryA failed 0x%08x\n", ret); 504 505 ret = PdhAddCounterA( query, "\\System\\System Up Time", 0, &counter ); 506 ok(ret == ERROR_SUCCESS, "PdhAddCounterA failed 0x%08x\n", ret); 507 508 ret = PdhGetCounterInfoA( NULL, 0, NULL, NULL ); 509 ok(ret == PDH_INVALID_HANDLE || ret == PDH_INVALID_ARGUMENT, "PdhGetCounterInfoA failed 0x%08x\n", ret); 510 511 ret = PdhGetCounterInfoA( counter, 0, NULL, NULL ); 512 ok(ret == PDH_INVALID_ARGUMENT, "PdhGetCounterInfoA failed 0x%08x\n", ret); 513 514 ret = PdhGetCounterInfoA( counter, 0, NULL, &info ); 515 ok(ret == PDH_INVALID_ARGUMENT, "PdhGetCounterInfoA failed 0x%08x\n", ret); 516 517 size = sizeof(info) - 1; 518 ret = PdhGetCounterInfoA( counter, 0, &size, NULL ); 519 ok(ret == PDH_MORE_DATA || ret == PDH_INVALID_ARGUMENT, "PdhGetCounterInfoA failed 0x%08x\n", ret); 520 521 size = sizeof(info); 522 ret = PdhGetCounterInfoA( counter, 0, &size, &info ); 523 ok(ret == ERROR_SUCCESS, "PdhGetCounterInfoA failed 0x%08x\n", ret); 524 ok(size == sizeof(info), "PdhGetCounterInfoA failed %d\n", size); 525 526 ret = PdhGetCounterInfoA( counter, 0, &size, &info ); 527 ok(ret == ERROR_SUCCESS, "PdhGetCounterInfoA failed 0x%08x\n", ret); 528 ok(info.lScale == 0, "lScale %d\n", info.lScale); 529 530 ret = PdhSetCounterScaleFactor( counter, 0 ); 531 ok(ret == ERROR_SUCCESS, "PdhSetCounterScaleFactor failed 0x%08x\n", ret); 532 533 ret = PdhGetCounterInfoA( counter, 0, &size, &info ); 534 ok(ret == ERROR_SUCCESS, "PdhGetCounterInfoA failed 0x%08x\n", ret); 535 ok(info.lScale == 0, "lScale %d\n", info.lScale); 536 537 ret = PdhSetCounterScaleFactor( counter, -5 ); 538 ok(ret == ERROR_SUCCESS, "PdhSetCounterScaleFactor failed 0x%08x\n", ret); 539 540 ret = PdhGetCounterInfoA( counter, 0, &size, &info ); 541 ok(ret == ERROR_SUCCESS, "PdhGetCounterInfoA failed 0x%08x\n", ret); 542 ok(info.lScale == -5, "lScale %d\n", info.lScale); 543 544 ret = PdhCloseQuery( query ); 545 ok(ret == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", ret); 546 } 547 548 static void test_PdhGetCounterInfoW( void ) 549 { 550 PDH_STATUS ret; 551 PDH_HQUERY query; 552 PDH_HCOUNTER counter; 553 PDH_COUNTER_INFO_W info; 554 DWORD size; 555 556 ret = PdhOpenQueryW( NULL, 0, &query ); 557 ok(ret == ERROR_SUCCESS, "PdhOpenQueryW failed 0x%08x\n", ret); 558 559 ret = PdhAddCounterW( query, percentage_processor_time, 0, &counter ); 560 ok(ret == ERROR_SUCCESS, "PdhAddCounterW failed 0x%08x\n", ret); 561 562 ret = PdhGetCounterInfoW( NULL, 0, NULL, NULL ); 563 ok(ret == PDH_INVALID_HANDLE || ret == PDH_INVALID_ARGUMENT, "PdhGetCounterInfoW failed 0x%08x\n", ret); 564 565 ret = PdhGetCounterInfoW( counter, 0, NULL, NULL ); 566 ok(ret == PDH_INVALID_ARGUMENT, "PdhGetCounterInfoW failed 0x%08x\n", ret); 567 568 ret = PdhGetCounterInfoW( counter, 0, NULL, &info ); 569 ok(ret == PDH_INVALID_ARGUMENT, "PdhGetCounterInfoW failed 0x%08x\n", ret); 570 571 size = sizeof(info) - 1; 572 ret = PdhGetCounterInfoW( counter, 0, &size, NULL ); 573 ok(ret == PDH_MORE_DATA || ret == PDH_INVALID_ARGUMENT, "PdhGetCounterInfoW failed 0x%08x\n", ret); 574 575 size = sizeof(info); 576 ret = PdhGetCounterInfoW( counter, 0, &size, &info ); 577 ok(ret == ERROR_SUCCESS, "PdhGetCounterInfoW failed 0x%08x\n", ret); 578 ok(size == sizeof(info), "PdhGetCounterInfoW failed %d\n", size); 579 580 ret = PdhGetCounterInfoW( counter, 0, &size, &info ); 581 ok(ret == ERROR_SUCCESS, "PdhGetCounterInfoW failed 0x%08x\n", ret); 582 ok(info.lScale == 0, "lScale %d\n", info.lScale); 583 584 ret = PdhSetCounterScaleFactor( counter, 0 ); 585 ok(ret == ERROR_SUCCESS, "PdhSetCounterScaleFactor failed 0x%08x\n", ret); 586 587 ret = PdhGetCounterInfoW( counter, 0, &size, &info ); 588 ok(ret == ERROR_SUCCESS, "PdhGetCounterInfoW failed 0x%08x\n", ret); 589 ok(info.lScale == 0, "lScale %d\n", info.lScale); 590 591 ret = PdhSetCounterScaleFactor( counter, -5 ); 592 ok(ret == ERROR_SUCCESS, "PdhSetCounterScaleFactor failed 0x%08x\n", ret); 593 594 ret = PdhGetCounterInfoW( counter, 0, &size, &info ); 595 ok(ret == ERROR_SUCCESS, "PdhGetCounterInfoW failed 0x%08x\n", ret); 596 ok(info.lScale == -5, "lScale %d\n", info.lScale); 597 598 ret = PdhCloseQuery( query ); 599 ok(ret == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", ret); 600 } 601 602 static void test_PdhLookupPerfIndexByNameA( void ) 603 { 604 PDH_STATUS ret; 605 DWORD index; 606 607 ret = PdhLookupPerfIndexByNameA( NULL, NULL, NULL ); 608 ok(ret == PDH_INVALID_ARGUMENT, "PdhLookupPerfIndexByNameA failed 0x%08x\n", ret); 609 610 ret = PdhLookupPerfIndexByNameA( NULL, NULL, &index ); 611 ok(ret == PDH_INVALID_ARGUMENT, "PdhLookupPerfIndexByNameA failed 0x%08x\n", ret); 612 613 ret = PdhLookupPerfIndexByNameA( NULL, "No Counter", &index ); 614 ok(ret == PDH_STRING_NOT_FOUND, "PdhLookupPerfIndexByNameA failed 0x%08x\n", ret); 615 616 ret = PdhLookupPerfIndexByNameA( NULL, "% Processor Time", NULL ); 617 ok(ret == PDH_INVALID_ARGUMENT, "PdhLookupPerfIndexByNameA failed 0x%08x\n", ret); 618 619 ret = PdhLookupPerfIndexByNameA( NULL, "% Processor Time", &index ); 620 ok(ret == ERROR_SUCCESS, "PdhLookupPerfIndexByNameA failed 0x%08x\n", ret); 621 ok(index == 6, "PdhLookupPerfIndexByNameA failed %d\n", index); 622 623 ret = PdhLookupPerfIndexByNameA( NULL, "System Up Time", &index ); 624 ok(ret == ERROR_SUCCESS, "PdhLookupPerfIndexByNameA failed 0x%08x\n", ret); 625 ok(index == 674, "PdhLookupPerfIndexByNameA failed %d\n", index); 626 } 627 628 static void test_PdhLookupPerfIndexByNameW( void ) 629 { 630 PDH_STATUS ret; 631 DWORD index; 632 633 static const WCHAR no_counter[] = {'N','o',' ','C','o','u','n','t','e','r',0}; 634 635 ret = PdhLookupPerfIndexByNameW( NULL, NULL, NULL ); 636 ok(ret == PDH_INVALID_ARGUMENT, "PdhLookupPerfIndexByNameW failed 0x%08x\n", ret); 637 638 ret = PdhLookupPerfIndexByNameW( NULL, NULL, &index ); 639 ok(ret == PDH_INVALID_ARGUMENT, "PdhLookupPerfIndexByNameW failed 0x%08x\n", ret); 640 641 ret = PdhLookupPerfIndexByNameW( NULL, no_counter, &index ); 642 ok(ret == PDH_STRING_NOT_FOUND, "PdhLookupPerfIndexByNameW failed 0x%08x\n", ret); 643 644 ret = PdhLookupPerfIndexByNameW( NULL, processor_time, NULL ); 645 ok(ret == PDH_INVALID_ARGUMENT, "PdhLookupPerfIndexByNameW failed 0x%08x\n", ret); 646 647 ret = PdhLookupPerfIndexByNameW( NULL, processor_time, &index ); 648 ok(ret == ERROR_SUCCESS, "PdhLookupPerfIndexByNameW failed 0x%08x\n", ret); 649 ok(index == 6, "PdhLookupPerfIndexByNameW failed %d\n", index); 650 651 ret = PdhLookupPerfIndexByNameW( NULL, uptime, &index ); 652 ok(ret == ERROR_SUCCESS, "PdhLookupPerfIndexByNameW failed 0x%08x\n", ret); 653 ok(index == 674, "PdhLookupPerfIndexByNameW failed %d\n", index); 654 } 655 656 static void test_PdhLookupPerfNameByIndexA( void ) 657 { 658 PDH_STATUS ret; 659 char buffer[PDH_MAX_COUNTER_NAME] = "!!"; 660 DWORD size; 661 662 ret = PdhLookupPerfNameByIndexA( NULL, 0, NULL, NULL ); 663 ok(ret == PDH_INVALID_ARGUMENT, "PdhLookupPerfNameByIndexA failed 0x%08x\n", ret); 664 665 size = 0; 666 ret = PdhLookupPerfNameByIndexA( NULL, 6, buffer, &size ); 667 ok(ret == PDH_MORE_DATA || ret == PDH_INSUFFICIENT_BUFFER, "PdhLookupPerfNameByIndexA failed 0x%08x\n", ret); 668 669 size = sizeof(buffer); 670 ret = PdhLookupPerfNameByIndexA( NULL, 6, buffer, &size ); 671 ok(ret == ERROR_SUCCESS, "PdhLookupPerfNameByIndexA failed 0x%08x\n", ret); 672 ok(!lstrcmpA( buffer, "% Processor Time" ), 673 "PdhLookupPerfNameByIndexA failed, got %s expected \'%% Processor Time\'\n", buffer); 674 ok(size == sizeof("% Processor Time"), "PdhLookupPerfNameByIndexA failed %d\n", size); 675 676 size = sizeof(buffer); 677 ret = PdhLookupPerfNameByIndexA( NULL, 674, NULL, &size ); 678 ok(ret == PDH_INVALID_ARGUMENT || 679 ret == PDH_MORE_DATA, /* win2k3 */ 680 "PdhLookupPerfNameByIndexA failed 0x%08x\n", ret); 681 682 size = sizeof(buffer); 683 ret = PdhLookupPerfNameByIndexA( NULL, 674, buffer, &size ); 684 ok(ret == ERROR_SUCCESS, "PdhLookupPerfNameByIndexA failed 0x%08x\n", ret); 685 ok(!lstrcmpA( buffer, "System Up Time" ), 686 "PdhLookupPerfNameByIndexA failed, got %s expected \'System Up Time\'\n", buffer); 687 ok(size == sizeof("System Up Time"), "PdhLookupPerfNameByIndexA failed %d\n", size); 688 } 689 690 static void test_PdhLookupPerfNameByIndexW( void ) 691 { 692 PDH_STATUS ret; 693 WCHAR buffer[PDH_MAX_COUNTER_NAME]; 694 DWORD size; 695 696 ret = PdhLookupPerfNameByIndexW( NULL, 0, NULL, NULL ); 697 ok(ret == PDH_INVALID_ARGUMENT, "PdhLookupPerfNameByIndexW failed 0x%08x\n", ret); 698 699 size = 0; 700 ret = PdhLookupPerfNameByIndexW( NULL, 6, buffer, &size ); 701 ok(ret == PDH_MORE_DATA || ret == PDH_INSUFFICIENT_BUFFER, "PdhLookupPerfNameByIndexW failed 0x%08x\n", ret); 702 703 size = sizeof(buffer) / sizeof(WCHAR); 704 ret = PdhLookupPerfNameByIndexW( NULL, 6, buffer, &size ); 705 ok(ret == ERROR_SUCCESS, "PdhLookupPerfNameByIndexW failed 0x%08x\n", ret); 706 ok(size == sizeof(processor_time) / sizeof(WCHAR), "PdhLookupPerfNameByIndexW failed %d\n", size); 707 708 size = sizeof(buffer) / sizeof(WCHAR); 709 ret = PdhLookupPerfNameByIndexW( NULL, 674, NULL, &size ); 710 ok(ret == PDH_INVALID_ARGUMENT || 711 ret == PDH_MORE_DATA, /* win2k3 */ 712 "PdhLookupPerfNameByIndexW failed 0x%08x\n", ret); 713 714 size = sizeof(buffer) / sizeof(WCHAR); 715 ret = PdhLookupPerfNameByIndexW( NULL, 674, buffer, &size ); 716 ok(ret == ERROR_SUCCESS, "PdhLookupPerfNameByIndexW failed 0x%08x\n", ret); 717 ok(size == sizeof(uptime) / sizeof(WCHAR), "PdhLookupPerfNameByIndexW failed %d\n", size); 718 } 719 720 static void test_PdhValidatePathA( void ) 721 { 722 PDH_STATUS ret; 723 724 ret = PdhValidatePathA( NULL ); 725 ok(ret == PDH_INVALID_ARGUMENT, "PdhValidatePathA failed 0x%08x\n", ret); 726 727 ret = PdhValidatePathA( "" ); 728 ok(ret == PDH_INVALID_ARGUMENT, "PdhValidatePathA failed 0x%08x\n", ret); 729 730 ret = PdhValidatePathA( "\\System" ); 731 ok(ret == PDH_CSTATUS_BAD_COUNTERNAME, "PdhValidatePathA failed 0x%08x\n", ret); 732 733 ret = PdhValidatePathA( "System Up Time" ); 734 ok(ret == PDH_CSTATUS_BAD_COUNTERNAME, "PdhValidatePathA failed 0x%08x\n", ret); 735 736 ret = PdhValidatePathA( "\\System\\Nonexistent Counter" ); 737 ok(ret == PDH_CSTATUS_NO_COUNTER, "PdhValidatePathA failed 0x%08x\n", ret); 738 739 ret = PdhValidatePathA( "\\System\\System Up Time" ); 740 ok(ret == ERROR_SUCCESS, "PdhValidatePathA failed 0x%08x\n", ret); 741 } 742 743 static void test_PdhValidatePathW( void ) 744 { 745 PDH_STATUS ret; 746 747 static const WCHAR empty[] = {0}; 748 static const WCHAR system[] = {'\\','S','y','s','t','e','m',0}; 749 750 ret = PdhValidatePathW( NULL ); 751 ok(ret == PDH_INVALID_ARGUMENT, "PdhValidatePathW failed 0x%08x\n", ret); 752 753 ret = PdhValidatePathW( empty ); 754 ok(ret == PDH_INVALID_ARGUMENT, "PdhValidatePathW failed 0x%08x\n", ret); 755 756 ret = PdhValidatePathW( system ); 757 ok(ret == PDH_CSTATUS_BAD_COUNTERNAME, "PdhValidatePathW failed 0x%08x\n", ret); 758 759 ret = PdhValidatePathW( uptime ); 760 ok(ret == PDH_CSTATUS_BAD_COUNTERNAME, "PdhValidatePathW failed 0x%08x\n", ret); 761 762 ret = PdhValidatePathW( nonexistent_counter ); 763 ok(ret == PDH_CSTATUS_NO_COUNTER, "PdhValidatePathW failed 0x%08x\n", ret); 764 765 ret = PdhValidatePathW( system_uptime ); 766 ok(ret == ERROR_SUCCESS, "PdhValidatePathW failed 0x%08x\n", ret); 767 } 768 769 static void test_PdhValidatePathExA( void ) 770 { 771 PDH_STATUS ret; 772 773 ret = pPdhValidatePathExA( NULL, NULL ); 774 ok(ret == PDH_INVALID_ARGUMENT, "PdhValidatePathExA failed 0x%08x\n", ret); 775 776 ret = pPdhValidatePathExA( NULL, "" ); 777 ok(ret == PDH_INVALID_ARGUMENT, "PdhValidatePathExA failed 0x%08x\n", ret); 778 779 ret = pPdhValidatePathExA( NULL, "\\System" ); 780 ok(ret == PDH_CSTATUS_BAD_COUNTERNAME, "PdhValidatePathExA failed 0x%08x\n", ret); 781 782 ret = pPdhValidatePathExA( NULL, "System Up Time" ); 783 ok(ret == PDH_CSTATUS_BAD_COUNTERNAME, "PdhValidatePathExA failed 0x%08x\n", ret); 784 785 ret = pPdhValidatePathExA( NULL, "\\System\\System Down Time" ); 786 ok(ret == PDH_CSTATUS_NO_COUNTER, "PdhValidatePathExA failed 0x%08x\n", ret); 787 788 ret = pPdhValidatePathExA( NULL, "\\System\\System Up Time" ); 789 ok(ret == ERROR_SUCCESS, "PdhValidatePathExA failed 0x%08x\n", ret); 790 } 791 792 static void test_PdhValidatePathExW( void ) 793 { 794 PDH_STATUS ret; 795 796 static const WCHAR empty[] = {0}; 797 static const WCHAR system[] = {'\\','S','y','s','t','e','m',0}; 798 799 ret = pPdhValidatePathExW( NULL, NULL ); 800 ok(ret == PDH_INVALID_ARGUMENT, "PdhValidatePathExW failed 0x%08x\n", ret); 801 802 ret = pPdhValidatePathExW( NULL, empty ); 803 ok(ret == PDH_INVALID_ARGUMENT, "PdhValidatePathExW failed 0x%08x\n", ret); 804 805 ret = pPdhValidatePathExW( NULL, system ); 806 ok(ret == PDH_CSTATUS_BAD_COUNTERNAME, "PdhValidatePathExW failed 0x%08x\n", ret); 807 808 ret = pPdhValidatePathExW( NULL, uptime ); 809 ok(ret == PDH_CSTATUS_BAD_COUNTERNAME, "PdhValidatePathExW failed 0x%08x\n", ret); 810 811 ret = pPdhValidatePathExW( NULL, nonexistent_counter ); 812 ok(ret == PDH_CSTATUS_NO_COUNTER, "PdhValidatePathExW failed 0x%08x\n", ret); 813 814 ret = pPdhValidatePathExW( NULL, system_uptime ); 815 ok(ret == ERROR_SUCCESS, "PdhValidatePathExW failed 0x%08x\n", ret); 816 } 817 818 static void test_PdhCollectQueryDataEx(void) 819 { 820 PDH_STATUS status; 821 PDH_HQUERY query; 822 PDH_HCOUNTER counter; 823 HANDLE event; 824 BOOL ret; 825 UINT i; 826 827 status = PdhOpenQueryA( NULL, 0, &query ); 828 ok(status == ERROR_SUCCESS, "PdhOpenQuery failed 0x%08x\n", status); 829 830 event = CreateEventA( NULL, FALSE, FALSE, "winetest" ); 831 ok(event != NULL, "CreateEvent failed\n"); 832 833 status = PdhAddCounterA( query, "\\System\\System Up Time", 0, &counter ); 834 ok(status == ERROR_SUCCESS, "PdhAddCounterA failed 0x%08x\n", status); 835 836 status = PdhCollectQueryDataEx( NULL, 1, event ); 837 ok(status == PDH_INVALID_HANDLE, "PdhCollectQueryDataEx failed 0x%08x\n", status); 838 839 status = PdhCollectQueryDataEx( query, 1, NULL ); 840 ok(status == ERROR_SUCCESS, "PdhCollectQueryDataEx failed 0x%08x\n", status); 841 842 status = PdhCollectQueryDataEx( query, 1, event ); 843 ok(status == ERROR_SUCCESS, "PdhCollectQueryDataEx failed 0x%08x\n", status); 844 845 status = PdhCollectQueryData( query ); 846 ok(status == ERROR_SUCCESS, "PdhCollectQueryData failed 0x%08x\n", status); 847 848 for (i = 0; i < 3; i++) 849 { 850 if (WaitForSingleObject( event, INFINITE ) == WAIT_OBJECT_0) 851 { 852 PDH_FMT_COUNTERVALUE value; 853 854 status = PdhGetFormattedCounterValue( counter, PDH_FMT_LARGE, NULL, &value ); 855 ok(status == ERROR_SUCCESS, "PdhGetFormattedCounterValue failed 0x%08x\n", status); 856 857 trace( "uptime %s\n", wine_dbgstr_longlong(U(value).largeValue) ); 858 } 859 } 860 861 ret = CloseHandle( event ); 862 ok(ret, "CloseHandle failed\n"); 863 864 status = PdhCloseQuery( query ); 865 ok(status == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", status); 866 } 867 868 static void test_PdhMakeCounterPathA(void) 869 { 870 PDH_STATUS ret; 871 PDH_COUNTER_PATH_ELEMENTS_A e; 872 char buffer[1024]; 873 DWORD buflen; 874 875 ret = PdhMakeCounterPathA(NULL, NULL, NULL, 0); 876 ok(ret == PDH_INVALID_ARGUMENT, "PdhMakeCounterPathA failed 0x%08x\n", ret); 877 878 buflen = 0; 879 ret = PdhMakeCounterPathA(NULL, NULL, &buflen, 0); 880 ok(ret == PDH_INVALID_ARGUMENT, "PdhMakeCounterPathA failed 0x%08x\n", ret); 881 882 buflen = 0; 883 ret = PdhMakeCounterPathA(NULL, buffer, &buflen, 0); 884 ok(ret == PDH_INVALID_ARGUMENT, "PdhMakeCounterPathA failed 0x%08x\n", ret); 885 886 buflen = sizeof(buffer); 887 memset(&e, 0, sizeof(e)); 888 ret = PdhMakeCounterPathA(&e, buffer, &buflen, 0); 889 ok(ret == PDH_INVALID_ARGUMENT, "PdhMakeCounterPathA failed 0x%08x\n", ret); 890 891 buffer[0] = 0; 892 buflen = sizeof(buffer); 893 e.szMachineName = (char *)"machine"; 894 ret = PdhMakeCounterPathA(&e, buffer, &buflen, 0); 895 ok(ret == PDH_INVALID_ARGUMENT, "PdhMakeCounterPathA failed 0x%08x\n", ret); 896 ok(!strcmp(buffer, ""), "expected \"machine\" got %s\n", buffer); 897 898 buffer[0] = 0; 899 buflen = sizeof(buffer); 900 e.szObjectName = (char *)"object"; 901 ret = PdhMakeCounterPathA(&e, buffer, &buflen, 0); 902 ok(ret == PDH_INVALID_ARGUMENT, "PdhMakeCounterPathA failed 0x%08x\n", ret); 903 ok(!strcmp(buffer, ""), "expected \"machine\" got %s\n", buffer); 904 905 buffer[0] = 0; 906 buflen = sizeof(buffer); 907 e.szInstanceName = (char *)"instance"; 908 ret = PdhMakeCounterPathA(&e, buffer, &buflen, 0); 909 ok(ret == PDH_INVALID_ARGUMENT, "PdhMakeCounterPathA failed 0x%08x\n", ret); 910 ok(!strcmp(buffer, ""), "expected \"machine\" got %s\n", buffer); 911 912 buffer[0] = 0; 913 buflen = sizeof(buffer); 914 e.szParentInstance = (char *)"parent"; 915 ret = PdhMakeCounterPathA(&e, buffer, &buflen, 0); 916 ok(ret == PDH_INVALID_ARGUMENT, "PdhMakeCounterPathA failed 0x%08x\n", ret); 917 ok(!strcmp(buffer, ""), "expected \"machine\" got %s\n", buffer); 918 919 buffer[0] = 0; 920 buflen = sizeof(buffer); 921 e.dwInstanceIndex = 1; 922 ret = PdhMakeCounterPathA(&e, buffer, &buflen, 0); 923 ok(ret == PDH_INVALID_ARGUMENT, "PdhMakeCounterPathA failed 0x%08x\n", ret); 924 ok(!strcmp(buffer, ""), "expected \"machine\" got %s\n", buffer); 925 926 buffer[0] = 0; 927 buflen = sizeof(buffer); 928 e.szCounterName = (char *)"counter"; 929 ret = PdhMakeCounterPathA(&e, buffer, &buflen, 0); 930 ok(ret == ERROR_SUCCESS, "PdhMakeCounterPathA failed 0x%08x\n", ret); 931 ok(!strcmp(buffer, "\\\\machine\\object(parent/instance#1)\\counter"), 932 "expected \"\\\\machine\\object(parent/instance#1)\\counter\" got %s\n", buffer); 933 934 buffer[0] = 0; 935 buflen = sizeof(buffer); 936 e.szParentInstance = NULL; 937 ret = PdhMakeCounterPathA(&e, buffer, &buflen, 0); 938 ok(ret == ERROR_SUCCESS, "PdhMakeCounterPathA failed 0x%08x\n", ret); 939 ok(!strcmp(buffer, "\\\\machine\\object(instance#1)\\counter"), 940 "expected \"\\\\machine\\object(instance#1)\\counter\" got %s\n", buffer); 941 942 buffer[0] = 0; 943 buflen = sizeof(buffer); 944 e.szInstanceName = NULL; 945 ret = PdhMakeCounterPathA(&e, buffer, &buflen, 0); 946 ok(ret == ERROR_SUCCESS, "PdhMakeCounterPathA failed 0x%08x\n", ret); 947 ok(!strcmp(buffer, "\\\\machine\\object\\counter"), 948 "expected \"\\\\machine\\object\\counter\" got %s\n", buffer); 949 950 buffer[0] = 0; 951 buflen = sizeof(buffer); 952 e.szMachineName = NULL; 953 ret = PdhMakeCounterPathA(&e, buffer, &buflen, 0); 954 ok(ret == ERROR_SUCCESS, "PdhMakeCounterPathA failed 0x%08x\n", ret); 955 ok(!strcmp(buffer, "\\object\\counter"), 956 "expected \"\\object\\counter\" got %s\n", buffer); 957 958 buffer[0] = 0; 959 buflen = sizeof(buffer); 960 e.szObjectName = NULL; 961 ret = PdhMakeCounterPathA(&e, buffer, &buflen, 0); 962 ok(ret == PDH_INVALID_ARGUMENT, "PdhMakeCounterPathA failed 0x%08x\n", ret); 963 } 964 965 static void test_PdhGetDllVersion(void) 966 { 967 PDH_STATUS ret; 968 DWORD version; 969 970 ret = PdhGetDllVersion(NULL); 971 ok(ret == PDH_INVALID_ARGUMENT || 972 broken(ret == ERROR_SUCCESS), /* Vista+ */ 973 "Expected PdhGetDllVersion to return PDH_INVALID_ARGUMENT, got %d\n", ret); 974 975 ret = PdhGetDllVersion(&version); 976 ok(ret == ERROR_SUCCESS, 977 "Expected PdhGetDllVersion to return ERROR_SUCCESS, got %d\n", ret); 978 979 if (ret == ERROR_SUCCESS) 980 { 981 ok(version == PDH_CVERSION_WIN50 || 982 version == PDH_VERSION, 983 "Expected version number to be PDH_CVERSION_WIN50 or PDH_VERSION, got %u\n", version); 984 } 985 } 986 987 START_TEST(pdh) 988 { 989 if (!is_lang_english()) 990 { 991 skip("An English UI is needed for the pdh tests\n"); 992 return; 993 } 994 init_function_ptrs(); 995 996 test_PdhOpenQueryA(); 997 test_PdhOpenQueryW(); 998 999 test_PdhAddCounterA(); 1000 test_PdhAddCounterW(); 1001 1002 if (pPdhAddEnglishCounterA) test_PdhAddEnglishCounterA(); 1003 if (pPdhAddEnglishCounterW) test_PdhAddEnglishCounterW(); 1004 if (pPdhCollectQueryDataWithTime) test_PdhCollectQueryDataWithTime(); 1005 1006 test_PdhGetFormattedCounterValue(); 1007 test_PdhGetRawCounterValue(); 1008 test_PdhSetCounterScaleFactor(); 1009 test_PdhGetCounterTimeBase(); 1010 1011 test_PdhGetCounterInfoA(); 1012 test_PdhGetCounterInfoW(); 1013 1014 test_PdhLookupPerfIndexByNameA(); 1015 test_PdhLookupPerfIndexByNameW(); 1016 1017 test_PdhLookupPerfNameByIndexA(); 1018 test_PdhLookupPerfNameByIndexW(); 1019 1020 test_PdhValidatePathA(); 1021 test_PdhValidatePathW(); 1022 1023 if (pPdhValidatePathExA) test_PdhValidatePathExA(); 1024 if (pPdhValidatePathExW) test_PdhValidatePathExW(); 1025 1026 test_PdhCollectQueryDataEx(); 1027 test_PdhMakeCounterPathA(); 1028 test_PdhGetDllVersion(); 1029 } 1030