/// <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(); }
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); }
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); }