蓝海峰 發表於 2011-9-29 21:56:55

DELPHI7.0 获取硬盘、CPU、网卡序列号的代码

<div class="codetitle"><span><U>复制代码</U></span> 代码如下:</div><div class="codebody" id="code24642"><BR>//引用及TYPE变量申明 <br><br>uses <BR>Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, <BR>Dialogs, StdCtrls,nb30; {重要引用} <br><br>type <BR>PASTAT = ^TASTAT; <BR>TASTAT = record <BR>adapter : TAdapterStatus; <BR>name_buf : TNameBuffer; <BR>end; <br><br>TForm1 = class(TForm) <BR>Button1: TButton; <BR>Edit1: TEdit; <BR>Label1: TLabel; <BR>Label2: TLabel; <BR>Label3: TLabel; <BR>Edit2: TEdit; <BR>Edit3: TEdit; <BR>Button2: TButton; <BR>Edit4: TEdit; <BR>Label4: TLabel; <BR>procedure Button1Click(Sender: TObject); <BR>procedure Button2Click(Sender: TObject); <BR>private <BR>{ Private declarations } <BR>public <BR>{ Public declarations } <BR>end; <br><br>var <BR>Form1: TForm1; <br><br>implementation <br><br>{$R *.dfm} <BR>type <BR>TCPUID = array of Longint; <br><br>//取硬盘系列号: <BR>function GetIdeSerialNumber: pchar; //获取硬盘的出厂系列号; <BR>const IDENTIFY_BUFFER_SIZE = 512; <BR>type <BR>TIDERegs = packed record <BR>bFeaturesReg: BYTE; <BR>bSectorCountReg: BYTE; <BR>bSectorNumberReg: BYTE; <BR>bCylLowReg: BYTE; <BR>bCylHighReg: BYTE; <BR>bDriveHeadReg: BYTE; <BR>bCommandReg: BYTE; <BR>bReserved: BYTE; <BR>end; <br><br>TSendCmdInParams = packed record <BR>cBufferSize: DWORD; <BR>irDriveRegs: TIDERegs; <BR>bDriveNumber: BYTE; <BR>bReserved: array of Byte; <BR>dwReserved: array of DWORD; <BR>bBuffer: array of Byte; <BR>end; <br><br>TIdSector = packed record <BR>wGenConfig: Word; <BR>wNumCyls: Word; <BR>wReserved: Word; <BR>wNumHeads: Word; <BR>wBytesPerTrack: Word; <BR>wBytesPerSector: Word; <BR>wSectorsPerTrack: Word; <BR>wVendorUnique: array of Word; <BR>sSerialNumber: array of CHAR; <BR>wBufferType: Word; <BR>wBufferSize: Word; <BR>wECCSize: Word; <BR>sFirmwareRev: array of Char; <BR>sModelNumber: array of Char; <BR>wMoreVendorUnique: Word; <BR>wDoubleWordIO: Word; <BR>wCapabilities: Word; <BR>wReserved1: Word; <BR>wPIOTiming: Word; <BR>wDMATiming: Word; <BR>wBS: Word; <BR>wNumCurrentCyls: Word; <BR>wNumCurrentHeads: Word; <BR>wNumCurrentSectorsPerTrack: Word; <BR>ulCurrentSectorCapacity: DWORD; <BR>wMultSectorStuff: Word; <BR>ulTotalAddressableSectors: DWORD; <BR>wSingleWordDMA: Word; <BR>wMultiWordDMA: Word; <BR>bReserved: array of BYTE; <BR>end; <br><br>PIdSector = ^TIdSector; <BR>TDriverStatus = packed record <BR>bDriverError: Byte; <BR>bIDEStatus: Byte; <BR>bReserved: array of Byte; <BR>dwReserved: array of DWORD; <BR>end; <br><br>TSendCmdOutParams = packed record <BR>cBufferSize: DWORD; <BR>DriverStatus: TDriverStatus; <BR>bBuffer: array of BYTE; <BR>end; <BR>var <BR>hDevice: Thandle; <BR>cbBytesReturned: DWORD; <BR>SCIP: TSendCmdInParams; <BR>aIdOutCmd: array of Byte; <BR>IdOutCmd: TSendCmdOutParams absolute aIdOutCmd; <br><br>procedure ChangeByteOrder(var Data; Size: Integer);//函数中的过程 <BR>var <BR>ptr: Pchar; <BR>i: Integer; <BR>c: Char; <BR>begin <BR>ptr := @Data; <BR>for I := 0 to (Size shr 1) - 1 do begin <BR>c := ptr^; <BR>ptr^ := (ptr + 1)^; <BR>(ptr + 1)^ := c; <BR>Inc(ptr, 2); <BR>end; <BR>end; <br><br>begin //函数主体 <BR>Result := ''; <BR>if SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT then <BR>begin // Windows NT, Windows 2000 <BR>hDevice := CreateFile('\\.\PhysicalDrive0', GENERIC_READ or GENERIC_WRITE, <BR>FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); <BR>end <BR>else // Version Windows 95 OSR2, Windows 98 <BR>hDevice := CreateFile('\\.\SMARTVSD', 0, 0, nil, Create_NEW, 0, 0); <BR>if hDevice = INVALID_HANDLE_VALUE then Exit; <BR>try <BR>FillChar(SCIP, SizeOf(TSendCmdInParams) - 1, #0); <BR>FillChar(aIdOutCmd, SizeOf(aIdOutCmd), #0); <BR>cbBytesReturned := 0; <BR>with SCIP do <BR>begin <BR>cBufferSize := IDENTIFY_BUFFER_SIZE; <BR>with irDriveRegs do <BR>begin <BR>bSectorCountReg := 1; <BR>bSectorNumberReg := 1; <BR>bDriveHeadReg := $A0; <BR>bCommandReg := $EC; <BR>end; <BR>end; <BR>if not DeviceIoControl(hDevice, $0007C088, @SCIP, SizeOf(TSendCmdInParams) - 1,@aIdOutCmd, SizeOf(aIdOutCmd), cbBytesReturned, nil) then Exit; <BR>finally <BR>CloseHandle(hDevice); <BR>end; <BR>with PIdSector(@IdOutCmd.bBuffer)^ do <BR>begin <BR>ChangeByteOrder(sSerialNumber, SizeOf(sSerialNumber)); <BR>(Pchar(@sSerialNumber) + SizeOf(sSerialNumber))^:= #0; <BR>Result := Pchar(@sSerialNumber); <BR>end; <BR>end; <BR>//================================================================= <br><br>//CPU系列号: <BR>FUNCTION GetCPUID : TCPUID; assembler; register; <BR>asm <BR>PUSH EBX {Save affected register} <BR>PUSH EDI <BR>MOV EDI,EAX {@Resukt} <BR>MOV EAX,1 <BR>DW $A20F {CPUID Command} <BR>STOSD {CPUID} <BR>MOV EAX,EBX <BR>STOSD {CPUID} <BR>MOV EAX,ECX <BR>STOSD {CPUID} <BR>MOV EAX,EDX <BR>STOSD {CPUID} <BR>POP EDI {Restore registers} <BR>POP EBX <BR>END; <br><br>function GetCPUIDStr:String; <BR>var <BR>CPUID:TCPUID; <BR>begin <BR>CPUID:=GetCPUID; <BR>Result:=IntToHex(CPUID,8)+IntToHex(CPUID,8)+IntToHex(CPUID,8)+IntToHex(CPUID,8); <BR>end; <br><br>///================================================================================== <br><br>///取MAC(非集成网卡): <br><br>function NBGetAdapterAddress(a: Integer): string; <BR>var <BR>NCB: TNCB; // Netbios control block //NetBios控制块 <BR>ADAPTER: TADAPTERSTATUS; // Netbios adapter status//取网卡状态 <BR>LANAENUM: TLANAENUM; // Netbios lana <BR>intIdx: Integer; // Temporary work value//临时变量 <BR>cRC: Char; // Netbios return code//NetBios返回值 <BR>strTemp: string; // Temporary string//临时变量 <BR>begin <BR>// Initialize <BR>Result := ''; <BR>try <BR>// Zero control blocl <BR>ZeroMemory(@NCB, SizeOf(NCB)); <BR>// Issue enum command <BR>NCB.ncb_command := Chr(NCBENUM); <BR>cRC := NetBios(@NCB); <BR>// Reissue enum command <BR>NCB.ncb_buffer := @LANAENUM; <BR>NCB.ncb_length := SizeOf(LANAENUM); <BR>cRC := NetBios(@NCB); <BR>if ord(cRC) &lt;&gt; 0 then <BR>exit; <BR>// Reset adapter <BR>ZeroMemory(@NCB, SizeOf(NCB)); <BR>NCB.ncb_command := Chr(NCBRESET); <BR>NCB.ncb_lana_num := LANAENUM.lana; <BR>cRC := NetBios(@NCB); <BR>if ord(cRC) &lt;&gt; 0 then <BR>exit; <BR>// Get adapter address <BR>ZeroMemory(@NCB, SizeOf(NCB)); <BR>NCB.ncb_command := Chr(NCBASTAT); <BR>NCB.ncb_lana_num := LANAENUM.lana; <BR>StrPCopy(NCB.ncb_callname, '*'); <BR>NCB.ncb_buffer := @ADAPTER; <BR>NCB.ncb_length := SizeOf(ADAPTER); <BR>cRC := NetBios(@NCB); <BR>// Convert it to string <BR>strTemp := ''; <BR>for intIdx := 0 to 5 do <BR>strTemp := strTemp + InttoHex(Integer(ADAPTER.adapter_address), 2); <BR>Result := strTemp; <BR>finally <BR>end; <BR>end; <BR>//========================================================================== <BR>//取MAC地址(集成网卡和非集成网卡): <br><br>function Getmac:string; <BR>var <BR>ncb : TNCB; <BR>s:string; <BR>adapt : TASTAT; <BR>lanaEnum : TLanaEnum; <BR>i, j, m : integer; <BR>strPart, strMac : string; <BR>begin <BR>FillChar(ncb, SizeOf(TNCB), 0); <BR>ncb.ncb_command := Char(NCBEnum); <BR>ncb.ncb_buffer := PChar(@lanaEnum); <BR>ncb.ncb_length := SizeOf(TLanaEnum); <BR>s:=Netbios(@ncb); <BR>for i := 0 to integer(lanaEnum.length)-1 do <BR>begin <BR>FillChar(ncb, SizeOf(TNCB), 0); <BR>ncb.ncb_command := Char(NCBReset); <BR>ncb.ncb_lana_num := lanaEnum.lana; <BR>Netbios(@ncb); <BR>Netbios(@ncb); <BR>FillChar(ncb, SizeOf(TNCB), 0); <BR>ncb.ncb_command := Chr(NCBAstat); <BR>ncb.ncb_lana_num := lanaEnum.lana; <BR>ncb.ncb_callname := '* '; <BR>ncb.ncb_buffer := PChar(@adapt); <BR>ncb.ncb_length := SizeOf(TASTAT); <BR>m:=0; <BR>if (Win32Platform = VER_PLATFORM_WIN32_NT) then <BR>m:=1; <BR>if m=1 then <BR>begin <BR>if Netbios(@ncb) = Chr(0) then <BR>strMac := ''; <BR>for j := 0 to 5 do <BR>begin <BR>strPart := IntToHex(integer(adapt.adapter.adapter_address), 2); <BR>strMac := strMac + strPart + '-'; <BR>end; <BR>SetLength(strMac, Length(strMac)-1); <BR>end; <BR>if m=0 then <BR>if Netbios(@ncb) &lt;&gt; Chr(0) then <BR>begin <BR>strMac := ''; <BR>for j := 0 to 5 do <BR>begin <BR>strPart := IntToHex(integer(adapt.adapter.adapter_address), 2); <BR>strMac := strMac + strPart + '-'; <BR>end; <BR>SetLength(strMac, Length(strMac)-1); <BR>end; <BR>end; <BR>result:=strmac; <BR>end; <br><br>function PartitionString(StrV,PrtSymbol: string): TStringList; <BR>var <BR>iTemp: integer; <BR>begin <BR>result := TStringList.Create; <BR>iTemp := pos(PrtSymbol,StrV); <BR>while iTemp&gt;0 do begin <BR>if iTemp&gt;1 then result.Append(copy(StrV,1,iTemp-1)); <BR>delete(StrV,1,iTemp+length(PrtSymbol)-1); <BR>iTemp := pos(PrtSymbol,StrV); <BR>end; <BR>if Strv&lt;&gt;'' then result.Append(StrV); <BR>end; <br><br>function MacStr():String; <BR>var <BR>Str:TStrings; <BR>i:Integer; <BR>MacStr:String; <BR>begin <BR>MacStr:=''; <BR>Str:=TStringList.Create; <BR>Str:=PartitionString(Getmac,'-'); <BR>for i:=0 to Str.Count-1 do <BR>MacStr:=MacStr+Str; <BR>Result:=MacStr; <BR>end; <br><br>//============================================== <br><br><BR>//调用示例 <BR>procedure TForm1.Button1Click(Sender: TObject); <BR>begin <BR>Edit3.Text:=strpas(GetIdeSerialNumber);//取硬盘号 <BR>Edit2.text:=GetCPUIDStr;//CPU系列号 <BR>edit4.Text:=NBGetAdapterAddress(12);//非集成网卡 <BR>Edit1.text:=MacStr;//集成和非集成网卡 <br><br>end;<BR></div>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>一个简单的花指令伪装器-Delphi版木马彩衣</li><li>Delphi实现窗口文字淡入淡出渐变效果的方法</li><li>Delphi实现限定软件使用时间的方法</li><li>Delphi实现图像文本旋转特效完整实例代码</li><li>Delphi实现图片滚动切换的完整实例代码</li><li>Delphi实现读取系统时间与日期完整实例</li><li>Delphi中对时间操作方法汇总</li><li>delphi7连接mysql5的实现方法</li><li>delphi设置开机自动启动函数具体实现</li><li>Delphi隐藏TPageControl的标签实例介绍</li><li>Delphi实现木马自我拷贝方法</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: DELPHI7.0 获取硬盘、CPU、网卡序列号的代码