public static float ComputeCounterValue(CounterSample oldSample, CounterSample newSample)
        {
            int counterType = (int)newSample.CounterType;

            if (oldSample.SystemFrequency == 0L)
            {
                if ((((counterType != 0x20020400) && (counterType != 0x10000)) && ((counterType != 0) && (counterType != 0x10100))) && ((counterType != 0x100) && (counterType != 0x42030500)))
                {
                    return(0f);
                }
            }
            else if (oldSample.CounterType != newSample.CounterType)
            {
                throw new InvalidOperationException(SR.GetString("MismatchedCounterTypes"));
            }
            if (counterType == 0x30240500)
            {
                return(GetElapsedTime(oldSample, newSample));
            }
            Microsoft.Win32.NativeMethods.PDH_RAW_COUNTER newPdhValue = new Microsoft.Win32.NativeMethods.PDH_RAW_COUNTER();
            Microsoft.Win32.NativeMethods.PDH_RAW_COUNTER oldPdhValue = new Microsoft.Win32.NativeMethods.PDH_RAW_COUNTER();
            FillInValues(oldSample, newSample, oldPdhValue, newPdhValue);
            LoadPerfCounterDll();
            Microsoft.Win32.NativeMethods.PDH_FMT_COUNTERVALUE pFmtValue = new Microsoft.Win32.NativeMethods.PDH_FMT_COUNTERVALUE();
            long systemFrequency = newSample.SystemFrequency;
            int  error           = Microsoft.Win32.SafeNativeMethods.FormatFromRawValue((uint)counterType, 0x9200, ref systemFrequency, newPdhValue, oldPdhValue, pFmtValue);

            switch (error)
            {
            case 0:
                return((float)pFmtValue.data);

            case -2147481640:
            case -2147481642:
            case -2147481643:
                return(0f);
            }
            throw new Win32Exception(error, SR.GetString("PerfCounterPdhError", new object[] { error.ToString("x", CultureInfo.InvariantCulture) }));
        }
        public static float ComputeCounterValue(CounterSample oldSample, CounterSample newSample)
        {
            int counterType = (int) newSample.CounterType;
            if (oldSample.SystemFrequency == 0L)
            {
                if ((((counterType != 0x20020400) && (counterType != 0x10000)) && ((counterType != 0) && (counterType != 0x10100))) && ((counterType != 0x100) && (counterType != 0x42030500)))
                {
                    return 0f;
                }
            }
            else if (oldSample.CounterType != newSample.CounterType)
            {
                throw new InvalidOperationException(SR.GetString("MismatchedCounterTypes"));
            }
            if (counterType == 0x30240500)
            {
                return GetElapsedTime(oldSample, newSample);
            }
            Microsoft.Win32.NativeMethods.PDH_RAW_COUNTER newPdhValue = new Microsoft.Win32.NativeMethods.PDH_RAW_COUNTER();
            Microsoft.Win32.NativeMethods.PDH_RAW_COUNTER oldPdhValue = new Microsoft.Win32.NativeMethods.PDH_RAW_COUNTER();
            FillInValues(oldSample, newSample, oldPdhValue, newPdhValue);
            LoadPerfCounterDll();
            Microsoft.Win32.NativeMethods.PDH_FMT_COUNTERVALUE pFmtValue = new Microsoft.Win32.NativeMethods.PDH_FMT_COUNTERVALUE();
            long systemFrequency = newSample.SystemFrequency;
            int error = Microsoft.Win32.SafeNativeMethods.FormatFromRawValue((uint) counterType, 0x9200, ref systemFrequency, newPdhValue, oldPdhValue, pFmtValue);
            switch (error)
            {
                case 0:
                    return (float) pFmtValue.data;

                case -2147481640:
                case -2147481642:
                case -2147481643:
                    return 0f;
            }
            throw new Win32Exception(error, SR.GetString("PerfCounterPdhError", new object[] { error.ToString("x", CultureInfo.InvariantCulture) }));
        }
        private static void FillInValues(CounterSample oldSample, CounterSample newSample, Microsoft.Win32.NativeMethods.PDH_RAW_COUNTER oldPdhValue, Microsoft.Win32.NativeMethods.PDH_RAW_COUNTER newPdhValue)
        {
            int counterType = (int)newSample.CounterType;

            switch (counterType)
            {
            case 0:
            case 0x100:
            case 0x10000:
            case 0x400500:
            case 0x10100:
            case 0x400400:
                newPdhValue.FirstValue  = newSample.RawValue;
                newPdhValue.SecondValue = 0L;
                oldPdhValue.FirstValue  = oldSample.RawValue;
                oldPdhValue.SecondValue = 0L;
                return;

            case 0x410400:
            case 0x650500:
            case 0x450400:
            case 0x10410400:
            case 0x20610500:
                newPdhValue.FirstValue  = newSample.RawValue;
                newPdhValue.SecondValue = newSample.TimeStamp;
                oldPdhValue.FirstValue  = oldSample.RawValue;
                oldPdhValue.SecondValue = oldSample.TimeStamp;
                return;

            case 0x550500:
                newPdhValue.FirstValue  = newSample.RawValue;
                newPdhValue.SecondValue = newSample.TimeStamp100nSec;
                oldPdhValue.FirstValue  = oldSample.RawValue;
                oldPdhValue.SecondValue = oldSample.TimeStamp100nSec;
                return;

            case 0x450500:
            case 0x10410500:
            case 0x20410500:
            case 0x22410500:
            case 0x21410500:
            case 0x23410500:
                newPdhValue.FirstValue  = newSample.RawValue;
                newPdhValue.SecondValue = newSample.TimeStamp;
                oldPdhValue.FirstValue  = oldSample.RawValue;
                oldPdhValue.SecondValue = oldSample.TimeStamp;
                switch (counterType)
                {
                case 0x22410500:
                case 0x23410500:
                    newPdhValue.FirstValue *= (uint)newSample.CounterFrequency;
                    if (oldSample.CounterFrequency != 0L)
                    {
                        oldPdhValue.FirstValue *= (uint)oldSample.CounterFrequency;
                    }
                    break;
                }
                if ((counterType & 0x2000000) == 0x2000000)
                {
                    newPdhValue.MultiCount = (int)newSample.BaseValue;
                    oldPdhValue.MultiCount = (int)oldSample.BaseValue;
                }
                return;

            case 0x20020400:
            case 0x20020500:
            case 0x20470500:
            case 0x20670500:
            case 0x20c20400:
            case 0x20570500:
            case 0x30020400:
            case 0x40020500:
                newPdhValue.FirstValue  = newSample.RawValue;
                newPdhValue.SecondValue = newSample.BaseValue;
                oldPdhValue.FirstValue  = oldSample.RawValue;
                oldPdhValue.SecondValue = oldSample.BaseValue;
                return;

            case 0x20510500:
            case 0x22510500:
            case 0x21510500:
            case 0x23510500:
                newPdhValue.FirstValue  = newSample.RawValue;
                newPdhValue.SecondValue = newSample.TimeStamp100nSec;
                oldPdhValue.FirstValue  = oldSample.RawValue;
                oldPdhValue.SecondValue = oldSample.TimeStamp100nSec;
                if ((counterType & 0x2000000) == 0x2000000)
                {
                    newPdhValue.MultiCount = (int)newSample.BaseValue;
                    oldPdhValue.MultiCount = (int)oldSample.BaseValue;
                }
                return;
            }
            newPdhValue.FirstValue  = 0L;
            newPdhValue.SecondValue = 0L;
            oldPdhValue.FirstValue  = 0L;
            oldPdhValue.SecondValue = 0L;
        }
 public static extern int FormatFromRawValue(uint dwCounterType, uint dwFormat, ref long pTimeBase, Microsoft.Win32.NativeMethods.PDH_RAW_COUNTER pRawValue1, Microsoft.Win32.NativeMethods.PDH_RAW_COUNTER pRawValue2, Microsoft.Win32.NativeMethods.PDH_FMT_COUNTERVALUE pFmtValue);