获取CPU系列号,硬盘系
unit Secrity;  
interface  
uses  
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
Dialogs, StdCtrls,nb30;{重要引用}  
type  
PASTAT = ^TASTAT;  
TASTAT = record  
    adapter : TAdapterStatus;  
    name_buf : TNameBuffer;  
end;  
TForm1 = class(TForm)  
    Button1: TButton;  
    Edit1: TEdit;  
    procedure Button1Click(Sender: TObject);  
private  
    { Private declarations }  
public  
    { Public declarations }  
end;  
var  
Form1: TForm1;  
implementation  
{$R *.dfm}  
type  
TCPUID = array[..] of Longint;  
//取硬盘系列号:  
function GetIdeSerialNumber: pchar; //获取硬盘的出厂系列号;  
const IDENTIFY_BUFFER_SIZE = ;  
type  
   TIDERegs = packed record  
     bFeaturesReg: BYTE;  
     bSectorCountReg: BYTE;  
     bSectorNumberReg: BYTE;  
     bCylLowReg: BYTE;  
     bCylHighReg: BYTE;  
     bDriveHeadReg: BYTE;  
     bCommandReg: BYTE;  
     bReserved: BYTE;  
end;  
TSendCmdInParams = packed record  
    cBufferSize: DWORD;  
    irDriveRegs: TIDERegs;  
    bDriveNumber: BYTE;  
    bReserved: array[..] of Byte;  
    dwReserved: array[..] of DWORD;  
    bBuffer: array[..] of Byte;  
end;  
TIdSector = packed record  
    wGenConfig: Word;  
    wNumCyls: Word;  
    wReserved: Word;  
    wNumHeads: Word;  
    wBytesPerTrack: Word;  
    wBytesPerSector: Word;  
    wSectorsPerTrack: Word;  
    wVendorUnique: array[..] of Word;  
    sSerialNumber: array[..] of CHAR;  
    wBufferType: Word;  
    wBufferSize: Word;  
    wECCSize: Word;  
    sFirmwareRev: array[..] of Char;  
    sModelNumber: array[..] of Char;  
    wMoreVendorUnique: Word;  
    wDoubleWordIO: Word;  
    wCapabilities: Word;  
    wReserved1: Word;  
    wPIOTiming: Word;  
    wDMATiming: Word;  
    wBS: Word;  
    wNumCurrentCyls: Word;  
    wNumCurrentHeads: Word;  
    wNumCurrentSectorsPerTrack: Word;  
    ulCurrentSectorCapacity: DWORD;  
    wMultSectorStuff: Word;  
    ulTotalAddressableSectors: DWORD;  
    wSingleWordDMA: Word;  
    wMultiWordDMA: Word;  
    bReserved: array[..] of BYTE;  
end;  
PIdSector = ^TIdSector;  
TDriverStatus = packed record  
    bDriverError: Byte;  
    bIDEStatus: Byte;  
    bReserved: array[..] of Byte;  
    dwReserved: array[..] of DWORD;  
end;  
TSendCmdOutParams = packed record  
    cBufferSize: DWORD;  
    DriverStatus: TDriverStatus;  
    bBuffer: array[..] of BYTE;  
end;  
var  
hDevice: Thandle;  
cbBytesReturned: DWORD;  
SCIP: TSendCmdInParams;  
aIdOutCmd: array[..(SizeOf(TSendCmdOutParams) + IDENTIFY_BUFFER_SIZE-)-] of Byte;  
IdOutCmd: TSendCmdOutParams absolute aIdOutCmd;  
procedure ChangeByteOrder(var Data; Size: Integer);  
var  
ptr: Pchar;  
i: Integer;  
c: Char;  
begin  
ptr := @Data;  
for I :=  to (Size shr ) -  do begin  
    c := ptr^;  
    ptr^ := (ptr + )^;  
    (ptr + )^ := c;  
    Inc(ptr, );  
