다음과 같이 코드 코드를 복사합니다.
//참조 및 TYPE 변수 선언
용도
Windows, 메시지, SysUtils, 변형, 클래스, 그래픽, 컨트롤, 양식,
대화상자, StdCtrls,nb30 {중요 인용문}
유형
PASTAT = ^TASTAT;
TASTAT=기록
어댑터: TAdapterStatus;
name_buf : TNameBuffer;
끝;
TForm1 = 클래스(TForm)
버튼1: T버튼;
편집1: T편집;
라벨1: TLabel;
라벨2: TLabel;
라벨3: TLabel;
편집2: T편집;
편집3: T편집;
Button2: T버튼;
편집4: T편집;
라벨4: TLabel;
절차 Button1Click(Sender: TObject);
절차 Button2Click(보내는 사람: TObject);
사적인
{비공개 선언}
공공의
{공개 선언}
끝;
var
Form1: TForm1;
구현
{$R *.dfm}
유형
TCPUID = Longint의 배열[1..4];
//하드 드라이브 일련 번호를 가져옵니다.
function GetIdeSerialNumber: pchar; //하드 디스크의 공장 일련 번호를 가져옵니다.
const IDENTIFY_BUFFER_SIZE = 512;
유형
TIDERegs = 압축된 기록
bFeaturesReg: BYTE;
bSectorCountReg: BYTE;
bSectorNumberReg: BYTE;
bCylLowReg: BYTE;
bCylHighReg: BYTE;
bDriveHeadReg: BYTE;
bCommandReg: BYTE;
b예약됨: BYTE;
끝;
TSendCmdInParams = 압축된 레코드
cBufferSize: DWORD;
irDriveRegs: TIDERegs;
b드라이브번호: BYTE;
bReserved: 바이트 배열[0..2];
dwReserved: DWORD의 배열[0..3];
bBuffer: 바이트 배열[0..0];
끝;
TIdSector = 압축된 레코드
wGenConfig: 단어;
wNumCyls: 단어;
w예약됨: 단어;
wNumHeads: 단어;
wBytesPerTrack: 단어;
wBytesPerSector: 단어;
wSectorsPerTrack: 단어;
wVendorUnique: Word의 배열[0..2];
sSerialNumber: CHAR의 배열[0..19];
wBufferType: 단어;
wBufferSize: 워드;
wECCC크기: 단어;
sFirmwareRev: Char 배열[0..7];
sModelNumber: Char의 배열[0..39];
wMoreVendorUnique: 단어;
wDoubleWordIO: 단어;
w기능: 단어;
wReserved1: 단어;
wPIO타이밍: 단어;
wDMATiming: 단어;
wBS: 단어;
wNumCurrentCyls: 단어;
wNumCurrentHeads: 단어;
wNumCurrentSectorsPerTrack: 단어;
ulCurrentSectorCapacity: DWORD;
wMultSectorStuff: 단어;
ulTotalAddressableSectors: DWORD;
wSingleWordDMA: 단어;
wMultiWordDMA: 워드;
bReserved: BYTE의 배열[0..127];
끝;
PId섹터 = ^TId섹터;
TDriverStatus = 압축된 기록
bDriverError: 바이트;
bIDEStatus: 바이트;
bReserved: 바이트 배열[0..1];
dwReserved: DWORD의 배열[0..1];
끝;
TSendCmdOutParams = 압축된 레코드
cBufferSize: DWORD;
드라이버상태: TDriverStatus;
bBuffer: BYTE의 배열[0..0];
끝;
var
hDevice: 핸들;
cbBytes반환: DWORD;
SCIP:TSendCmdInParams;
aIdOutCmd: 바이트의 배열[0..(SizeOf(TSendCmdOutParams) + IDENTIFY_BUFFER_SIZE-1)-1];
IdOutCmd: TSendCmdOutParams 절대 aIdOutCmd;
절차 ChangeByteOrder(var Data; Size: Integer);//함수 내 프로세스
var
ptr: Pchar;
i: 정수;
c: 문자;
시작하다
ptr := @데이터;
for I := 0 ~ (Size shr 1) - 1 시작
c := ptr^;
ptr^ := (ptr + 1)^;
(ptr + 1)^ := c;
Inc(포인트, 2);
끝;
끝;
시작 //함수 본문
결과 := '';
SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT인 경우
시작 // 윈도우 NT, 윈도우 2000
hDevice := CreateFile('//./PhysicalDrive0', GENERIC_READ 또는 GENERIC_WRITE,
FILE_SHARE_READ 또는 FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
끝
else // 버전 Windows 95 OSR2, Windows 98
hDevice := CreateFile('//./SMARTVSD', 0, 0, nil, Create_NEW, 0, 0);
hDevice = INVALID_HANDLE_VALUE이면 종료합니다.
노력하다
FillChar(SCIP, SizeOf(TSendCmdInParams) - 1, #0);
FillChar(aIdOutCmd, SizeOf(aIdOutCmd), #0);
cbBytesReturned := 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(hDevice);
끝;
PIdSector(@IdOutCmd.bBuffer)^ 사용
시작하다
ChangeByteOrder(sSerialNumber, SizeOf(sSerialNumber));
(Pchar(@sSerialNumber) + SizeOf(sSerialNumber))^:= #0;
결과 := Pchar(@sSerialNumber);
끝;
끝;
//================================================ =================
//CPU 일련번호:
기능 GetCPUID: TCPUID 레지스터;
asm
PUSH EBX {영향을 받은 레지스터 저장}
푸시 EDI
MOV EDI,EAX {@Resukt}
MOV EAX,1
DW $A20F {CPUID 명령}
중지됨 {CPUID[1]}
MOV EAX,EBX
중지됨 {CPUID[2]}
MOV EAX,ECX
중지됨 {CPUID[3]}
MOV EAX,EDX
중지됨 {CPUID[4]}
POP EDI {레지스터 복원}
포페BX
끝;
함수 GetCPUIDStr:문자열;
var
CPUID:TCPUID;
시작하다
CPUID:=GetCPUID;
결과:=IntToHex(CPUID[1],8)+IntToHex(CPUID[2],8)+IntToHex(CPUID[3],8)+IntToHex(CPUID[4],8);
끝;
///=============================================== = ===================================
///MAC 가져오기(비통합 네트워크 카드):
함수 NBGetAdapterAddress(a: 정수): 문자열;
var
NCB: TNCB; // Netbios 제어 블록 //NetBios 제어 블록
ADAPTER: TADAPTERSTATUS; // Netbios 어댑터 상태//네트워크 카드 상태 가져오기
LANAENUM: TLANAENUM // Netbios 라나;
intIdx: Integer; // 임시 작업 값//임시 변수
cRC: Char; // Netbios 반환 코드//NetBios 반환 값
strTemp: string; // 임시 문자열//임시 변수
시작하다
//초기화
결과 := '';
노력하다
// 제로 제어 블록
ZeroMemory(@NCB, SizeOf(NCB));
// enum 명령을 실행합니다.
NCB.ncb_command := Chr(NCBENUM);
cRC := 넷바이오스(@NCB);
// enum 명령을 다시 실행합니다.
NCB.ncb_buffer := @LANAENUM;
NCB.ncb_length := SizeOf(LANAENUM);
cRC := 넷바이오스(@NCB);
ord(cRC) <> 0이면
출구;
//어댑터 재설정
ZeroMemory(@NCB, SizeOf(NCB));
NCB.ncb_command := Chr(NCBRESET);
NCB.ncb_lana_num := LANAENUM.lana[a];
cRC := 넷바이오스(@NCB);
ord(cRC) <> 0이면
출구;
// 어댑터 주소 얻기
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 := 넷바이오스(@NCB);
// 문자열로 변환
strTemp := '';
for intIdx := 0 ~ 5 do
strTemp := strTemp + InttoHex(Integer(ADAPTER.adapter_address[intIdx]), 2);
결과 := strTemp;
마지막으로
끝;
끝;
//================================================ ==========================
//MAC 주소 가져오기(통합 네트워크 카드 및 비통합 네트워크 카드):
함수 Getmac:문자열;
var
ncb: TNCB;
s:문자열;
적응하다: TASTAT;
lanaEnum : TLanaEnum;
i, j, m : 정수;
strPart, strMac : 문자열;
시작하다
FillChar(ncb, SizeOf(TNCB), 0);
ncb.ncb_command := Char(NCBEnum);
ncb.ncb_buffer := PChar(@lanaEnum);
ncb.ncb_length := SizeOf(TLanaEnum);
s:=넷바이오스(@ncb);
for i := 0에서 정수(lanaEnum.length)-1 do
시작하다
FillChar(ncb, SizeOf(TNCB), 0);
ncb.ncb_command := Char(NCBReset);
ncb.ncb_lana_num := lanaEnum.lana[i];
넷바이오스(@ncb);
넷바이오스(@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) 그러면
m:=1;
m=1이면
시작하다
Netbios(@ncb) = Chr(0)이면
strMac := '';
for j := 0 ~ 5 do
시작하다
strPart := IntToHex(integer(adapt.adapter.adapter_address[j]), 2);
strMac := strMac + strPart + '-';
끝;
SetLength(strMac, 길이(strMac)-1);
끝;
m=0이면
if Netbios(@ncb) <> Chr(0) then
시작하다
strMac := '';
for j := 0 ~ 5 do
시작하다
strPart := IntToHex(integer(adapt.adapter.adapter_address[j]), 2);
strMac := strMac + strPart + '-';
끝;
SetLength(strMac, 길이(strMac)-1);
끝;
끝;
결과:=strmac;
끝;
함수 PartitionString(StrV,PrtSymbol: 문자열): TStringList;
var
iTemp: 정수;
시작하다
결과 := TStringList.Create;
iTemp := pos(PrtSymbol,StrV);
iTemp>0이 시작되는 동안
iTemp>1이면 result.Append(copy(StrV,1,iTemp-1));
delete(StrV,1,iTemp+length(PrtSymbol)-1);
iTemp := pos(PrtSymbol,StrV);
끝;
if Strv<>'' 그러면 result.Append(StrV);
끝;
함수 MacStr():문자열;
var
Str:TStrings;
i:정수;
MacStr:문자열;
시작하다
MacStr:='';
Str:=TStringList.Create;
Str:=PartitionString(Getmac,'-');
i:=0에서 Str.Count-1까지 do
MacStr:=MacStr+Str[i];
결과:=MacStr;
끝;
//==============================================
//호출 예시
절차 TForm1.Button1Click(Sender: TObject);
시작하다
Edit3.Text:=strpas(GetIdeSerialNumber);//하드 디스크 번호 가져오기
Edit2.text:=GetCPUIDStr;//CPU 일련번호
edit4.Text:=NBGetAdapterAddress(12);//비통합 네트워크 카드
Edit1.text:=MacStr;//통합 및 비통합 네트워크 카드
끝;