คัดลอกรหัสรหัสดังต่อไปนี้:
//การประกาศตัวแปรอ้างอิงและประเภท
การใช้งาน
Windows, ข้อความ, SysUtils, ตัวแปร, คลาส, กราฟิก, การควบคุม, แบบฟอร์ม,
กล่องโต้ตอบ, StdCtrls, nb30; {คำพูดที่สำคัญ}
พิมพ์
พาสต้า = ^ทาสแตท;
TASTAT=บันทึก
อะแดปเตอร์: TAdapterStatus;
name_buf : TNameBuffer;
จบ;
TForm1 = คลาส (TForm)
Button1: T ปุ่ม;
แก้ไข 1: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
แก้ไข 2: TEdit;
แก้ไข 3: TEdit;
Button2: T ปุ่ม;
แก้ไข 4: TEdit;
Label4: TLabel;
ขั้นตอน Button1Click (ผู้ส่ง: TObject);
ขั้นตอน Button2Click (ผู้ส่ง: TObject);
ส่วนตัว
{ประกาศส่วนตัว}
สาธารณะ
{ประกาศสาธารณะ}
จบ;
var
แบบฟอร์ม 1: TForm1;
การดำเนินการ
{$R *.dfm}
พิมพ์
TCPUID = array[1..4] ของ Longint;
// รับหมายเลขซีเรียลของฮาร์ดไดรฟ์:
ฟังก์ชั่น GetIdeSerialNumber: pchar; // รับหมายเลขซีเรียลของฮาร์ดดิสก์จากโรงงาน
const IDENTIFY_BUFFER_SIZE = 512;
พิมพ์
TIDERegs = บันทึกที่อัดแน่น
bFeaturesReg: ไบต์;
bSectorCountReg: ไบต์;
bSectorNumberReg: ไบต์;
bCylLowReg: ไบต์;
bCylHighReg: ไบต์;
bDriveHeadReg: ไบต์;
bCommandReg: ไบต์;
สงวนไว้: ไบต์;
จบ;
TSendCmdInParams = บันทึกที่อัดแน่น
cBufferSize: DWORD;
irDriveRegs: TIDERegs;
bDriveNumber: ไบต์;
bสงวนไว้: อาร์เรย์ [0..2] ของไบต์;
dwReserved: อาร์เรย์ [0..3] ของ DWORD;
bBuffer: อาร์เรย์ [0..0] ของไบต์;
จบ;
TIdSector = บันทึกที่อัดแน่น
wGenConfig: คำ;
wNumCyls: Word;
สงวนไว้: Word;
wNumHeads: Word;
wBytesPerTrack: Word;
wBytesPerSector: Word;
wSectorsPerTrack: Word;
wVendorUnique: อาร์เรย์ [0..2] ของ Word;
sSerialNumber: อาร์เรย์ [0..19] ของ CHAR;
wBufferType: Word;
wBufferSize: Word;
wECCSize: Word;
sFirmwareRev: อาร์เรย์ [0..7] ของ Char;
sModelNumber: อาร์เรย์ [0..39] ของ Char;
wMoreVendorUnique: คำ;
wDoubleWordIO: คำ;
ความสามารถ: Word;
wReserved1: คำ;
wPIOTiming: Word;
wDMATiming: Word;
WBS: คำ;
wNumCurrentCyls: Word;
wNumCurrentHeads: Word;
wNumCurrentSectorsPerTrack: Word;
ulCurrentSectorCapacity: DWORD;
wMultSectorStuff: Word;
ulTotalAddressableSectors: DWORD;
wSingleWordDMA: คำ;
wMultiWordDMA: คำ;
bสงวนไว้: อาร์เรย์ [0..127] ของ BYTE;
จบ;
PIdSector = ^TIdSector;
TDriverStatus = บันทึกที่อัดแน่น
bDriverError: ไบต์;
สถานะ BIDE: ไบต์;
bสงวนไว้: อาร์เรย์ [0..1] ของไบต์;
dwReserved: อาร์เรย์ [0..1] ของ DWORD;
จบ;
TSendCmdOutParams = บันทึกที่อัดแน่น
cBufferSize: DWORD;
สถานะไดร์เวอร์: TDriverStatus;
bBuffer: อาร์เรย์ [0..0] ของ BYTE;
จบ;
var
อุปกรณ์: Thandle;
cbBytesส่งคืน: DWORD;
SCIP:TSendCmdInParams;
aIdOutCmd: array[0..(SizeOf(TSendCmdOutParams) + IDENTIFY_BUFFER_SIZE-1)-1] ของไบต์;
IdOutCmd: TSendCmdOutParams aIdOutCmd แบบสัมบูรณ์;
ขั้นตอน ChangeByteOrder(var Data; Size: Integer);//กระบวนการในฟังก์ชัน
var
ptr: พชาร์;
ฉัน: จำนวนเต็ม;
ค: ชาร์;
เริ่ม
ptr := @ข้อมูล;
สำหรับฉัน := 0 ถึง (ขนาด shr 1) - 1 จะเริ่มต้น
ค := ptr^;
ptr^ := (ptr + 1)^;
(ptr + 1)^ := ค;
อิงค์(พีทีอาร์, 2);
จบ;
จบ;
start //ฟังก์ชั่น body
ผลลัพธ์ := '';
ถ้า SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT แล้ว
เริ่มต้น // Windows NT, Windows 2000
hDevice := CreateFile('//./PhysicalDrive0', GENERIC_READ หรือ GENERIC_WRITE,
FILE_SHARE_READ หรือ FILE_SHARE_WRITE, ไม่มี, OPEN_EXISTING, 0, 0);
จบ
อื่น // เวอร์ชัน Windows 95 OSR2, Windows 98
hDevice := CreateFile('//./SMARTVSD', 0, 0, ไม่มี, Create_NEW, 0, 0);
ถ้า hDevice = INVALID_HANDLE_VALUE ให้ออก;
พยายาม
FillChar(SCIP, SizeOf(TSendCmdInParams) - 1, #0);
FillChar(aIdOutCmd, SizeOf(aIdOutCmd), #0);
cbBytesส่งคืนแล้ว := 0;
ด้วย SCIP ทำ
เริ่ม
cBufferSize := IDENTIFY_BUFFER_SIZE;
ด้วย irDriveRegs
เริ่ม
bSectorCountReg := 1;
bSectorNumberReg := 1;
bDriveHeadReg := $A0;
bCommandReg := $EC;
จบ;
จบ;
ถ้าไม่ใช่ DeviceIoControl(hDevice, $0007C088, @SCIP, SizeOf(TSendCmdInParams) - 1,@aIdOutCmd, SizeOf(aIdOutCmd), cbBytesReturned, nil) จากนั้นให้ออก
ในที่สุด
CloseHandle (อุปกรณ์ h);
จบ;
ด้วย PIdSector(@IdOutCmd.bBuffer)^ ทำ
เริ่ม
ChangeByteOrder(sSerialNumber, SizeOf(sSerialNumber));
(Pchar(@sSerialNumber) + ขนาดของ(sSerialNumber))^:= #0;
ผลลัพธ์ := Pchar(@sSerialNumber);
จบ;
จบ;
//================================================ =================
//หมายเลขซีเรียลของซีพียู:
ฟังก์ชั่น GetCPUID : แอสเซมเบลอร์;
asm
PUSH EBX {บันทึกการลงทะเบียนที่ได้รับผลกระทบ}
พุชอีดีไอ
MOV EDI,EAX {@Resukt}
MOV EAX,1
DW $A20F {คำสั่ง CPU}
STOSD {CPUID[1]}
MOV EAX, EBX
STOSD {CPUID[2]}
MOV EAX, ECX
STOSD {CPUID[3]}
MOV EAX, EDX
STOSD {CPUID[4]}
POP EDI {คืนค่าการลงทะเบียน}
ป๊อปเบกซ์
จบ;
ฟังก์ชัน GetCPUIDStr:สตริง;
var
CPUID:TCPUID;
เริ่ม
CPUID:=รับ CPUID;
ผลลัพธ์:=IntToHex(CPUID[1],8)+IntToHex(CPUID[2],8)+IntToHex(CPUID[3],8)+IntToHex(CPUID[4],8);
จบ;
///=============================================== = ===================================
/// รับ MAC (การ์ดเครือข่ายที่ไม่รวม):
ฟังก์ชัน NBGetAdapterAddress (a: จำนวนเต็ม): สตริง;
var
NCB: TNCB; // บล็อกควบคุม Netbios // บล็อกควบคุม NetBios
อะแดปเตอร์: TADAPTERSTATUS; // สถานะอะแดปเตอร์ Netbios// รับสถานะการ์ดเครือข่าย
LANAENUM: TLANAENUM; // Netbios ลาน่า
intIdx: จำนวนเต็ม; // ค่าทำงานชั่วคราว//ตัวแปรชั่วคราว
cRC: Char; // รหัสส่งคืน Netbios//ค่าส่งคืน NetBios
strTemp: string; // สตริงชั่วคราว//ตัวแปรชั่วคราว
เริ่ม
//เริ่มต้น
ผลลัพธ์ := '';
พยายาม
// บล็อกควบคุมเป็นศูนย์
ZeroMemory(@NCB, ขนาดของ(NCB));
// ออกคำสั่ง enum
NCB.ncb_command := Chr(NCBENUM);
cRC := NetBios(@NCB);
// ออกคำสั่ง enum ใหม่
NCB.ncb_buffer := @LANAENUM;
NCB.ncb_length := ขนาดของ (LANAENUM);
cRC := NetBios(@NCB);
ถ้า ord(cRC) <> 0 แล้ว
ออก;
//รีเซ็ตอะแดปเตอร์
ZeroMemory(@NCB, ขนาดของ(NCB));
NCB.ncb_command := Chr(NCBRESET);
NCB.ncb_lana_num := LANAENUM.lana[a];
cRC := NetBios(@NCB);
ถ้า ord(cRC) <> 0 แล้ว
ออก;
// รับที่อยู่อะแดปเตอร์
ZeroMemory(@NCB, ขนาดของ(NCB));
NCB.ncb_command := Chr(NCBASTAT);
NCB.ncb_lana_num := LANAENUM.lana[a];
StrPCopy(NCB.ncb_callname, '*');
NCB.ncb_buffer := @ADAPTER;
NCB.ncb_length := ขนาดของ (ADAPTER);
cRC := NetBios(@NCB);
// แปลงเป็นสตริง
strTemp := '';
สำหรับ intIdx := 0 ถึง 5 ทำ
strTemp := strTemp + InttoHex(จำนวนเต็ม(ADAPTER.adapter_address[intIdx]), 2);
ผลลัพธ์ := strTemp;
ในที่สุด
จบ;
จบ;
//================================================ ==========================
// รับที่อยู่ MAC (การ์ดเครือข่ายแบบรวมและการ์ดเครือข่ายแบบไม่รวม):
ฟังก์ชั่น Getmac:สตริง;
var
ncb: ธนชาต;
ส:สตริง;
ปรับให้เข้ากับ: TASTAT;
lanaEnum : TLanaEnum;
ฉัน, เจ, ม. : จำนวนเต็ม;
strPart, strMac : สตริง;
เริ่ม
FillChar(ncb, ขนาดของ(TNCB), 0);
ncb.ncb_command := ถ่าน (NCBEnum);
ncb.ncb_buffer := PChar(@lanaEnum);
ncb.ncb_length := ขนาดของ (TLanaEnum);
s:=Netbios(@ncb);
สำหรับ i := 0 ถึงจำนวนเต็ม (lanaEnum.length)-1 do
เริ่ม
FillChar(ncb, ขนาดของ(TNCB), 0);
ncb.ncb_command := ถ่าน (NCBReset);
ncb.ncb_lana_num := lanaEnum.lana[i];
เน็ตไบออส(@ncb);
เน็ตไบออส(@ncb);
FillChar(ncb, ขนาดของ(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 := ขนาดของ (TASTAT);
ม:=0;
ถ้า (Win32Platform = VER_PLATFORM_WIN32_NT) แล้ว
ม:=1;
ถ้า m=1 แล้ว
เริ่ม
ถ้า Netbios(@ncb) = Chr(0) แล้ว
strMac := '';
สำหรับ j := 0 ถึง 5 ทำ
เริ่ม
strPart := IntToHex(จำนวนเต็ม(adapt.adapter.adapter_address[j]), 2);
strMac := strMac + strPart + '-';
จบ;
SetLength(strMac, ความยาว(strMac)-1);
จบ;
ถ้า m=0 แล้ว
ถ้า Netbios(@ncb) <> Chr(0) แล้ว
เริ่ม
strMac := '';
สำหรับ j := 0 ถึง 5 ทำ
เริ่ม
strPart := IntToHex(จำนวนเต็ม(adapt.adapter.adapter_address[j]), 2);
strMac := strMac + strPart + '-';
จบ;
SetLength(strMac, ความยาว(strMac)-1);
จบ;
จบ;
ผลลัพธ์:=strmac;
จบ;
ฟังก์ชั่น PartitionString (StrV, PrtSymbol: string): TStringList;
var
iTemp: จำนวนเต็ม;
เริ่ม
ผลลัพธ์ := TStringList.Create;
iTemp := pos(PrtSymbol,StrV);
ในขณะที่ iTemp>0 เริ่มต้นขึ้น
ถ้า iTemp>1 แล้ว result.Append(copy(StrV,1,iTemp-1));
ลบ(StrV,1,iTemp+ความยาว(PrtSymbol)-1);
iTemp := pos(PrtSymbol,StrV);
จบ;
ถ้า Strv<>'' แล้ว result.Append(StrV);
จบ;
ฟังก์ชัน MacStr():สตริง;
var
Str:TStrings;
ฉัน:จำนวนเต็ม;
MacStr:สตริง;
เริ่ม
MacStr:='';
Str:=TStringList.Create;
Str:=PartitionString(Getmac,'-');
สำหรับ i:=0 ถึง Str.Count-1 ทำ
MacStr:=MacStr+Str[i];
ผลลัพธ์:=MacStr;
จบ;
-
//ตัวอย่างการโทร
ขั้นตอน TForm1.Button1Click (ผู้ส่ง: TObject);
เริ่ม
Edit3.Text:=strpas(GetIdeSerialNumber);//รับหมายเลขฮาร์ดดิสก์
Edit2.text:=GetCPUIDStr;//หมายเลขซีเรียลของ CPU
edit4.Text:=NBGetAdapterAddress(12);//การ์ดเครือข่ายแบบไม่รวม
แก้ไข1.text:=MacStr;//การ์ดเครือข่ายแบบรวมและแบบไม่รวม
จบ;