ReactOS 0.4.17-dev-966-gf06eace
pdh_main.c
Go to the documentation of this file.
1/*
2 * Performance Data Helper (pdh.dll)
3 *
4 * Copyright 2007 Andrey Turkin
5 * Copyright 2007 Hans Leidekker
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 */
21
22#include <stdarg.h>
23#include <stdlib.h>
24#include <math.h>
25
26#include "windef.h"
27#include "winbase.h"
28
29#include "pdh.h"
30#include "pdhmsg.h"
31#include "winperf.h"
32#ifdef __REACTOS__
33#include <wchar.h>
34#include <winnls.h>
35#endif
36
37#include "wine/debug.h"
38#include "wine/list.h"
39
41
44{
45 0, 0, &pdh_handle_cs,
48 0, 0, { (DWORD_PTR)(__FILE__ ": pdh_handle_cs") }
49};
50static CRITICAL_SECTION pdh_handle_cs = { &pdh_handle_cs_debug, -1, 0, 0, 0, 0 };
51
52static inline WCHAR *pdh_strdup_aw( const char *src )
53{
54 int len;
55 WCHAR *dst;
56
57 if (!src) return NULL;
58 len = MultiByteToWideChar( CP_ACP, 0, src, -1, NULL, 0 );
59 if ((dst = malloc( len * sizeof(WCHAR) ))) MultiByteToWideChar( CP_ACP, 0, src, -1, dst, len );
60 return dst;
61}
62
63union value
64{
68};
69
70struct counter
71{
72 DWORD magic; /* signature */
73 struct list entry; /* list entry */
74 WCHAR *path; /* identifier */
75 DWORD type; /* counter type */
76 DWORD status; /* update status */
77 LONG scale; /* scale factor */
78 LONG defaultscale; /* default scale factor */
79 DWORD_PTR user; /* user data */
80 DWORD_PTR queryuser; /* query user data */
81 LONGLONG base; /* samples per second */
82 FILETIME stamp; /* time stamp */
83 void (CALLBACK *collect)( struct counter * ); /* collect callback */
84 union value one; /* first value */
85 union value two; /* second value */
86};
87
88#define PDH_MAGIC_COUNTER 0x50444831 /* 'PDH1' */
89
90static struct counter *create_counter( void )
91{
92 struct counter *counter;
93
94 if ((counter = calloc( 1, sizeof(struct counter) )))
95 {
97 return counter;
98 }
99 return NULL;
100}
101
102static void destroy_counter( struct counter *counter )
103{
104 /* Ensure compiler doesn't optimize out the assignment with 0. */
105 SecureZeroMemory( &counter->magic, sizeof( counter->magic ) );
106 free( counter->path );
107 free( counter );
108}
109
110#define PDH_MAGIC_QUERY 0x50444830 /* 'PDH0' */
111
112struct query
113{
114 DWORD magic; /* signature */
115 DWORD_PTR user; /* user data */
116 HANDLE thread; /* collect thread */
117 DWORD interval; /* collect interval */
118 HANDLE wait; /* wait event */
119 HANDLE stop; /* stop event */
120 struct list counters; /* counter list */
121};
122
123static struct query *create_query( void )
124{
125 struct query *query;
126
127 if ((query = calloc( 1, sizeof(struct query) )))
128 {
131 return query;
132 }
133 return NULL;
134}
135
136static void destroy_query( struct query *query )
137{
138 /* Ensure compiler doesn't optimize out the assignment with 0. */
139 SecureZeroMemory( &query->magic, sizeof( query->magic ) );
140 free( query );
141}
142
143struct source
144{
145 DWORD index; /* name index */
146 const WCHAR *path; /* identifier */
147 void (CALLBACK *collect)( struct counter * ); /* collect callback */
148 DWORD type; /* counter type */
149 LONG scale; /* default scale factor */
150 LONGLONG base; /* samples per second */
151};
152
154{
155 counter->two.largevalue = 500000; /* FIXME */
157}
158
160{
163}
164
165#define TYPE_PROCESSOR_TIME \
166 (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_TIMER_100NS | PERF_DELTA_COUNTER | \
167 PERF_INVERSE_COUNTER | PERF_DISPLAY_PERCENT)
168
169#define TYPE_UPTIME \
170 (PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_ELAPSED | PERF_OBJECT_TIMER | PERF_DISPLAY_SECONDS)
171
172/* counter source registry */
173static const struct source counter_sources[] =
174{
175 { 6, L"\\Processor(_Total)\\% Processor Time", collect_processor_time, TYPE_PROCESSOR_TIME, -5, 10000000 },
176 { 674, L"\\System\\System Up Time", collect_uptime, TYPE_UPTIME, -3, 1000 }
177};
178
180{
182 DWORD buflen = ARRAY_SIZE(buf);
183
184 if (!GetComputerNameW( buf, &buflen )) return FALSE;
185 return len == buflen && !wcsnicmp( name, buf, buflen );
186}
187
189{
190 const WCHAR *p;
191
192 if (path[0] == '\\' && path[1] == '\\' && (p = wcschr( path + 2, '\\' )) &&
193 is_local_machine( path + 2, p - path - 2 ))
194 {
195 path += p - path;
196 }
197 if (wcschr( path, '\\' )) p = fullpath;
198 else p = wcsrchr( fullpath, '\\' ) + 1;
199 return !wcscmp( p, path );
200}
201
202/***********************************************************************
203 * PdhAddCounterA (PDH.@)
204 */
206 DWORD_PTR userdata, PDH_HCOUNTER *counter )
207{
209 WCHAR *pathW;
210
211 TRACE("%p %s %Ix %p\n", query, debugstr_a(path), userdata, counter);
212
213 if (!path) return PDH_INVALID_ARGUMENT;
214
215 if (!(pathW = pdh_strdup_aw( path )))
217
218 ret = PdhAddCounterW( query, pathW, userdata, counter );
219
220 free( pathW );
221 return ret;
222}
223
224/***********************************************************************
225 * PdhAddCounterW (PDH.@)
226 */
228 DWORD_PTR userdata, PDH_HCOUNTER *hcounter )
229{
230 struct query *query = hquery;
231 struct counter *counter;
232 unsigned int i;
233
234 TRACE("%p %s %Ix %p\n", hquery, debugstr_w(path), userdata, hcounter);
235
236 if (!path || !hcounter) return PDH_INVALID_ARGUMENT;
237
239 if (!query || query->magic != PDH_MAGIC_QUERY)
240 {
242 return PDH_INVALID_HANDLE;
243 }
244
245 *hcounter = NULL;
246 for (i = 0; i < ARRAY_SIZE(counter_sources); i++)
247 {
249 {
250 if ((counter = create_counter()))
251 {
253 counter->collect = counter_sources[i].collect;
254 counter->type = counter_sources[i].type;
256 counter->base = counter_sources[i].base;
258 counter->user = userdata;
259
261 *hcounter = counter;
262
264 return ERROR_SUCCESS;
265 }
268 }
269 }
272}
273
274/***********************************************************************
275 * PdhAddEnglishCounterA (PDH.@)
276 */
278 DWORD_PTR userdata, PDH_HCOUNTER *counter )
279{
280 TRACE("%p %s %Ix %p\n", query, debugstr_a(path), userdata, counter);
281
282 if (!counter) return PDH_INVALID_ARGUMENT;
283 if (!query) return PDH_INVALID_HANDLE;
284 return PdhAddCounterA( query, path, userdata, counter );
285}
286
287/***********************************************************************
288 * PdhAddEnglishCounterW (PDH.@)
289 */
291 DWORD_PTR userdata, PDH_HCOUNTER *counter )
292{
293 TRACE("%p %s %Ix %p\n", query, debugstr_w(path), userdata, counter);
294
295 if (!counter) return PDH_INVALID_ARGUMENT;
296 if (!query) return PDH_INVALID_HANDLE;
297 return PdhAddCounterW( query, path, userdata, counter );
298}
299
300/* caller must hold counter lock */
302 union value *raw2, PDH_FMT_COUNTERVALUE *value )
303{
304 LONG factor;
305
307 if (format & PDH_FMT_LONG)
308 {
309 if (format & PDH_FMT_1000) value->longValue = raw2->longvalue * 1000;
310 else value->longValue = raw2->longvalue * pow( 10, factor );
311 }
312 else if (format & PDH_FMT_LARGE)
313 {
314 if (format & PDH_FMT_1000) value->largeValue = raw2->largevalue * 1000;
315 else value->largeValue = raw2->largevalue * pow( 10, factor );
316 }
317 else if (format & PDH_FMT_DOUBLE)
318 {
319 if (format & PDH_FMT_1000) value->doubleValue = raw2->doublevalue * 1000;
320 else value->doubleValue = raw2->doublevalue * pow( 10, factor );
321 }
322 else
323 {
324 WARN("unknown format %lx\n", format);
326 }
327 return ERROR_SUCCESS;
328}
329
330/***********************************************************************
331 * PdhCalculateCounterFromRawValue (PDH.@)
332 */
336{
338 struct counter *counter = handle;
339
340 TRACE("%p 0x%08lx %p %p %p\n", handle, format, raw1, raw2, value);
341
342 if (!value) return PDH_INVALID_ARGUMENT;
343
346 {
348 return PDH_INVALID_HANDLE;
349 }
350
351 ret = format_value( counter, format, (union value *)&raw1->SecondValue,
352 (union value *)&raw2->SecondValue, value );
353
355 return ret;
356}
357
358
359/***********************************************************************
360 * PdhCloseQuery (PDH.@)
361 */
363{
364 struct query *query = handle;
365 struct list *item, *next;
366
367 TRACE("%p\n", handle);
368
370 if (!query || query->magic != PDH_MAGIC_QUERY)
371 {
373 return PDH_INVALID_HANDLE;
374 }
375
376 if (query->thread)
377 {
379 SetEvent( query->stop );
381
383
386 {
388 return ERROR_SUCCESS;
389 }
392 query->thread = NULL;
393 }
394
396 {
397 struct counter *counter = LIST_ENTRY( item, struct counter, entry );
398
401 }
402
404
406 return ERROR_SUCCESS;
407}
408
409/* caller must hold query lock */
410static void collect_query_data( struct query *query )
411{
412 struct list *item;
413
415 {
417 struct counter *counter = LIST_ENTRY( item, struct counter, entry );
418
419 counter->collect( counter );
420
421 GetLocalTime( &time );
423 }
424}
425
426/***********************************************************************
427 * PdhCollectQueryData (PDH.@)
428 */
430{
431 struct query *query = handle;
432
433 TRACE("%p\n", handle);
434
436 if (!query || query->magic != PDH_MAGIC_QUERY)
437 {
439 return PDH_INVALID_HANDLE;
440 }
441
442 if (list_empty( &query->counters ))
443 {
445 return PDH_NO_DATA;
446 }
447
449
451 return ERROR_SUCCESS;
452}
453
455{
456 struct query *query = arg;
459
460 for (;;)
461 {
463
466 {
469 }
470
472
473 if (!SetEvent( query->wait ))
474 {
476 ExitThread( 0 );
477 }
479 }
480}
481
482/***********************************************************************
483 * PdhCollectQueryDataEx (PDH.@)
484 */
486{
488 struct query *query = handle;
489
490 TRACE("%p %ld %p\n", handle, interval, event);
491
493 if (!query || query->magic != PDH_MAGIC_QUERY)
494 {
496 return PDH_INVALID_HANDLE;
497 }
498 if (list_empty( &query->counters ))
499 {
501 return PDH_NO_DATA;
502 }
503 if (query->thread)
504 {
506 SetEvent( query->stop );
508
510
513 {
515 return PDH_INVALID_HANDLE;
516 }
518 query->thread = NULL;
519 }
520 else if (!(query->stop = CreateEventW( NULL, FALSE, FALSE, NULL )))
521 {
522 ret = GetLastError();
524 return ret;
525 }
526 query->wait = event;
527 query->interval = interval * 1000;
529 {
530 ret = GetLastError();
532
534 return ret;
535 }
536
538 return ERROR_SUCCESS;
539}
540
541/***********************************************************************
542 * PdhCollectQueryDataWithTime (PDH.@)
543 */
545{
546 struct query *query = handle;
547 struct counter *counter;
548 struct list *item;
549
550 TRACE("%p %p\n", handle, timestamp);
551
552 if (!timestamp) return PDH_INVALID_ARGUMENT;
553
555 if (!query || query->magic != PDH_MAGIC_QUERY)
556 {
558 return PDH_INVALID_HANDLE;
559 }
560 if (list_empty( &query->counters ))
561 {
563 return PDH_NO_DATA;
564 }
565
567
569 counter = LIST_ENTRY( item, struct counter, entry );
570
572
574 return ERROR_SUCCESS;
575}
576
577/***********************************************************************
578 * PdhExpandWildCardPathA (PDH.@)
579 */
580PDH_STATUS WINAPI PdhExpandWildCardPathA( LPCSTR szDataSource, LPCSTR szWildCardPath, LPSTR mszExpandedPathList, LPDWORD pcchPathListLength, DWORD dwFlags )
581{
582 FIXME("%s, %s, %p, %p, 0x%lx: stub\n", debugstr_a(szDataSource), debugstr_a(szWildCardPath), mszExpandedPathList, pcchPathListLength, dwFlags);
583 return PDH_NOT_IMPLEMENTED;
584}
585
586/***********************************************************************
587 * PdhExpandWildCardPathW (PDH.@)
588 */
589PDH_STATUS WINAPI PdhExpandWildCardPathW( LPCWSTR szDataSource, LPCWSTR szWildCardPath, LPWSTR mszExpandedPathList, LPDWORD pcchPathListLength, DWORD dwFlags )
590{
591 FIXME("%s, %s, %p, %p, 0x%lx: stub\n", debugstr_w(szDataSource), debugstr_w(szWildCardPath), mszExpandedPathList, pcchPathListLength, dwFlags);
592 return PDH_NOT_IMPLEMENTED;
593}
594
595/***********************************************************************
596 * PdhExpandCounterPathA (PDH.@)
597 */
598PDH_STATUS WINAPI PdhExpandCounterPathA( LPCSTR szWildCardPath, LPSTR mszExpandedPathList, LPDWORD pcchPathListLength )
599{
600 FIXME("%s, %p, %p: stub\n", debugstr_a(szWildCardPath), mszExpandedPathList, pcchPathListLength);
601 return PdhExpandWildCardPathA(NULL, szWildCardPath, mszExpandedPathList, pcchPathListLength, 0);
602}
603
604/***********************************************************************
605 * PdhExpandCounterPathW (PDH.@)
606 */
607PDH_STATUS WINAPI PdhExpandCounterPathW( LPCWSTR szWildCardPath, LPWSTR mszExpandedPathList, LPDWORD pcchPathListLength )
608{
609 FIXME("%s, %p, %p: stub\n", debugstr_w(szWildCardPath), mszExpandedPathList, pcchPathListLength);
610 return PdhExpandWildCardPathW(NULL, szWildCardPath, mszExpandedPathList, pcchPathListLength, 0);
611}
612
613/***********************************************************************
614 * PdhGetCounterInfoA (PDH.@)
615 */
617{
618 struct counter *counter = handle;
619
620 TRACE("%p %d %p %p\n", handle, text, size, info);
621
624 {
626 return PDH_INVALID_HANDLE;
627 }
628 if (!size)
629 {
632 }
633 if (*size < sizeof(PDH_COUNTER_INFO_A))
634 {
635 *size = sizeof(PDH_COUNTER_INFO_A);
637 return PDH_MORE_DATA;
638 }
639
640 memset( info, 0, sizeof(PDH_COUNTER_INFO_A) );
641
642 info->dwType = counter->type;
643 info->CStatus = counter->status;
644 info->lScale = counter->scale;
645 info->lDefaultScale = counter->defaultscale;
646 info->dwUserData = counter->user;
647 info->dwQueryUserData = counter->queryuser;
648
649 *size = sizeof(PDH_COUNTER_INFO_A);
650
652 return ERROR_SUCCESS;
653}
654
655/***********************************************************************
656 * PdhGetCounterInfoW (PDH.@)
657 */
659{
660 struct counter *counter = handle;
661
662 TRACE("%p %d %p %p\n", handle, text, size, info);
663
666 {
668 return PDH_INVALID_HANDLE;
669 }
670 if (!size)
671 {
674 }
675 if (*size < sizeof(PDH_COUNTER_INFO_W))
676 {
677 *size = sizeof(PDH_COUNTER_INFO_W);
679 return PDH_MORE_DATA;
680 }
681
682 memset( info, 0, sizeof(PDH_COUNTER_INFO_W) );
683
684 info->dwType = counter->type;
685 info->CStatus = counter->status;
686 info->lScale = counter->scale;
687 info->lDefaultScale = counter->defaultscale;
688 info->dwUserData = counter->user;
689 info->dwQueryUserData = counter->queryuser;
690
691 *size = sizeof(PDH_COUNTER_INFO_W);
692
694 return ERROR_SUCCESS;
695}
696
697/***********************************************************************
698 * PdhGetCounterTimeBase (PDH.@)
699 */
701{
702 struct counter *counter = handle;
703
704 TRACE("%p %p\n", handle, base);
705
706 if (!base) return PDH_INVALID_ARGUMENT;
707
710 {
712 return PDH_INVALID_HANDLE;
713 }
714
715 *base = counter->base;
716
718 return ERROR_SUCCESS;
719}
720
721/***********************************************************************
722 * PdhGetDllVersion (PDH.@)
723 */
725{
726 if (!version)
728
730
731 return ERROR_SUCCESS;
732}
733
734/***********************************************************************
735 * PdhGetFormattedCounterValue (PDH.@)
736 */
739{
741 struct counter *counter = handle;
742
743 TRACE("%p %lx %p %p\n", handle, format, type, value);
744
745 if (!value) return PDH_INVALID_ARGUMENT;
746
749 {
751 return PDH_INVALID_HANDLE;
752 }
753 if (counter->status)
754 {
756 return PDH_INVALID_DATA;
757 }
759 {
760 value->CStatus = ERROR_SUCCESS;
761 if (type) *type = counter->type;
762 }
763
765 return ret;
766}
767
768/***********************************************************************
769 * PdhGetRawCounterValue (PDH.@)
770 */
773{
774 struct counter *counter = handle;
775
776 TRACE("%p %p %p\n", handle, type, value);
777
778 if (!value) return PDH_INVALID_ARGUMENT;
779
782 {
784 return PDH_INVALID_HANDLE;
785 }
786
787 value->CStatus = counter->status;
788 value->TimeStamp.dwLowDateTime = counter->stamp.dwLowDateTime;
789 value->TimeStamp.dwHighDateTime = counter->stamp.dwHighDateTime;
790 value->FirstValue = counter->one.largevalue;
791 value->SecondValue = counter->two.largevalue;
792 value->MultiCount = 1; /* FIXME */
793
794 if (type) *type = counter->type;
795
797 return ERROR_SUCCESS;
798}
799
800/***********************************************************************
801 * PdhLookupPerfIndexByNameA (PDH.@)
802 */
804{
807 WCHAR *nameW;
808
809 TRACE("%s %s %p\n", debugstr_a(machine), debugstr_a(name), index);
810
811 if (!name) return PDH_INVALID_ARGUMENT;
812
814
815 if (!(nameW = pdh_strdup_aw( name )))
817
819
820 free( nameW );
821 free( machineW );
822 return ret;
823}
824
825/***********************************************************************
826 * PdhLookupPerfIndexByNameW (PDH.@)
827 */
829{
830 unsigned int i;
831
832 TRACE("%s %s %p\n", debugstr_w(machine), debugstr_w(name), index);
833
834 if (!name || !index) return PDH_INVALID_ARGUMENT;
835
836 if (machine)
837 {
838 FIXME("remote machine not supported\n");
840 }
841 for (i = 0; i < ARRAY_SIZE(counter_sources); i++)
842 {
844 {
845 *index = counter_sources[i].index;
846 return ERROR_SUCCESS;
847 }
848 }
850}
851
852/***********************************************************************
853 * PdhLookupPerfNameByIndexA (PDH.@)
854 */
856{
860 DWORD sizeW = ARRAY_SIZE(bufferW);
861
862 TRACE("%s %ld %p %p\n", debugstr_a(machine), index, buffer, size);
863
864 if (!buffer || !size) return PDH_INVALID_ARGUMENT;
865
867
868 if (!(ret = PdhLookupPerfNameByIndexW( machineW, index, bufferW, &sizeW )))
869 {
870 int required = WideCharToMultiByte( CP_ACP, 0, bufferW, -1, NULL, 0, NULL, NULL );
871
872 if (*size < required) ret = PDH_MORE_DATA;
873 else WideCharToMultiByte( CP_ACP, 0, bufferW, -1, buffer, required, NULL, NULL );
874 *size = required;
875 }
876 free( machineW );
877 return ret;
878}
879
880/***********************************************************************
881 * PdhLookupPerfNameByIndexW (PDH.@)
882 */
884{
886 unsigned int i;
887
888 TRACE("%s %ld %p %p\n", debugstr_w(machine), index, buffer, size);
889
890 if (machine)
891 {
892 FIXME("remote machine not supported\n");
894 }
895
896 if (!buffer || !size) return PDH_INVALID_ARGUMENT;
897 if (!index) return ERROR_SUCCESS;
898
899 for (i = 0; i < ARRAY_SIZE(counter_sources); i++)
900 {
902 {
903 WCHAR *p = wcsrchr( counter_sources[i].path, '\\' ) + 1;
904 unsigned int required = lstrlenW( p ) + 1;
905
906 if (*size < required) ret = PDH_MORE_DATA;
907 else
908 {
909 lstrcpyW( buffer, p );
911 }
912 *size = required;
913 return ret;
914 }
915 }
917}
918
919/***********************************************************************
920 * PdhOpenQueryA (PDH.@)
921 */
923{
925 WCHAR *sourceW = NULL;
926
927 TRACE("%s %Ix %p\n", debugstr_a(source), userdata, query);
928
929 if (source && !(sourceW = pdh_strdup_aw( source ))) return PDH_MEMORY_ALLOCATION_FAILURE;
930
931 ret = PdhOpenQueryW( sourceW, userdata, query );
932 free( sourceW );
933
934 return ret;
935}
936
937/***********************************************************************
938 * PdhOpenQueryW (PDH.@)
939 */
941{
942 struct query *query;
943
944 TRACE("%s %Ix %p\n", debugstr_w(source), userdata, handle);
945
946 if (!handle) return PDH_INVALID_ARGUMENT;
947
948 if (source)
949 {
950 FIXME("log file data source not supported\n");
952 }
953 if ((query = create_query()))
954 {
955 query->user = userdata;
956 *handle = query;
957
958 return ERROR_SUCCESS;
959 }
961}
962
963/***********************************************************************
964 * PdhRemoveCounter (PDH.@)
965 */
967{
968 struct counter *counter = handle;
969
970 TRACE("%p\n", handle);
971
974 {
976 return PDH_INVALID_HANDLE;
977 }
978
981
983 return ERROR_SUCCESS;
984}
985
986/***********************************************************************
987 * PdhSetCounterScaleFactor (PDH.@)
988 */
990{
991 struct counter *counter = handle;
992
993 TRACE("%p\n", handle);
994
997 {
999 return PDH_INVALID_HANDLE;
1000 }
1001 if (factor < PDH_MIN_SCALE || factor > PDH_MAX_SCALE)
1002 {
1004 return PDH_INVALID_ARGUMENT;
1005 }
1006
1007 counter->scale = factor;
1008
1010 return ERROR_SUCCESS;
1011}
1012
1013/***********************************************************************
1014 * PdhValidatePathA (PDH.@)
1015 */
1017{
1019 WCHAR *pathW;
1020
1021 TRACE("%s\n", debugstr_a(path));
1022
1023 if (!path) return PDH_INVALID_ARGUMENT;
1025
1027
1028 free( pathW );
1029 return ret;
1030}
1031
1033{
1034 if (!path || !*path) return PDH_INVALID_ARGUMENT;
1035 if (*path++ != '\\' || !wcschr( path, '\\' )) return PDH_CSTATUS_BAD_COUNTERNAME;
1036 return ERROR_SUCCESS;
1037 }
1038
1039/***********************************************************************
1040 * PdhValidatePathW (PDH.@)
1041 */
1043{
1045 unsigned int i;
1046
1047 TRACE("%s\n", debugstr_w(path));
1048
1049 if ((ret = validate_path( path ))) return ret;
1050
1051 for (i = 0; i < ARRAY_SIZE(counter_sources); i++)
1053
1055}
1056
1057/***********************************************************************
1058 * PdhVbAddCounter (PDH.@)
1059 */
1061{
1062 FIXME("%p, %s, %p: stub!\n", query, debugstr_a(path), counter);
1063
1064 if (!path) return PDH_INVALID_ARGUMENT;
1065
1066 return PDH_NOT_IMPLEMENTED;
1067}
1068
1069/***********************************************************************
1070 * PdhVbGetDoubleCounterValue (PDH.@)
1071 */
1073{
1076
1077 TRACE( "%p %p\n", handle, counter_status );
1078
1079 memset( &value, 0, sizeof(value) );
1081
1082 if (counter_status) *counter_status = status;
1083 return value.doubleValue;
1084}
1085
1086/***********************************************************************
1087 * PdhValidatePathExA (PDH.@)
1088 */
1090{
1091 TRACE("%p %s\n", source, debugstr_a(path));
1092
1093 if (source)
1094 {
1095 FIXME("log file data source not supported\n");
1096 return ERROR_SUCCESS;
1097 }
1098 return PdhValidatePathA( path );
1099}
1100
1101/***********************************************************************
1102 * PdhValidatePathExW (PDH.@)
1103 */
1105{
1106 TRACE("%p %s\n", source, debugstr_w(path));
1107
1108 if (source)
1109 {
1110 FIXME("log file data source not supported\n");
1111 return ERROR_SUCCESS;
1112 }
1113 return PdhValidatePathW( path );
1114}
1115
1116/***********************************************************************
1117 * PdhMakeCounterPathA (PDH.@)
1118 */
1120 LPDWORD buflen, DWORD flags )
1121{
1124 WCHAR *bufferW;
1125 DWORD buflenW;
1126
1127 TRACE("%p %p %p 0x%08lx\n", e, buffer, buflen, flags);
1128
1129 if (!e || !buflen) return PDH_INVALID_ARGUMENT;
1130
1131 memset( &eW, 0, sizeof(eW) );
1132 if (e->szMachineName && !(eW.szMachineName = pdh_strdup_aw( e->szMachineName ))) goto done;
1133 if (e->szObjectName && !(eW.szObjectName = pdh_strdup_aw( e->szObjectName ))) goto done;
1134 if (e->szInstanceName && !(eW.szInstanceName = pdh_strdup_aw( e->szInstanceName ))) goto done;
1135 if (e->szParentInstance && !(eW.szParentInstance = pdh_strdup_aw( e->szParentInstance ))) goto done;
1136 if (e->szCounterName && !(eW.szCounterName = pdh_strdup_aw( e->szCounterName ))) goto done;
1137 eW.dwInstanceIndex = e->dwInstanceIndex;
1138
1139 buflenW = 0;
1140 ret = PdhMakeCounterPathW( &eW, NULL, &buflenW, flags );
1141 if (ret == PDH_MORE_DATA)
1142 {
1143 if ((bufferW = malloc( buflenW * sizeof(WCHAR) )))
1144 {
1145 if (!(ret = PdhMakeCounterPathW( &eW, bufferW, &buflenW, flags )))
1146 {
1147 int len = WideCharToMultiByte(CP_ACP, 0, bufferW, -1, NULL, 0, NULL, NULL);
1148 if (*buflen >= len) WideCharToMultiByte(CP_ACP, 0, bufferW, -1, buffer, *buflen, NULL, NULL);
1149 else ret = PDH_MORE_DATA;
1150 *buflen = len;
1151 }
1152 free( bufferW );
1153 }
1154 else
1156 }
1157
1158done:
1159 free( eW.szMachineName );
1160 free( eW.szObjectName );
1161 free( eW.szInstanceName );
1162 free( eW.szParentInstance );
1163 free( eW.szCounterName );
1164 return ret;
1165}
1166
1167/***********************************************************************
1168 * PdhMakeCounterPathW (PDH.@)
1169 */
1171 LPDWORD buflen, DWORD flags )
1172{
1175 DWORD len;
1176
1177 TRACE("%p %p %p 0x%08lx\n", e, buffer, buflen, flags);
1178
1179 if (flags) FIXME("unimplemented flags 0x%08lx\n", flags);
1180
1181 if (!e || !e->szCounterName || !e->szObjectName || !buflen)
1182 return PDH_INVALID_ARGUMENT;
1183
1184 path[0] = 0;
1185 if (e->szMachineName)
1186 {
1187 lstrcatW(path, L"\\\\");
1188 lstrcatW(path, e->szMachineName);
1189 }
1190 lstrcatW(path, L"\\");
1191 lstrcatW(path, e->szObjectName);
1192 if (e->szInstanceName)
1193 {
1194 lstrcatW(path, L"(");
1195 if (e->szParentInstance)
1196 {
1197 lstrcatW(path, e->szParentInstance);
1198 lstrcatW(path, L"/");
1199 }
1200 lstrcatW(path, e->szInstanceName);
1201 swprintf(instance, ARRAY_SIZE(instance), L"#%u", e->dwInstanceIndex);
1203 lstrcatW(path, L")");
1204 }
1205 lstrcatW(path, L"\\");
1206 lstrcatW(path, e->szCounterName);
1207
1208 len = lstrlenW(path) + 1;
1209 if (*buflen >= len) lstrcpyW(buffer, path);
1210 else ret = PDH_MORE_DATA;
1211 *buflen = len;
1212 return ret;
1213}
1214
1215/***********************************************************************
1216 * PdhEnumObjectItemsA (PDH.@)
1217 */
1218PDH_STATUS WINAPI PdhEnumObjectItemsA(LPCSTR szDataSource, LPCSTR szMachineName, LPCSTR szObjectName,
1219 LPSTR mszCounterList, LPDWORD pcchCounterListLength, LPSTR mszInstanceList,
1220 LPDWORD pcchInstanceListLength, DWORD dwDetailLevel, DWORD dwFlags)
1221{
1222 FIXME("%s, %s, %s, %p, %p, %p, %p, %ld, 0x%lx: stub\n", debugstr_a(szDataSource), debugstr_a(szMachineName),
1223 debugstr_a(szObjectName), mszCounterList, pcchCounterListLength, mszInstanceList,
1224 pcchInstanceListLength, dwDetailLevel, dwFlags);
1225
1226 return PDH_NOT_IMPLEMENTED;
1227}
1228
1229/***********************************************************************
1230 * PdhEnumObjectItemsW (PDH.@)
1231 */
1232PDH_STATUS WINAPI PdhEnumObjectItemsW(LPCWSTR szDataSource, LPCWSTR szMachineName, LPCWSTR szObjectName,
1233 LPWSTR mszCounterList, LPDWORD pcchCounterListLength, LPWSTR mszInstanceList,
1234 LPDWORD pcchInstanceListLength, DWORD dwDetailLevel, DWORD dwFlags)
1235{
1236 FIXME("%s, %s, %s, %p, %p, %p, %p, %ld, 0x%lx: stub\n", debugstr_w(szDataSource), debugstr_w(szMachineName),
1237 debugstr_w(szObjectName), mszCounterList, pcchCounterListLength, mszInstanceList,
1238 pcchInstanceListLength, dwDetailLevel, dwFlags);
1239
1240 return PDH_NOT_IMPLEMENTED;
1241}
1242
1243/***********************************************************************
1244 * PdhSetDefaultRealTimeDataSource (PDH.@)
1245 */
1247{
1248 FIXME("%lu\n", source);
1249 return ERROR_SUCCESS;
1250}
1251
1252/***********************************************************************
1253 * PdhGetLogFileTypeA (PDH.@)
1254 */
1256{
1257 FIXME("%s, %p: stub\n", debugstr_a(log), type);
1258 return PDH_NOT_IMPLEMENTED;
1259}
1260
1261/***********************************************************************
1262 * PdhGetLogFileTypeW (PDH.@)
1263 */
1265{
1266 FIXME("%s, %p: stub\n", debugstr_w(log), type);
1267 return PDH_NOT_IMPLEMENTED;
1268}
1269
1270/***********************************************************************
1271 * PdhBindInputDataSourceA (PDH.@)
1272 */
1274{
1275 FIXME("%p %s: stub\n", source, debugstr_a(filenamelist));
1276 return PDH_NOT_IMPLEMENTED;
1277}
1278
1279/***********************************************************************
1280 * PdhBindInputDataSourceW (PDH.@)
1281 */
1283{
1284 FIXME("%p %s: stub\n", source, debugstr_w(filenamelist));
1285 return PDH_NOT_IMPLEMENTED;
1286}
1287
1288/***********************************************************************
1289 * PdhConnectMachineA (PDH.@)
1290 */
1292{
1293 FIXME("%s: stub\n", debugstr_a(name));
1294 return PDH_NOT_IMPLEMENTED;
1295}
unsigned char BOOLEAN
Definition: actypes.h:127
BOOL required
Definition: adapter_vk.c:1885
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
static const WCHAR nameW[]
Definition: main.c:49
#define ARRAY_SIZE(A)
Definition: main.h:20
static void list_remove(struct list_entry *entry)
Definition: list.h:90
static int list_empty(struct list_entry *head)
Definition: list.h:58
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
Definition: list.h:83
static void list_init(struct list_entry *head)
Definition: list.h:51
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
static HANDLE thread
Definition: service.c:33
Definition: list.h:39
BOOL WINAPI GetComputerNameW(LPWSTR lpBuffer, LPDWORD lpnSize)
Definition: compname.c:446
#define WAIT_TIMEOUT
Definition: dderror.h:14
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
static HINSTANCE instance
Definition: main.c:35
#define CloseHandle
Definition: compat.h:739
#define wcschr
Definition: compat.h:17
#define wcsnicmp
Definition: compat.h:14
#define wcsrchr
Definition: compat.h:16
#define CP_ACP
Definition: compat.h:109
#define CALLBACK
Definition: compat.h:35
#define lstrcpyW
Definition: compat.h:749
#define WideCharToMultiByte
Definition: compat.h:111
#define MultiByteToWideChar
Definition: compat.h:110
#define lstrlenW
Definition: compat.h:750
static const WCHAR version[]
Definition: asmname.c:66
VOID WINAPI ExitThread(IN DWORD uExitCode)
Definition: thread.c:365
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:137
BOOL WINAPI SystemTimeToFileTime(IN CONST SYSTEMTIME *lpSystemTime, OUT LPFILETIME lpFileTime)
Definition: time.c:153
VOID WINAPI GetLocalTime(OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:272
ULONGLONG WINAPI DECLSPEC_HOTPATCH GetTickCount64(void)
Definition: sync.c:192
static const WCHAR sizeW[]
Definition: editor.c:79
const WCHAR * text
Definition: package.c:1826
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1977
static wchar_t * wcsdup(const wchar_t *str)
Definition: string.h:94
#define swprintf
Definition: precomp.h:40
return ret
Definition: mutex.c:147
#define L(x)
Definition: resources.c:13
#define INFINITE
Definition: serial.h:102
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
double pow(double x, double y)
Definition: freeldr.c:179
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLenum src
Definition: glext.h:6340
GLuint buffer
Definition: glext.h:5915
GLsizeiptr size
Definition: glext.h:5919
GLuint index
Definition: glext.h:6031
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLenum GLenum dst
Definition: glext.h:6340
GLbitfield flags
Definition: glext.h:7161
GLint GLint GLsizei GLuint * counters
Definition: glext.h:11114
GLfloat GLfloat p
Definition: glext.h:8902
GLenum GLsizei len
Definition: glext.h:6722
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 factor
Definition: glfuncs.h:178
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
uint32_t entry
Definition: isohybrid.c:63
#define e
Definition: ke_i.h:82
#define debugstr_a
Definition: kernel32.h:31
#define debugstr_w
Definition: kernel32.h:32
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:274
__u16 time
Definition: mkdosfs.c:8
static const WCHAR pathW[]
Definition: path.c:2368
static const WCHAR machineW[]
Definition: profile.c:105
static const char machine[]
Definition: profile.c:104
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
static HMODULE pdh
Definition: pdh.c:30
#define PDH_MAX_COUNTER_NAME
Definition: pdh.h:47
#define PDH_FMT_LONG
Definition: pdh.h:49
#define PDH_FMT_DOUBLE
Definition: pdh.h:50
#define PDH_FMT_1000
Definition: pdh.h:53
LONG PDH_STATUS
Definition: pdh.h:35
#define PDH_VERSION
Definition: pdh.h:42
#define PDH_FMT_LARGE
Definition: pdh.h:51
struct _PDH_COUNTER_INFO_W PDH_COUNTER_INFO_W
struct _PDH_COUNTER_INFO_A PDH_COUNTER_INFO_A
#define PDH_MAX_SCALE
Definition: pdh.h:44
static void collect_query_data(struct query *query)
Definition: pdh_main.c:410
PDH_STATUS WINAPI PdhCollectQueryDataEx(PDH_HQUERY handle, DWORD interval, HANDLE event)
Definition: pdh_main.c:485
PDH_STATUS WINAPI PdhGetLogFileTypeW(const WCHAR *log, DWORD *type)
Definition: pdh_main.c:1264
PDH_STATUS WINAPI PdhExpandCounterPathW(LPCWSTR szWildCardPath, LPWSTR mszExpandedPathList, LPDWORD pcchPathListLength)
Definition: pdh_main.c:607
PDH_STATUS WINAPI PdhValidatePathExW(PDH_HLOG source, LPCWSTR path)
Definition: pdh_main.c:1104
PDH_STATUS WINAPI PdhGetFormattedCounterValue(PDH_HCOUNTER handle, DWORD format, LPDWORD type, PPDH_FMT_COUNTERVALUE value)
Definition: pdh_main.c:737
static BOOL pdh_match_path(LPCWSTR fullpath, LPCWSTR path)
Definition: pdh_main.c:188
PDH_STATUS WINAPI PdhLookupPerfIndexByNameA(LPCSTR machine, LPCSTR name, LPDWORD index)
Definition: pdh_main.c:803
PDH_STATUS WINAPI PdhRemoveCounter(PDH_HCOUNTER handle)
Definition: pdh_main.c:966
PDH_STATUS WINAPI PdhGetCounterInfoA(PDH_HCOUNTER handle, BOOLEAN text, LPDWORD size, PPDH_COUNTER_INFO_A info)
Definition: pdh_main.c:616
PDH_STATUS WINAPI PdhAddEnglishCounterW(PDH_HQUERY query, LPCWSTR path, DWORD_PTR userdata, PDH_HCOUNTER *counter)
Definition: pdh_main.c:290
static void CALLBACK collect_uptime(struct counter *counter)
Definition: pdh_main.c:159
static struct counter * create_counter(void)
Definition: pdh_main.c:90
static WCHAR * pdh_strdup_aw(const char *src)
Definition: pdh_main.c:52
PDH_STATUS WINAPI PdhAddCounterA(PDH_HQUERY query, LPCSTR path, DWORD_PTR userdata, PDH_HCOUNTER *counter)
Definition: pdh_main.c:205
PDH_STATUS WINAPI PdhSetCounterScaleFactor(PDH_HCOUNTER handle, LONG factor)
Definition: pdh_main.c:989
static PDH_STATUS format_value(struct counter *counter, DWORD format, union value *raw1, union value *raw2, PDH_FMT_COUNTERVALUE *value)
Definition: pdh_main.c:301
PDH_STATUS WINAPI PdhGetCounterInfoW(PDH_HCOUNTER handle, BOOLEAN text, LPDWORD size, PPDH_COUNTER_INFO_W info)
Definition: pdh_main.c:658
PDH_STATUS WINAPI PdhCalculateCounterFromRawValue(PDH_HCOUNTER handle, DWORD format, PPDH_RAW_COUNTER raw1, PPDH_RAW_COUNTER raw2, PPDH_FMT_COUNTERVALUE value)
Definition: pdh_main.c:333
static CRITICAL_SECTION_DEBUG pdh_handle_cs_debug
Definition: pdh_main.c:43
PDH_STATUS WINAPI PdhExpandWildCardPathW(LPCWSTR szDataSource, LPCWSTR szWildCardPath, LPWSTR mszExpandedPathList, LPDWORD pcchPathListLength, DWORD dwFlags)
Definition: pdh_main.c:589
PDH_STATUS WINAPI PdhGetLogFileTypeA(const char *log, DWORD *type)
Definition: pdh_main.c:1255
PDH_STATUS WINAPI PdhCollectQueryDataWithTime(PDH_HQUERY handle, LONGLONG *timestamp)
Definition: pdh_main.c:544
PDH_STATUS WINAPI PdhBindInputDataSourceA(PDH_HLOG *source, const char *filenamelist)
Definition: pdh_main.c:1273
double WINAPI PdhVbGetDoubleCounterValue(PDH_HCOUNTER handle, PDH_STATUS *counter_status)
Definition: pdh_main.c:1072
PDH_STATUS WINAPI PdhValidatePathA(LPCSTR path)
Definition: pdh_main.c:1016
PDH_STATUS WINAPI PdhOpenQueryA(LPCSTR source, DWORD_PTR userdata, PDH_HQUERY *query)
Definition: pdh_main.c:922
PDH_STATUS WINAPI PdhEnumObjectItemsA(LPCSTR szDataSource, LPCSTR szMachineName, LPCSTR szObjectName, LPSTR mszCounterList, LPDWORD pcchCounterListLength, LPSTR mszInstanceList, LPDWORD pcchInstanceListLength, DWORD dwDetailLevel, DWORD dwFlags)
Definition: pdh_main.c:1218
static void destroy_query(struct query *query)
Definition: pdh_main.c:136
PDH_STATUS WINAPI PdhMakeCounterPathA(PDH_COUNTER_PATH_ELEMENTS_A *e, LPSTR buffer, LPDWORD buflen, DWORD flags)
Definition: pdh_main.c:1119
PDH_STATUS WINAPI PdhExpandWildCardPathA(LPCSTR szDataSource, LPCSTR szWildCardPath, LPSTR mszExpandedPathList, LPDWORD pcchPathListLength, DWORD dwFlags)
Definition: pdh_main.c:580
static PDH_STATUS validate_path(LPCWSTR path)
Definition: pdh_main.c:1032
PDH_STATUS WINAPI PdhConnectMachineA(const char *name)
Definition: pdh_main.c:1291
#define TYPE_PROCESSOR_TIME
Definition: pdh_main.c:165
PDH_STATUS WINAPI PdhMakeCounterPathW(PDH_COUNTER_PATH_ELEMENTS_W *e, LPWSTR buffer, LPDWORD buflen, DWORD flags)
Definition: pdh_main.c:1170
#define PDH_MAGIC_QUERY
Definition: pdh_main.c:110
PDH_STATUS WINAPI PdhEnumObjectItemsW(LPCWSTR szDataSource, LPCWSTR szMachineName, LPCWSTR szObjectName, LPWSTR mszCounterList, LPDWORD pcchCounterListLength, LPWSTR mszInstanceList, LPDWORD pcchInstanceListLength, DWORD dwDetailLevel, DWORD dwFlags)
Definition: pdh_main.c:1232
static CRITICAL_SECTION pdh_handle_cs
Definition: pdh_main.c:42
PDH_STATUS WINAPI PdhExpandCounterPathA(LPCSTR szWildCardPath, LPSTR mszExpandedPathList, LPDWORD pcchPathListLength)
Definition: pdh_main.c:598
PDH_STATUS WINAPI PdhGetDllVersion(LPDWORD version)
Definition: pdh_main.c:724
PDH_STATUS WINAPI PdhLookupPerfNameByIndexA(LPCSTR machine, DWORD index, LPSTR buffer, LPDWORD size)
Definition: pdh_main.c:855
PDH_STATUS WINAPI PdhValidatePathExA(PDH_HLOG source, LPCSTR path)
Definition: pdh_main.c:1089
PDH_STATUS WINAPI PdhLookupPerfNameByIndexW(LPCWSTR machine, DWORD index, LPWSTR buffer, LPDWORD size)
Definition: pdh_main.c:883
#define PDH_MAGIC_COUNTER
Definition: pdh_main.c:88
static void destroy_counter(struct counter *counter)
Definition: pdh_main.c:102
PDH_STATUS WINAPI PdhLookupPerfIndexByNameW(LPCWSTR machine, LPCWSTR name, LPDWORD index)
Definition: pdh_main.c:828
PDH_STATUS WINAPI PdhVbAddCounter(PDH_HQUERY query, LPCSTR path, PDH_HCOUNTER *counter)
Definition: pdh_main.c:1060
PDH_STATUS WINAPI PdhGetRawCounterValue(PDH_HCOUNTER handle, LPDWORD type, PPDH_RAW_COUNTER value)
Definition: pdh_main.c:771
PDH_STATUS WINAPI PdhGetCounterTimeBase(PDH_HCOUNTER handle, LONGLONG *base)
Definition: pdh_main.c:700
PDH_STATUS WINAPI PdhAddCounterW(PDH_HQUERY hquery, LPCWSTR path, DWORD_PTR userdata, PDH_HCOUNTER *hcounter)
Definition: pdh_main.c:227
PDH_STATUS WINAPI PdhOpenQueryW(LPCWSTR source, DWORD_PTR userdata, PDH_HQUERY *handle)
Definition: pdh_main.c:940
#define TYPE_UPTIME
Definition: pdh_main.c:169
static void CALLBACK collect_processor_time(struct counter *counter)
Definition: pdh_main.c:153
PDH_STATUS WINAPI PdhSetDefaultRealTimeDataSource(DWORD source)
Definition: pdh_main.c:1246
PDH_STATUS WINAPI PdhBindInputDataSourceW(PDH_HLOG *source, const WCHAR *filenamelist)
Definition: pdh_main.c:1282
PDH_STATUS WINAPI PdhCollectQueryData(PDH_HQUERY handle)
Definition: pdh_main.c:429
PDH_STATUS WINAPI PdhAddEnglishCounterA(PDH_HQUERY query, LPCSTR path, DWORD_PTR userdata, PDH_HCOUNTER *counter)
Definition: pdh_main.c:277
PDH_STATUS WINAPI PdhValidatePathW(LPCWSTR path)
Definition: pdh_main.c:1042
static const struct source counter_sources[]
Definition: pdh_main.c:173
static DWORD CALLBACK collect_query_thread(void *arg)
Definition: pdh_main.c:454
static struct query * create_query(void)
Definition: pdh_main.c:123
PDH_STATUS WINAPI PdhCloseQuery(PDH_HQUERY handle)
Definition: pdh_main.c:362
static BOOL is_local_machine(const WCHAR *name, DWORD len)
Definition: pdh_main.c:179
#define PDH_NOT_IMPLEMENTED
Definition: pdhmsg.h:68
#define PDH_INVALID_HANDLE
Definition: pdhmsg.h:45
#define PDH_CSTATUS_VALID_DATA
Definition: pdhmsg.h:24
#define PDH_MEMORY_ALLOCATION_FAILURE
Definition: pdhmsg.h:44
#define PDH_INVALID_DATA
Definition: pdhmsg.h:55
#define PDH_STRING_NOT_FOUND
Definition: pdhmsg.h:69
#define PDH_NO_DATA
Definition: pdhmsg.h:31
#define PDH_CSTATUS_NO_MACHINE
Definition: pdhmsg.h:26
#define PDH_MORE_DATA
Definition: pdhmsg.h:28
#define PDH_INVALID_ARGUMENT
Definition: pdhmsg.h:46
#define PDH_CSTATUS_BAD_COUNTERNAME
Definition: pdhmsg.h:49
#define PDH_CSTATUS_NO_COUNTER
Definition: pdhmsg.h:42
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
static unsigned __int64 next
Definition: rand_nt.c:6
#define calloc
Definition: rosglue.h:14
#define LIST_FOR_EACH(cursor, list)
Definition: list.h:226
#define LIST_FOR_EACH_SAFE(cursor, cursor2, list)
Definition: list.h:230
#define memset(x, y, z)
Definition: compat.h:39
#define log(outFile, fmt,...)
Definition: util.h:15
#define TRACE(s)
Definition: solgame.cpp:4
DWORD dwHighDateTime
Definition: mapidefs.h:66
DWORD dwLowDateTime
Definition: mapidefs.h:65
LONGLONG SecondValue
Definition: pdh.h:78
DWORD type
Definition: pdh_main.c:75
DWORD magic
Definition: pdh_main.c:72
DWORD status
Definition: pdh_main.c:76
struct list entry
Definition: pdh_main.c:73
DWORD_PTR user
Definition: pdh_main.c:79
union value two
Definition: pdh_main.c:85
LONG defaultscale
Definition: pdh_main.c:78
union value one
Definition: pdh_main.c:84
DWORD_PTR queryuser
Definition: pdh_main.c:80
FILETIME stamp
Definition: pdh_main.c:82
LONGLONG base
Definition: pdh_main.c:81
LONG scale
Definition: pdh_main.c:77
WCHAR * path
Definition: pdh_main.c:74
void(CALLBACK *collect)(struct counter *)
Definition: filter.c:185
Definition: list.h:15
Definition: name.c:39
struct list counters
Definition: pdh_main.c:120
HANDLE wait
Definition: pdh_main.c:118
DWORD_PTR user
Definition: pdh_main.c:115
DWORD magic
Definition: pdh_main.c:114
HANDLE thread
Definition: pdh_main.c:116
DWORD interval
Definition: pdh_main.c:117
HANDLE stop
Definition: pdh_main.c:119
DWORD index
Definition: pdh_main.c:145
void(CALLBACK *collect)(struct counter *)
DWORD type
Definition: pdh_main.c:148
const WCHAR * path
Definition: pdh_main.c:146
LONGLONG base
Definition: pdh_main.c:150
LONG scale
Definition: pdh_main.c:149
Definition: ps.c:97
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:587
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:669
#define LIST_ENTRY(type)
Definition: queue.h:175
#define DWORD_PTR
Definition: treelist.c:76
const char * LPCSTR
Definition: typedefs.h:52
const uint16_t * LPCWSTR
Definition: typedefs.h:57
uint32_t DWORD_PTR
Definition: typedefs.h:65
uint16_t * LPWSTR
Definition: typedefs.h:56
int64_t LONGLONG
Definition: typedefs.h:68
uint32_t * LPDWORD
Definition: typedefs.h:59
char * LPSTR
Definition: typedefs.h:51
Definition: pdh_main.c:64
LONGLONG largevalue
Definition: pdh_main.c:67
LONG longvalue
Definition: pdh_main.c:65
double doublevalue
Definition: pdh_main.c:66
#define SecureZeroMemory
Definition: winbase.h:1441
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
#define MAX_COMPUTERNAME_LENGTH
Definition: winbase.h:268
void * arg
Definition: msvc.h:10
#define WINAPI
Definition: msvc.h:6