Delphi-PRAXiS
Seite 2 von 6     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi SMART-Werte lesen (https://www.delphipraxis.net/72013-smart-werte-lesen.html)

Muetze1 26. Jun 2006 08:32

Re: SMART-Werte lesen
 
Zitat:

Zitat von Daniel G
Zitat:

Zitat von Muetze1
Ich versuche den ATAPI_INQUIRE an meine ATAPI Laufwerke zu senden, aber ich bekomme diese grundlegend nicht erreicht.

ATAPI - Laufwerke? Du meinst Wechseldatenträger, oder? Was genau willst du denn da machen?

Also Geräte welche das Packet Interface am ATA Anschluss nutzen - z.B. Brenner, DVD ROMs, etc. Grundlegend meistens Wechseldatenträger bzw. Datenträger mit einer Sektorgrösse ungleich 512. Diese Laufwerke reagieren nicht auf den DEVICE_INQUIRY Befehl für ATA Laufwerke, daher.

Daniel G 26. Jun 2006 09:58

Re: SMART-Werte lesen
 
Zitat:

Zitat von Muetze1
Also Geräte welche das Packet Interface am ATA Anschluss nutzen - z.B. Brenner, DVD ROMs, etc.

Ja, ok, ich hatte mich nur gewundert. Ich seh' grad, der "Inquiry" - Code für ATAPI und SCSI ist derselbe. Ich verwende für sowas eigentlich immer das SCSI_PASSTHROUGH_INTERFACE. Aber warum das bei dir nicht klappt... Wie erzeugst du dein Handle?

Sind wir eigentlich OT? :gruebel:

Muetze1 26. Jun 2006 10:32

Re: SMART-Werte lesen
 
Ich denke nicht das wir OT sind, da ich mich immernoch auf mein Programm beziehe was ich oben gepostet habe. Das Handle erzeuge ich wahlweise über \\.\PhysicalDriveX oder \\.\e: . In beiden Fällen bekomme ich ein Handle, aber GetVersionInfo() gibt mir in der IDE DeviceMap immer 0 zurück anstatt $11 für ein ATAPI Device oder $33 für 2 ATAPI devices. Das ist mein Problem und umstellen auf das SPTI wollte ich nun nicht.

Daniel G 1. Jul 2006 15:03

Re: SMART-Werte lesen
 
Hm, komisch isses in der Tat...

Aber um nochmal auf deine SMART - Demo zurück zu kommen:

Mir ist aufgefallen, dass du die Schleife für die SMART - Werte der einzelnen Festplatten einmal zuviel durchläufst.

Delphi-Quellcode:
//Zeile 8
Const
  MAX_IDE_DRIVES             = 4; // Max number of drives assuming primary/secondary, master/slave topology
Delphi-Quellcode:
//Zeile 86
For i := 0 To MAX_IDE_DRIVES Do
Is' jetzt kein Beinbruch, aber ich fand es halt erwähnenswert, weil ich das als Basis für eine Neuauflage von Be S.M.A.R.T. (oh gott,schon fast zwei Jahre alt...) nutzen wollte, wenn du nichts dagegen hast.

Muetze1 2. Jul 2006 14:01

Re: SMART-Werte lesen
 
Jo, stimmt.

Nutze den Code, ist mir egal. War ja nur mal eine schnelle Portierung.

Daniel G 10. Jul 2006 17:15

Re: SMART-Werte lesen
 
Hm... So peu à peu finde ich ja Zeit, den Code auseinander zu nehmen. Ich hatte mich schon gewundert, aber na gut, ich dachte halt, wenns von Microsoft kommt, wird's schon stimmen. Folgendes:

Diese Funktion hier:

Delphi-Quellcode:
//---------------------------------------------------------------------
// Open SMART to allow DeviceIoControl communications.
//---------------------------------------------------------------------
Function OpenSMART: THandle;
Begin
  Result := INVALID_HANDLE_VALUE;

  If ( Win32Platform = VER_PLATFORM_WIN32_WINDOWS ) Then
  Begin
      // Version Windows 95 OSR2, Windows 98
    Result := CreateFile('\\.\SMARTVSD', 0, 0, Nil, CREATE_NEW, 0, 0);

    //printf("Unable to open SMARTVSD, error code: 0x%lX\n", GetLastError());
  End
  Else If( Win32Platform = VER_PLATFORM_WIN32_NT ) Then
  Begin
    // Windows NT, Windows 2000
    Result := CreateFile('\\.\PhysicalDrive0', GENERIC_READ Or GENERIC_WRITE,
                         FILE_SHARE_READ Or FILE_SHARE_WRITE, Nil, OPEN_EXISTING, 0, 0);

    //printf("Unable to open physical drive, error code: 0x%lX\n", GetLastError());
  End;
End;
liefert unter NT - Systemen lediglich ein Handle auf die erste Festplatte (Was ja durch '\\.\PhysicalDrive0' auch nicht anders zu erwarten ist.) Dennoch wird die Schleife bei zwei Festplatten zweimal durchlaufen. Blöd nur, das beim zweiten Durchlauf immer noch das Handle für die erste Festplatte genommen wird. Unter Win9x ist der Code korrekt, da das Handle zur Smartvsd.vxd erzeugt wird. Unter NT funktioniert das so aber nicht. Das muss für jede Festplatte ein Handle mit '\\.\PhysicalDrivex' (x = Zahl von 0 - 3) erzeugt werden.

Wollte ich nur als kleinen Hinweis geben, für Leute, die den Code verwenden. :wink:

himitsu 10. Jul 2006 18:51

Re: SMART-Werte lesen
 
Das mit den Max=4:
ich lasse von 0 bis 255 durchlaufen ... erstens dauert es nicht lange und zweitens ... Sicher ist Sicher.

Mein PC hat z.B. die 4 bekannten IDE anschlüsse, da hängen schonmal 1 bis 2 Platten und die CD-Laufwerke drann, dann hab ich aber seit kurzem die neuen Platten an den S-ATAs ... macht also schonmal 6 (4 IDE + 2 SATA) ... einige MainBoards verfügen auch noch über ingesammt 4 S-ATA-Anschlüsse, macht also schon 8 ... dahingegen besitze ich noch eine IDE-Erweiterung ... also nochmal 4 IDEs ... macht zusammen 10 Ports, welcher angesprochen werden können ... schonmal schlecht, wenn euer Code nur die ersten 4 anspricht ;)

