Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.04.2012, 18:11
StudentMarat StudentMarat вне форума
Прохожий
 
Регистрация: 18.02.2011
Сообщения: 38
Репутация: 156
По умолчанию Серийные номер HDD

Нашел программу на Delphi, которая определяет серийный номер HDD (именно заводской номер, а не раздела). Сразу признаюсь, код не я писал. Протестировал. Программа работает на любой операционной системе. Посмотрел на код, так это полный аут
Никак не могу разобраться с кодом, что значит каждая процедура, константа, функция. Помогите разобраться в коде, если не трудно поставьте комментарий возле каждой строки, что это значит, для чего это необходимо. Мне очень нуна. Вот сам код, полностью рабочий, исходник тоже выкладываю:
Код:
unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

{$R *.DFM}

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;


procedure CorrectDevInfo(var _params: TSendCmdOutParams);
asm
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
end;


procedure TForm1.Button1Click(Sender: TObject);
var
i: DWORD;
tmp: string;
dev: THandle;
scip: TSendCmdInParams;
scop: TSendCmdOutParams;
gvip: TGetVersionInParams;
ret: DWORD;

begin
dev := CreateFile('\\.\PhysicalDrive0', 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
scip.dwBufferSize := 512;
scip.bDriveNumber := 0;
scip.irDriveRegs.bSectorCountReg := 1;
scip.irDriveRegs.bSectorNumberReg := 1;
scip.irDriveRegs.bDriveHeadReg := $A0; // ???
scip.irDriveRegs.bCommandReg := ID_CMD; // ???

if not DeviceIoControl(dev, SMART_RCV_DRIVE_DATA, @scip, SizeOf(scip),
@scop, SizeOf(scop), ret, nil) then
ShowMessage(SysErrorMessage(GetLastError))
else
if scop.dsDriverStatus.bDriverError = DRVERR_NO_ERROR then begin
CorrectDevInfo(scop);
SetLength(tmp, 20);
Move(scop.bBuffer[21], tmp[1], 20);
Memo1.Lines.Add('Serial Number: ' + tmp);

SetLength(tmp, 8);
Move(scop.bBuffer[47], tmp[1], 8);
Memo1.Lines.Add('Firmware Revision: ' + tmp);

SetLength(tmp, 40);
Move(scop.bBuffer[55], tmp[1], 40);
Memo1.Lines.Add('Model: ' + tmp);
end
else
ShowMessageFmt('Error code: %d', [scop.dsDriverStatus.bDriverError])
end
else
ShowMessage(SysErrorMessage(GetLastError));

CloseHandle(dev);
end;

end;
end.

Заранее благодарен
Вложения
Тип файла: rar Серийный номер HDD.rar (142.5 Кбайт, 133 просмотров)
Ответить с цитированием
  #2  
Старый 27.04.2012, 19:35
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,090
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

В кратце - программа обращается к системе S.M.A.R.T. винта и запрашивает у нее некоторые параметры. Потом из этих структур просто выдирает нужные значения. Просто объяснять код - бессмысленно. Надо пронимать что такое S.M.A.R.T., как оно работает. Ну еще до кучи - как обращаться собственно к контроллеру, но это как раз просто (dev := CreateFile('\\.\PhysicalDrive0',... - открывает физическое устройство как файл). К моменту, когда ты сможешь понять объяснение, само объяснение тебе уже не нужно будет. Так что читай про S.M.A.R.T.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:14.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025