Delphi-PRAXiS
Seite 1 von 2  1 2      

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)

ManuMF 23. Jun 2006 18:55


SMART-Werte lesen
 
Hallo,

ich bastele mir gerade eine Komponente, die mir die SMART-Festplatteninfos liefern soll. Ich habe dazu den Code von SwissDelphiCenter.ch verwendet, aber der liefert entweder keine oder nur falsche Werte (Vergleich: SpeedFan). Hier im Forum habe ich nur 2 Themen gefunden, eines davon mit Hinweis zu SwissDelphiCenter. Gibt es vielleicht noch eine andere Möglichkeit, die Werte auszulesen?

Danke,
ManuMF

Daniel G 23. Jun 2006 19:03

Re: SMART-Werte lesen
 
Probier mal, diese C-Demo nach Delphi zu portieren.

http://download.microsoft.com/downlo...S/SmartApp.exe

Ich habe es nicht geschafft.

ManuMF 24. Jun 2006 12:45

Re: SMART-Werte lesen
 
Hallo,

wenn ich C könnte und ein bisschen mehr Zeit hätte... :cyclops:

Gruß,
ManuMF

Muetze1 25. Jun 2006 01:34

Re: SMART-Werte lesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, ich hatte ein wenig Zeit und interessiert hatte es mich auch. Hier nun die Übersetzung der SmartApp von Microsoft. Ich habe das ganze von einem Kommandozeilentool in eine Form-basierende Form gebracht.

Ich habe einmal IfThen() benutzt, daher ab Delphi 7. Wenn man das IfThen() ersetzt, dann sollte es ab Delphi 4 klappen (die Unit Variants einfach kicken).

Daniel G 25. Jun 2006 10:39

Re: SMART-Werte lesen
 
:shock:

*räusper*

Tja, funktioniert einwandfrei. Die Gelegenheit für mich, mal nachzusehen, warum mein Programm bei mir nur Mist produziert hat. Aus Fehlern lernt man ja bekanntlich...

ManuMF 25. Jun 2006 11:43

Re: SMART-Werte lesen
 
Hallo,

das funktioniert super :thumb:
Auch unter D6.

Aber wie kann ich die Werte verwerten? ;-) Mich interessiert vor allem die Temperatur, und der gelesene Wert ist "157", sowohl von dem Programm als auch von SpeedFan. Aber SpeedFan wandelt das um in "27°C". Was steckt dahinter? Fahrenheit nicht, denn die wären weniger.

Gruß,
ManuMF

Daniel G 25. Jun 2006 11:54

Re: SMART-Werte lesen
 
Zitat:

Zitat von ManuMF
Aber SpeedFan wandelt das um in "27°C".

Ein Irrglaube. Speedfan wandelt nichts um.Die Hersteller weisen den Werten, bis auf ein paar Ausnahmen, unterschiedliche Bedeutung zu. Ähnlich verhält es sich mit dem Wert für die Temperatur. Ich hatte mal 'ne Liste, mal sehen, ob ich die noch finde...

//Edit: Ok, ich sehe gerade, bei mir arbeitet Speedfan mit dem "RAW" - Wert dieser Eigenschaft... D.h., dieser müsste auch noch abgefragt werden...

Daniel G 25. Jun 2006 12:30

Re: SMART-Werte lesen
 
So, ich schon wieder. Wenn du in Zeile 352 der Smartfunc.pas das hier:

Delphi-Quellcode:
      AOut.Add(Format('%.2X %-29s%d%20s%d', [lDA^.bAttrID,
                                             coAttrNames[lAttr],
                                             lDA^.bAttrValue,
                                             ' ',
                                             lAT^.bWarrantyThreshold]));
in das änderst

Delphi-Quellcode:
      AOut.Add(Format('%.2X %-29s%d%20s%d%20s%d', [lDA^.bAttrID,
                                             coAttrNames[lAttr],
                                             lDA^.bAttrValue,
                                             ' ',
                                             lAT^.bWarrantyThreshold,
                                             ' ',
                                             lDA^.bRAWValue[0]]));
