获取硬件信息的delphi源码CPUID、操作系统、Mac物理地址、计算机名称、IP地址、用户名
{-----------------------------------------------------------------------------
作者:sushengmiyan 2013.01.26
备注:
功能:硬件信息获取单元
-----------------------------------------------------------------------------}
unit ApplicationHardWareInfo;
interface
uses
Windows, SysUtils, Classes, Registry, Nb30, WinSock;
type
TCPUID = array[1..4] of Longint;
function GetCPUID: TCPUID; assembler; register;
type
//CPUID信息类
TCPUIDInfo = class
private
FCPUID: TCPUID;
FCPUIDStr: string;
procedure SetCPU(AHandle: THandle; CpuNo: Integer);
function CPUIDTostr(ACPUID: TCPUID): string;
function GetComputerBasicFrequency: string;
function GetCPUType: string;
public
function GetCPUIDstr: string;
property CPUFrequency: string read GetComputerBasicFrequency;
property ProcessorType: string read GetCPUType;
constructor Create;
end;
//mac地址信息类
TMacAdressInfo = class
private
FMacAdress: string;
function GetMacPhysicalAddress(Alana: Integer = 0): string;
function GetMacAddress: string;
public
property MacAdrress: string read GetMacAddress;
constructor Create;
end;
//用户信息类
TPCUserInfo = class
private
function GetUserName: string;
function GetHostIP: string;
function GetWindowsVertion: string;
public
property UserName: string read GetUserName;
property HostIP: string read GetHostIP;
property WindowsVertion: string read GetWindowsVertion;
constructor Create;
end;
implementation
{ TCPUIDInfo }
{----------------------------------------------------------------------------\-
作者:sushengmiyan 2013.01.26
参数:None
返回:TCPUID
功能:汇编方式获取CPUID
\-----------------------------------------------------------------------------}
function GetCPUID: TCPUID;
asm
PUSH EBX {Save affected register}
PUSH EDI
MOV EDI,EAX {@Resukt}
MOV EAX,1
DW $A20F {CPUID Command}
STOSD {CPUID[1]}
MOV EAX,EBX
STOSD {CPUID[2]}
MOV EAX,ECX
STOSD {CPUID[3]}
MOV EAX,EDX
STOSD {CPUID[4]}
POP EDI {Restore registers}
POP EBX
end;
{----------------------------------------------------------------------------\-
作者:sushengmiyan 2013.01.26
参数:ACPUID: TCPUID
返回:string
功能:将十六进制的CPUID转换为字符串
\-----------------------------------------------------------------------------}
function TCPUIDInfo.CPUIDTostr(ACPUID: TCPUID): string;
begin
Result := '';
Result := IntToHex(ACPUID[1] , 8) + IntToHex(ACPUID[2] , 8) + IntToHex(ACPUID[3]
, 8) + IntToHex(ACPUID[4] , 8);
end;
{----------------------------------------------------------------------------\-
作者:sushengmiyan 2013.01.26
参数:None
返回:string
功能:处理器类型
\-----------------------------------------------------------------------------}
function TCPUIDInfo.GetCPUType: string;
var
systeminfo: SYSTEM_INFO;
begin
//获得CPU型号
GetSystemInfo(systeminfo);
Result := IntToStr(systeminfo.dwProcessorType)
end;
{----------------------------------------------------------------------------\-
作者:sushengmiyan 2013.01.26
参数:None
返回:string
功能:CPU频率
\-----------------------------------------------------------------------------}
function TCPUIDInfo.GetComputerBasicFrequency: string;
const
DelayTime = 500;
var
TimerHi, TimerLo: DWORD;
PriorityClass, Priority: Integer;
dSpeed: Double;
begin
PriorityClass := GetPriorityClass(GetCurrentProcess);
Priority := GetThreadPriority(GetCurrentThread);
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
Sleep(10);
asm
dw 310Fh // RDTSC指令
mov TimerLo, eax
mov TimerHi, edx
end;
Sleep(DelayTime);
asm
dw 310Fh // rdtsc
sub eax, TimerLo
sbb edx, TimerHi
mov TimerLo, eax
mov TimerHi, edx
end;
SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);
dSpeed := TimerLo / (1000.0 * DelayTime);
Result := FormatFloat('0.00' , dSpeed / 1024) + ' GHz';
end;
{----------------------------------------------------------------------------\-
作者:sushengmiyan 2013.01.26
参数:AOwner: TComponent
返回:None
功能:初始化
\-----------------------------------------------------------------------------}
constructor TCPUIDInfo.Create;
begin
FCPUID := GetCPUID;
FCPUIDStr := CPUIDTostr(FCPUID);
end;
{----------------------------------------------------------------------------\-
作者:sushengmiyan 2013.01.26
参数:None
返回:string CPUID字符串
功能:对外函数,调用这个方法就能得到CPUID
\-----------------------------------------------------------------------------}
function TCPUIDInfo.GetCPUIDstr: string;
begin
SetCPU(GetCurrentProcess , 1);
Result := CPUIDTostr(GetCPUID);
end;
{----------------------------------------------------------------------------\-
作者:sushengmiyan 2013.01.26
参数:AHandle: THandle; CpuNo: Integer
返回:None
功能:设置使用哪个cpu默认是第一个(推荐)
\-----------------------------------------------------------------------------}
procedure TCPUIDInfo.SetCPU(AHandle: THandle; CpuNo: Integer);
var
ProcessAffinity: Cardinal;
_SystemAffinity: Cardinal;
begin
//通过设置进程或线程的亲缘性(affinity),使进程或线程在指定的CPU(核)上运行
GetProcessAffinityMask(AHandle , ProcessAffinity, _SystemAffinity) ;
ProcessAffinity := CpuNo;
SetProcessAffinityMask(AHandle , ProcessAffinity);
end;
{ TMacAdressInfo }
{----------------------------------------------------------------------------\-
作者:sushengmiyan 2013.01.26
参数:None
返回:None
功能:初始化
\-----------------------------------------------------------------------------}
constructor TMacAdressInfo.Create;
begin
FMacAdress := GetMacPhysicalAddress;
end;
{----------------------------------------------------------------------------\-
作者:sushengmiyan 2013.01.26
参数:None
返回:string
功能:返回Mac地址
\-----------------------------------------------------------------------------}
function TMacAdressInfo.GetMacAddress: string;
begin
Result := FMacAdress;
end;
{----------------------------------------------------------------------------\-
作者:sushengmiyan 2013.01.26
参数:Alana: Integer = 0
返回:string
功能:通过LANA号获取Mac物理地址 (内存方式获取),整体步骤如下:
一、枚举系统上可用的所有LANA编号
二、重置计划使用的每个LANA编号
三、适配器命令获取网卡地址
\-----------------------------------------------------------------------------}
function TMacAdressInfo.GetMacPhysicalAddress(Alana: Integer = 0): string;
var
NCB: TNCB;//Netbios控制块
AdapterStatus: TAdapterStatus;//取网卡状态
LanaEnum: TLanaEnum; //LANA枚举值
I: Integer;
begin
Result := '';
Try
{ http://blog.csdn.net/sushengmiyan/article/details/8543811
一、枚举LANA值
①.申请分配一个TNCB结构 NCB: TNCB;
②.将TNCB结构变量初始化成O ZeroMemory(@NCB , SizeOf(NCB));
③.置命令为NCBENUM NCB.ncb_Command := chr(NCBENUM);
④.为ncb_buffer分配LANA_ENUM NCB.ncb_buffer := @LANAENUM;
⑤.为NCB_length制定长度 NCB.NCB_length := Sizeof(LANAENUM);
⑥.调用Netbios函数获取Netbios CRC := NetBios(@NCB);
⑦.返回值NRC_GOODRET表示成功 NCB.ncb_retcode = Chr(NRC_GOODRET)
}
ZeroMemory(@NCB , SizeOf(NCB));
NCB.ncb_Command := Chr(NCBENUM);
NCB.ncb_buffer := @LANAENUM;
NCB.NCB_length := Sizeof(LANAENUM);
NetBios(@NCB);
if not (NCB.ncb_retcode = Chr(NRC_GOODRET)) then Exit;
{ http://blog.csdn.net/sushengmiyan/article/details/8543811
二、重置计划使用的每个LANA编号
①.申请分配一个TNCB结构 NCB: TNCB;
②.将TNCB结构变量初始化成O ZeroMemory(@NCB , SizeOf(NCB));
③.置命令为NCBRESET NCB.ncb_Command := chr(NCBRESET);
④.给命令设置LANA编号 NCB.ncb_lana_num := LanaEnum.lana[Alana];
⑤.调用Netbios函数获取Netbios CRC := NetBios(@NCB);
⑥.返回值NRC_GOODRET表示成功 NCB.ncb_retcode = Chr(NRC_GOODRET)
}
ZeroMemory(@NCB , SizeOf(NCB));
NCb.ncb_Command := Chr(NCBRESET);
NCB.ncb_lana_num := LanaEnum.lana[Alana];
Netbios(@NCB);
if not (NCB.ncb_retcode = Chr(NRC_GOODRET)) then Exit;
{ http://blog.csdn.net/sushengmiyan/article/details/8543811
三、使用TAdapterStatus结构获取网卡地址
①.申请分配一个TNCB结构 NCB: TNCB;
②.将TNCB结构变量初始化成O ZeroMemory(@NCB , SizeOf(NCB));
③.置命令为NCBASTAT NCB.ncb_Command := chr(NCBASTAT);
④.为ncb_buffer分配LANA_ENUM NCB.ncb_buffer := @LANAENUM;
⑤.设置ncb_callname NCB.ncb_callname := '* ' + #0;
⑥.为ncb_buffer分配AdapterStatus NCB.ncb_buffer := @AdapterStatus;
⑦.为NCB_length制定长度 NCB.NCB_length := Sizeof(AdapterStatus);
⑧.调用Netbios函数获取Netbios CRC := NetBios(@NCB);
}
ZeroMemory(@NCB , SizeOf(NCB));
NCb.ncb_Command := chr(NCBASTAT);
NCB.ncb_lana_num := LANAENUM.lana[Alana];
NCB.ncb_callname[0] := '*';
//不明白为何如此设置,*代表啥子?
//有懂的可以邮件分享 429119108@qq.com O(∩_∩)O谢谢
NCB.ncb_buffer := @AdapterStatus;
NCB.ncb_length := SizeOf(AdapterStatus);
NetBios(@NCB);
//获取形如AA-BB-CC-DD-EE-FF形式的mac物理地址字符串
Result := '';
for I := 0 to 5 do
if SameStr(Result , '') then
Result := Result + IntToHex(Integer(AdapterStatus.adapter_address[I]) , 2)
else
Result := Result + '-' + IntToHex(Integer(AdapterStatus.adapter_address[I]) , 2);
Finally
End;
end;
{ TPCUserInfo }
{----------------------------------------------------------------------------\-
作者:sushengmiyan 2013.01.26
参数:None
返回:None
功能:创建
\-----------------------------------------------------------------------------}
constructor TPCUserInfo.Create;
begin
end;
{----------------------------------------------------------------------------\-
作者:sushengmiyan 2013.01.26
参数:None
返回:string
功能:得到主机IP
\-----------------------------------------------------------------------------}
function TPCUserInfo.GetHostIP: string;
var
sHostName: string;
WSAData: TWSAData;
HostEnt: PHostEnt;
begin
sHostName := UserName;
Result := '';
WSAStartup(2 , WSAData);
HostEnt := GetHostByName(PChar(sHostName));
if HostEnt <> nil then
begin
with HostEnt^ do
Result:= Format('%d.%d.%d.%d' , [Byte(h_addr^[0]) , Byte(h_addr^[1])
, Byte(h_addr^[2]) , Byte(h_addr^[3])]);
end;
WSACleanup;
end;
{----------------------------------------------------------------------------\-
作者:sushengmiyan 2013.01.26
参数:None
返回:None
功能:获取用户名
\-----------------------------------------------------------------------------}
function TPCUserInfo.GetUserName;
var
Name: PChar;
Size: DWORD;
begin
GetMem(Name , 255);//申请内存
Size := 255;
GetComputerName(Name , Size);
Result := Name;
FreeMem(Name); //记得释放内存
end;
{----------------------------------------------------------------------------\-
作者:sushengmiyan 2013.01.26
参数:None
返回:string
功能:返回操作系统类型
\-----------------------------------------------------------------------------}
function TPCUserInfo.GetWindowsVertion: string;
function GetWindowsVersionString: string;
var
oSVersion: TOSVersionInfoA;
begin
Result := '';
oSversion.dwOSVersionInfoSize := SizeOf(TOSVersionInfoA);
if GetVersionExA(oSVersion) then
with oSVersion do
Result := Trim(Format('%s', [szCSDVersion]));
end;
var
AWin32Version: Extended;
sWin: string;
begin
sWin := 'Windows';
AWin32Version := StrToFloat(Format('%d.%d', [Win32MajorVersion, Win32MinorVersion]));
case Win32Platform of
VER_PLATFORM_WIN32s:
Result := sWin + '32';
VER_PLATFORM_WIN32_WINDOWS:
begin
if AWin32Version = 4.0 then
Result := sWin + '95'
else if AWin32Version = 4.1 then
Result := sWin + '98'
else if AWin32Version = 4.9 then
Result := sWin + 'Me'
else
Result := sWin + '9x';
end;
VER_PLATFORM_WIN32_NT:
begin
if AWin32Version = 3.51 then
Result := sWin + 'NT 3.51'
else if AWin32Version = 4.0 then
Result := sWin + 'NT 4.0'
else if AWin32Version = 5.0 then
Result := sWin + '2000'
else if AWin32Version = 5.1 then
Result := sWin + 'XP'
else if AWin32Version = 5.2 then
Result := sWin + '2003'
else if AWin32Version = 6.0 then
Result := sWin + 'Vista'
else if AWin32Version = 6.1 then
Result := sWin + '7'
else
Result := sWin;
end
else
Result := sWin;
end;
Result := Result + ' ' + GetWindowsVersionString;
end;
end.
获取硬件信息的delphi源码CPUID、操作系统、Mac物理地址、计算机名称、IP地址、用户名的更多相关文章
- http代理工具delphi源码
http://www.caihongnet.com/content/xingyexinwen/2013/0721/730.html http代理工具delphi源码 以下代码在 DELPHI7+IND ...
- WMI 获取硬件信息的封装函数与获取联想台式机的出厂编号方法
原文:WMI 获取硬件信息的封装函数与获取联想台式机的出厂编号方法 今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都是可以提取出来的,就自己把那些公共部分提出出来,以后如果要获取 某部分的 ...
- 微信公众平台开发-access_token获取及应用(含源码)
微信公众平台开发-access_token获取及应用(含源码)作者: 孟祥磊-<微信公众平台开发实例教程> 很多系统中都有access_token参数,对于微信公众平台的access_to ...
- 微信公众平台开发2-access_token获取及应用(含源码)
微信公众平台开发-access_token获取及应用(含源码) 很多系统中都有access_token参数,对于微信公众平台的access_token参数,微信服务器判断该公众平台所拥有的权限,允许或 ...
- 转:微信开发之使用java获取签名signature(贴源码,附工程)
微信开发之使用java获取签名signature(贴源码,附工程) 标签: 微信signature获取签名 2015-12-29 22:15 6954人阅读 评论(3) 收藏 举报 分类: 微信开发 ...
- [源码]Delphi源码免杀之函数动态调用 实现免杀的下载者
[免杀]Delphi源码免杀之函数动态调用 实现免杀的下载者 2013-12-30 23:44:21 来源:K8拉登哥哥's Blog 自己编译这份代码看看 过N多杀软 没什么技 ...
- Java关于ReentrantLock获取锁和释放锁源码跟踪
通过对ReentrantLock获取锁和释放锁源码跟踪主要想进一步深入学习AQS. 备注:AQS中的waitStatus状态码含义:
- QQ2008自动聊天精灵delphi源码
QQ2008自动聊天精灵delphi源码 unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Grap ...
- 转换GMT秒数为日期时间格式-Delphi源码
转换GMT秒数为日期时间格式-Delphi源码.收藏最近在写PE分析工具的时候,需要转换TimeDateStamp字段值为日期时间格式,这是Delphi的源码. //把GMT时间的秒数转换成日期时间格 ...
随机推荐
- 在windows server 2012中安装完oracle 11 client如何使用
1.首先要添加监听配置,这样才可以没有报错的连接上服务器,至于如何添加,请自行搜索. 2.打开SQL Plus连接oracle server端,这里因为是小白,看到命令行界面上来就需要输入用户名密码 ...
- elasticsearch 父子文档(十一)
说明 需求 一个产品多个区域销售 每个区域有自己的价格, 方式1冗余行,a 产品分别在 area1 area2 area3区域销售 a产品就会生成3条产品数据 搜索id去重就行了,但是问题就是 聚合 ...
- 每天进步一点点-WPF-根据数据类型加载控件
目的,根据数据类型的不同,动态的加载适用于不同数据类型的控件(布局) 原理:为自定义的数据类型添加数据魔板,绑定的时候绑定这些数据类型的实例. 例子: 数据类型: 数据模板: <DataTemp ...
- MapReduce计算原理及步骤
步骤:input从HDFS读取内容, split()切割分片内容,key/value, map()方法对输入的key/value进行计算处理,先写到内存,在内存中进行分区.排序,之后将Key/valu ...
- springboot连接mysql数据库,JdbcTemplate和spring JPA方式
SQL部分 CREATE TABLE test( id ) primary key, name ) not null, age ), address ) ); ,,'bj'); ,,'sh'); ,, ...
- 阿里云成为Hyperledger超级账本全球会员,发力区块链生态建设
摘要: 阿里云将会与Hyperledger社区共同推进全球区块链技术和商业生态在多行业领域的建设. 2018年12月12日在瑞士巴塞尔的2018Hyperledger全球峰会上,阿里云正式加入Hype ...
- php的字符串{}选定与{变量}
$str = "abcdefg"; echo $str{2};//输出c $a = "test"; echo "ddd{$a}";//输出d ...
- Linux/Mac中alias的使用
最近在设置代理的时候,每次手写不方便,想起linux有个alias命令可以用,防止忘记,这边记录一下 一.alias 设置 1.设置别名 proxy # 1. # 设置别名前,使用 `type 自定义 ...
- iOS 多层级的immutable objects 转换成 mutable objects
第一种方法是:将多层级的递归转换 方法: +(id) recursiveMutable:(id)object { if([object isKindOfClass:[NSDictionary clas ...
- Delphi中文件名函数-路径、名称、子目录、驱动器、扩展名
文件名函数 文件名函数可以对文件的名称.所在子目录.驱动器和扩展名等进行操作.下表列出这些函数及其功能. 函数说明 ExpandFileName() //返回文件的全路径(含驱动器.路径) Extra ...