Und es ist ja nicht so, daß ich hier als Hardcore Speichersammler gelte ... da kenn ich schlimmere

IDE1 Master = Systemplatte
IDE2 Master/Slave = CD-ROMs
S-ATA 1+2 = RAID 1
IDE 3 Master or Slave = Wechsellaufwerk so brauch ich halt nicht aufpassen was die Wechselplattte hat und kann die och mal mitten im Betrieb ein-/ausbauen

hab also zwar nicht alles ausgenutzt, aber hätte dennoch die Möglichkeit euren Code zu "überlasten)



Das \\.\PhysicalDriveX oder \\.\X: ... tja, dafür gibt es auch noch die andere Möglichkeit,
denn diese Angaben sind nicht "eindeutig", von daher hab ich auch die (wie es jemand nannte) kryptischen Laufwerksbezeichnungen, wie \\?\Volume{GUID}, denn dieses hat halt ein paar nette Vorteile ... der Wichtigste ist z.B. daß diese Bezeichnungen im gesammten Windows eindeutig sind, also egal welcher Benutzer aktiv ist, es gelten immer die selben Werte.
vorallen das \\.\X: ist ja nicht immer gleich und hängt davon ab, ob und wie das Laufwerk gemounted ist.
(z.B.: Benutzer A kann ja eine Partition als X:\ mounten, Benutzer B hat sie als Q:\ und vielleicht noch R:\MeineDrives\ und Benutzer C hat sie garnicht gemounted)

Daniel G 10. Jul 2006 18:55

Re: SMART-Werte lesen
 
Zitat:

Zitat von himitsu
dann hab ich aber seit kurzem die neuen Platten an den S-ATAs

Funktioniert der Code denn mit S-ATA Platten? Ich meine mal gelesen zu haben, dass das nicht geht.

Muetze1 10. Jul 2006 21:29

Re: SMART-Werte lesen
 
Ähm, ich glaube hier wird geraten und Dinge als Wahrheit verkauft ohne Wissen, oder?

Grundlegendes:

1. PhysicalDrive0 ist vollkommen in Ordnung und liefert ein Handle für den primären und sekundären IDE Port. Deshalb auch die 4. Man kan durch gesetztes Bit 0..3 sehen, ob es ein Gerät gib. Dabei sieht die Zuordnung wie folgt aus:

Bit 0 = Primary Master
Bit 1 = Primary Slave
Bit 2 = Secondary Master
Bit 3 = Secondary Slave

Im High Nibble geben die 4 Bits an, ob es sich um ein ATAPI Gerät handelt, also das Packet Interface verwendet. Wenn dies der Fall ist, dann ist Bit entsprechend gesetzt. Auch hier gilt wieder:

Bit 4 = Primary Master
Bit 5 = Primary Slave
Bit 6 = Secondary Master
Bit 7 = Secondary Slave

