//引用及TYPE变量申明

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;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit2: TEdit;
    Edit3: TEdit;
    Button2: TButton;
    Edit4: TEdit;
    Label4: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
type
  TCPUID = array[1..4] of Longint;

//取硬盘系列号:
function GetIdeSerialNumber: pchar;  //获取硬盘的出厂系列号;
const IDENTIFY_BUFFER_SIZE = 512;
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[0..2] of Byte;
    dwReserved: array[0..3] of DWORD;
    bBuffer: array[0..0] of Byte;
  end;

TIdSector = packed record
    wGenConfig: Word;
    wNumCyls: Word;
    wReserved: Word;
    wNumHeads: Word;
    wBytesPerTrack: Word;
    wBytesPerSector: Word;
    wSectorsPerTrack: Word;
    wVendorUnique: array[0..2] of Word;
    sSerialNumber: array[0..19] of CHAR;
    wBufferType: Word;
    wBufferSize: Word;
    wECCSize: Word;
    sFirmwareRev: array[0..7] of Char;
    sModelNumber: array[0..39] 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[0..127] of BYTE;
  end;

PIdSector = ^TIdSector;
  TDriverStatus = packed record
    bDriverError: Byte;
    bIDEStatus: Byte;
    bReserved: array[0..1] of Byte;
    dwReserved: array[0..1] of DWORD;
  end;

TSendCmdOutParams = packed record
    cBufferSize: DWORD;
    DriverStatus: TDriverStatus;
    bBuffer: array[0..0] of BYTE;
  end;
var
  hDevice: Thandle;
  cbBytesReturned: DWORD;
  SCIP: TSendCmdInParams;
  aIdOutCmd: array[0..(SizeOf(TSendCmdOutParams) + IDENTIFY_BUFFER_SIZE-1)-1] of Byte;
  IdOutCmd: TSendCmdOutParams absolute aIdOutCmd;

procedure ChangeByteOrder(var Data; Size: Integer);//函数中的过程
var
  ptr: Pchar;
  i: Integer;
  c: Char;
begin
  ptr := @Data;
  for I := 0 to (Size shr 1) - 1 do begin
    c := ptr^;
    ptr^ := (ptr + 1)^;
    (ptr + 1)^ := c;
    Inc(ptr, 2);
  end;
end;

begin          //函数主体
    Result := '';
    if SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT then
       begin // Windows NT, Windows 2000
         hDevice := CreateFile('\\.\PhysicalDrive0', GENERIC_READ or GENERIC_WRITE,
         FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
       end
    else // Version Windows 95 OSR2, Windows 98
       hDevice := CreateFile('\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0);
    if hDevice = INVALID_HANDLE_VALUE then Exit;
    try
      FillChar(SCIP, SizeOf(TSendCmdInParams) - 1, #0);
      FillChar(aIdOutCmd, SizeOf(aIdOutCmd), #0);
      cbBytesReturned := 0;
      with SCIP do
      begin
        cBufferSize := IDENTIFY_BUFFER_SIZE;
        with irDriveRegs do
        begin
          bSectorCountReg := 1;
          bSectorNumberReg := 1;
          bDriveHeadReg := $A0;
          bCommandReg := $EC;
        end;
      end;
      if not DeviceIoControl(hDevice, $0007C088, @SCIP, SizeOf(TSendCmdInParams) - 1,@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))^:= #0;
      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,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;

function GetCPUIDStr:String;
var
  CPUID:TCPUID;
begin
  CPUID:=GetCPUID;
  Result:=IntToHex(CPUID[1],8)+IntToHex(CPUID[2],8)+IntToHex(CPUID[3],8)+IntToHex(CPUID[4],8);
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) <> 0 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) <> 0 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 := 0 to 5 do
      strTemp := strTemp + InttoHex(Integer(ADAPTER.adapter_address[intIdx]), 2);
    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), 0);
  ncb.ncb_command := Char(NCBEnum);
  ncb.ncb_buffer := PChar(@lanaEnum);
  ncb.ncb_length := SizeOf(TLanaEnum);
  s:=Netbios(@ncb);
  for i := 0 to integer(lanaEnum.length)-1 do
  begin
    FillChar(ncb, SizeOf(TNCB), 0);
    ncb.ncb_command := Char(NCBReset);
    ncb.ncb_lana_num := lanaEnum.lana[i];
    Netbios(@ncb);
    Netbios(@ncb);
    FillChar(ncb, SizeOf(TNCB), 0);
    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:=0;
    if (Win32Platform = VER_PLATFORM_WIN32_NT) then
    m:=1;
    if m=1 then
    begin
    if Netbios(@ncb) = Chr(0) then
      strMac := '';
      for j := 0 to 5 do
      begin
        strPart := IntToHex(integer(adapt.adapter.adapter_address[j]), 2);
        strMac := strMac + strPart + '-';
      end;
      SetLength(strMac, Length(strMac)-1);
    end;
  if m=0 then
    if Netbios(@ncb) <> Chr(0) then
    begin
      strMac := '';
      for j := 0 to 5 do
      begin
        strPart := IntToHex(integer(adapt.adapter.adapter_address[j]), 2);
        strMac := strMac + strPart + '-';
      end;
      SetLength(strMac, Length(strMac)-1);
    end;
  end;
result:=strmac;
end;

function PartitionString(StrV,PrtSymbol: string): TStringList;
var
  iTemp: integer;
