Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.08.2012, 13:33   #1
Robin_
Пользователь
 
Регистрация: 02.05.2008
Сообщений: 66
Восклицание Как определить размер физического диска?

Привет всем!
Кто подскажет как определить размер ФИЗИЧЕСКОГО диска???

Или что-то типо этого:
Drive Model Number________________: WDC WD2500JD-00FYB0
Drive Serial Number_______________: WD-WMAEH1491504
Drive Controller Revision Number__: 02.05D02
Controller Buffer Size on Drive___: 8388608 bytes
Drive Type________________________: Fixed
Drive Size________________________: 250059350016 bytes
Robin_ вне форума Ответить с цитированием
Старый 28.08.2012, 13:58   #2
Robin_
Пользователь
 
Регистрация: 02.05.2008
Сообщений: 66
По умолчанию

Размер выяснил, может кто с моделью поможет???

Код:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

function GetDriveSize (DriveNo : byte) : Int64;
var
 hDrive : THandle;
 Size : Int64;
 Tmp : Cardinal;

begin
 Result := 0;
 hDrive := CreateFile (PChar('\\.\PhysicalDrive' + Char(DriveNo + Ord('0'))),
                       GENERIC_READ,
                       FILE_SHARE_READ or FILE_SHARE_WRITE,
                       nil,
                       OPEN_EXISTING,
                       0,
                       0);
 if hDrive = INVALID_HANDLE_VALUE then Exit;

 Tmp := SizeOf(Size);
 Size := 0;
 if DeviceIoControl (hDrive, $7405C,
                     nil, 0,
                     @Size, SizeOf(Size), Tmp,
                     nil) then Result := Size;

 CloseHandle (hDrive);
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
   ShowMessage (FloatToStr(GetDriveSize(0)/(1024*1024*1024)) + ' Gb');
end;

end.
Robin_ вне форума Ответить с цитированием
Старый 08.01.2013, 13:12   #3
supermario
Новичок
Джуниор
 
Аватар для supermario
 
Регистрация: 15.03.2011
Сообщений: 2
По умолчанию

Robin_, Получилось узнать модель?
supermario вне форума Ответить с цитированием
Старый 17.01.2016, 15:57   #4
_Valdemar_
Новичок
Джуниор
 
Регистрация: 05.05.2014
Сообщений: 2
По умолчанию Получилось узнать модель диска

Я нарыл в интернете пример, пришлось немного переделать под Delphi XE и доработать. В Мемо выводятся данные из SMART физического HDD диска:
1. Номер HDD диска в системе.
2. Серийный номер HDD диска.
3. Версия толи контролера толи чего другого, я так и не понял.
4. Модель HDD диска.
5. Размер HDD диска (использовал GetDriveSize смотрите выше).
Пример не может прочитать данные с флешки и выдает ошибки(отключил вывод об ошибках).
Может кому пригодится пример и он захочет его доработать.
Код:
unit main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Math;

const
  SMART_GET_VERSION = $074080;
  SMART_SEND_DRIVE_COMMAND = $07C084;
  SMART_RCV_DRIVE_DATA = $07C088;
  // Values of ds_bDriverError
  DRVERR_NO_ERROR = 0;
  DRVERR_IDE_ERROR = 1;
  DRVERR_INVALID_FLAG = 2;
  DRVERR_INVALID_COMMAND = 3;
  DRVERR_INVALID_BUFFER = 4;
  DRVERR_INVALID_DRIVE = 5;
  DRVERR_INVALID_IOCTL = 6;
  DRVERR_ERROR_NO_MEM = 7;
  DRVERR_INVALID_REGISTER = 8;
  DRVERR_NOT_SUPPORTED = 9;
  DRVERR_NO_IDE_DEVICE = 10;
  // Values of ir_bCommandReg
  ATAPI_ID_CMD = $A1;
  ID_CMD       = $EC;
  SMART_CMD    = $B0;

type
  TIdeRegs = packed record
    bFeaturesReg,
    bSectorCountReg,
    bSectorNumberReg,
    bCylLowReg,
    bCylHighReg,
    bDriveHeadReg,
    bCommandReg,
    bReserved: byte;
  end;

  TDriverStatus = packed record
    bDriverError: byte;
    bIDEError:    byte;
    bReserved:    array[1..2] of byte;
    dwReserved:   array[1..2] of DWORD;
  end;

  TSendCmdInParams = packed record
    dwBufferSize: DWORD;
    irDriveRegs:  TIdeRegs;
    bDriveNumber: byte;
    bReserved:    array[1..3] of byte;
    dwReserved:   array[1..4] of DWORD;
    bBuffer:      byte;
  end;

  TSendCmdOutParams = packed record
    dwBufferSize:   DWORD;
    dsDriverStatus: TDriverStatus;
    bBuffer:        array[1..512] of byte;
  end;

  TGetVersionInParams = packed record
    bVersion,
    bRevision,
    bReserved,
    bIDEDeviceMap:  byte;
    dwCapabilities: DWORD;
    dwReserved:     array[1..4] of DWORD;
  end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1:   TMemo;
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure CorrectDevInfo(var _params: TSendCmdOutParams);
asm
  PUSH EDI
  LEA EDI, _params.bBuffer
  ADD EDI, 14h
  MOV ECX, 0AH
  @@SerNumLoop:
  MOV AX, [EDI]
  XCHG AL, AH
  STOSW
  LOOP @@SerNumLoop
  ADD EDI, 6
  MOV CL, 18h
  @@ModelNumLoop:
  MOV AX, [EDI]
  XCHG AL, AH
  STOSW
  LOOP @@ModelNumLoop
  POP EDI
end;

procedure GetHDD;
var
  I:  integer;
  tmp: ansistring;
  St: ansistring;
  dev: THandle;
  scip: TSendCmdInParams;
  scop: TSendCmdOutParams;
  gvip: TGetVersionInParams;
  ret: DWORD;
  TmpSize: extended;
  Size: string;
begin
  St := '';
  for I := 0 to 25 do
  begin
    dev := CreateFile(PChar('\\.\PhysicalDrive ' + IntToStr(I)), GENERIC_READ or
      GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
    if dev <> INVALID_HANDLE_VALUE then
    begin
      if DeviceIoControl(dev, SMART_GET_VERSION, nil, 0, @gvip, SizeOf(gvip), ret, nil) then
      begin
        St := St + 'Disk № ' + ansistring(IntToStr(I)) + #13#10;
        St := St + '================================== =======' + #13#10;
        scip.irDriveRegs.bCommandReg := ID_CMD;
        if not DeviceIoControl(dev, SMART_RCV_DRIVE_DATA, @scip, SizeOf(scip),
          @scop, SizeOf(scop), ret, nil) then
          MessageBox(0, PChar(SysErrorMessage(GetLastError)), 'Error!', MB_OK or MB_ICONERROR)
        else
        if scop.dsDriverStatus.bDriverError = DRVERR_NO_ERROR then
        begin
          CorrectDevInfo(scop);
          SetLength(tmp, 20);
          Move(scop.bBuffer[21], tmp[1], 20);
          St := St + 'Serial Number: ' + tmp + #13#10;
          SetLength(tmp, 8);
          Move(scop.bBuffer[47], tmp[1], 8);
          St := St + 'Firmware Revision: ' + tmp + #13#10;
          SetLength(tmp, 40);
          Move(scop.bBuffer[55], tmp[1], 40);
          St := St + 'Model: ' + tmp + #13#10;
          TmpSize := GetDriveSize(i) / (1024 * 1024 * 1024);
          TmpSize := RoundTo(TmpSize, -1);
          Size := FloatToStr(TmpSize) + ' Gb';
          St := St + 'Size: ' + Size + #13#10#13#10;
          Form1.Memo1.Lines.Add(St);
        end
        else
          exit;
      end
      else
        exit;
      CloseHandle(dev);
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  GetHDD;
end;

end.
От модератора
Вставляйте код используя тэг кода(#).

Последний раз редактировалось Пепел Феникса; 18.01.2016 в 06:24. Причина: Отформатирован код
_Valdemar_ вне форума Ответить с цитированием
Старый 17.01.2016, 16:16   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Вот пример прям на сервере MSDN.
Копипастить сюда даже смысла нет.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 18.01.2016, 05:58   #6
_Valdemar_
Новичок
Джуниор
 
Регистрация: 05.05.2014
Сообщений: 2
По умолчанию

Min@y, тот твой пример на сервере MSDN, на который ты ссылку указал написан для C#, и к тому же там определяется только геометрия диска . Пример не имеет отношение к этой теме.
_Valdemar_ вне форума Ответить с цитированием
Старый 18.01.2016, 06:14   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от _Valdemar_ Посмотреть сообщение
Min@y, тот твой пример на сервере MSDN, на который ты ссылку указал написан для C#, и к тому же там определяется только геометрия диска . Пример не имеет отношение к этой теме.
Он на С++.
и от геометрии идет размер физ диска.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.01.2016, 07:11   #8
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Хоспади... Некропостеры. И не лень же искать темы трехлетней давности.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в Delphi определить размер файла? Nomad Помощь студентам 7 10.08.2010 08:33
Как определить размер скрытого объекта? rolling JavaScript, Ajax 7 28.09.2009 19:39
Как определить букву диска? Борис2 Паскаль, Turbo Pascal, PascalABC.NET 2 06.12.2007 22:16
Как определить размер кадра в AVI sun Общие вопросы C/C++ 1 18.11.2007 06:00
как определить название жёсткого диска??? PAVEL315 Общие вопросы Delphi 7 20.11.2006 20:27