end;  
end;  
begin  
    Result := '';  
    if SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT then  
       begin // Windows NT, Windows   
         hDevice := CreateFile('//./PhysicalDrive0', GENERIC_READ or GENERIC_WRITE,  
         FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, , );  
       end  
    else // Version Windows  OSR2, Windows   
       hDevice := CreateFile('//./SMARTVSD', , , nil, CREATE_NEW, , );  
    if hDevice = INVALID_HANDLE_VALUE then Exit;  
    try  
      FillChar(SCIP, SizeOf(TSendCmdInParams) - , #);  
      FillChar(aIdOutCmd, SizeOf(aIdOutCmd), #);  
      cbBytesReturned := ;  
      with SCIP do  
      begin  
        cBufferSize := IDENTIFY_BUFFER_SIZE;  
        with irDriveRegs do  
        begin  
          bSectorCountReg := ;  
          bSectorNumberReg := ;  
          bDriveHeadReg := $A0;  
          bCommandReg := $EC;  
        end;  
      end;  
      if not DeviceIoControl(hDevice, $0007C088, @SCIP, SizeOf(TSendCmdInParams) - ,@aIdOutCmd, SizeOf(aIdOutCmd), cbBytesReturned, nil) then Exit;  
    finally  
      CloseHandle(hDevice);  
    end;  
    with PIdSector(@IdOutCmd.bBuffer)^ do  
    begin  
      ChangeByteOrder(sSerialNumber, SizeOf(sSerialNumber));  
      (Pchar(@sSerialNumber) + SizeOf(sSerialNumber))^:= #;  
      Result := Pchar(@sSerialNumber);  
    end;  
end;  
//=================================================================  
//CPU系列号:  
FUNCTION GetCPUID : TCPUID; assembler; register;  
asm  
PUSH    EBX         {Save affected register}  
PUSH    EDI  
MOV     EDI,EAX     {@Resukt}  
MOV     EAX,  
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;  
function GetCPUIDStr:String;  
var  
CPUID:TCPUID;  
begin  
CPUID:=GetCPUID;  
Result:=IntToHex(CPUID[],)+IntToHex(CPUID[],)+IntToHex(CPUID[],)+IntToHex(CPUID[],);  
end;  
///==================================================================================  
///取MAC(非集成网卡):  
function NBGetAdapterAddress(a: Integer): string;  
var  
NCB: TNCB; // Netbios control block //NetBios控制块  
ADAPTER: TADAPTERSTATUS; // Netbios adapter status//取网卡状态  
LANAENUM: TLANAENUM; // Netbios lana  
intIdx: Integer; // Temporary work value//临时变量  
cRC: Char; // Netbios return code//NetBios返回值  
strTemp: string; // Temporary string//临时变量  
begin  
// Initialize  
Result := '';  
try  
    // Zero control blocl  
    ZeroMemory(@NCB, SizeOf(NCB));  
    // Issue enum command  
    NCB.ncb_command := Chr(NCBENUM);  
    cRC := NetBios(@NCB);  
    // Reissue enum command  
    NCB.ncb_buffer := @LANAENUM;  
    NCB.ncb_length := SizeOf(LANAENUM);  
    cRC := NetBios(@NCB);  
    if Ord(cRC) <>  then  
      exit;  
    // Reset adapter  
    ZeroMemory(@NCB, SizeOf(NCB));  
    NCB.ncb_command := Chr(NCBRESET);  
    NCB.ncb_lana_num := LANAENUM.lana[a];  
    cRC := NetBios(@NCB);  
    if Ord(cRC) <>  then  
      exit;  
    // Get adapter address  
    ZeroMemory(@NCB, SizeOf(NCB));  
    NCB.ncb_command := Chr(NCBASTAT);  
    NCB.ncb_lana_num := LANAENUM.lana[a];  
    StrPCopy(NCB.ncb_callname, '*');  
    NCB.ncb_buffer := @ADAPTER;  
    NCB.ncb_length := SizeOf(ADAPTER);  
    cRC := NetBios(@NCB);  
    // Convert it to string  
    strTemp := '';  
    for intIdx :=  to  do  
      strTemp := strTemp + InttoHex(Integer(ADAPTER.adapter_address[intIdx]), );  
    Result := strTemp;  
finally  
end;  
end;  
//==========================================================================  
//取MAC地址(集成网卡和非集成网卡):  
function Getmac:string;  
var  
ncb : TNCB;  
s:string;  
adapt : TASTAT;  
lanaEnum : TLanaEnum;  
i, j, m : integer;  
strPart, strMac : string;  
begin  
FillChar(ncb, SizeOf(TNCB), );  
ncb.ncb_command := Char(NCBEnum);  
ncb.ncb_buffer := PChar(@lanaEnum);  
ncb.ncb_length := SizeOf(TLanaEnum);  
s:=Netbios(@ncb);  
for i :=  to integer(lanaEnum.length)- do  
begin  
    FillChar(ncb, SizeOf(TNCB), );  
    ncb.ncb_command := Char(NCBReset);  
    ncb.ncb_lana_num := lanaEnum.lana[i];  
    Netbios(@ncb);  
    Netbios(@ncb);  
    FillChar(ncb, SizeOf(TNCB), );  
    ncb.ncb_command := Chr(NCBAstat);  
    ncb.ncb_lana_num := lanaEnum.lana[i];  
    ncb.ncb_callname := '*               ';  
    ncb.ncb_buffer := PChar(@adapt);  
    ncb.ncb_length := SizeOf(TASTAT);  
    m:=;  
    if (Win32Platform = VER_PLATFORM_WIN32_NT) then  
    m:=;  
    if m= then  
    begin  
    if Netbios(@ncb) = Chr() then  
      strMac := '';  
      for j :=  to  do  
      begin  
        strPart := IntToHex(integer(adapt.adapter.adapter_address[j]), );  
        strMac := strMac + strPart + '-';  
      end;  
      SetLength(strMac, Length(strMac)-);  
    end;  
if m= then  
    if Netbios(@ncb) <> Chr() then  
    begin  
      strMac := '';  
      for j :=  to  do  
      begin  
        strPart := IntToHex(integer(adapt.adapter.adapter_address[j]), );  
        strMac := strMac + strPart + '-';  
      end;  
      SetLength(strMac, Length(strMac)-);  
    end;  
end;  
result:=strmac;  
end;  
function PartitionString(StrV,PrtSymbol: string): TStringList;  
var  
iTemp: integer;  
begin  
result := TStringList.Create;  
iTemp := pos(PrtSymbol,StrV);  
while iTemp> do begin  
    if iTemp> then result.Append(copy(StrV,,iTemp-));  
    delete(StrV,,iTemp+length(PrtSymbol)-);  
    iTemp := pos(PrtSymbol,StrV);  
end;  
if Strv<>'' then result.Append(StrV);  
end;  
function MacStr():String;  
var  
Str:TStrings;  
i:Integer;  
MacStr:String;  
begin  
MacStr:='';  
Str:=TStringList.Create;  
Str:=PartitionString(Getmac,'-');  
for i:= to Str.Count- do  
    MacStr:=MacStr+Str[i];  
Result:=MacStr;  
end;  
//==============================================  
//调用例子  
procedure TForm1.Button1Click(Sender: TObject);  
begin  
//Edit1.Text:=strpas(GetIdeSerialNumber)//取硬盘号  
//Edit1.text:=GetCPUIDStr;//CPU系列号  
//edit1.Text:=NBGetAdapterAddress();//非集成网卡  
Edit1.text:=MacStr;//集成和非集成网卡  
end;  
获取CPU系列号,硬盘系的更多相关文章
- Qt获取CPU编号和硬盘序列号
		
windows下执行命令除了用cmd之外,还有个东西叫WMIC,非常强大,可以通过他获取很多信息,包括硬件信息. QString frmMain::getWMIC(const QString & ...
 - C#获取CPU与网卡硬盘序列号及Base64和DES加密解密操作类
		
public class RegisterHelp { /// <summary> /// CPU /// </summary> /// <returns>< ...
 - 取CPU序列号,获取网卡,取硬盘系列号,获取目录下的文件,强制删除目录
		
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
 - C#获取cpu序列号 硬盘ID 网卡硬地址以及操作注册表 .
		
转:http://blog.csdn.net/smartsmile2012/article/details/8682295 #region 获取cpu序列号 硬盘ID 网卡硬地址 /**/ /// & ...
 - C# 使用 PerformanceCounter 获取 CPU 和 硬盘的使用率
		
C# 使用 PerformanceCounter 获取 CPU 和 硬盘的使用率: 先看界面: 建一个 Windows Form 桌面程序,代码如下: using System; using Sys ...
 - C# 获取CPU序列号、网卡MAC地址、硬盘序列号封装类,用于软件绑定电脑
		
using System.Management; namespace GLaLa { /// <summary> /// hardware_mac 的摘要说明. /// </summ ...
 - C# 获取电脑MAC地址,IP地址,物理内存,CPU序列号,硬盘ID..........................
		
上班很忙,自己做个记录 代码如下: 需要引入:System.Management 代码如下: using System; using System.Collections.Generic; using ...
 - 获取CPU序列号、网卡MAC地址、硬盘序列号
		
<pre name="code" class="csharp"> using System; using System.Collections; u ...
 - Golang获取CPU、内存、硬盘使用率
		
Golang获取CPU.内存.硬盘使用率 工具包 go get github.com/shirou/gopsutil 实现 func GetCpuPercent() float64 { percent ...
 
随机推荐
- angularJS在创建指令需要注意的问题(指令中使用ngRepeat)
			
现在发现,当初的自己真的是太菜了,为什么你在指令中更改数据,没有作用呢?这其实是原型链的问题. 详细的我就不在这里说了,有位大神早已发布了这个内容,在这里复制个地址给大家,有兴趣的可以看看 http: ...
 - Kali-linux安装之后的简单设置(转)
			
1.更新软件源: 先备份软件源文件 cp /etc/apt/sources.list /etc/apt/sources.list.bak 修改sources.list文件: leafpad /etc/ ...
 - whm 设置共享IP
			
点击 Main >>Resellers>>resellers centers (manages ressellers center's IP有几个IP代表几个)
 - web容器启动顺序
			
web容器启动顺序: 第一:context-param 第二:Listerer 第三:Filter 第四:servlet
 - C#+QI的例子
			
COM中,和我们打交道的是接口,也就是说类对我们是隐形的,那么我们要做开发,要使用这些功能,我们只能通过接口,通过接口暴露出来的方法,COM是一种服务器端/客户端架构,服务器端定义了操作的法,客户端通 ...
 - 在XAMPP上建立多个域名的站点
			
XAMPP默认安装完毕后,站点文件默认放在/xampp/htdocs/ 文件下,并且可以通过http://localhost 进行访问.先前在测试各种程序的时候均是在/xampp/htdocs/ 文件 ...
 - ACM录 之 输入输出。
			
—— 简单介绍一下ACM里面的输入输出... —— 主要说C++的输入输出(其实其他的我不会...). —— C++里面有输入输出流,也就是cin和cout,用起来也算是比较方便吧... —— 但是, ...
 - Lazy Load, 延迟加载图片的 jQuery 插件 - NeoEase
			
body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...
 - Codeforces AIM Tech Round3
			
打得最烂一场Codeforces,多次都错题,无限WA... A题: 题意:给定n个橘子的大小,大小超过b的丢掉,不足d的补充进来,同时超过d的部分去掉,问要去掉几次 分析:直接模拟即可 #inclu ...
 - SSH使用TCP Wrappers实现访问控制
			
SSH使用TCP Wrappers实现访问控制主要配置文件/etc/hosts.allow/etc/hosts.deny===TCP Wrappers的访问控制原则首先检查 hosts.allow 文 ...