Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1264
Благодарности: 1024

Профиль | Отправить PM | Цитировать


Цитата ABBAT:
Как можно определить системный диск ({sd}) ssd или hdd. »
ABBAT, пробуйте.
Скрытый текст

Код: Выделить весь код
[Setup]
AppName=test
AppVerName=test
CreateAppDir=no
DefaultDirName={tmp}
Uninstallable=no
CreateUninstallRegKey=no

[Languages]
Name: ru; MessagesFile: compiler:Languages\russian.isl

[Code]
#define A = (Defined UNICODE) ? "W" : "A"
const
  GENERIC_READ = $80000000;
  GENERIC_WRITE = $40000000;
  FILE_SHARE_READ = $1;
  FILE_SHARE_WRITE = $2;
  OPEN_EXISTING = 3;
  INVALID_HANDLE_VALUE = -1;
  IOCTL_ATA_PASS_THROUGH = $0004D02C;
  ATA_FLAGS_DRDY_REQUIRED = $0001;
  ATA_FLAGS_DATA_IN = $0002;
  ID_CMD = $EC;

type
  TATAPassThroughEx = record
    Length: WORD;
    AtaFlags: WORD;
    PathId: Byte;
    TargetId: Byte;
    Lun: Byte;
    ReservedAsUchar: Byte;
    DataTransferLength: DWORD;
    TimeOutValue: DWORD;
    ReservedAsUlong: DWORD;
    DataBufferOffset: DWORD;
    PreviousTaskFile: array [0..7] of Byte;
    CurrentTaskFile: array [0..7] of Byte;
  end;

  TATAIdentifyDeviceQuery = record
    Header: TATAPassThroughEx;
    Data: array [0..255] of WORD;
  end;

// Device Management Functions
function DeviceIoControlATAIdentifyDeviceQuery(hDevice: THandle; dwIoControlCode: DWORD; var lpInBuffer: TATAIdentifyDeviceQuery; nInBufferSize: DWORD; out lpOutBuffer: TATAIdentifyDeviceQuery; nOutBufferSize: DWORD; out lpBytesReturned: DWORD; lpOverlapped: DWORD): BOOL; external 'DeviceIoControl@kernel32.dll stdcall';

// File Management Functions
function CreateFile(lpFileName: string; dwDesiredAccess, dwShareMode: DWORD; lpSecurityAttributes: Longint; dwCreationDisposition, dwFlagsAndAttributes: DWORD; hTemplateFile: THandle): THandle; external 'CreateFile{#A}@kernel32.dll stdcall';

// Handle and Object Functions
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';

/////////////////////////////////////////////////////////
function IsDriveSSD(const ADriveLetter: string): Boolean;
var
  BytesReturned: DWORD;
  DeviceHandle: THandle;
  ATAIdentifyDeviceQuery: TATAIdentifyDeviceQuery;
begin
  Result := False;
  try
    DeviceHandle := CreateFile(Format('\\.\%s', [ADriveLetter]), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    if DeviceHandle = INVALID_HANDLE_VALUE then
      RaiseException(SysErrorMessage(DLLGetLastError));

    ATAIdentifyDeviceQuery.Header.Length := SizeOf(ATAIdentifyDeviceQuery.Header);
    ATAIdentifyDeviceQuery.Header.AtaFlags := ATA_FLAGS_DATA_IN or ATA_FLAGS_DRDY_REQUIRED;
    ATAIdentifyDeviceQuery.Header.DataTransferLength := SizeOf(ATAIdentifyDeviceQuery.Data);
    ATAIdentifyDeviceQuery.Header.TimeOutValue := 3;
    ATAIdentifyDeviceQuery.Header.DataBufferOffset := SizeOf(ATAIdentifyDeviceQuery.Header);
    ATAIdentifyDeviceQuery.Header.CurrentTaskFile[6{ = Command/Status register }] := ID_CMD; // ATA IDENTIFY DEVICE command

    if not DeviceIoControlATAIdentifyDeviceQuery(DeviceHandle, IOCTL_ATA_PASS_THROUGH, ATAIdentifyDeviceQuery, SizeOf(ATAIdentifyDeviceQuery), ATAIdentifyDeviceQuery, SizeOf(ATAIdentifyDeviceQuery), BytesReturned, 0) then
    begin
      Log(Format('DeviceIoControl failed: %s', [SysErrorMessage(DLLGetLastError)]));
      Exit;
    end;
    Result := ATAIdentifyDeviceQuery.Data[{ Word }217{: Nominal media rotation rate }] = 1;
  finally
    if DeviceHandle > 0 then
      CloseHandle(DeviceHandle);
  end;
end;

///////////////////////////
procedure InitializeWizard;
begin
  if IsDriveSSD(ExpandConstant('{sd}')) then
    MsgBox('SSD', mbInformation, MB_OK)
  else
    MsgBox('No SSD', mbInformation, MB_OK);
end;
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:28, 08-04-2018 | #16