亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? hddserial.pas

?? 改進的Hardware檢測代碼
?? PAS
字號:
unit HDDSerial;

interface

uses Windows, SysUtils;

const
    HDD_IDE = 1;
    HDD_UNKNOWN = 0;
    HDD_SCSI = 2;

function GetIdeDiskSerialNumber: string;
function GetScsiDiskSerialNumber: string;
function GetHddSerialNumber: string;

implementation


{*******************************************************************************
獲取第一個IDE硬盤的序列號
更多關于 S.M.A.R.T. ioctl 的信息可查看:
http://www.microsoft.com/hwdev/download/respec/iocltapi.rtf

MSDN庫中也有一些簡單的例子
Windows Development -> Win32 Device Driver Kit ->
SAMPLE: SmartApp.exe Accesses SMART stats in IDE drives

還可以查看 http://www.mtgroup.ru/~alexk
IdeInfo.zip - 一個簡單的使用了S.M.A.R.T. Ioctl API的Delphi應用程序

注意:
WinNT/Win2000 - 你必須擁有對硬盤的讀/寫訪問權限
Win98 - SMARTVSD.VXD 必須安裝到 \windows\system\iosubsys,重啟系統。
*******************************************************************************}

function GetIdeDiskSerialNumber: string;
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;
    //ptr : PChar;
    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 begin //Windows NT, Windows 2000
        //提示:改變名稱可適用于其它驅動器,如第二個驅動器: '\\.\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 := Trim(StrPas(@sSerialNumber));
    end;
end;

function GetScsiDiskSerialNumber: string;
{$ALIGN ON}
type
    TScsiPassThrough = record
        Length: Word;
        ScsiStatus: Byte;
        PathId: Byte;
        TargetId: Byte;
        Lun: Byte;
        CdbLength: Byte;
        SenseInfoLength: Byte;
        DataIn: Byte;
        DataTransferLength: ULONG;
        TimeOutValue: ULONG;
        DataBufferOffset: DWORD;
        SenseInfoOffset: ULONG;
        Cdb: array[0..15] of Byte;
    end;
    TScsiPassThroughWithBuffers = record
        spt: TScsiPassThrough;
        bSenseBuf: array[0..31] of Byte;
        bDataBuf: array[0..191] of Byte;
    end;
    {ALIGN OFF}
var
    dwReturned: DWORD;
    len: DWORD;
    sDeviceName: string;
    hDevice: THandle;
    Buffer: array[0..SizeOf(TScsiPassThroughWithBuffers) + SizeOf(TScsiPassThrough) - 1] of Byte;
    sptwb: TScsiPassThroughWithBuffers absolute Buffer;
