static Patcher() { if (IntPtr.Size != 8) { Error = "Not a 64 bit"; return; } PatchCpuid(typeof(Patcher).GetMethod("Cpuid", DefaultBinding)); if (Error != null) { return; } PatchCallSitePtr = GetMethodPtr(typeof(Patcher).GetMethod("PatchCallSite", DefaultBinding)); fixed(int *cpuInfo = new int[4]) { CpuFeatures = new ReplaceWithAttribute("<unused>"); Cpuid(1, cpuInfo); CpuFeatures.Cpiud1EDX = cpuInfo[3]; CpuFeatures.Cpiud1ECX = cpuInfo[2]; Cpuid(7, cpuInfo); CpuFeatures.Cpiud7EBX = cpuInfo[1]; CpuFeatures.Cpiud7ECX = cpuInfo[2]; Cpuid(0x80000001, cpuInfo); CpuFeatures.Cpiud80000001EDX = cpuInfo[3]; CpuFeatures.Cpiud80000001ECX = cpuInfo[2]; } }
internal bool CheckFeatures(ReplaceWithAttribute features) { return ((features.Cpiud1EDX & Cpiud1EDX) == Cpiud1EDX && (features.Cpiud1ECX & Cpiud1ECX) == Cpiud1ECX && (features.Cpiud7EBX & Cpiud7EBX) == Cpiud7EBX && (features.Cpiud7ECX & Cpiud7ECX) == Cpiud7ECX && (features.Cpiud80000001EDX & Cpiud80000001EDX) == Cpiud80000001EDX && (features.Cpiud80000001ECX & Cpiud80000001ECX) == Cpiud80000001ECX); }