Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Серийный номер винчестера [D7]


Цукор5   (16.11.16 15:06

Добрый день.

Много лет назад кто-то делился реализацией. Собственно, я и использую. Вопрос в том, что на 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 не было, по крайней мере в том виде как на старых добрых винчестерах. Короче, я даже и не пытался разбираться - зоопарк расширяется и дальше зверей будет всё больше и больше. Просто нет смысла пытаться угнаться за всем этим безобразием. Простой утилиты по-любому уже не выйдет.


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо