Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Заводской S/N Жесткого диска 
V
    Опции темы
Antony41
  Дата 17.7.2009, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 27.12.2008

Репутация: 1
Всего: 1



Привет Всем! 
Такая вот проблемка! В Delphi 7 всё работает на ура, но вот в Delphi 2009, какие то не те данные. В чем может быть дело?

Код

function HddSerialAndModel(Param:String):String;
var
i: DWORD;
FTmpHDD: 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);
        if Param='Serial' then
          begin
            SetLength(FTmpHDD, 20);
            Move(scop.bBuffer[21], FTmpHDD[1], 20);
            Result:=FTmpHDD;
          end;
        if Param='Model' then
          begin
            SetLength(FTmpHDD, 40);
            Move(scop.bBuffer[55], FTmpHDD[1], 40);
            Result:=FTmpHDD;
        end;
      end
    else
      ShowMessageFmt('Error code: %d', [scop.dsDriverStatus.bDriverError])
end
else
ShowMessage(SysErrorMessage(GetLastError));
CloseHandle(dev);
end;

end;


примеры
при нажатии на кнопку1
Код

ShowMessage(HddSerialAndModel('Serial'));


при нажатии на кнопку2
Код

ShowMessage(HddSerialAndModel('Model'));


Или может есть другой вариант
PM MAIL   Вверх
Keeper89
Дата 17.7.2009, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



Замена типа string на AnsiString не поможет?


Это сообщение отредактировал(а) Keeper89 - 17.7.2009, 23:32


--------------------
PM MAIL WWW   Вверх
Antony41
  Дата 17.7.2009, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 27.12.2008

Репутация: 1
Всего: 1



Зашибись спасибочки!!!!
PM MAIL   Вверх
Antony41
Дата 18.7.2009, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 27.12.2008

Репутация: 1
Всего: 1



еще что то не то! (речь о Delphi2009), 

вот так работает:
Код

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
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: Ansistring;
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);
ShowMessage(' Serial Number: ' + tmp);

SetLength(tmp, 8);
Move(scop.bBuffer[47], tmp[1], 8);
ShowMessage('Firmware Revision: ' + tmp);
SetLength(tmp, 40);
Move(scop.bBuffer[55], tmp[1], 40);
ShowMessage(' Model: ' + tmp);
end
else
ShowMessageFmt('Error code: %d', [scop.dsDriverStatus.bDriverError])
end
else
ShowMessage(SysErrorMessage(GetLastError));
CloseHandle(dev);
end;
end;

end.







а так не работает
Код

unit Unit1;

interface

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

type
TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
function HddSerialAndModel(const Param:String):AnsiString;
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;

function TForm1.HddSerialAndModel(const Param:String):AnsiString;
var
  i: DWORD;
  tmp: Ansistring;
  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);
                if param='Serial' then
                    begin
                      SetLength(tmp, 20);
                      Move(scop.bBuffer[21], tmp[1], 20);
                      Result:=(tmp);
                    end
                else
                  if Param='Model' then
                    begin
                      SetLength(tmp, 40);
                      Move(scop.bBuffer[55], tmp[1], 40);
                      Result:=tmp;
                    end
                else
                  if Param='Firmware' then
                    begin
                      SetLength(tmp, 8);
                      Move(scop.bBuffer[47], tmp[1], 8);
                      Result:=tmp;
                    end;
              end;
        end
          else
            ShowMessageFmt('Error code: %d', [scop.dsDriverStatus.bDriverError])
    end
      else
        ShowMessage(SysErrorMessage(GetLastError));
  CloseHandle(dev);
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
ShowMessage(HddSerialAndModel('Serial'));
end;
end.


Чё за хрень?
PM MAIL   Вверх
Keeper89
Дата 18.7.2009, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



А здесь заменить
Код

function TForm1.HddSerialAndModel(const Param:String):AnsiString;

на
Код

function TForm1.HddSerialAndModel(const Param: AnsiString): AnsiString;

?

Это сообщение отредактировал(а) Keeper89 - 18.7.2009, 12:38


--------------------
PM MAIL WWW   Вверх
Antony41
  Дата 18.7.2009, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 27.12.2008

Репутация: 1
Всего: 1



почему то и так не помогает!

PM MAIL   Вверх
Keeper89
Дата 18.7.2009, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



Что значит не работает? Ошибки? Неверные значения?
Результаты в студию!


--------------------
PM MAIL WWW   Вверх
Antony41
  Дата 18.7.2009, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 27.12.2008

Репутация: 1
Всего: 1



Ошибка по како му то адрусу, в файле kernel32.dll.

Проблему решил вставив результат в конец функции, но так и не понял в чём дело:(
Код

function TForm1.HddSerialAndModel(AParam: AnsiString): AnsiString;
var
  tmp: Ansistring;
  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);
                if AParam='Serial' then
                  begin
                    SetLength(tmp, 20);
                    Move(scop.bBuffer[21], tmp[1], 20);
                  end
                else
                  if AParam='Firmware' then
                    begin
                      SetLength(tmp, 8);
                      Move(scop.bBuffer[47], tmp[1], 8);
                    end
                  else
                    if AParam='Model' then
                      begin
                        SetLength(tmp, 40);
                        Move(scop.bBuffer[55], tmp[1], 40);
                      end;
              end;
        end
          else
            ShowMessageFmt('Error code: %d', [scop.dsDriverStatus.bDriverError])
    end
      else
        ShowMessage(SysErrorMessage(GetLastError));
  CloseHandle(dev);
  if tmp<>'' then
    if AParam='Serial' then
      Result:=(' Serial: ' + tmp)
    else
      if AParam='Firmware' then
        Result:=(' Firmware: ' + tmp)
      else
        if AParam='Model' then
          Result:=(' Model: ' + tmp)
end;


procedure TForm1.BitBtn1Click(Sender: TObject);
begin
ShowMessage(HddSerialAndModel('Model')+HddSerialAndModel('Serial')+HddSerialAndModel('Firmware'));
end;


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1263 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.