Copie o código do código da seguinte forma:
//Referência e declaração da variável TYPE
usa
Windows, Mensagens, SysUtils, Variantes, Classes, Gráficos, Controles, Formulários,
Diálogos, StdCtrls, nb30; {Citação importante}
tipo
PASTAT = ^TASTAT;
TASTAT=registro
adaptador: TAdapterStatus;
nome_buf: TNameBuffer;
fim;
TForm1 = classe(TForm)
Botão1: Botão T;
Editar1: TEdit;
Rótulo1: TLabel;
Etiqueta2: TLabel;
Rótulo3: TLabel;
Editar2: TEdit;
Editar3: TEdit;
Botão2: Botão T;
Editar4: TEdit;
Etiqueta4: TLabel;
procedimento Button1Click(Remetente: TObject);
procedimento Button2Click(Remetente: TObject);
privado
{Declarações privadas}
público
{Declarações públicas}
fim;
var
Formulário1: TForm1;
implementação
{$R *.dfm}
tipo
TCPUID = array[1..4] de inteiro longo;
//Obtém o número de série do disco rígido:
function GetIdeSerialNumber: pchar; //Obtém o número de série de fábrica do disco rígido;
const IDENTIFY_BUFFER_SIZE = 512;
tipo
TIDERegs = registro compactado
bFeaturesReg: BYTE;
bSectorCountReg:BYTE;
bSectorNumberReg:BYTE;
bCylLowReg:BYTE;
bCylHighReg: BYTE;
bDriveHeadReg:BYTE;
bCommandReg:BYTE;
bReservado: BYTE;
fim;
TSendCmdInParams = registro compactado
cBufferSize: DWORD;
irDriveRegs: TIDERegs;
bDriveNumber: BYTE;
bReservado: array[0..2] de Byte;
dwReserved: array[0..3] de DWORD;
bBuffer: array[0..0] de Bytes;
fim;
TIdSector = registro compactado
wGenConfig: Palavra;
wNumCyls: Palavra;
wReservado: Palavra;
wNumHeads: Palavra;
wBytesPerTrack: Palavra;
wBytesPerSector: Palavra;
wSectorsPerTrack: Palavra;
wVendorUnique: array[0..2] do Word;
sSerialNumber: array[0..19] de CHAR;
wBufferType: Palavra;
wBufferSize: Palavra;
wECCSize: Palavra;
sFirmwareRev: array[0..7] de Char;
sModelNumber: array[0..39] de Char;
wMaisVendorÚnico: Word;
wDoubleWordIO: Palavra;
wCapacidades: Word;
wReservado1: Palavra;
wPIOTiming: Palavra;
wDMATiming: Palavra;
EAB: Palavra;
wNumCurrentCyls: Palavra;
wNumCurrentHeads: Palavra;
wNumCurrentSectorsPerTrack: Palavra;
ulCurrentSectorCapacity: DWORD;
wMultSectorStuff: Palavra;
ulTotalAddressableSectors: DWORD;
wSingleWordDMA: Palavra;
wMultiWordDMA: Palavra;
bReservado: array[0..127] de BYTE;
fim;
PIdSector = ^TIdSector;
TDriverStatus = registro compactado
bDriverError: Byte;
bIDEStatus: Byte;
bReservado: array[0..1] de Byte;
dwReserved: array[0..1] de DWORD;
fim;
TSendCmdOutParams = registro compactado
cBufferSize: DWORD;
Status do Driver: TDriverStatus;
bBuffer: array[0..0] de BYTE;
fim;
var
hDispositivo: Thandle;
cbBytesRetornados: DWORD;
SCIP:TSendCmdInParams;
aIdOutCmd: array[0..(SizeOf(TSendCmdOutParams) + IDENTIFY_BUFFER_SIZE-1)-1] de Byte;
IdOutCmd: TSendCmdOutParams aIdOutCmd absoluto;
procedimento ChangeByteOrder(var Data; Size: Integer);//O processo na função
var
ptr: Pchar;
eu: inteiro;
c: Caráter;
começar
ptr := @Dados;
para I := 0 a (Tamanho shr 1) - 1 comece
c:=ptr^;
ptr^ := (ptr + 1)^;
(ptr + 1)^ := c;
Inc(ptr, 2);
fim;
fim;
começar //corpo da função
Resultado:= '';
se SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT então
começar // Windows NT, Windows 2000
hDevice := CreateFile('//./PhysicalDrive0', GENERIC_READ ou GENERIC_WRITE,
FILE_SHARE_READ ou FILE_SHARE_WRITE, nulo, OPEN_EXISTING, 0, 0);
fim
else // Versão Windows 95 OSR2, Windows 98
hDevice := CreateFile('//./SMARTVSD', 0, 0, nil, Create_NEW, 0, 0);
se hDevice = INVALID_HANDLE_VALUE então Sair;
tentar
FillChar(SCIP, SizeOf(TSendCmdInParams) - 1, #0);
FillChar(aIdOutCmd, SizeOf(aIdOutCmd), #0);
cbBytesRetornados := 0;
com SCIP faça
começar
cBufferSize := IDENTIFY_BUFFER_SIZE;
com irDriveRegs faça
começar
bSectorCountReg := 1;
bSectorNumberReg := 1;
bDriveHeadReg := $A0;
bCommandReg := $EC;
fim;
fim;
se não for DeviceIoControl(hDevice, $0007C088, @SCIP, SizeOf(TSendCmdInParams) - 1,@aIdOutCmd, SizeOf(aIdOutCmd), cbBytesReturned, nil) então Sair;
finalmente
CloseHandle(hDevice);
fim;
com PIdSector(@IdOutCmd.bBuffer)^ faça
começar
ChangeByteOrder(sSerialNumber, SizeOf(sSerialNumber));
(Pchar(@sSerialNumber) + SizeOf(sSerialNumber))^:= #0;
Resultado := Pchar(@sSerialNumber);
fim;
fim;
//=============================================== =================
//Número de série da CPU:
FUNÇÃO GetCPUID : registrador TCPUID;
asm
PUSH EBX {Salvar registro afetado}
PRESSIONE EDI
MOV EDI,EAX {@Resukt}
MOV EAX,1
DW $A20F {comando CPUID}
STOSD {CPUID[1]}
MOV EAX,EBX
STOSD {CPUID[2]}
MOV EAX,ECX
STOSD {CPUID[3]}
MOV EAX,EDX
STOSD {CPUID[4]}
POP EDI {Restaurar registros}
POPEBX
FIM;
função GetCPUIDStr:String;
var
CPUID:TCPUID;
começar
CPUID:=ObterCPUID;
Resultado:=IntToHex(CPUID[1],8)+IntToHex(CPUID[2],8)+IntToHex(CPUID[3],8)+IntToHex(CPUID[4],8);
fim;
///============================================= ===================================
///Obter MAC (placa de rede não integrada):
função NBGetAdapterAddress (a: Inteiro): string;
var
NCB: TNCB; // bloco de controle NetBios // bloco de controle NetBios
ADAPTADOR: TADAPTERSTATUS; // Status do adaptador Netbios // Obtém o status da placa de rede
LANAENUM: TLANAENUM; // Netbios lana
intIdx: Integer; // Valor de trabalho temporário // Variável temporária
cRC: Char; // Código de retorno NetBios // Valor de retorno NetBios
strTemp: string; // String temporária // Variável temporária
começar
//Inicializar
Resultado:= '';
tentar
// Bloco de controle zero
ZeroMemory(@NCB, SizeOf(NCB));
//Emite o comando enum
NCB.ncb_command := Chr(NCBENUM);
cRC := NetBios(@NCB);
//Reemitir comando enum
NCB.ncb_buffer := @LANAENUM;
NCB.ncb_length := SizeOf(LANAENUM);
cRC := NetBios(@NCB);
se ord(cRC) <> 0 então
saída;
//Reinicia adaptador
ZeroMemory(@NCB, SizeOf(NCB));
NCB.ncb_command := Chr(NCBRESET);
NCB.ncb_lana_num := LANAENUM.lana[a];
cRC := NetBios(@NCB);
se ord(cRC) <> 0 então
saída;
//Obtém o endereço do adaptador
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);
//converte para string
strTemp := '';
para intIdx := 0 a 5 faça
strTemp := strTemp + InttoHex(Integer(ADAPTER.adapter_address[intIdx]), 2);
Resultado:= strTemp;
finalmente
fim;
fim;
//=============================================== ==========================
//Obter o endereço MAC (placa de rede integrada e placa de rede não integrada):
função Getmac:string;
var
ncb: TNCB;
s:string;
adaptar: TASTAT;
lanaEnum : TLanaEnum;
eu, j, m: inteiro;
strPart, strMac: string;
começar
FillChar(ncb, SizeOf(TNCB), 0);
ncb.ncb_command := Char(NCBEnum);
ncb.ncb_buffer := PChar(@lanaEnum);
ncb.ncb_length := SizeOf(TLanaEnum);
s:=Netbios(@ncb);
para i := 0 para inteiro(lanaEnum.length)-1 faça
começar
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;
se (Win32Platform = VER_PLATFORM_WIN32_NT) então
m:=1;
se m = 1 então
começar
se Netbios(@ncb) = Chr(0) então
strMac := '';
para j := 0 a 5 faça
começar
strPart := IntToHex(integer(adapt.adapter.adapter_address[j]), 2);
strMac := strMac + strPart + '-';
fim;
SetLength(strMac, Comprimento(strMac)-1);
fim;
se m = 0 então
se Netbios(@ncb) <> Chr(0) então
começar
strMac := '';
para j := 0 a 5 faça
começar
strPart := IntToHex(integer(adapt.adapter.adapter_address[j]), 2);
strMac := strMac + strPart + '-';
fim;
SetLength(strMac, Comprimento(strMac)-1);
fim;
fim;
resultado:=strmac;
fim;
função PartitionString(StrV,PrtSymbol: string): TStringList;
var
iTemp: inteiro;
começar
resultado: = TStringList.Create;
iTemp := pos(PrtSymbol,StrV);
enquanto iTemp> 0 começa
se iTemp>1 então result.Append(copy(StrV,1,iTemp-1));
delete(StrV,1,iTemp+comprimento(PrtSymbol)-1);
iTemp := pos(PrtSymbol,StrV);
fim;
se Strv<>'' então resultado.Append(StrV);
fim;
função MacStr():String;
var
Str:Strings;
eu:Inteiro;
MacStr:String;
começar
MacStr:='';
Str:=TStringList.Create;
Str:=PartitionString(Getmac,'-');
para i:=0 para Str.Count-1 faça
MacStr:=MacStr+Str[i];
Resultado:=MacStr;
fim;
//=============================================
//Exemplo de chamada
procedimento TForm1.Button1Click(Remetente: TObject);
começar
Edit3.Text:=strpas(GetIdeSerialNumber);//Obtém o número do disco rígido
Edit2.text:=GetCPUIDStr;//número de série da CPU
edit4.Text:=NBGetAdapterAddress(12);//placa de rede não integrada
Edit1.text:=MacStr;//Placas de rede integradas e não integradas
fim;