Exemple #1
0
        /// <include file='doc\PerformanceCounterManager.uex' path='docs/doc[@for="PerformanceCounterManager.InitCounterDefinition"]/*' />
        /// <devdoc>
        ///     Initializes the PERF_COUNTER_DEFINITION structure
        /// </devdoc>
        /// <internalonly/>
        private static int InitCounterDefinition(IntPtr ptr, int counterIndex, ObjectData data, int nextCounterOffset)
        {
            NativeMethods.PERF_COUNTER_DEFINITION perfCounter = new NativeMethods.PERF_COUNTER_DEFINITION();
            perfCounter.ByteLength            = Marshal.SizeOf(typeof(NativeMethods.PERF_COUNTER_DEFINITION));
            perfCounter.CounterNameTitleIndex = data.FirstCounterId + 2 + counterIndex * 2;
            perfCounter.CounterNameTitlePtr   = 0;
            perfCounter.CounterHelpTitleIndex = data.FirstHelpId + 2 + counterIndex * 2;
            perfCounter.CounterHelpTitlePtr   = 0;
            perfCounter.DefaultScale          = 0;
            perfCounter.DetailLevel           = NativeMethods.PERF_DETAIL_NOVICE;

            int counterType = data.CounterTypes[counterIndex];

            perfCounter.CounterType = counterType;

            if (((counterType & NativeMethods.PERF_SIZE_LARGE) != 0) || (counterType == NativeMethods.PERF_AVERAGE_TIMER))
            {
                perfCounter.CounterSize = NativeMethods.LARGE_INTEGER_SIZE;
            }
            else   // Since we only support two counter sizes, if it's not an Int64, must be an Int32.
            {
                perfCounter.CounterSize = NativeMethods.DWORD_SIZE;
            }

            perfCounter.CounterOffset = nextCounterOffset;
            int retVal = perfCounter.CounterSize;

            Marshal.StructureToPtr(perfCounter, ptr, false);

            return(retVal);
        }
        public void CounterDefinitionSampleReadsInstanceValueCorrectlyInt64()
        {
            // ARRANGE
            var perfCounter = new NativeMethods.PERF_COUNTER_DEFINITION()
            {
                CounterNameTitleIndex = 0,
                CounterType           = 0,
                CounterOffset         = 6,
                CounterSize           = 8
            };

            var data = new byte[]
            {
                0, 0, 0, 0,
                0, 0, 5, 0,
                0, 0, 0, 0
            };

            GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned);

            IntPtr dataRef = handle.AddrOfPinnedObject();

            var sample = new CounterDefinitionSample(perfCounter, -1);

            // ACT
            sample.SetInstanceValue(0, dataRef);

            // ASSERT
            Assert.AreEqual(5, sample.GetInstanceValue(0));

            handle.Free();
        }
Exemple #3
0
        private static ThreadInfo GetThreadInfo(NativeMethods.PERF_OBJECT_TYPE type, IntPtr instancePtr, NativeMethods.PERF_COUNTER_DEFINITION[] counters)
        {
            ThreadInfo threadInfo = new ThreadInfo();

            for (int i = 0; i < counters.Length; i++)
            {
                NativeMethods.PERF_COUNTER_DEFINITION pERF_COUNTER_DEFINITION = counters[i];
                long num = NtProcessManager.ReadCounterValue(pERF_COUNTER_DEFINITION.CounterType, (IntPtr)((long)instancePtr + (long)pERF_COUNTER_DEFINITION.CounterOffset));
                switch (pERF_COUNTER_DEFINITION.CounterNameTitlePtr)
                {
                case 11:
                    threadInfo.threadId = (int)num;
                    break;

                case 12:
                    threadInfo.processId = (int)num;
                    break;

                case 13:
                    threadInfo.basePriority = (int)num;
                    break;

                case 14:
                    threadInfo.currentPriority = (int)num;
                    break;

                case 17:
                    threadInfo.startAddress = (IntPtr)num;
                    break;

                case 18:
                    threadInfo.threadState = (System.Diagnostics.ThreadState)num;
                    break;

                case 19:
                    threadInfo.threadWaitReason = NtProcessManager.GetThreadWaitReason((int)num);
                    break;
                }
            }
            return(threadInfo);
        }
Exemple #4
0
        private static ProcessInfo GetProcessInfo(NativeMethods.PERF_OBJECT_TYPE type, IntPtr instancePtr, NativeMethods.PERF_COUNTER_DEFINITION[] counters)
        {
            ProcessInfo processInfo = new ProcessInfo();

            for (int i = 0; i < counters.Length; i++)
            {
                NativeMethods.PERF_COUNTER_DEFINITION pERF_COUNTER_DEFINITION = counters[i];
                long num = NtProcessManager.ReadCounterValue(pERF_COUNTER_DEFINITION.CounterType, (IntPtr)((long)instancePtr + (long)pERF_COUNTER_DEFINITION.CounterOffset));
                switch (pERF_COUNTER_DEFINITION.CounterNameTitlePtr)
                {
                case 0:
                    processInfo.handleCount = (int)num;
                    break;

                case 1:
                    processInfo.poolPagedBytes = num;
                    break;

                case 2:
                    processInfo.poolNonpagedBytes = num;
                    break;

                case 4:
                    processInfo.virtualBytesPeak = num;
                    break;

                case 5:
                    processInfo.virtualBytes = num;
                    break;

                case 6:
                    processInfo.privateBytes = num;
                    break;

                case 7:
                    processInfo.pageFileBytes = num;
                    break;

                case 8:
                    processInfo.pageFileBytesPeak = num;
                    break;

                case 9:
                    processInfo.workingSetPeak = num;
                    break;

                case 10:
                    processInfo.workingSet = num;
                    break;

                case 12:
                    processInfo.processId = (int)num;
                    break;

                case 13:
                    processInfo.basePriority = (int)num;
                    break;
                }
            }
            return(processInfo);
        }