bekommst du den ersten "RAW" - Wert. Bei mir entspricht dieser Wert in der Eigenschaft "C2" der Temperatur der Festplatte. Allerdings weiß ich nicht, ob das genormt ist, sprich, ob alle Hersteller denselben Wert nutzen...

Muetze1 25. Jun 2006 19:19

Re: SMART-Werte lesen
 
Moin!

So, schön zu hören, das das Prog klappt. Es ist nur schnell dahingeschmiert - das Memo hat keine Anchors, etc. Sollte alles noch gemacht werden.

Nun zu der Frage mit der Temperatur: Ich habe mir mal alle ATA/ATAPI Standards von 1 bis zur 8 (Draft) besorgt und studiert sowie die S.M.A.R.T. Definition der SFF. Bei allen steht halt, dass es Vendor-Specific ist. Die von Microsoft schon mit Text versehenen Attribute sind nur bis ATA-3 richtig, ab ATA-4 sind diese komplett Vendor Specific. Daher müsste man eigentlich aus der vom DEVICE_INQUIRE zurück gelieferten Info-Struktur auslesen nach welcher Revision das Gerät arbeitet und entsprechend umsetzen. Maxtor hat bei vielen Platten eine Attribute ID von 192 (dezimal) für die Temperatur in °C, aber leider nicht überall. Es gibt auch Maxtor Platten mit einem anderen Wert auf dem Attribute ID von 192. Toshiba hat dort meist die Minuten der aktuellen Laufzeit und bei manchen Platten auch die Temperatur - aber mit 10 Multipliziert um eine Kommastelle zu ermöglichen.