2. Dieses Interface leitet nur die Strukturen/Commands direkt an das IDE Interface weiter. Dies betrifft nur die alte parallel-ATA Schnittstelle. Wenn ihr also einen S-ATA Controller habt und dieser nicht gerade im P-ATA Kompatibilitätsmodus läuft und somit die Port belegt und sich so verhält, dann habt ihr keine Chance. S-ATA Geräte werden in Windows als SCSI Geräte eingebunden und müssen somit über SPTI angesprochen werden und verwenden grundsätzlich wie SCSI nur noch Packet-orientierte Befehlsstrukturen.

3.
Zitat:

Zitat von himitsu
ich lasse von 0 bis 255 durchlaufen ...

Nach der Definition der Bits oben dürfte dir vllt. klar werden, das somit die meisten Abfragen die mit der Schleifenvariable gebaut werden Müll sind. Schon allein die Drive Selection in den Kommando-absetzenden-Proceduren kommt damit völlig aus dem Tritt. Du produzierst damit Überläufe in den Command/Drive/Head/Cylinder Registern die über die Struktur befüllt werden. Deine Datensicherheit scheint dir ja nicht viel Wert zu sein.

4. \\.\PhysicalDriveX bezeichnet ein physikalisch vorhandenes Laufwerk und die werden vom HAL in eine Reihenfolge der Erkennung gebracht und die ist soweit immer gleich. Die HAL Schicht kommt vor der Nutzer-Authentifizierung somit ändert sich da rein gar nix abhängig vom Nutzer. Windows verkabelt doch nicht dein System neu wenn du dich anmeldest und klemmt das CD-ROM ab, wenn es dein Bruder an deinem Rechner macht. Sowas wäre ja der Himmel auf Erden für alle Kinderporno-Sammler ...

5.
Zitat:

Zitat von Daniel G
Das muss für jede Festplatte ein Handle mit '\\.\PhysicalDrivex' (x = Zahl von 0 - 3) erzeugt werden.

Probier es aus, aber ich behaupte du wirst niemals ein gesetztes Bit finden bei einem \\.\PhysicalDriveX bei x > 0.

/EDIT: So, der Thread wird ja doch noch weiter gepflegt, ich lass mich denn mal doch benachrichtigen...

Daniel G 10. Jul 2006 21:44

Re: SMART-Werte lesen
 
Zitat:

Zitat von Muetze1
PhysicalDrive0 ist vollkommen in Ordnung und liefert ein Handle für den primären und sekundären IDE Port. Deshalb auch die 4. Man kan durch gesetztes Bit 0..3 sehen, ob es ein Gerät gib. Dabei sieht die Zuordnung wie folgt aus:

Das bestreite ich auch nicht. Allerdings werden mir zweimal die selben Daten geliefert. Ich hab's mal getestet:

Beide IDE - Laufwerke hängen am selben Kabel. Das Master Laufwerk ist max. 1 Jahr alt, das Slave Laufwerk 10 Jahre (nur zu Testzwecken angehangen).

(Ich nutze mal die Code - Tags, damit man die beiden Dinge zusammenklappen kann. Anhängen wollte ich das jetzt nicht extra. ;) )

Zuerst mit...


Delphi-Quellcode:
Result := CreateFile('\\.\PhysicalDrive0', GENERIC_READ Or GENERIC_WRITE,
                         FILE_SHARE_READ Or FILE_SHARE_WRITE, Nil, OPEN_EXISTING, 0, 0);
Code:
SMART interface opened...
DFP_GET_VERSION returned:
    bVersion       = 1
    bRevision      = 1
    fCapabilities  = 0x00000007
    bReserved      = 0x0
    bIDEDeviceMap  = 0x3
SMART enabled on drive: 0
     cbBytesReturned: 16
Drive 0 is an IDE Hard drive that supports SMART
    #Cylinders: 16383, #Heads: 16, #Sectors per Track: 63
     IDE TASK FILE REGISTERS:
          bFeaturesReg    = 0x0
          bSectorCountReg = 0x1
          bSectorNumberReg = 0x1
          bCylLowReg      = 0x0
          bCylHighReg     = 0x0
          bDriveHeadReg   = 0xA0
          Status          = 0xEC
     Model number: WDC WD800JB-00JJC0                     
     Firmware rev: 05.01C0
     Serial number:     WD-WCAM9654893:
   cbBytesReturned: 528
SMART enabled on drive: 1
     cbBytesReturned: 16
Drive 1 is an IDE Hard drive that supports SMART
    #Cylinders: 16383, #Heads: 16, #Sectors per Track: 63
     IDE TASK FILE REGISTERS:
          bFeaturesReg    = 0x0
          bSectorCountReg = 0x1
          bSectorNumberReg = 0x1
          bCylLowReg      = 0x0
          bCylHighReg     = 0x0
          bDriveHeadReg   = 0xB0
          Status          = 0xEC
     Model number: WDC WD800JB-00JJC0                     
     Firmware rev: 05.01C0
     Serial number:     WD-WCAM9654893:
   cbBytesReturned: 528
