AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Ioctl_ata_pass_through

Ein Thema von Mattze · begonnen am 14. Apr 2014 · letzter Beitrag vom 15. Apr 2014
Antwort Antwort
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#1

Ioctl_ata_pass_through

  Alt 14. Apr 2014, 08:55
Hallo,

ich habe für IOCTL_ATA_PASS_THROUGH einen Typ
Delphi-Quellcode:
    TATAIdentifyDeviceQuery = packed record
      header: ATA_PASS_THROUGH_EX;
      data: array [0..255] of Word;
    end;
gefunden.
(Damit kriegt man z. Bsp. raus, ob das eine SSD ist: data[217]=1)

Mich würden nun aber noch die anderen data interessieren.
Bisher habe ich dazu nichts gefunden. Kennt jemand ein paar?

Gruß
Mattze
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Ioctl_ata_pass_through

  Alt 14. Apr 2014, 09:03
Das ist aber etwas sehr allgmein. Die tatsächliche Struktur ist hier dokumentiert.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#3

AW: Ioctl_ata_pass_through

  Alt 14. Apr 2014, 10:27
http://en.wikipedia.org/wiki/S.M.A.R....T._attributes
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#4

°C

  Alt 14. Apr 2014, 10:44
Hallo,

vielen Dank, aber...

@Union: Es geht hier nicht um die Struktur von ATA_PASS_THROUGH_EX, sondern um die Struktur des OutputPuffers.

@Hathor: Das dachte ich zuerst auch. Allerdings müsste dann data[194] die aktuelle Temperatur der Platte sein sein. Ist es aber nicht! Der Wert ist 0, richtig (anders per SMART direkt ausgelesen) ist sie 29°C.
(Ich dachte auch, das das die gleichen Werte wie bei WMI unter Vendorspezifisch1 angegeben sind. Aber??? Den Klassennamen habe ich jetzt vergessen!)

Gruß Mattze
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#5

AW: Ioctl_ata_pass_through

  Alt 14. Apr 2014, 10:53
Manche Einträge sind herstellerspezifisch -> Stichwort: arrVendorSpecific.
Z.B. Temperatur:
Manche speichern auch den niedrigsten, aktuellen und höchsten Wert, der je aufgetreten ist.

Nicht alle SSD haben einen Temperatursensor!

Geändert von hathor (14. Apr 2014 um 11:16 Uhr)
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#6

AW: Ioctl_ata_pass_through

  Alt 14. Apr 2014, 11:16
Hallo,

das herstellerspezifisch" stimmt natürlich - und ist ziemlich lästig.
Aber:
1. Es geht nicht um die Temperatur einer SDD, sondern einer ganz normalen S.M.A.R.T.-HDD.
2. Im Datenpuffer data[194] steht 0. Dieser SMART-Wert direkt ausgelesen gibt 29. Fremdprogramme ergeben auch 29! Laut Deines Vorschlages gibt SMART bei 194 tatsächlich die Temperatur an und dort ist auch kein Hinweis auf "herstellerspezifisch" zu finden. Das scheint wirklich zu den allgemein gültigen Adressen zu gehören!

Gruß
Mattze
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#7

AW: Ioctl_ata_pass_through

  Alt 14. Apr 2014, 17:13
Bei meiner Seagate-HDD bekomme ich die Temperatur mit

Delphi-Quellcode:
type
  TSmartData = array[0..527] of Byte;

procedure GetSmartData(var Data: TSmartData);
var
  hdrive: Cardinal;
  dwBytesReturned: DWORD;
  ipar: array[0..31] of Byte;
  opar: TSmartData;
begin
  ipar[0] := 0;
  ipar[1] := $02;
  ipar[2] := 0;
  ipar[3] := 0;
  ipar[4] := $d0;
  ipar[5] := $01;
  ipar[6] := $01;
  ipar[7] := $4f;
  ipar[8] := $c2;
  ipar[9] := $a0;
  ipar[10] := $b0;
  ipar[11] := 0;
  ipar[12] := 0;
  ipar[13] := 0;
  ipar[14] := 0;
  ipar[15] := 0;
  ipar[16] := $8c;
  ipar[17] := $fd;
  ipar[18] := $14;
  ipar[19] := 0;
  ipar[20] := 0;
  ipar[21] := $02;
  ipar[22] := 0;
  ipar[23] := 0;
  ipar[24] := $03;
  ipar[25] := 0;
  ipar[26] := 0;
  ipar[27] := 0;
  ipar[28] := $03;
  ipar[29] := 0;
  ipar[30] := 0;
  ipar[31] := 0;

  // Get first harddrive
  hdrive := CreateFile(PChar('\\.\PhysicalDrive0'), 3221225472, 3, nil, 3, 0, 0);
  DeviceIoControl(hdrive, $0007C088, @ipar, 32, @opar, 528, dwBytesReturned, nil);
  CloseHandle(hdrive);
  Data := opar;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var sdata: TSmartData;
begin
getsmartdata(sdata);
Caption := INTTOSTR(sdata[168]*256+sdata[167]);
end;

Geändert von hathor (14. Apr 2014 um 18:27 Uhr)
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#8

AW: Ioctl_ata_pass_through

  Alt 15. Apr 2014, 11:22
Nachtrag: constant arrVendorSpecific

FUJITSU, HITACHI, MAXTOR: arrVendorSpecific(151)
WESTERN DIGITAL, IBM: arrVendorSpecific(139)
SAMSUNG: arrVendorSpecific(135)
SEAGATE: arrVendorSpecific(127)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz