Autor Beitrag
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 02.06.17 09:36 
- Nachträglich durch die Entwickler-Ecke gelöscht -
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18730
Erhaltene Danke: 1630

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 02.06.17 22:37 
Bei mir funktioniert die Funktion korrekt. Du musst diese allerdings mit Adminrechten ausführen.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 02.06.17 23:45 
- Nachträglich durch die Entwickler-Ecke gelöscht -
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18730
Erhaltene Danke: 1630

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 03.06.17 07:33 
Hast du Delphi 10.1 benutzt? Ich Delphi 10.2, da sollte kein Unterschied liegen...
Und ich habe den Code 1:1 kopiert.

Hast du einmal mit Adminrechten debuggt? Bekommst du ein Handle von CreateFile?
t.roller
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 118
Erhaltene Danke: 34



BeitragVerfasst: Sa 03.06.17 09:34 
CrystalDiskInfo zeigt bei manchen USB-Drives S.M.A.R.T.-Werte an, bei manchen nicht.

Der Code vom TE scheint aber bei USB-Drives nie richtig zu funktionieren.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 03.06.17 11:58 
- Nachträglich durch die Entwickler-Ecke gelöscht -
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18730
Erhaltene Danke: 1630

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 03.06.17 14:03 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Habe es nun auch mit Delphi 10.1 getestet und es lief genauso erfolglos ab. Das Handle scheint gültig zu sein.
Was heißt scheint... Hast du das im Debugger geprüft und immer auch SysErrorMessage(GetLastError) in Strg + F7 ausgewertet?
Dann müsstest du doch ganz genau wissen was passiert... Ein Aufsplitten der Methoden brauchst du doch gar nicht.

Ich habe natürlich jetzt nur unter Windows 10 getestet, nicht unter alten Systemen.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 03.06.17 14:42 
- Nachträglich durch die Entwickler-Ecke gelöscht -
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18730
Erhaltene Danke: 1630

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 03.06.17 21:28 
Du kannst ja die Werte einmal im Debugger bzw. im API Monitor vergleichen...
DebugSmartCheck
DeviceIOControlCall
Einloggen, um Attachments anzusehen!
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 03.06.17 22:53 
- Nachträglich durch die Entwickler-Ecke gelöscht -
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18730
Erhaltene Danke: 1630

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 04.06.17 18:53 
Ich benutze nur Windows 10 64 Bit.

Leider habe ich keinen physischen PC mit einem anderen Betriebssystem mehr zur Verfügung aktuell... und in einer VM geht SMART nicht.

Die Befehlslänge ist falsch müsste ja eigentlich heißen, dass die Strukturgröße falsch ist. Ist die denn identisch zu mir (36 bzw. 20)?
t.roller
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 118
Erhaltene Danke: 34



BeitragVerfasst: So 04.06.17 21:50 
Hier ist eine Liste von smartmontools, die USB-Bridges und HDDs enthält.
www.smartmontools.or...upported_USB-Devices

Wenn smartmontools und CrystalDiskInfo nicht funktionieren, werden DELPHI-Programme auch nicht funktionieren.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18730
Erhaltene Danke: 1630

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 04.06.17 21:57 
user profile icont.roller hat folgendes geschrieben Zum zitierten Posting springen:
Wenn smartmontools und CrystalDiskInfo nicht funktionieren, werden DELPHI-Programme auch nicht funktionieren.
Das Problem ist ja offenbar, dass der Aufruf fehlschlägt. Dass es prinzipiell mit der Festplatte geht, hat er ja auch schon geschrieben:
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Die Anwendung CrystalDiskInfo sagt mir, dass die Laufwerke SMART unterstützen. :nixweiss:
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 04.06.17 23:30 
- Nachträglich durch die Entwickler-Ecke gelöscht -
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18730
Erhaltene Danke: 1630

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 05.06.17 05:23 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
cmdIn.bDriveNumber den Wert 176 zugwiesen bekommt
Du solltest den Inhalt des Records einmal mit 0 initialisieren. bDriveNumber wird zwar laut Doku ignoriert, aber vielleicht stören ja andere nicht initialisierte Werte...
Denn da stehen ja dann "zufällige" Werte drin.

