示例#1
0
        // ReSharper restore InconsistentNaming

        public CpuId(int thread)
        {
            uint threadMaskWith;
            uint coreMaskWith;

            Thread = thread;
            uint maxCpuidExt;

            if (thread >= 64)
            {
                throw new ArgumentOutOfRangeException(nameof(thread));
            }


            ulong mask = 1UL << thread;
            uint  maxCpuid;

            if (OpCode.CpuidTx(CPUID_0, 0, out uint eax, out uint ebx, out uint ecx, out uint edx, mask))
            {
                if (eax > 0)
                {
                    maxCpuid = eax;
                }
                else
                {
                    return;
                }


                StringBuilder vendorBuilder = new StringBuilder();
                AppendRegister(vendorBuilder, ebx);
                AppendRegister(vendorBuilder, edx);
                AppendRegister(vendorBuilder, ecx);
                string cpuVendor = vendorBuilder.ToString();
                switch (cpuVendor)
                {
                case "GenuineIntel":
                    Vendor = Vendor.Intel;
                    break;

                case "AuthenticAMD":
                    Vendor = Vendor.AMD;
                    break;

                default:
                    Vendor = Vendor.Unknown;
                    break;
                }

                if (OpCode.CpuidTx(CPUID_EXT, 0, out eax, out _, out _, out _, mask))
                {
                    if (eax > CPUID_EXT)
                    {
                        maxCpuidExt = eax - CPUID_EXT;
                    }
                    else
                    {
                        return;
                    }
                }
                else
                {
                    throw new ArgumentOutOfRangeException(nameof(thread));
                }
            }