Data for Drive Number 0
Attribute Structure Revision         Threshold Structure Revision
             16                                      16
   -Attribute Name-      -Attribute Value-     -Threshold Value-
01 Raw Read Error Rate         200                    51
03 Spin Up Time                174                    21
04 Start/Stop Count            99                    0
05 Reallocated Sector Count    200                    140
07 Seek Error Rate             200                    51
09 Power On Hours Count        97                    0
0A Spin Retry Count            100                    51
0B Calibration Retry Count     100                    51
0C Power Cycle Count           99                    0
C2 (Unknown attribute)         98                    0
C4 (Unknown attribute)         200                    0
C5 (Unknown attribute)         200                    0
C6 (Unknown attribute)         200                    0
C7 (Unknown attribute)         200                    0
C8 (Unknown attribute)         200                    51
Data for Drive Number 1
Attribute Structure Revision         Threshold Structure Revision
             16                                      16

   -Attribute Name-      -Attribute Value-     -Threshold Value-
01 Raw Read Error Rate         200                    51
03 Spin Up Time                174                    21
04 Start/Stop Count            99                    0
05 Reallocated Sector Count    200                    140
07 Seek Error Rate             200                    51
09 Power On Hours Count        97                    0
0A Spin Retry Count            100                    51
0B Calibration Retry Count     100                    51
0C Power Cycle Count           99                    0
C2 (Unknown attribute)         98                    0
C4 (Unknown attribute)         200                    0
C5 (Unknown attribute)         200                    0
C6 (Unknown attribute)         200                    0
C7 (Unknown attribute)         200                    0
C8 (Unknown attribute)         200                    51
...dann mit

Delphi-Quellcode:
Result := CreateFile('\\.\PhysicalDrive1', GENERIC_READ Or GENERIC_WRITE,
                         FILE_SHARE_READ Or FILE_SHARE_WRITE, Nil, OPEN_EXISTING, 0, 0);
Code:
SMART interface opened...
DFP_GET_VERSION returned:
    bVersion       = 1
    bRevision      = 1
    fCapabilities  = 0x00000007
    bReserved      = 0x0
    bIDEDeviceMap  = 0x3
SMART enabled on drive: 0
     cbBytesReturned: 16
Drive 0 is an IDE Hard drive that supports SMART
    #Cylinders: 2482, #Heads: 16, #Sectors per Track: 63
     IDE TASK FILE REGISTERS:
          bFeaturesReg    = 0x0
          bSectorCountReg = 0x1
          bSectorNumberReg = 0x1
          bCylLowReg      = 0x0
          bCylHighReg     = 0x0
          bDriveHeadReg   = 0xA0
          Status          = 0xEC
     Model number: ST31277A                              
     Firmware rev: 0.62   
     Serial number:            XA84142:
   cbBytesReturned: 528
SMART enabled on drive: 1
     cbBytesReturned: 16
Drive 1 is an IDE Hard drive that supports SMART
    #Cylinders: 2482, #Heads: 16, #Sectors per Track: 63
     IDE TASK FILE REGISTERS:
          bFeaturesReg    = 0x0
          bSectorCountReg = 0x1
          bSectorNumberReg = 0x1
          bCylLowReg      = 0x0
          bCylHighReg     = 0x0
          bDriveHeadReg   = 0xB0
          Status          = 0xEC
     Model number: ST31277A                              
     Firmware rev: 0.62   
     Serial number:            XA84142:
   cbBytesReturned: 528
Data for Drive Number 0
Attribute Structure Revision         Threshold Structure Revision
             5                                      5
   -Attribute Name-      -Attribute Value-     -Threshold Value-
01 Raw Read Error Rate         117                    0
03 Spin Up Time                96                    0
04 Start/Stop Count            99                    20
05 Reallocated Sector Count    100                    36
07 Seek Error Rate             39                    30
0A Spin Retry Count            100                    97
0C Power Cycle Count           100                    20
Data for Drive Number 1
Attribute Structure Revision         Threshold Structure Revision
             5                                      5

   -Attribute Name-      -Attribute Value-     -Threshold Value-
01 Raw Read Error Rate         117                    0
03 Spin Up Time                96                    0
04 Start/Stop Count            99                    20
05 Reallocated Sector Count    100                    36
07 Seek Error Rate             39                    30
0A Spin Retry Count            100                    97
0C Power Cycle Count           100                    20
@Muetze1: Verstehst du jetzt mein Problem?

//Edit:
Zitat:

Probier es aus, aber ich behaupte du wirst niemals ein gesetztes Bit finden bei einem \\.\PhysicalDriveX bei x > 0.
Dann hätte obiges ja gar nicht funktionieren dürfen, oder? :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:20 Uhr.
Seite 2 von 6     12 34     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz