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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 27.04.2012, 18:06   #1
StudentMarat
Форумчанин
 
Регистрация: 10.10.2008
Сообщений: 123
По умолчанию Серийные номер 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 Кб, 64 просмотров)
StudentMarat вне форума
Старый 27.04.2012, 20:22   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Все в полне понятно. Большенство типов, констант, исп. функций - можно найти в MSDN.
Человек_Борща вне форума
Старый 27.04.2012, 21:15   #3
StudentMarat
Форумчанин
 
Регистрация: 10.10.2008
Сообщений: 123
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Все в полне понятно. Большенство типов, констант, исп. функций - можно найти в MSDN.
Ну это понятно. Пользоваться справкой. Ну просто времени особо нет. Да и преподу скоро это объяснять. А если не объясню, то ничего хорошего. Если не трудно, прокомментируйте каждую строку. очень нуна.
StudentMarat вне форума
Старый 27.04.2012, 21:53   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Пользоваться справкой.
не заметно.

Цитата:
Ну просто времени особо нет.
Ни у кого нет.

Цитата:
Если не трудно, прокомментируйте каждую строку.
Почему кто-то это должен делать?

Цитата:
очень нуна.
Только тебе.

Уважаемй, за эти эмм 4 часа, которые висит тема, уже можно было не только код понять и прокомментировать, но и с ассемблерной вставкой разобраться.
Человек_Борща вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Серийные номера устройств. Tip.the.besT Win Api 5 05.10.2011 19:54
Программа, получающая серийный номер hdd. Ghj Ibanez Wizard Win Api 3 21.09.2011 07:47
Серийный номер hdd через wmi xil C# (си шарп) 3 08.09.2011 12:04
Серийный номер HDD ?! $T@LKER Общие вопросы Delphi 32 26.02.2011 10:55
Серийный номер HDD Mikola-TEAM Win Api 1 25.05.2010 19:38