日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Delphi读取硬盘的物理序列号

發布時間:2023/12/14 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Delphi读取硬盘的物理序列号 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
<script type="text/javascript"></script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>

??? 因要用到硬盤的物理序列號,從網上找了很多,最終確定使用了以下的一段程序:

function TFrmMain.GetIdeSerialNumber() : PChar; stdcall;
const
? IDENTIFY_BUFFER_SIZE = 512;
type
? TIDERegs = packed record
???? bFeaturesReg: BYTE; // Used for specifying SMART "commands".
???? bSectorCountReg: BYTE; // IDE sector count register
???? bSectorNumberReg: BYTE; // IDE sector number register
???? bCylLowReg: BYTE; // IDE low order cylinder value
???? bCylHighReg: BYTE; // IDE high order cylinder value
???? bDriveHeadReg: BYTE; // IDE drive/head register
???? bCommandReg: BYTE; // Actual IDE command.
???? bReserved: BYTE; // reserved for future use. Must be zero.
? end;

? TSendCmdInParams = packed record
??? // Buffer size in bytes
??? cBufferSize: DWORD;
??? // Structure with drive register values.
??? irDriveRegs: TIDERegs;
??? // Physical drive number to send command to (0,1,2,3).
??? bDriveNumber: BYTE;
??? bReserved: array[0..2] of Byte;
??? dwReserved: array[0..3] of DWORD;
??? bBuffer: array[0..0] of Byte; // Input buffer.
? end;

? TIdSector = packed record
??? wGenConfig: Word;
??? wNumCyls: Word;
??? wReserved: Word;
??? wNumHeads: Word;
??? wBytesPerTrack: Word;
??? wBytesPerSector: Word;
??? wSectorsPerTrack: Word;
??? wVendorUnique: array[0..2] of Word;
??? sSerialNumber: array[0..19] of CHAR;
??? wBufferType: Word;
??? wBufferSize: Word;
??? wECCSize: Word;
??? sFirmwareRev: array[0..7] of Char;
??? sModelNumber: array[0..39] of Char;
??? wMoreVendorUnique: Word;
??? wDoubleWordIO: Word;
??? wCapabilities: Word;
??? wReserved1: Word;
??? wPIOTiming: Word;
??? wDMATiming: Word;
??? wBS: Word;
??? wNumCurrentCyls: Word;
??? wNumCurrentHeads: Word;
??? wNumCurrentSectorsPerTrack: Word;
??? ulCurrentSectorCapacity: DWORD;
??? wMultSectorStuff: Word;
??? ulTotalAddressableSectors: DWORD;
??? wSingleWordDMA: Word;
??? wMultiWordDMA: Word;
??? bReserved: array[0..127] of BYTE;
? end;

? PIdSector = ^TIdSector;

? TDriverStatus = packed record
??? // 驅動器返回的錯誤代碼,無錯則返回0
??? bDriverError: Byte;
??? // IDE出錯寄存器的內容,只有當bDriverError 為 SMART_IDE_ERROR 時有效
??? bIDEStatus: Byte;
??? bReserved: array[0..1] of Byte;
??? dwReserved: array[0..1] of DWORD;
? end;

? TSendCmdOutParams = packed record
??? // bBuffer的大小
??? cBufferSize: DWORD;
??? // 驅動器狀態
??? DriverStatus: TDriverStatus;
??? // 用于保存從驅動器讀出的數據的緩沖區,實際長度由cBufferSize決定
??? bBuffer: array[0..0] of BYTE;
? end;
var
? hDevice : THandle;
? cbBytesReturned : DWORD;
? SCIP : TSendCmdInParams;
? aIdOutCmd : array[0..(SizeOf(TSendCmdOutParams) + IDENTIFY_BUFFER_SIZE - 1) - 1] of Byte;
? IdOutCmd : TSendCmdOutParams absolute aIdOutCmd;

? procedure ChangeByteOrder(var Data; Size: Integer);
? var
??? ptr : PChar;
??? i : Integer;
??? c : Char;
? begin
??? ptr := @Data;

??? for I := 0 to (Size shr 1) - 1 do
??? begin
????? c := ptr^;
????? ptr^ := (ptr + 1)^;
????? (ptr + 1)^ := c;
????? Inc(ptr, 2);
??? end;
? end;
begin
? Result := ''; // 如果出錯則返回空串

? if SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT then? // Windows NT, Windows 2000
? begin
??? // 提示! 改變名稱可適用于其它驅動器,如第二個驅動器: '//./PhysicalDrive1/'
??? hDevice := CreateFile('//./PhysicalDrive0', GENERIC_READ or GENERIC_WRITE,
????????????????????????? FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
? end
? else // Version Windows 95 OSR2, Windows 98
??? hDevice := CreateFile('//./SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0);

??? if hDevice = INVALID_HANDLE_VALUE then Exit;

??? try
????? FillChar(SCIP, SizeOf(TSendCmdInParams) - 1, #0);
????? FillChar(aIdOutCmd, SizeOf(aIdOutCmd), #0);
????? cbBytesReturned := 0;

????? // Set up data structures for IDENTIFY command.
????? with SCIP do
????? begin
??????? cBufferSize := IDENTIFY_BUFFER_SIZE;

??????? // bDriveNumber := 0;
??????? with irDriveRegs do
??????? begin
????????? bSectorCountReg := 1;
????????? bSectorNumberReg := 1;

????????? // if Win32Platform=VER_PLATFORM_WIN32_NT then bDriveHeadReg := $A0
????????? // else bDriveHeadReg := $A0 or ((bDriveNum and 1) shl 4);
????????? bDriveHeadReg := $A0;
????????? bCommandReg := $EC;
??????? end;
????? end;

????? if not DeviceIoControl(hDevice, $0007C088, @SCIP, SizeOf(TSendCmdInParams) - 1,
??????????????????????????? @aIdOutCmd, SizeOf(aIdOutCmd), cbBytesReturned, nil) then Exit;
??? finally
????? CloseHandle(hDevice);
??? end;

??? with PIdSector(@IdOutCmd.bBuffer)^ do
??? begin
????? ChangeByteOrder(sSerialNumber, SizeOf(sSerialNumber));
????? (Pchar(@sSerialNumber) + SizeOf(sSerialNumber))^ := #0;

????? Result := Pchar(@sSerialNumber);

????? end;
end;

搜索其它相關資源,請用Google搜索:
<script type="text/javascript"></script> <script src="http://pagead2.googlesyndication.com/pagead/show_sdo.js" type="text/javascript"></script>

總結

以上是生活随笔為你收集整理的Delphi读取硬盘的物理序列号的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。