안녕하세요.^^
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMain *Main;
//---------------------------------------------------------------------------
__fastcall TMain::TMain(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
#pragma pack(push, 1)
struct TCPUID
{
DWORD Version;
DWORD Other;
DWORD ExtendedFeatures;
DWORD Features;
};
#pragma pack(pop)
#pragma option push -w-
void __fastcall CPU_ID(TCPUID* CpuID)
{
__asm
{
PUSH EBX
PUSH EDI
MOV EDI, EAX
MOV EAX,1
DW 0xA20F
STOSD
MOV EAX, EBX
STOSD
MOV EAX, ECX
STOSD
MOV EAX, EDX
STOSD
POP EDI
POP EBX
}
}
void __fastcall CPU_Serial(unsigned __int64* SerialNumber)
{
__asm
{
PUSH EBX
PUSH EDI
MOV EDI, EAX
MOV EAX, 3
DW 0xA20F
MOV EAX, ECX
STOSD
MOV EAX, EDX
STOSD
POP EDI
POP EBX
}
}
bool IsCPUIDAvailable(void)
{
__asm
{
PUSHFD
POP EAX
MOV EDX, EAX
XOR EAX, 0x00200000
PUSH EAX
POPFD
PUSHFD
POP EAX
XOR EAX, EDX
SHR EAX, 21
}
}
bool GetCPUSerialNumber(unsigned __int64 *SerialNumber)
{
*SerialNumber = 0;
if( IsCPUIDAvailable() )
{
TCPUID CpuID;
memset(&CpuID, 0, sizeof(TCPUID));
CPU_ID(&CpuID);
if( CpuID.Features & 0x00040000 )
{
CPU_Serial(SerialNumber);
return true;
}
}
return false;
}
#pragma option pop
void __fastcall TMain::Button1Click(TObject *Sender)
{
unsigned __int64 SerialNumber = 0;
if( GetCPUSerialNumber(&SerialNumber))
{
ShowMessage(SerialNumber);
}
}
//---------------------------------------------------------------------------
제가 CPU Serial번호를 가져오기 위하여 위와 같이 코딩하였는데요.
GetCPUSerialNumber(&SerialNumber)의 리턴값이 false가 나오네요.ㅜ
저는 어디가 잘못되었는지 잘 모르겠어요ㅠㅠ
도움 주시면 감사하겠습니다.
|