次のようにコードをコピーします。
//参照とTYPE変数の宣言
用途
ウィンドウ、メッセージ、SysUtils、バリアント、クラス、グラフィックス、コントロール、フォーム、
ダイアログ、StdCtrls、nb30; {重要な引用}
タイプ
パスタット = ^タスタット;
TASTAT=記録
アダプター : TAdapterStatus;
name_buf : TNameBuffer;
終わり;
TForm1 = クラス(TForm)
ボタン 1: T ボタン;
編集1: TEdit;
ラベル 1: T ラベル;
ラベル 2: T ラベル;
ラベル 3: T ラベル;
編集2: TEdit;
編集3: TEdit;
ボタン 2: T ボタン;
編集4: TEdit;
ラベル 4: T ラベル;
プロシージャ Button1Click(送信者: TObject);
プロシージャ Button2Click(送信者: TObject);
プライベート
{プライベート宣言}
公共
{公的宣言}
終わり;
変数
フォーム1: TForm1;
実装
{$R *.dfm}
タイプ
TCPUID = 倍長整数の配列[1..4];
//ハードドライブのシリアル番号を取得します。
function GetIdeSerialNumber: pchar; // ハードディスクの工場出荷時のシリアル番号を取得します。
const IDENTIFY_BUFFER_SIZE = 512;
タイプ
TIDERegs = パックされたレコード
b機能登録: バイト;
bSectorCountReg: バイト;
bSectorNumberReg: バイト;
bCylLowReg: バイト;
bCylHighReg: バイト;
bDriveHeadReg: バイト;
bCommandReg: バイト;
b予約済み: バイト;
終わり;
TSendCmdInParams = パックされたレコード
cBufferSize: DWORD;
irDriveRegs: TIDERegs;
bドライブ番号: バイト;
b予約: バイトの配列[0..2]。
dwReserved: DWORD の配列 [0..3]。
bBuffer: バイトの配列[0..0]。
終わり;
TIdSector = パックされたレコード
wGenConfig: Word;
wNumCyls: 単語;
w予約済み: 単語;
wNumHeads: 単語;
wBytesPerTrack: ワード;
wBytesPerSector: ワード;
wSectorsPerTrack: Word;
wVendorUnique: Word の配列 [0..2]。
sSerialNumber: CHAR の配列 [0..19]。
wBufferType: Word;
wBufferSize: ワード;
wECCサイズ: ワード;
sFirmwareRev: Char の array[0..7]。
sModelNumber: Char の配列[0..39]。
wMoreVendorUnique: Word;
wDoubleWordIO: ワード;
w機能: Word;
wReserved1: ワード;
wPIOTiming: Word;
wDMATiming: Word;
wBS: 単語;
wNumCurrentCyls: 単語;
wNumCurrentHeads: 単語;
wNumCurrentSectorsPerTrack: ワード;
ulCurrentSectorCapacity: DWORD;
wMultSectorStuff: ワード;
ulTotalAddressableSectors: DWORD;
wSingleWordDMA: ワード;
wMultiWordDMA: ワード;
b予約: バイトの配列[0..127]。
終わり;
PIdSector = ^TIdSector;
TDriverStatus = パックされたレコード
bDriverError: バイト;
bIDEステータス: バイト;
b予約: バイトの配列[0..1]。
dwReserved: DWORD の配列 [0..1]。
終わり;
TSendCmdOutParams = パックされたレコード
cBufferSize: DWORD;
ドライバーステータス: TDriverStatus;
bBuffer: バイトの配列[0..0]。
終わり;
変数
hデバイス: ハンドル;
cbBytes返された値: DWORD;
SCIP:TSendCmdInParams;
aIdOutCmd: バイトの配列[0..(SizeOf(TSendCmdOutParams) + IDENTIFY_BUFFER_SIZE-1)-1]。
IdOutCmd: TSendCmdOutParams 絶対 aIdOutCmd;
procedure ChangeByteOrder(var Data; Size: Integer);//関数内の処理
変数
ptr: Pchar;
i: 整数。
c: シャア。
始める
ptr := @データ;
for I := 0 から (サイズ shr 1) - 1 が始まります
c := ptr^;
ptr^ := (ptr + 1)^;
(ptr + 1)^ := c;
Inc(ptr, 2);
終わり;
終わり;
begin //関数本体
結果 := '';
SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT の場合
begin // Windows NT、Windows 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 アセンブラ;
アズム
PUSH EBX {影響を受けるレジスタを保存}
プッシュEDI
MOV EDI、EAX {@Resukt}
MOV EAX、1
DW $A20F {CPUID コマンド}
STOSD {CPUID[1]}
MOV EAX、EBX
STOSD {CPUID[2]}
MOV EAX、ECX
STOSD {CPUID[3]}
MOV EAX、EDX
STOSD {CPUID[4]}
POP EDI {レジスタの復元}
POPEBX
終わり;
関数 GetCPUIDStr:String;
変数
CPUID:TCPUID;
始める
CPUID:=GetCPUID;
結果:=IntToHex(CPUID[1],8)+IntToHex(CPUID[2],8)+IntToHex(CPUID[3],8)+IntToHex(CPUID[4],8);
終わり;
///============================================== = ==================================
///MAC (非統合ネットワーク カード) を取得します。
関数NBGetAdapterAddress(a:整数):文字列;
変数
NCB: TNCB; // NetBIOS 制御ブロック // NetBios 制御ブロック
ADAPTER: TADAPTERSTATUS; // Netbios アダプターのステータス// ネットワーク カードのステータスを取得します
LANAENUM: TLANAENUM // Netbios ラナ;
intIdx: 整数 // 一時的な作業値// 一時変数;
cRC: Char; // NetBIOS 戻りコード// NetBios 戻り値
strTemp: 文字列; // 一時文字列//一時変数
始める
//初期化
結果 := '';
試す
// ゼロ制御ブロック
ZeroMemory(@NCB, SizeOf(NCB));
// enumコマンドを発行する
NCB.ncb_command := Chr(NCBENUM);
cRC := NetBios(@NCB);
// enum コマンドを再発行します
NCB.ncb_buffer := @LANAENUM;
NCB.ncb_length := SizeOf(LANAENUM);
cRC := NetBios(@NCB);
if ord(cRC) <> 0 then
出口;
//リセットアダプター
ZeroMemory(@NCB, SizeOf(NCB));
NCB.ncb_command := Chr(NCBRESET);
NCB.ncb_lana_num := LANAENUM.lana[a];
cRC := NetBios(@NCB);
if ord(cRC) <> 0 then
出口;
// アダプターのアドレスを取得します
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);
// 文字列に変換します
strTemp := '';
intIdx の場合:= 0 ~ 5 を実行します
strTemp := strTemp + InttoHex(Integer(ADAPTER.adapter_address[intIdx]), 2);
結果 := strTemp;
ついに
終わり;
終わり;
//=============================================== ==========================
//MAC アドレスを取得します (統合ネットワーク カードおよび非統合ネットワーク カード):
関数 Getmac:string;
変数
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:=Netbios(@ncb);
for i := 0 から integer(lanaEnum.length)-1 まで
始める
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 := サイズOf(TASTAT);
m:=0;
if (Win32Platform = VER_PLATFORM_WIN32_NT) then
m:=1;
m=1 の場合
始める
Netbios(@ncb) = Chr(0) の場合
strMac := '';
for j := 0 ~ 5 を実行します
始める
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 を実行します
始める
strPart := IntToHex(integer(adapt.adapter.adapter_address[j]), 2);
strMac := strMac + strPart + '-';
終わり;
SetLength(strMac, 長さ(strMac)-1);
終わり;
終わり;
結果:=strmac;
終わり;
関数 PartitionString(StrV,PrtSymbol: string): TStringList;
変数
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<>'' then result.Append(StrV);
終わり;
関数 MacStr():String;
変数
Str:TStrings;
i:整数;
MacStr:文字列;
始める
MacStr:='';
Str:=TStringList.Create;
Str:=PartitionString(Getmac,'-');
for 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);//非統合ネットワーク カード
Edit1.text:=MacStr;//統合ネットワーク カードと非統合ネットワーク カード
終わり;