c++32/64ビットコンパイラ簡単にcpuid低32ビットコードを取得
2093 ワード
64ビットはshellcodeを使用してインラインアセンブリコードを行い、32ビットのコンパイラは直接インラインアセンブリを使用すればよい.
UINT64 GetCpuID()
{
#if defined(_WIN64)//64
UCHAR shellcode[] =
"\xB8\x01\x00\x00\x00" //mov eax 1
"\x0F\xA2" //cpuid
"\xC3"; //ret
PVOID p = NULL;
// dep malloc
if (nullptr==(p = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE)))
fprintf(stderr,"VirtualAlloc Failed!!!");
if (nullptr==(memcpy(p, shellcode, sizeof(shellcode))))
fprintf(stderr, "WriteMemory Failed!!!");
typedef UINT64(*SCFN)(void);
SCFN code = (SCFN)p;
// shellcode,shellcode ret 。
UINT64 ret=code();
VirtualFree(p, sizeof(shellcode), MEM_RELEASE | MEM_COMMIT);
return ret;
#else
volatile UINT hcpu = 0U;
__asm
{
mov eax,1
cpuid
mov hcpu,eax
}
return hcpu;
#endif
}