Конференция "WinAPI" » Серийный номер винчестера [D7]
 
  • Цукор5 (16.11.16 15:06) [0]
    Добрый день.

    Много лет назад кто-то делился реализацией. Собственно, я и использую. Вопрос в том, что на Win7 и выше в большинстве случаев это не работает. Причем, что самое удивительное, код таки может заработать, если установить (программно) что-то. Но что?



    ...
    FillChar(Buffer,BufferSize,#0);
     if Win32Platform=VER_PLATFORM_WIN32_NT then
       begin // Windows NT, Windows 2000
         Str(ControllerNumber,s);
         // Get SCSI port handle
         hDevice := CreateFile(
           PChar('\\\\.\\Scsi'+s+':'),
           GENERIC_READ or GENERIC_WRITE,
           FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 );
         if hDevice=INVALID_HANDLE_VALUE then RaiseLastOSError;
         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_CONTROL));
           pOutData := pInData;
           with pInData^ do
           begin
             cBufferSize  := IDENTIFY_BUFFER_SIZE;
             bDriveNumber := DriveNumber;
             with irDriveRegs do
             begin
               bFeaturesReg     := 0;
               bSectorCountReg  := 1;
               bSectorNumberReg := 1;
               bCylLowReg       := 0;
               bCylHighReg      := 0;
               bDriveHeadReg    := $A0 or ((DriveNumber and 1) shl 4);
               bCommandReg      := IDE_ID_FUNCTION;
             end;
           end;
           if not DeviceIoControl( hDevice, IOCTL_SCSI_MINIPORT, @Buffer, BufferSize, @Buffer, BufferSize, cbBytesReturned, nil ) then RaiseLastOSError;
         finally
           CloseHandle(hDevice);
         end;
       end
    ...

    function GetIdeDiskSerialNumber : String;
    var
     iController, iDrive, maxController : Integer;
    begin
     Result := '';
     maxController := 15;
     if Win32Platform<>VER_PLATFORM_WIN32_NT then maxController := 0;
     for iController := 0 to maxController do
     begin
       for iDrive := 0 to 4 do
       begin
         try
           Result := GetIdeDisk(iController,iDrive);
           if Result<>'' then Exit;
         except
           // ignore exceptions
         end;
       end;
     end;
    end;

  • Цукор5 (16.11.16 16:02) [1]
    Судя по всему, ошибка возникает на функции DeviceIoControl с ошибкой: Запрос не был выполнен из-за ошибки ввода и вывода на устройстве.
  • Цукор5 (16.11.16 16:30) [2]
    Или  DeviceIoControl с ошибкой: Неверная функция
  • Rouse_ © (16.11.16 17:15) [3]
    Зачем так сложно?
    GetVolumeInformation - четвертый параметр
  • Цукор5 (16.11.16 17:20) [4]

    > Зачем так сложно?
    > GetVolumeInformation - четвертый параметр


    Меняется после переустановки ОС.
  • Eraser © (16.11.16 21:11) [5]

    > Цукор5   (16.11.16 17:20) [4]
    >
    > > Зачем так сложно?
    > > GetVolumeInformation - четвертый параметр
    >
    >
    > Меняется после переустановки ОС.

    если почитать описание данной функции, там сказано

    lpVolumeSerialNumber [out, optional]
    A pointer to a variable that receives the volume serial number.
    This parameter can be NULL if the serial number is not required.
    This function returns the volume serial number that the operating system assigns when a hard disk is formatted. To programmatically obtain the hard disk's serial number that the manufacturer assigns, use the Windows Management Instrumentation (WMI) Win32_PhysicalMedia property SerialNumber.
  • Alex Konshin © (19.05.17 08:21) [6]
    Меня терзают смутные сомнения :) Знакомый код.
    Много воды утекло. Не все SSD поддерживают SMART или поддерживают, но не полностью. И это в принципе не работает для дисков через USB, для RAID или через какие-то контроллеры, которые сейчас есть почти на каждой motherboard.
    Но в остальном оно до сих пор работает на Win7, но требует elevation, то есть нужно запускать "As Administrator". Вот прямо сейчас попробовал и сработало на всех 4 дисках, даже достало sn из Samsung SSD 840 Pro.

    D:\Projects\1\IdeInfo2\BIN>D:\Projects\1\IdeInfo2\BIN\IdeInfo2.exe
    SMART IDENTIFY command is completed successfully.
    Model number: Samsung SSD 840 PRO Series
    Firmware rev: DXM05B0Q
    Serial number: S1AXNSAF101887X

    SMART IDENTIFY command is completed successfully.
    Model number: WDC WD4003FZEX-00Z4SA0
    Firmware rev: 01.01A01
    Serial number:      WD-WCC131117262

    SMART IDENTIFY command is completed successfully.
    Model number: ST3000DM001-1CH166
    Firmware rev: CC24
    Serial number:             Z1F1AZS2

    SMART IDENTIFY command is completed successfully.
    Model number: WDC WD6001FZWX-00A2VA0
    Firmware rev: 01.01A01
    Serial number:      WD-WXC1HB4HF2U0

    Error on GetPhysicalDeviceHandle (errcode=2): The system cannot find the file specified
    ========================= SCSI/IDE Port 0 ==============================
    PID TID LUN Claimed String                       Inquiry Header
    --- --- --- ------- ---------------------------- -----------------------
    2   0    0    Y                         Samsun  0x0000050241000002
    Error on SmartIdentifyMiniport: The request could not be performed because of an I/O device error

    3   0    0    Y                         WD      0x0000050241000002
    Error on SmartIdentifyMiniport: The request could not be performed because of an I/O device error

    4   0    0    Y              ST3000DM001-1CH166 0x0000050241000002
    Error on SmartIdentifyMiniport: The request could not be performed because of an I/O device error

    5   0    0    Y                         WD      0x0000050241000002
    Error on SmartIdentifyMiniport: The request could not be performed because of an I/O device error

  • Игорь Шевченко © (19.05.17 13:31) [7]

    > Не все SSD поддерживают SMART или поддерживают, но не полностью


    Как же, как же, а Media wearout indicator ?
  • Alex Konshin © (23.05.17 06:40) [8]

    > Игорь Шевченко ©   (19.05.17 13:31) [7]
    > > Не все SSD поддерживают SMART или поддерживают, но не полностью
    > Как же, как же, а Media wearout indicator ?

    Я натыкался на SSD в которых вообще SMART не было, по крайней мере в том виде как на старых добрых винчестерах. Короче, я даже и не пытался разбираться - зоопарк расширяется и дальше зверей будет всё больше и больше. Просто нет смысла пытаться угнаться за всем этим безобразием. Простой утилиты по-любому уже не выйдет.
 
Конференция "WinAPI" » Серийный номер винчестера [D7]
Есть новые Нет новых   [118642   +46][b:0][p:0.003]