Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Festplatten-Standby und Status auslesen (https://www.delphipraxis.net/117189-festplatten-standby-und-status-auslesen.html)

c.wuensch 13. Jul 2008 22:16


Festplatten-Standby und Status auslesen
 
Hi an alle,

ich habe mir in den Kopf gesetzt, ein Programm zu realisieren, das eine angeschlossene Festplatte in den Standby-Modus versetzen kann. Außerdem soll es den aktuellen Power-Status aller Platten (aktiv / gestoppt) anzeigen können.

Ich habe mich bereits intensiv mit der Thematik beschäftigt, und jede Menge vielversprechende Ansätze gefunden. Nur komm ich mit der Programmierung nicht zurecht. Wär super, wenn mir da jemand ein bisschen helfen könnte :hi:

Also, was hab ich schon:

1.) Man muss wohl unterscheiden zwischen IDE-Platten und anderen (z.B. über S-ATA oder USB angeschlossenen) Platten. (Bei letzteren unterstützt der Controller wohl immer ein SCSI-Interface).
Für beide Arten gibt es je ein portiertes Linux-Tool (hdparm für IDE und sg_start für SCSI), welches die jeweilige Platte in Standby schickt. Es ist also zumindest möglich.

2.) Zur Not könnte ich diese Tools also aus meinem Delphi-Programm heraus aufrufen, um den Effekt zu erreichen, aber eine selbst programmierte Lösung wäre mir lieber...
Außerdem fehlt auf jeden Fall noch eine Möglichkeit, den Power-Status bei einer SCSI-Platte auszulesen (das kann sg_start nämlich nicht).

3.) Ich vermute, dass für solche Aktionen die API-Funktion DeviceIoControl nützlich sein dürfte. Und hierbei speziell zum Beispiel IOCTL_SCSI_PASS_THROUGH. Kann mir einer sagen, wie man die anwendet?
Interessant wäre da v.a. der SCSI-Befehl Start / Stop Unit

4.) Gibt es vielleicht irgendwelche SCSI-Befehle, die den Power-Status einer Platte auslesen können?

5.) Es gibt für DeviceIoControl auch die Konstante IOCTL_ATA_PASS_THROUGH. Vielleicht lässt sich darüber auch was für IDE-Platten machen? Und kennt jemand die entsprechenden ATA-Befehle?

6.) Hier gab es noch einen interessanten Tipp, der vorschlägt, DeviceIoControl mit dem Parameter SetFeature aufzurufen. Darüber finde ich jedoch keinerlei Dokumentation...


So... Kann mir denn irgendjemand aus den vorhandenen Ansätzen Tipps geben, wie ich weiter vorgehen könnte? Bin echt für jede Hilfe dankbar!!!

hathor 13. Jul 2008 23:05

Re: Festplatten-Standby und Status auslesen
 
http://www.delphi-forum.de/viewtopic.php?t=75438

c.wuensch 13. Jul 2008 23:28

Re: Festplatten-Standby und Status auslesen
 
Das ist ja spitze! Danke schonmal! :thumb:
Funktioniert das denn jetzt auch für SCSI-/SATA-/USB-Platten?
Und hast du zufällig auch noch ne Lösung für das Auslesen des Power-Status?

hathor 14. Jul 2008 07:52

Re: Festplatten-Standby und Status auslesen
 
Zitat:

Zitat von c.wuensch
Das ist ja spitze! Danke schonmal! :thumb:
Funktioniert das denn jetzt auch für SCSI-/SATA-/USB-Platten?
Und hast du zufällig auch noch ne Lösung für das Auslesen des Power-Status?

SCSI: nicht getestet
SATA: ja.
USB: hängt ab vom USB-Chip - es gibt welche, die SMART-Befehle weiterleiten

Power Status:
Vielleicht findest Du hier etwas:
http://www.google.com/codesearch?hl=...ate&sbtn=Suche

ftp://ftp.sac.sk/pub/sac/utildisk/hddspd21.zip

c.wuensch 14. Jul 2008 11:06

Re: Festplatten-Standby und Status auslesen
 
HDDSpeed kann es leider nicht! (Wäre auch zu schön gewesen...)
Bei deinem Google-Link hab ich leider auch nichts Passendes gefunden.

Aber in deinem Code gibt es in der Struktur TIdSector den Eintrag wInitialPowerMode.
Vielleicht kann man aus dem (oder einem anderen) die Information auslesen?

Gibt es denn eine Doku dafür, oder kannst du mir das etwas erklären (du scheinst dich damit ja super auszukennen...)

c.wuensch 14. Jul 2008 14:40

Re: Festplatten-Standby und Status auslesen
 
Der Code funktioniert leider nicht bei SATA-Platten, und solchen die über eine UDMA-Controller-Karte angeschlossen sind.

Hierbei könnte aber ein SCSI-Passthrough mit dem hier erläuterten CDB helfen. Kann mir vielleicht jemand sagen, wie ich das programmieren könnte?

-------------

Außerdem habe ich mir gerade ein wenig den Quellcode zu hdparm angesehen (zu finden hier).

Die Funktion zum Auslesen des Status sieht da so aus (bin nicht sicher, ob das alles ist):
Code:
   if (get_powermode) {
      __u8 args[4] = {ATA_OP_CHECKPOWERMODE1,0,0,0};
      const char *state;
      if (do_drive_cmd(fd, args)
       && (args[0] = ATA_OP_CHECKPOWERMODE2) /* (single =) try again with 0x98 */
       && do_drive_cmd(fd, args)) {
         err = errno;
         state = "unknown";
      } else {
         state = (args[2] == 255) ? "active/idle" : "standby";
      }
      printf(" drive state is: %s\n", state);
   }
Kann damit jemand etwas anfangen? Bzw. könnte man das in Delphi so ähnlich machen?

Freue mich wie immer über jede Antwort!

c.wuensch 14. Jul 2008 20:56

Re: Festplatten-Standby und Status auslesen
 
Ich werde mal 2 getrennte Fragen daraus machen, damit der Titel besser zum Inhalt passt.

Vielen Dank schonmal für die Hilfe!


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 Uhr.

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