Vielleicht so?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
//...
  if hnd <> INVALID_HANDLE_VALUE then
  begin
    ZeroMemory(@cmdIn, SizeOf(cmdIn));
    with cmdIn.irDriveRegs do
    begin
      bFeaturesReg := ENABLE_SMART;
      bSectorCountReg := 1;
      bSectorNumberReg := 1;
      bCylLowReg := SMART_CYL_LOW;
      bCylHighReg := SMART_CYL_HI;
      bDriveHeadReg := DRIVE_HEAD_REG;
      bCommandReg := SMART_CMD;

      ZeroMemory(@cmdOut, SizeOf(cmdOut));
      result := DeviceIoControl(hnd, SMART_SEND_DRIVE_COMMAND,
                                @cmdIn, SizeOf(cmdIn), @cmdOut, SizeOf(cmdOut),
                                bytesReturned, nil);
    end;
  end;
//...

// EDIT:
Und dann steht da in der Doku noch das...
msdn.microsoft.com/e...566206(v=vs.85).aspx hat folgendes geschrieben:
If SMART status is being requested, the output buffer must be >= (sizeof(SENDCMDOUTPARAMS) - 1 + sizeof(IDEREGS)).

Vielleicht funktioniert das erst ab Windows 10 auch ohne diesen Bufferteil...
Füge doch einfach mal diese IdeRegs noch in die OutParams ein:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  _SENDCMDOUTPARAMS = record
    cBufferSize: DWord;
    DriverStatus: TDriverStatus;
    bBuffer: array[0..0of Byte;
    irDriveRegs: TIdeRegs;
  end;
Übergebe ich als Größe der Out-Params aber zu wenig, bekomme ich den Fehler:
Zitat:
Der an einen Systemaufruf übergebene Datenbereich ist zu klein
Deshalb vermute ich nicht, dass es daran liegt.

// EDIT2:
Ich habe gerade gelesen, dass nicht alle Mainboards mit nForce Chipsatz diese SMART Kommandos unterstützen. Hast du zufällig so eins?

// EDIT3:
Bist du sicher, dass du für die Abfrage des SMART Status den richtigen Befehl benutzt? Ich verstehe deinen Befehl so, dass du SMART damit versuchst zu aktivieren...
Sollte nicht eher SMART_RCV_DRIVE_DATA dafür geeignet sein?
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
const
  SMART_SEND_DRIVE_COMMAND     = $0007C084;
  ENABLE_SMART                 = $000000D8;
  SMART_CYL_LOW                = $0000004F;
  SMART_CYL_HI                 = $000000C2;
  SMART_CMD                    = $000000B0;
  DRIVE_HEAD_REG               = $000000A0;
  READ_ATTRIBUTES              = $D0;
  READ_THRESHOLDS              = $D1;

function SmartExists(ADriveLetter: Char): Boolean;
var
  root: PChar;
  hnd: THandle;
  cmdIn: TSendCmdInParams;
  cmdOut: TSendCmdOutParams;
  bytesReturned: DWord;
begin
  result := false;
  root := PChar('\\.\' + UpCase(ADriveLetter) + ':');
  hnd := CreateFile(root, GENERIC_READ or GENERIC_WRITE,
                    FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
                    OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, 0);

  if hnd <> INVALID_HANDLE_VALUE then
  begin
    ZeroMemory(@cmdIn, SizeOf(cmdIn));
    cmdIn.cBufferSize := 512;
    with cmdIn.irDriveRegs do
    begin
      bFeaturesReg := READ_ATTRIBUTES;
      bCommandReg := SMART_CMD;
      bDriveHeadReg := DRIVE_HEAD_REG;

      ZeroMemory(@cmdOut, SizeOf(cmdOut));
      result := DeviceIoControl(hnd, SMART_RCV_DRIVE_DATA,
                                @cmdIn, SizeOf(cmdIn), @cmdOut, SizeOf(cmdOut),
                                bytesReturned, nil);
    end;
  end;
end;
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 05.06.17 06:41 
- Nachträglich durch die Entwickler-Ecke gelöscht -
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18730
Erhaltene Danke: 1630

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 05.06.17 07:34 
Mit SMART_RCV_DRIVE_DATA bekomme ich auch problemlos die einzelnen Werte für die Smart-Daten. Die stimmen auch mit CrystalDiskInfo überein.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 05.06.17 07:43 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 06.06.17 08:26 
- Nachträglich durch die Entwickler-Ecke gelöscht -


Zuletzt bearbeitet von Frühlingsrolle am Di 06.06.17 09:01, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18730
Erhaltene Danke: 1630

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 06.06.17 08:43 
Du hast wieder das ZeroMemory vergessen... ;-)