Получение серийного номера Ide диска

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by KSoniX, 22 May 2008.

  1. KSoniX

    KSoniX Elder - Старейшина

    Joined:
    17 Jan 2008
    Messages:
    94
    Likes Received:
    12
    Reputations:
    1
    вот пример из инета но он на delphi
    Code:
    { **** UBPFD *********** by delphibase.endimus.com ****
    >> Поличение серийного номера IDE диска.  Функция 
    получает серийный номер первого физического диска IDE 
    (не серийный номер тома!). Используется S.M.A.R.T. API, а 
    под Windows NT/2K/XP запрос производится не напрямую к
     диску, а через miniport драйвер контроллера, что позволяет читать серийный номер не имея прав 
    администратора. Функция может не работать, если первый 
    контролер в системе не ATA или если первое устройство не 
    является винчестером, который поддерживает SMART 
    (современные винчестеры поддерживают). Если Вы хотите 
    получить другие параметры диска/других дисков, то 
    смотрите пример IdeInfo2 с моего сайта. На Windows 9x 
    требует наличия драйвера smartvsd.vxd (должен быть в 
    стандартной поставке), просто скопируйте его в \windows
    \system\iosubsys и перезагрузите компьютер.  Зависимости: 
    Windows, SysUtils Автор: Alex Konshin, 
    [email protected], Boston, USA Copyright: 
    http://home.earthlink.net/~akonshin/index.htm Дата: 30 
    декабря 2002 г. 
    ***************************************************** }  
    
    function GetIdeDiskSerialNumber : String; 
    type TSrbIoControl = packed record HeaderLength : ULONG; 
    Signature : Array[0..7] of Char; 
    Timeout : ULONG; 
    ControlCode : ULONG; 
    ReturnCode : ULONG;
    Length : ULONG;
    end; 
    SRB_IO_CONTROL = TSrbIoControl; 
    PSrbIoControl = ^TSrbIoControl;  
    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;
    IDEREGS = TIDERegs;
    PIDERegs = ^TIDERegs;  
    TSendCmdInParams = packed record cBufferSize : DWORD; // Buffer size in bytes 
    irDriveRegs : TIDERegs; // Structure with drive register values.
    bDriveNumber : Byte; // Physical drive number to send 
    command to (0,1,2,3). 
    bReserved : Array[0..2] of Byte; // Reserved for future expansion. 
    dwReserved : Array[0..3] of DWORD; // For future use.
    bBuffer : Array[0..0] of Byte; // Input buffer.
    end;
    SENDCMDINPARAMS = TSendCmdInParams; 
    PSendCmdInParams = ^TSendCmdInParams; 
    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 : ULONG; 
    wMultSectorStuff : Word; 
    ulTotalAddressableSectors : ULONG;
    wSingleWordDMA : Word; 
    wMultiWordDMA : Word; 
    bReserved : Array[0..127] of Byte; 
    end;
    PIdSector = ^TIdSector;  
    const IDE_ID_FUNCTION = $EC; 
    IDENTIFY_BUFFER_SIZE = 512; 
    DFP_RECEIVE_DRIVE_DATA = $0007c088; 
    IOCTL_SCSI_MINIPORT = $0004d008; 
    IOCTL_SCSI_MINIPORT_IDENTIFY = $001b0501; 
    DataSize = sizeof(TSendCmdInParams)-1+IDENTIFY_BUFFER_SIZE;
    BufferSize = SizeOf(SRB_IO_CONTROL)+DataSize; 
    W9xBufferSize = IDENTIFY_BUFFER_SIZE+16; 
    var hDevice : THandle;
    cbBytesReturned : DWORD; 
    pInData : PSendCmdInParams; 
    pOutData : Pointer; // PSendCmdInParams; 
    Buffer : Array[0..BufferSize-1] of Byte;
    srbControl : TSrbIoControl absolute Buffer; 
    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 := '';
    FillChar(Buffer,BufferSize,#0);
    if Win32Platform=VER_PLATFORM_WIN32_NT then 
    begin 
    // Windows NT, Windows 2000 
    // Get SCSI port handle 
    hDevice := CreateFile( '\\.\Scsi0:', 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 
    srbControl.HeaderLength := SizeOf(SRB_IO_CONTROL); 
    System.Move('SCSIDISK',srbControl.Signature,8);
    srbControl.Timeout := 2; 
    srbControl.Length := DataSize; 
    srbControl.ControlCode := IOCTL_SCSI_MINIPORT_IDENTIFY; 
    pInData := PSendCmdInParams(PChar(@Buffer)+SizeOf(SRB_IO_CONT ROL));
    pOutData := pInData; 
    with pInData^ do 
    begin
    cBufferSize := IDENTIFY_BUFFER_SIZE;
    bDriveNumber := 0; with irDriveRegs do 
    begin
    bFeaturesReg := 0; 
    bSectorCountReg := 1; 
    bSectorNumberReg := 1;
    bCylLowReg := 0; 
    bCylHighReg := 0;
    bDriveHeadReg := $A0; 
    bCommandReg := IDE_ID_FUNCTION; 
    end;
    end; 
    if not DeviceIoControl( hDevice, IOCTL_SCSI_MINIPORT, @Buffer, BufferSize, @Buffer, BufferSize, cbBytesReturned, nil ) 
    then Exit; 
    finally CloseHandle(hDevice);
    end; 
    end 
    else
    begin 
    // Windows 95 OSR2, Windows 98 
    hDevice := CreateFile( '\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0 ); 
    if hDevice=INVALID_HANDLE_VALUE then Exit; 
    try 
    pInData := PSendCmdInParams(@Buffer); 
    pOutData := PChar(@pInData^.bBuffer);
    with pInData^ do
    begin 
    cBufferSize := IDENTIFY_BUFFER_SIZE; 
    bDriveNumber := 0; 
    with irDriveRegs do 
    begin 
    bFeaturesReg := 0; 
    bSectorCountReg := 1; 
    bSectorNumberReg := 1;
    bCylLowReg := 0; 
    bCylHighReg := 0; 
    bDriveHeadReg := $A0; 
    bCommandReg := IDE_ID_FUNCTION; 
    end; 
    end; 
    if not DeviceIoControl( hDevice, DFP_RECEIVE_DRIVE_DATA, pInData, SizeOf(TSendCmdInParams)-1, pOutData, W9xBufferSize, cbBytesReturned, nil ) then Exit;
    finally CloseHandle(hDevice);
    end; 
    end;
    with PIdSector(PChar(pOutData)+16)^ do 
    begin 
    ChangeByteOrder(sSerialNumber,SizeOf(sSerialNumber )); 
    SetString(Result,sSerialNumber,SizeOf(sSerialNumbe r)); 
    end; 
    end; 
    
     Пример использования:  
    var s : String; rc : DWORD; 
    begin 
    s := GetIdeDiskSerialNumber; 
    if s='' then 
    begin 
    rc := GetLastError; 
    if rc=0 then 
    WriteLn('IDE drive is not support SMART feature') 
    else 
    WriteLn(SysErrorMessage(rc)); end else WriteLn('Disk serial number: ''', s,''''); 
    end.  
    
    Автор: Alex Konshin, [email protected], Boston, USA
    
    помогите плз переделать его на С++ :confused:

    added:

    или у каго есть что нибуть похожее на этот пример на с++

    мне надо взять серийного номер диска
     
    #1 KSoniX, 22 May 2008
    Last edited by a moderator: 22 May 2008
  2. GlOFF

    GlOFF Elder - Старейшина

    Joined:
    8 May 2006
    Messages:
    689
    Likes Received:
    484
    Reputations:
    4
    :)
     
    1 person likes this.
  3. KSoniX

    KSoniX Elder - Старейшина

    Joined:
    17 Jan 2008
    Messages:
    94
    Likes Received:
    12
    Reputations:
    1
    мне надо взять серийного номер диска не тома

    спасибо GlOFF
     
  4. Amoura

    Amoura Elder - Старейшина

    Joined:
    23 Jan 2008
    Messages:
    237
    Likes Received:
    148
    Reputations:
    46
    http://www.sources.ru/cpp/cpp_show_ide_information.shtml

    почитай, может подойдет..
     
    1 person likes this.
  5. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    >>DeviceIoControl( hDevice, IOCTL_SCSI_MINIPORT,
    >>rbControl.ControlCode := IOCTL_SCSI_MINIPORT_IDENTIFY;
    >>CreateFile( '\\.\Scsi0:',

    интересный у тебя ide диск