-
Добрый день. Много лет назад кто-то делился реализацией. Собственно, я и использую. Вопрос в том, что на Win7 и выше в большинстве случаев это не работает. Причем, что самое удивительное, код таки может заработать, если установить (программно) что-то. Но что?
...
FillChar(Buffer,BufferSize,#0);
if Win32Platform=VER_PLATFORM_WIN32_NT then
begin Str(ControllerNumber,s);
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
end;
end;
end;
end;
-
Судя по всему, ошибка возникает на функции DeviceIoControl с ошибкой: Запрос не был выполнен из-за ошибки ввода и вывода на устройстве.
-
Или DeviceIoControl с ошибкой: Неверная функция
-
Зачем так сложно? GetVolumeInformation - четвертый параметр
-
> Зачем так сложно? > GetVolumeInformation - четвертый параметр
Меняется после переустановки ОС.
-
> Цукор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.
-
Меня терзают смутные сомнения :) Знакомый код. Много воды утекло. Не все 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
-
> Не все SSD поддерживают SMART или поддерживают, но не полностью
Как же, как же, а Media wearout indicator ?
-
> Игорь Шевченко © (19.05.17 13:31) [7] > > Не все SSD поддерживают SMART или поддерживают, но не полностью > Как же, как же, а Media wearout indicator ?
Я натыкался на SSD в которых вообще SMART не было, по крайней мере в том виде как на старых добрых винчестерах. Короче, я даже и не пытался разбираться - зоопарк расширяется и дальше зверей будет всё больше и больше. Просто нет смысла пытаться угнаться за всем этим безобразием. Простой утилиты по-любому уже не выйдет.
|