Ich habe dann mich nochmal mit dem Quellcode von dem SMARTmontools (http://www.sourceforge.net/projects/smartmontools) auseinander gesetzt und die Jungs (und Mädels) machen es auch nur nach verifizierten Informationen. D.h. sie haben eine Tabelle mit den jeweiligen Zuordnungen der Attribute IDs zu den Modellen der Herstellern über RegExpressions.

Dann habe ich mich noch auf Suche nach herstellerspezifischen Dokumentationen begeben zu den SMART Attributen, aber Maxtor, Seagate (sind ja nun eins), IBM (Naja, nun Hitachi) und WDC schweigen sich aus oder wollen deftig Geld für die PDFs.

Nun aber noch was am Rande: Ich versuche den ATAPI_INQUIRE an meine ATAPI Laufwerke zu senden, aber ich bekomme diese grundlegend nicht erreicht. Wenn ich PhysicalDriveX abändere bekomme ich nie die beiden Laufwerke (obwohl sie am Secondary hängen) und der Laufwerksbuchstabe ist auch nicht erfolgreich (\\.\e:). Ich weiss nicht mehr weiter. Die Kombinationen der Attribute (z.B. entfernen von GENERIC_WRITE) hat auch nicht gebraucht. Irgendwelche Ideen?

MfG
Muetze1

Daniel G 26. Jun 2006 00:18

Re: SMART-Werte lesen
 
Zitat:

Zitat von Muetze1
Dann habe ich mich noch auf Suche nach herstellerspezifischen Dokumentationen begeben zu den SMART Attributen, aber Maxtor, Seagate (sind ja nun eins), IBM (Naja, nun Hitachi) und WDC schweigen sich aus oder wollen deftig Geld für die PDFs.

Jupp, ging mir damals eben so. Es ist teils echt frustrierend und ich muss gestehen, ich kann es auch nicht wirklich nachvollziehen... Aber wat soll man machen...
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?

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:

Muetze1 10. Jul 2006 21:51

Re: SMART-Werte lesen
 
Kann es sein, dass du eine Mischung von Jumpersettings hast? z.B. die WDC nicht von Single auf Master umgesteckt oder das die alte am Slave vllt. als CS (cable select) gejumpert ist?

Jo, der zweite hätte nicht funktionieren dürfen.

Daniel G 10. Jul 2006 21:55

Re: SMART-Werte lesen
 
Mom, ich schau' mal nach.... Die alte (Seagate) ist definitiv Slave.... Und die Western Digital definitiv Master... Und hängen am selben IDE - Port...

//Edit: Ich könnte spaßeshalber auch noch eine dritte Festplatte an den zweiten IDE - Port hängen. Auch so'n Uraltteil...

Sir Rufo 10. Jul 2006 22:59

Re: SMART-Werte lesen
 
Hi folks,

hier mal ein netter Link, wo es zu SMART alles gibt, was das Herz begehrt und eine ganze Menge mehr

Magenta Systems

cu

Oliver

Muetze1 11. Jul 2006 08:52

Re: SMART-Werte lesen
 
Der Link hat zum einen nur eine Übersetzung der Strukturen wie wir sie auch haben aus der gleichen C Quelle con Microsoft und die Ermittlung der SMART Werte löst er genauso wie wir mit dem gleichen übersetzten Code. Diese Unit ist aber sehr komisch. Zum einen sind die Formatierungen ein heilloses durcheinander und zum anderen wurden Dinge falsch übersetzt. Anscheinend testet er seine eigenen Procedure nicht mal. Da werden Formatierungszeichen von C im String gelassen (z.B. der doppelte \ um einen zu bekommen...) etc.

Das einzige wären die Texte bzw. Bedeutungen der SMART Attribute Tags die er noch zusätzlich hat, wobei aber hier auch wieder das schon oben angesprochene Problem ist: jeder Hersteller kocht sein eigenes Süppchen ab ATA v4.

Sir Rufo 11. Jul 2006 09:10

Re: SMART-Werte lesen
 
Jepp, das mag schon sein, allerdings ist der Zugriff darauf, ob es sich hier um einen SMART-Fehler handelt relativ einfach.
Ausserdem kann man mit dieser Unit einfach die Temperatur der Festplatten auslesen.

Ich habe mit dieser Unit (Magenta) eine SMART-Überwachung geschrieben, die dann automatisch eine mail an mich versendet, wenn ein Wert in einen Fehler läuft.

Dieses läuft auf ca. 150 Rechnern (fast immer unterschiedliche Platten) und das ganz hervorragend.
Kann also gar nicht so schlecht sein :mrgreen:

cu

Oliver

Muetze1 11. Jul 2006 10:56

Re: SMART-Werte lesen
 
Zitat:

Zitat von Sir Rufo
Ausserdem kann man mit dieser Unit einfach die Temperatur der Festplatten auslesen.

Das geht mit der Übersetzung von uns genauso - nur das Problem ist, das diese Information überhaupt nicht gesichert ist. Ich kann dir Festplatten nennen, da steht in dem Feld keine Temperatur drinne sondern etwas ganz anderes und da funktioniert unser wie auch dein Code nicht mehr ordentlich. Schon allein durch die Änderung des Statuses der Attribut Tags auf vendor specific in ATA-4 wird in nächster Zeit seine Auswirkungen haben und es wird zu Inkompatibilitäten kommen. Aktuell wird an der Version 8 gebastelt und die meisten P-ATA Geräte implementieren den Standard nach 4 z.T. 5.

Zitat:

Zitat von Sir Rufo
Dieses läuft auf ca. 150 Rechnern (fast immer unterschiedliche Platten) und das ganz hervorragend.
Kann also gar nicht so schlecht sein :mrgreen:

Mit meiner Einschätzung habe ich mich nicht auf den Teil der SMART Erkennung beschränkt. Einen C Quellcode in Delphi zu portieren ist keine Leistung und somit sollte da auch keine Probleme auftauchen und die gleichen Ergebnisse rauskommen. Ich habe mich vielmehr auf ein Gesamtbild der Unit bezogen, welche nunmal direkte Fehler enthält. Die Proceduren die diese Fehler enthalten werden von dir anscheinend nicht genutzt, somit treten sie nicht auf.

Und zu den unterschiedlichen Platten: Siehe oben bzw. den Rest des Threads zuvor.

himitsu 11. Jul 2006 11:22

Re: SMART-Werte lesen
 
also bei mir werden definitiv bei PhysicalDriveX auch die S-ATA-Platten mit aufgeführt.

Bei mir also derzeit:
PhysicalDrive0: S-ATA 0
PhysicalDrive1: S-ATA 1
PhysicalDrive2: IDE 0 - Master

Hab jetzt rein zufällig an jedem Port nur ein Gerät hängen
PS: bei CdromX werden auch noch die virtuellen CD-Laufwerke mit aufgeführt,
und bei mir ist demnach nicht "Bit 0 = Primary Master", sonder 3 = Primary Master
(ich kann heute abend ja mal an IDE 2 - Slave mal wieder das Wechellaufwerk klemmen ... aber ich bin mir da jetzt mal relativ sicher, daß dieses dann als PhysicalDrive3 und nicht PhysicalDrive5, wie nach deiner Zählung und unter Inbetrachtnahme, daß bei mir die S-ATAs zuerst aufgeführt werden.

Und wie gesagt, theoretisch hab ich Platz für bis zu 8 Festplatten und mit noch mehr IDE-Erweiterungskarten noch viel mehr ... irgendwo müssen diese dann doch auch noch mit aufgezählt werden, also mit 4 ist es da noch lange nicht getan?
(Es gibt ja auch schon lange Mainboards mit 2 IDE-Kontrolern, also 4 Anschlüssen a 8 Geräte ... die 4 kann man also nicht nur mit Erweiterungskarten "überlasten")


Also bin ich jetzt einfach mal davon ausgegangen, daß dort "alle" Festplatten von 0 aufwärts (so wie sie von Windows gefunden werden und nicht nach 'nem bestimmten Muster aufgezählt werden.


Und OK, ich bin ja och gerade erst noch beim Reinfützen in die Materie, aber so wie ich das sehe ist dort eindeutig nicht nur IDE drin.

Allerginst konnte ich bißher och noch keine eindeutigen Informationen zu diesen "Namen" finden.
Ich weiß bisher nur, das es für derartige Zugriffe PhysicalDriveX, CdromX und angeblich auch ScsiX geben soll (hab aber keine SCSI-Geräte und so'nen Bus erst recht nicht, also konnte es nicht testen).



Ich schau mir aber gern mal die genauen Fehlermeldungen an, also ob der sowas wie "Gerät nicht vorhanden", oder "ungültiger Name" ab PhysicalDrive4 von sich gibt.



Ach ja, das mit dem System neuverkabeln:
\\.\PhysicalDriveX und \\.\X: sind doch eh nicht das Selbe ... Ersteres sind Laufwerke und das andere Partitionen(auf Laufwerken), virtuelle Datenträger Speicherkarten, oder was man halt sonst noch damit verknüpft.

Aber \\.\X: isr nicht eindeutig ... \\?\Volume{GUID} hingegen schon ;)

Daniel G 11. Jul 2006 11:34

Re: SMART-Werte lesen
 
Zitat:

Zitat von himitsu
Aber \\.\X: isr nicht eindeutig ... \\?\Volume{GUID} hingegen schon ;)

Aber für unser Problem ist das doch eh irrelevant, oder?

Auch wenn deine S-ATA - Platten gelistet werden, S.M.A.R.T. - Werte dürftest du nicht bekommen.

@Topic: Ich hab' eben mal eine dritte Platte an den IDE2 - Port gehängt. (Ergo: 2 Platten an IDE1, eine Platte an IDE2).

Interessanterweise, wenn ich das Handle auf "PhysicalDrive0" oder "PhysicalDrive1" erstelle, läuft die Schleife zweimal durch. Erstelle ich es auf "PhysicalDrive2", läuft die Schleife einmal durch.

(Frühe) Schlussfolgerung:
Unter XP zeigt die Funktion, ob an dem IDE - Port, wo das Laufwerk hängt für das das Handle erzeugt wurde, sich noch ein weiteres Laufwerk befindet. Ist dies der Fall, muss für das andere IDE - Laufwerk ein weiteres Handle erzeugt werden, um an die Werte zu kommen. Ergo könnte man "PhysicalDriveX" auch einfach bis 3 hochzählen (mit Vorbehalt). Es käme auf dasselbe hinaus.

Wär' schön, wenn diese Behauptung irgendwer mit mehreren Festplatten (IDE) stützen könnte.

himitsu 11. Jul 2006 11:42

Re: SMART-Werte lesen
 
Ich werd's mal testen ... hab ja derzeit mehr S-ATA, als IDE dran.

Interessant wird es allerdings, wenn ich die Platten dann noch als RAID 1 zusammenschalte ... also über's BIOS und nicht per Windows ... bin schon gespannt was mir dann Windows dazu sagt :stupid:

Muetze1 11. Jul 2006 18:19

Re: SMART-Werte lesen
 
Moin!

Zitat:

Zitat von himitsu
also bei mir werden definitiv bei PhysicalDriveX auch die S-ATA-Platten mit aufgeführt.

Dann hast du deinen S-ATA Controller im P-ATA Modus aktiviert. Dieser belegt dann den primary und secondary Port für IDE Geräte und emuliert ein P-ATA Interface. Dein echter P-ATA Controller kommt dann danach auf dem 3. und 4. Portadresse.

Zitat:

Zitat von himitsu
Hab jetzt rein zufällig an jedem Port nur ein Gerät hängen

S-ATA kann nur ein Device pro Port. Wenn du also einen P-ATA Emulationsmodus bei deinem Controller an hast, dann wird immer nur ein Gerät am Master des IDE Ports gefunden, und zwar das angeschlossene Gerät.

Zitat:

Zitat von himitsu
und bei mir ist demnach nicht "Bit 0 = Primary Master", sonder 3 = Primary Master

Ich habe vorhin _nicht_ von den Nummern des \\.\PhysicalDriveX Identifiers gesprochen sondern von der bIDEDeviceMap der Struktur von DFP_GET_VERSION.
\\.\PhysicalDriveX zählt immer die gefundenen Hardwaregeräte in aufsteigenden Reihenfolge.

Zitat:

Zitat von himitsu
Also bin ich jetzt einfach mal davon ausgegangen, daß dort "alle" Festplatten von 0 aufwärts (so wie sie von Windows gefunden werden und nicht nach 'nem bestimmten Muster aufgezählt werden.

Die ersten 8 Geräte werden nacheinander gesucht und das in der Reihenfolge der IDE Ports, wenn entsprechend diese vorhanden sind und entsprechend auch mindestens ein Standardtreiber dafür installiert wurde.

Zitat:

Zitat von himitsu
Ich weiß bisher nur, das es für derartige Zugriffe PhysicalDriveX, CdromX und angeblich auch ScsiX geben soll (hab aber keine SCSI-Geräte und so'nen Bus erst recht nicht, also konnte es nicht testen).

Hä? Installier dir einen SCSI Sub Treiber z.B: den von Adaptec. Manche Brennerprogramme benötigen ein SCSI Interface und das SCSI Interface bietet auch Zugriff auf die gefundenen ATA/ATAPI Geräte. Du musst kein SCSI System besitzen.

/EDIT: also \\.\CdromX funktioniert bei mir nicht...

[edit=Christian Seehase]Quote-Tags korrigiert. Mfg, Christian Seehase[/edit] /EDIT: Sorry, nicht mehr kontrolliert...

himitsu 12. Jul 2006 11:45

Re: SMART-Werte lesen
 
Liste der Anhänge anzeigen (Anzahl: 2)
\\.\ScsiX hab ich auf irgend'ner Webseite mal gesehn ... und wie gesagt, k.A. ob's stimmt.
\\.\CdromX läuft bei mir aber ganz gut ^^ (siehe Anhang)

Das mit dem "S-ATA Controller im P-ATA Modus" ... hmmm, also ich hab da nichts gemacht, das läuft schon die ganze Zeit so? (GA-K8NSC-939 - BIOS Version F8)


Zitat:

Funktioniert der Code denn mit S-ATA Platten? Ich meine mal gelesen zu haben, dass das nicht geht.
Also, bei mir wird nur die S-ATA-Platte erkannt.
Die Andere (4K040H2 ... beides von Maxtor) kennt vermutlich kein SMART ... jedenfalls meint das BIOS? (kurz nach'm Start), dat S.M.A.R.T für dieses nicht aktiviert ist.

Code:
SMART interface opened...
DFP_GET_VERSION returned:
    bVersion       = 1
    bRevision      = 1
    fCapabilities  = 0x00000007
    bReserved      = 0x0
    bIDEDeviceMap  = 0x4
SMART enabled on drive: 2
     cbBytesReturned: 16
Drive 2 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: Maxtor 6V250F0                         
     Firmware rev: VA11163
     Serial number: V594J4NG          
   cbBytesReturned: 528
Data for Drive Number 2
Attribute Structure Revision         Threshold Structure Revision
             32                                      32
   -Attribute Name-      -Attribute Value-     -Threshold Value-
03 Spin Up Time                188                    63
04 Start/Stop Count            253                    0
05 Reallocated Sector Count    253                    63
07 Seek Error Rate             253                    0
08 Seek Time Performance       251                    187
09 Power On Hours Count        253                    0
0A Spin Retry Count            253                    157
0B Calibration Retry Count     253                    223
0C Power Cycle Count           253                    0
BD (Unknown attribute)         100                    0
BE (Unknown attribute)         72                    0
C0 (Unknown attribute)         253                    0
C1 (Unknown attribute)         253                    0
C2 (Unknown attribute)         47                    0
C3 (Unknown attribute)         253                    0
C4 (Unknown attribute)         253                    0
C5 (Unknown attribute)         253                    0
C6 (Unknown attribute)         253                    0
C7 (Unknown attribute)         199                    0
C8 (Unknown attribute)         253                    0
C9 (Unknown attribute)         253                    0
CA (Unknown attribute)         253                    0
CB (Unknown attribute)         253                    180
CC (Unknown attribute)         253                    0
CD (Unknown attribute)         253                    0
CF (Unknown attribute)         253                    0
D0 (Unknown attribute)         253                    0
D2 (Unknown attribute)         253                    0
D3 (Unknown attribute)         253                    0
D4 (Unknown attribute)         253                    0
PS: (hatte jetzt mal Zeit etwas in die Codes zu gucken)
Delphi-Quellcode:
If ( AHandle <> INVALID_HANDLE_VALUE ) Then
  CloseHandle(AHandle);
Dat IF könnte man sich eigentlich sparren, denn CloseHandle prüft intern selbst nochmal und bei INVALID_HANDLE_VALUE macht es einfach nüschts ^^


So, jetzt hatte ich mal ein bissl "aufgerüstet" ... leider nur mit alten Platten ... bin mal bis PhysicalDrive5 gekommen, dann sind mit die Kabel ausgegangen (OK, ich hatte keine Lust nochmal in den Keller zu geh ... 6 Etage ohne Fahrstuhl)
Also mit dem MAX_IDE_DRIVES kommt ihr da schonmal nicht hin.
PS: dieses HDD-Dinges geht von 0 bis 9 ... verwendet aber kein S.M.A.R.T, sondern nur IOCTL_DISK_GET_DRIVE_GEOMETRY und IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS.

Ich hatte ja nur 0 bis 255 genommen, weil das BIOS die "Laufwerke" ja über'n Byte verwaltet ... ich glaub ab $80 war'n die Festplatten, also sollte wohl 0..127 ausreichend sein ... ich will ja eigentlich nicht die SMART-Werte, sodern die Daten der Platten und davon kann es halt mehr geben, also nur 4.


Im Anhang mal noch'n paar Werte der Maxtor-Platte ... dort oben is ja eindeutig zuviel von (Unknown attribute) zu lesen ._.
Die Werte stammen aus der WMI (Windows Management Instrumentation).
(ich weiß zwar noch nicht, aber ich glaub ich komm besser, wenn ich mir mal WMI genauer anseh, dat scheint ja ganz gute Ergebnisse zu liefern und außerdem is dort nich bei 4 Schluß ._.)

Muetze1 12. Jul 2006 12:58

Re: SMART-Werte lesen
 
Zitat:

Zitat von himitsu
Das mit dem "S-ATA Controller im P-ATA Modus" ... hmmm, also ich hab da nichts gemacht, das läuft schon die ganze Zeit so? (GA-K8NSC-939 - BIOS Version F8)

Ka, musst in das BIOS schauen wie der Controller eingestellt ist.

Zitat:

Zitat von himitsu
Also mit dem MAX_IDE_DRIVES kommt ihr da schonmal nicht hin.

Wie oft denn noch: MAX_IDE_DRIVES gilt nur für das Handle welches du mit SMARTVSD oder PhysicalDriveX geholt hast. Du kannst doch PhysicalDriveX in Massen haben, aber pro zurück gelieferten Handle kannst du maximal 4 Geräte mit diesem Handle ansprechen.

Ich werde wohl auch nochmal eine kleine Bastelstunde hinlegen und das INQUIRY auch nochmal über das SPTI Interface von 2000/XP aufbauen.

himitsu 12. Jul 2006 13:08

Re: SMART-Werte lesen
 
Das mit MAX_IDE_DRIVES hab ich nun inzwischen verstanden (denk ich ma), aber wie soll es dann mögloch sein die S.M.A.R.T-Werte der IDE's abzufragen, denn diese liegen bei mir nunmal im Bereich von 2 bis 5.

Aber praktisch ist jetzt halt, daß zumindestens S.M.A.R.T auch bei meiner S-ATA-Platte vorhanden ist ^^

Und nein, hatte schonma geguckt und konnte nichts finden, wo man sowas einstellen kann -.-''
Aber sollte es dann nicht standardmäßig deaktiviert sein? (hatte nach dem BIOS-Update ja erstmal alles zurückgesetzt)

Muetze1 12. Jul 2006 13:15

Re: SMART-Werte lesen
 
Zitat:

Zitat von himitsu
Das mit MAX_IDE_DRIVES hab ich nun inzwischen verstanden (denk ich ma), aber wie soll es dann mögloch sein die S.M.A.R.T-Werte der IDE's abzufragen, denn diese liegen bei mir nunmal im Bereich von 2 bis 5.

Wieso? Die PhysicalDriveX kann doch bis sonstwo laufen :gruebel:

Zitat:

Zitat von himitsu
Und nein, hatte schonma geguckt und konnte nichts finden, wo man sowas einstellen kann -.-''
Aber sollte es dann nicht standardmäßig deaktiviert sein? (hatte nach dem BIOS-Update ja erstmal alles zurückgesetzt)

Vllt. ist es bei deinem Board Standard?

himitsu 12. Jul 2006 13:25

Re: SMART-Werte lesen
 
Zitat:

Zitat von Muetze1
Wieso? Die PhysicalDriveX kann doch bis sonstwo laufen :gruebel:

Ja, aber dieses SMART-Zeugs doch aber nicht?

Zitat:

Zitat von Muetze1
Vllt. ist es bei deinem Board Standard?

Na ja, Hauptsache ist doch, dat mein PC läuft :)
Und ich hab keine Ahnung ... wußte ja noch nichtmal, dat es sowas gibt :roll:

Muetze1 12. Jul 2006 13:34

Re: SMART-Werte lesen
 
Zitat:

Zitat von himitsu
Zitat:

Zitat von Muetze1
Wieso? Die PhysicalDriveX kann doch bis sonstwo laufen :gruebel:

Ja, aber dieses SMART-Zeugs doch aber nicht?

In wie fern? :gruebel:

himitsu 12. Jul 2006 13:43

Re: SMART-Werte lesen
 
ich denk das zählt nur von 0 bis 3?

Muetze1 12. Jul 2006 13:46

Re: SMART-Werte lesen
 
Zitat:

Zitat von himitsu
ich denk das zählt nur von 0 bis 3?

Ja und? Du hast doch genug Möglichkeiten:

Handle PhysicalDrive0
+-- Bit 0 (nicht) gesetzt
+-- Bit 1 (nicht) gesetzt
+-- Bit 2 (nicht) gesetzt
+-- Bit 3 (nicht) gesetzt

Handle PhysicalDrive1
+-- Bit 0 (nicht) gesetzt
+-- Bit 1 (nicht) gesetzt
+-- Bit 2 (nicht) gesetzt
+-- Bit 3 (nicht) gesetzt

Handle PhysicalDrive2
+-- Bit 0 (nicht) gesetzt
+-- Bit 1 (nicht) gesetzt
+-- Bit 2 (nicht) gesetzt
+-- Bit 3 (nicht) gesetzt

Handle PhysicalDrive3
+-- Bit 0 (nicht) gesetzt
+-- Bit 1 (nicht) gesetzt
+-- Bit 2 (nicht) gesetzt
+-- Bit 3 (nicht) gesetzt

Handle PhysicalDrive4
+-- Bit 0 (nicht) gesetzt
+-- Bit 1 (nicht) gesetzt
+-- Bit 2 (nicht) gesetzt
+-- Bit 3 (nicht) gesetzt

Handle PhysicalDrive5
+-- Bit 0 (nicht) gesetzt
+-- Bit 1 (nicht) gesetzt
+-- Bit 2 (nicht) gesetzt
+-- Bit 3 (nicht) gesetzt

etc, usw, ff, bla blubb

Ich weiss nicht, wie ich es sonst noch ausdrücken sollte. Die Beschränkung auf die 4 gilt nur für ein Handle, welches du über das CreateFile() auf \\.\PhysicalDriveX bekommen hast. Ich weiss nicht, wo hier das Problem liegt?

Daniel G 12. Jul 2006 13:51

Re: SMART-Werte lesen
 
Zitat:

Zitat von himitsu
ich denk das zählt nur von 0 bis 3?

Nein, imho ist diese alte Struktur dazu gedacht, mit dem Handle die einzelnen IDE Laufwerke ansprechen zu können, wenn das Handle unter 9x mithilfe der SmartVSD erstellt wurde. Unter NT musst du für jedes Laufwerk ein Handle erzeugen, siehe mein Versuch oben. Alles, was mit S - ATA direkt zu tun hat, funktioniert nur via SPTI...
Gleich bricht Thomas zusammen... :lol:

//Edit: Ok, den Beitrag vor mit habe ich nicht gesehen. :oops:

himitsu 12. Jul 2006 14:33

Re: SMART-Werte lesen
 
Ähhh .... ja ... OK ... dann ...

Dachte die Bits und das PhysicalDriveX gehört in dem Zusammenhang zusammen ... also bei beidem geht es nur von 0 bis 3.

Im Code (SmartApp) wird doch ach aus einer Variable für beide Angaben die "Zahl" erstellt.
Delphi-Quellcode:
Drive := 'PhysicalDrive' + IntToStr(i);
Smart.irgendwas := 1 shl i;
da kann man doch ma durcheinander kommen ._.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:05 Uhr.
Seite 1 von 2  1 2      

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