begin
    Result := '';
    sDeviceName := 'C:';
    hDevice := CreateFile(PChar('\\.\' + sDeviceName), GENERIC_READ or GENERIC_WRITE,
        FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);

    if hDevice = INVALID_HANDLE_VALUE then Exit;
    try
        FillChar(Buffer, SizeOf(Buffer), #0);
        with sptwb.spt do begin
            Length := SizeOf(TScsiPassThrough);
            CdbLength := 6; // CDB6GENERIC_LENGTH
            SenseInfoLength := 24;
            DataIn := 1; // SCSI_IOCTL_DATA_IN
            DataTransferLength := 192;
            TimeOutValue := 2;
            DataBufferOffset := PChar(@sptwb.bDataBuf) - PChar(@sptwb);
            SenseInfoOffset := PChar(@sptwb.bSenseBuf) - PChar(@sptwb);
            Cdb[0] := $12; //	OperationCode := SCSIOP_INQUIRY;
            Cdb[1] := $01; //	Flags := CDB_INQUIRY_EVPD;  Vital product data
            Cdb[2] := $80; //	PageCode            Unit serial number
            Cdb[4] := 192; // AllocationLength
        end;
        len := sptwb.spt.DataBufferOffset + sptwb.spt.DataTransferLength;
        if DeviceIoControl(hDevice, $0004D004, @sptwb, SizeOf(TScsiPassThrough), @sptwb, len, dwReturned, nil) and ((PChar(@sptwb.bDataBuf) + 1)^ = #$80) then
            SetString(Result, PChar(@sptwb.bDataBuf) + 4, Ord((PChar(@sptwb.bDataBuf) + 3)^));
        Result := Trim(Result);
    finally
        CloseHandle(hDevice);
    end;
end;

function GetHddSerialNumber: string;
begin
    Result := GetIdeDiskSerialNumber;

    if Length(Result) = 0 then //函數已收縮串前后綴空格
    begin
        Result := GetScsiDiskSerialNumber;
        if Length(Result) = 0 then Result := ''
        else Result := '[SCSI]' + Result;
    end
    else Result := '[IDE]' + Result;

end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美性一二三区| 欧美色图片你懂的| 91麻豆蜜桃一区二区三区| 欧美日韩高清不卡| 国产精品乱人伦中文| 日本伊人精品一区二区三区观看方式| 成人免费视频网站在线观看| 欧美亚洲综合另类| 中文字幕在线不卡国产视频| 美国三级日本三级久久99| 91久久精品一区二区| 国产亚洲女人久久久久毛片| 三级一区在线视频先锋| 91一区二区在线观看| 久久久美女艺术照精彩视频福利播放| 亚洲黄色录像片| 成人黄色电影在线 | 丁香天五香天堂综合| 欧美日韩你懂得| 亚洲另类一区二区| 99精品国产一区二区三区不卡| 欧美精品一区男女天堂| 蜜桃精品视频在线| 欧美日韩高清影院| 午夜欧美在线一二页| 欧美视频一区二区三区四区 | 亚洲人123区| 成人综合婷婷国产精品久久 | 看片网站欧美日韩| 欧美日韩精品一区二区三区四区| 亚洲欧美日韩中文播放| 成人av第一页| 亚洲手机成人高清视频| 91在线观看高清| 国产精品久久久久7777按摩| 成人激情免费网站| 国产精品天天看| www.欧美日韩| 亚洲天堂成人在线观看| 色综合中文字幕国产 | 精品国产亚洲一区二区三区在线观看| 亚洲高清久久久| 欧美日韩三级在线| 老司机精品视频导航| 久久久亚洲综合| 成人动漫一区二区三区| 亚洲欧洲中文日韩久久av乱码| 99国产精品国产精品久久| 成人欧美一区二区三区视频网页| 不卡视频一二三| 亚洲国产精品天堂| 欧美一级艳片视频免费观看| 捆绑变态av一区二区三区| 国产日产欧产精品推荐色| av在线综合网| 午夜av一区二区三区| 欧美大片在线观看一区| 成人午夜在线免费| 亚洲国产日韩一区二区| 日韩欧美中文一区二区| 不卡一区二区在线| 午夜精品福利一区二区三区蜜桃| 精品免费国产一区二区三区四区| 成人一区二区三区| 亚洲午夜三级在线| 久久久午夜精品| 91视频国产资源| 蜜桃av一区二区三区电影| 中文字幕的久久| 欧美日韩大陆在线| 粉嫩欧美一区二区三区高清影视| 亚洲激情中文1区| 欧美精品一区二区三区蜜臀| 色综合视频在线观看| 日本中文字幕一区二区视频 | 亚洲国产美女搞黄色| 日韩精品自拍偷拍| 日本高清不卡一区| 韩国v欧美v亚洲v日本v| 亚洲国产一区在线观看| 国产性色一区二区| 欧美精品在欧美一区二区少妇 | 日本免费新一区视频| 欧美激情在线一区二区三区| 欧美日韩精品免费| 99久久99久久精品免费观看| 久久成人18免费观看| 亚洲在线视频一区| 国产欧美日韩精品在线| 欧美一区二区三区在线电影| 99久久精品情趣| 国产在线精品一区二区| 亚洲va天堂va国产va久| 亚洲人成网站影音先锋播放| 精品乱码亚洲一区二区不卡| 欧美四级电影网| 91在线视频在线| 国产美女主播视频一区| 奇米精品一区二区三区在线观看一| 精品久久久久久久久久久久久久久久久 | 久久精品一区八戒影视| 91精品国产综合久久久久久漫画 | 国产在线日韩欧美| 日本午夜一本久久久综合| 亚洲欧美日韩国产手机在线| 欧美激情在线看| 久久久久综合网| 精品国产第一区二区三区观看体验| 91黄色激情网站| 色综合天天综合狠狠| 成人综合婷婷国产精品久久| 国产一区二区三区在线看麻豆| 午夜国产精品一区| 亚洲二区在线观看| 亚洲午夜在线观看视频在线| 亚洲国产精品视频| 亚洲成人黄色小说| 天天综合天天综合色| 视频一区中文字幕国产| 日韩精品免费专区| 日韩精品视频网站| 另类调教123区| 国产精品99久久久久久宅男| 激情综合网最新| 国产乱码字幕精品高清av| 国产精品一品二品| 懂色一区二区三区免费观看| 风间由美性色一区二区三区| 国产乱妇无码大片在线观看| 丁香天五香天堂综合| 99re成人精品视频| 欧美日韩一区三区| 4hu四虎永久在线影院成人| 69精品人人人人| 欧美成人午夜电影| 日本一区二区三区视频视频| 国产精品久久久久久久第一福利 | 成人禁用看黄a在线| 91亚洲国产成人精品一区二区三| 色哟哟日韩精品| 欧美色精品天天在线观看视频| 欧美在线视频日韩| 91精品国产欧美日韩| 久久久久久久久久久99999| 综合网在线视频| 亚洲成人免费av| 国产一区二区三区高清播放| 成人a免费在线看| 欧美日本在线播放| 精品盗摄一区二区三区| 亚洲女人****多毛耸耸8| 三级在线观看一区二区| 国产精品自拍av| 91久久精品日日躁夜夜躁欧美| 欧美亚洲日本一区| 久久综合九色综合欧美亚洲| 中文字幕一区不卡| 午夜视频在线观看一区二区 | 99re在线精品| 欧美一区二区国产| 亚洲欧洲三级电影| 美女一区二区三区| 91激情五月电影| 国产欧美一区二区精品性| 午夜影院久久久| 高清国产一区二区| 3d动漫精品啪啪| 综合在线观看色| 激情综合五月婷婷| 精品视频一区三区九区| 国产精品视频看| 免费看精品久久片| 日本乱码高清不卡字幕| 日本一区二区三区四区在线视频| 日欧美一区二区| 91污片在线观看| 久久久夜色精品亚洲| 蜜桃久久久久久久| 欧美日韩精品一区二区| 中文字幕亚洲一区二区av在线 | 国产在线精品一区在线观看麻豆| 91九色02白丝porn| 国产精品视频一二三区| 久久爱另类一区二区小说| 欧美精品九九99久久| 亚洲精品高清在线观看| 国产99一区视频免费| 欧美精品一区二区精品网| 午夜视频在线观看一区二区三区| 91亚洲精品久久久蜜桃| 欧美国产禁国产网站cc| 国产麻豆午夜三级精品| 精品国产一区二区在线观看| 日韩成人dvd| 91麻豆精品国产自产在线| 亚洲一区二区三区四区五区黄| 91日韩一区二区三区| 亚洲欧美国产高清| 不卡免费追剧大全电视剧网站| 久久精品在线免费观看|