begin
  result := TStringList.Create;
  iTemp := pos(PrtSymbol,StrV);
  while iTemp>0 do begin
    if iTemp>1 then result.Append(copy(StrV,1,iTemp-1));
    delete(StrV,1,iTemp+length(PrtSymbol)-1);
    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:=0 to Str.Count-1 do
    MacStr:=MacStr+Str[i];
  Result:=MacStr;
end;

//==============================================

//调用示例
procedure TForm1.Button1Click(Sender: TObject);
begin
 Edit3.Text:=strpas(GetIdeSerialNumber);//取硬盘号
  Edit2.text:=GetCPUIDStr;//CPU系列号
  edit4.Text:=NBGetAdapterAddress(12);//非集成网卡
  Edit1.text:=MacStr;//集成和非集成网卡

end;

DELPHI获取硬盘、CPU、网卡序列号相关推荐

  1. 获取电脑cpu,硬盘,网卡序列号

    1.命令行获取 cpu序列号:wmic cpu get processorid 硬盘序列号: 1)diskpart 2)list disk 3)select disk 0 4)detail disk ...

  2. delphi 获取硬盘序列号

    // 更多关于 S.M.A.R.T. ioctl 的信息可查看: // http://www.microsoft.com/hwdev/download/respec/iocltapi.rtf // M ...

  3. VC6获取硬盘序列号、型号、修订版本号

    因为要做个读取硬盘参数信息的控件,所以在网上找了不少代码,但是自己作为一个初学者在使用别人代码时,总会发现有各种各样的问题: 1. 需要的头文件未写明 2. 有些定义未给出 3. 代码的开发环境未明, ...

  4. 用C#获取硬盘序列号,CPU序列号,网卡MAC地址

    这个问题首先得考虑的就是你的硬盘是不是SCSI硬盘 如果是,那么根本不存在"物理序列号",只可能取得卷标的序列号 如果是卷标序列号,要注意的是每次格式化硬盘的时候这个序列号都会变 ...

  5. windows平台下 c++获取 系统版本 网卡 内存 CPU 硬盘 显卡信息

    GetsysInfo.h: #ifndef _H_GETSYSINFO #define _H_GETSYSINFO#pragma once#include <afxtempl.h>clas ...

  6. Qt windows下获取CPU、主板、硬盘、网卡等相关信息

    首先磁盘ID和磁盘序列号是不一样的,磁盘的一些相关信息可通过以下方式获取 查看步骤,右键我的电脑---->选择属性---->选择设备管理器---->展开磁盘驱动器    就可以看到磁 ...

  7. [转]获取机器的硬件信息(CPU ID序列号, 主板信息,硬盘序列号,系统信息)

    本文转自:http://www.msproject.cn/Article/GetHardwareInformation.aspx 原文如下: -------- 在很多情况下,你可能都需要得到微机的硬件 ...

  8. 获取硬盘序列号、CPU序列号

    public class SerialUtils {private static Properties props = System.getProperties();private static St ...

  9. JAVA获取CPUID、主板序列号、硬盘序列号、MAC地址

    最近在修改公司licence程序,需要获取到更多的硬件唯一标识,以便加密使用. 网上看了很多大神的博客,思路大概整理了一下,根据系统类型分为两种方式: 一.windows 通过创建vbs脚本,然后使用 ...

  10. 获取计算机本机信息命令大全(WMIC指令、硬盘、网卡等)

    目录 概览 1 基本输入/输出服务(BIOS)管理 1.1 获取属性列表操作: 1.2 一次性获取所有属性信息: 1.3 单个属性获取 2 主板信息 3 cpu信息 4 其他信息 参考资料: QT软件 ...

最新文章

  1. 《逻辑与计算机设计基础(原书第5版)》——3.9 二进制加法器
  2. [渝粤教育] 西北大学 仪器分析 参考 资料
  3. mysql客户端安装错误_windows下mysql 5.7以上版本安装及遇到的问题
  4. 前端学习(1):HTML和CSS导学
  5. oracle表空间 设置,Oracle表空间怎么设置和管理
  6. mysql怎么初始化自增值_MySQL 重置自增值
  7. jstat分析JVM内存
  8. 最大化/最小化/关闭窗口代码集锦
  9. nginx+kibana代理以及简单认证
  10. 查看静态库支持的CPU架构
  11. Hexo+Github搭建个人博客(一)——开始搭建
  12. 模二运算,模二加减乘除
  13. 民间计算机网络高手,高手在民间!牛人用Excel创作的惊人画作
  14. 百度脑图制作的简单的个人介绍
  15. 你知道什么是大数据的核心吗?
  16. 用EasyBoot轻松做启动光盘
  17. 计算机怎么发音乐,网易云音乐怎么分享音乐给别人的教程
  18. 中国大学MOOC保险学试题及答案
  19. 【问题】连接mysql报错errorCode 0, state 08S01
  20. Android缓存,删除网络依赖包缓存

热门文章

  1. 关于Polar SI9000重装/启动后卡在Frequency Dependent Calculation界面不能切换。
  2. 练习作品9:高仿大漠工具
  3. idea导出war包并部署在tomact
  4. H5网页漫画小说苹果cms模板源码/支持对接公众号/支持三级分销
  5. 单片机c语言必背代码_stm32单片机编程用库函数好还是寄存器好?
  6. android的天气和时钟部件,时钟天气小部件
  7. 烽火狼烟丨Microsoft多个安全漏洞风险提示
  8. IntelliJ IDEA 常用设置 主题颜色模式、字体、样式、背景自定义颜色及其背景图片(图文步骤)
  9. python爬虫ip_python爬虫数据采集ip被封一篇解决
  10. Mentor Xpedtion partsymbolcell