C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[69036] Re:Re:Re:Re:CPU Serial 번호(어셈블리어) (자답 및 재질문)
김도완 [purplecofe2] 2875 읽음    2013-01-22 20:23
바이오스에 진입해서 cpu 설정등에서 활성화가 가능하고 간단히 명령 라인으로 확인하는 방법은

> wmic cpu get processorid, uniqueid 이렇게 하시면 될겁니다.

> wmic cpu하면 내용이 다 보입니다.

단일 아이디를 만들 땐 bios 시리얼 번호와 NIC의 MAC을 조합하는게 가장 좋다고 합니다.

> wmic bios 요렇게 하면 바이오스 정보가 다 보입니다.

성공하시길~


LeeD 님이 쓰신 글 :
: #include <comutil.h>
: #include <assert.h>
: //---------------------------------------------------------------------------
: #pragma link "bcbatl.lib"
: //---------------------------------------------------------------------------
: void __stdcall _com_issue_error(long HRESULT) throw(_com_error)
: {
:     //ATLASSERT(HRESULT);
:     assert(HRESULT); // 본래는 _com_error 객체를 던지는 에러처리를 해야 함.
: }
: //---------------------------------------------------------------------------
:
: 이렇게 추가하니까 에러는 사라졌네요ㅎ
:
: 그런데 첫번째 if문에서 바로 Error1이 뜨네요.
:
: 이것도 BIOS에서 시리얼 번호에 대한 기능이 꺼져있어서 그런건가요?
:
: 그렇다면 시리얼 번호에대한 기능을 enable하는 법좀 알려주세용
:
: 아니면 다른 문제가 있는건가요?ㅜ
:
: 그리고 그냥 첫번째 if문 주석걸고 실행해 보았더니 UniqueId 가 NULL값이 나오네요ㅜㅜ
:
: LeeD 님이 쓰신 글 :
: : 김도완님 감사합나디^^
: :
: : 제가 사이트에서 예제소스를 보고 작성해 보았는데요. ERROR가 나네요ㅜㅜ
: :
: : [ILINK32 Error] Error: Unresolved external '__stdcall _com_issue_error(long)' referenced from C:\USERS\CLONIX\DOCUMENTS\RAD STUDIO\PROJECTS\DEBUG\CPUID2CPP.OBJ
: : [ILINK32 Error] Error: Unresolved external '__stdcall _com_util::ConvertStringToBSTR(const char *)' referenced from C:\USERS\CLONIX\DOCUMENTS\RAD STUDIO\PROJECTS\DEBUG\CPUID2CPP.OBJ
: :
: : 뭔가 잘못된 부분 있나요?ㅜㅜ
: :
: : 그리고 혹시 BIOS enable 시키는 법도 알려주시면 감사하겠습니다.ㅠ
: :
: : //---------------------------------------------------------------------------
: :
: : #include <vcl.h>
: : #pragma hdrstop
: :
: : #include "CPUID2cpp.h"
: :
: : #define _WIN32_DCOM
: : #include <iostream>
: : #include <comdef.h>
: : #include <Wbemidl.h>
: :
: : #pragma comment(lib, "wbemuuid.lib")
: :
: : using namespace std;
: : //---------------------------------------------------------------------------
: : #pragma package(smart_init)
: : #pragma resource "*.dfm"
: : TMain *Main;
: : //---------------------------------------------------------------------------
: : __fastcall TMain::TMain(TComponent* Owner)
: :     : TForm(Owner)
: : {
: : }
: : //---------------------------------------------------------------------------
: : int GetCpuSerial()
: : {
: :     HRESULT hres;
: :
: :     hres =  CoInitializeEx(0, COINIT_MULTITHREADED);
: :     if (FAILED(hres))
: :     {
: :         ShowMessage("Error1");
: :         return 1;                  // Program has failed.
: :     }
: :
: :     hres =  CoInitializeSecurity(
: :         NULL,
: :         -1,                          // COM authentication
: :         NULL,                        // Authentication services
: :         NULL,                        // Reserved
: :         RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication
: :         RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation
: :         NULL,                        // Authentication info
: :         EOAC_NONE,                   // Additional capabilities
: :         NULL                         // Reserved
: :         );
: :
: :
: :     if (FAILED(hres))
: :     {
: :         CoUninitialize();
: :         ShowMessage("Error2");
: :         return 1;                    // Program has failed.
: :     }
: :
: :     IWbemLocator *pLoc = NULL;
: :
: :     hres = CoCreateInstance(
: :         CLSID_WbemLocator,
: :         0,
: :         CLSCTX_INPROC_SERVER,
: :         IID_IWbemLocator, (LPVOID *) &pLoc);
: :
: :     if (FAILED(hres))
: :     {
: :         CoUninitialize();
: :         ShowMessage("Error3");
: :         return 1;                 // Program has failed.
: :     }
: :
: :     IWbemServices *pSvc = NULL;
: :
: :     hres = pLoc->ConnectServer(
: :         _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace
: :          NULL,                    // User name. NULL = current user
: :          NULL,                    // User password. NULL = current
: :          0,                       // Locale. NULL indicates current
: :         NULL,                    // Security flags.
: :         0,                       // Authority (for example, Kerberos)
: :         0,                       // Context object
: :         &pSvc                    // pointer to IWbemServices proxy
: :         );
: :
: :     if (FAILED(hres))
: :     {
: :         pLoc->Release();
: :         CoUninitialize();
: :         ShowMessage("Error4");
: :         return 1;                // Program has failed.
: :     }
: :
: :     Main->Memo1->Lines->Add("Connected to ROOT\\CIMV2 WMI namespace");
: :
: :     hres = CoSetProxyBlanket(
: :        pSvc,                        // Indicates the proxy to set
: :        RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
: :        RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
: :        NULL,                        // Server principal name
: :        RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx
: :        RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
: :        NULL,                        // client identity
: :        EOAC_NONE                    // proxy capabilities
: :     );
: :
: :     if (FAILED(hres))
: :     {
: :         pSvc->Release();
: :         pLoc->Release();
: :         CoUninitialize();
: :         ShowMessage("Error5");
: :         return 1;               // Program has failed.
: :     }
: :
: :     IEnumWbemClassObject* pEnumerator = NULL;
: :     hres = pSvc->ExecQuery(
: :         bstr_t("WQL"),
: :         bstr_t("SELECT * FROM Win32_OperatingSystem"),
: :         WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
: :         NULL,
: :         &pEnumerator);
: :
: :     if (FAILED(hres))
: :     {
: :         pSvc->Release();
: :         pLoc->Release();
: :         CoUninitialize();
: :         ShowMessage("Error6");
: :         return 1;               // Program has failed.
: :     }
: :
: :     IWbemClassObject *pclsObj;
: :     ULONG uReturn = 0;
: :
: :     while (pEnumerator)
: :     {
: :         HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
: :             &pclsObj, &uReturn);
: :
: :         if(0 == uReturn)
: :         {
: :             break;
: :         }
: :
: :         VARIANT vtProp;
: :
: :         // Get the value of the Name property
: :         hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
: : //        wcout << " OS Name : " << vtProp.bstrVal << endl;
: :         Main->Memo1->Lines->Add(" OS Name : " + (String)vtProp.bstrVal);
: :         VariantClear(&vtProp);
: :
: :         pclsObj->Release();
: :     }
: :
: :     pSvc->Release();
: :     pLoc->Release();
: :     pEnumerator->Release();
: :     pclsObj->Release();
: :     CoUninitialize();
: :
: :     return 0;
: : }
: : void __fastcall TMain::Button1Click(TObject *Sender)
: : {
: :     GetCpuSerial();
: : }
: : //---------------------------------------------------------------------------
: :
: : 김도완 님이 쓰신 글 :
: : : 대부분 바이오스에서 시리얼 번호에 대한 기능이 꺼져있다고 합니다. 바이오스에서 enable시킨 후 테스트해보시고,
: : :
: : : 다른 방법으로 WMI를 이용하는 방법이 있습니다.
: : :
: : : 대충보니 UniqueID라는게 맞는 것 같네요.
: : :
: : : http://msdn.microsoft.com/en-us/library/aa394373.aspx
: : :
: : : 참고하시길~
: : :
: : :
: : : LeeD 님이 쓰신 글 :
: : : : 안녕하세요.^^
: : : :
: : : : //---------------------------------------------------------------------------
: : : : #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가 나오네요.ㅜ
: : : :
: : : : 저는 어디가 잘못되었는지 잘 모르겠어요ㅠㅠ
: : : :
: : : : 도움 주시면 감사하겠습니다.

+ -

관련 글 리스트
69027 CPU Serial 번호(어셈블리어) LeeD 2254 2013/01/21
69028     Re:CPU Serial 번호(어셈블리어) 김도완 1809 2013/01/21
69029         Re:Re:CPU Serial 번호(어셈블리어) LeeD 2048 2013/01/21
69032             Re:Re:Re:CPU Serial 번호(어셈블리어) (자답 및 재질문) LeeD 1908 2013/01/21
69036                 Re:Re:Re:Re:CPU Serial 번호(어셈블리어) (자답 및 재질문) 김도완 2875 2013/01/22
69037                     Re:Re:Re:Re:Re:감사합니당^^(내용무) LeeD 2150 2013/01/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.