获取CPUID等

  1 unit CommonUnit;
  2 
  3 interface
  4 
  5 uses
  6   Windows, SysUtils, DateUtils;
  7 
  8 Const
  9   CPUVendorIDs: array [0 .. 5] of string = ('GenuineIntel', 'UMC UMC UMC',
 10     'AuthenticAMD', 'CyrixInstead', 'NexGenDriven', 'CentaurHauls');
 11   // 将CPU厂家信息转换成字串形式
 12   CPUVendors: array [0 .. 5] of string = ('Intel', 'UMC', 'AMD', 'Cyrix',
 13     'NexGen', 'CentaurHauls');
 14 
 15 type
 16   TVendor = array [0 .. 11] of AnsiChar;
 17 
 18   { 将AnsiString的乱码转换成能正常显示的Utf8编码的字符串 }
 19 function DecodeUtf8Str(const S: string): WideString;
 20 function DateToInt64(date: TDateTime): Int64;
 21 function Int64ToDate(num: Int64): TDateTime;
 22 
 23 function GetCPUID: string;
 24 function GetIdeSerialNumber: string;
 25 function GetCPUVendor: TVendor;
 26 function GetCPUV: string;
 27 
 28 implementation
 29 
 30 function DecodeUtf8Str(const S: string): WideString;
 31 var
 32   lenSrc, lenDst: Integer;
 33 begin
 34   lenSrc := Length(S);
 35   if (lenSrc = 0) then
 36     Exit;
 37   lenDst := MultiByteToWideChar(CP_UTF8, 0, Pointer(S), lenSrc, nil, 0);
 38   SetLength(Result, lenDst);
 39   MultiByteToWideChar(CP_UTF8, 0, Pointer(S), lenSrc, Pointer(Result), lenDst);
 40 end;
 41 
 42 function DateToInt64(date: TDateTime): Int64;
 43 var
 44   Bias: Integer;
 45   a1, a2: Extended;
 46   T1, T2: TDateTime;
 47   TS, TS2: TTimeStamp;
 48   pTime: _TIME_ZONE_INFORMATION;
 49 begin
 50   GetTimeZoneInformation(pTime); // 获取时区
 51   Bias := pTime.Bias;
 52   T1 := IncMinute(date, Bias);
 53   T2 := EncodeDateTime(1970, 1, 1, 0, 0, 0, 0);
 54   TS := DateTimeToTimeStamp(T1);
 55   TS2 := DateTimeToTimeStamp(T2);
 56   a1 := TimeStampToMSecs(TS);
 57   a2 := TimeStampToMSecs(TS2);
 58 
 59   Result := StrToInt64Def(FloatToStr(a1 - a2), 0);
 60 end;
 61 
 62 function Int64ToDate(num: Int64): TDateTime;
 63 var
 64   Bias: Integer;
 65   a1, a2: Extended;
 66   T1, T2: TDateTime;
 67   TS, TS2: TTimeStamp;
 68   pTime: _TIME_ZONE_INFORMATION;
 69 begin
 70   GetTimeZoneInformation(pTime); // 获取时区
 71   Bias := pTime.Bias;
 72   // Bias := Bias + pTime.DaylightBias;
 73   T2 := EncodeDateTime(1970, 1, 1, 0, 0, 0, 0);
 74   TS2 := DateTimeToTimeStamp(T2);
 75   a2 := TimeStampToMSecs(TS2);
 76   a1 := StrToFloat(IntToStr(num));
 77   TS := MSecsToTimeStamp(a1 + a2);
 78   T1 := TimeStampToDateTime(TS);
 79   T1 := IncMinute(T1, -Bias);
 80   Result := T1;
 81 end;
 82 
 83 function GetCPUID: string;
 84   procedure SetCPU(Handle: THandle; CPUNO: Integer);
 85   var
 86     ProcessAffinity: Cardinal;
 87     _SystemAffinity: Cardinal;
 88   begin
 89     GetProcessAffinityMask(Handle, ProcessAffinity, _SystemAffinity);
 90     ProcessAffinity := CPUNO;
 91     SetProcessAffinityMask(Handle, ProcessAffinity);
 92   end;
 93 
 94 const
 95   CPUINFO = '%s-%.8x%.8x';
 96 var
 97   iEax: Integer;
 98   iEbx: Integer;
 99   iEcx: Integer;
100   iEdx: Integer;
101 begin
102   SetCPU(GetCurrentProcess, 1);
103   asm
104     push ebx
105     push ecx
106     push edx
107     mov   eax, 1
108     DW $A20F// cpuid
109     mov   iEax, eax
110     mov   iEbx, ebx
111     mov   iEcx, ecx
112     mov   iEdx, edx
113     pop edx
114     pop ecx
115     pop ebx
116   end
117   ;
118 
119   Result := Format(CPUINFO, [GetCPUV, iEdx,iEax]);
120 end;
121 
122 function GetCPUV: string;
123 var
124   Vendor: string;
125   VendorID, I: Integer;
126 begin
127   Vendor := GetCPUVendor;
128   {for I := 0 to High(CPUVendorIDs) do
129   begin
130     If Vendor = CPUVendorIDs[I] then
131     begin
132       Vendor := CPUVendorIDs[I];
133       VendorID := I;
134       break;
135     end;
136   end; }
137   Result := Vendor;
138 end;
139 
140 // 获取CPU厂家信息,返回值为TVendor类型
141 function GetCPUVendor: TVendor;assembler;register;
142 asm
143   PUSH    EBX
144   PUSH    EDI
145   MOV     EDI,EAX
146   MOV     EAX,0
147   DW      $A20F  // CPUID指令
148   MOV     EAX,EBX
149   XCHG      EBX,ECX
150   MOV      ECX,4
151 @1:
152   STOSB
153   SHR     EAX,8
154   LOOP    @1
155   MOV     EAX,EDX
156   MOV      ECX,4
157 @2:
158   STOSB
159   SHR     EAX,8
160   LOOP    @2
161   MOV     EAX,EBX
162   MOV      ECX,4
163 @3:
164   STOSB
165   SHR     EAX,8
166   LOOP    @3
167   POP     EDI
168   POP     EBX
169 end;
170 
171 function GetIdeSerialNumber: string; // 获取硬盘的出厂系列号;
172 var
173   RootPath: array [0 .. 20] of char;
174   VolName: array [0 .. 255] of char;
175   SerialNumber: DWORD;
176   MaxCLength: DWORD;
177   FileSysFlag: DWORD;
178   FileSysName: array [0 .. 255] of char;
179 begin
180   RootPath := 'C:';
181 
182   GetVolumeInformation(RootPath, VolName, 255, @SerialNumber, MaxCLength,
183     FileSysFlag, FileSysName, 255);
184   Result := Format('%s', [IntToHex(SerialNumber, 8)]);
185 end;
186 
187 end.
原文地址:https://www.cnblogs.com/toosuo/p/3637555.html