Autor |
Beitrag |
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 02.06.17 10:36
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 02.06.17 23:37
Bei mir funktioniert die Funktion korrekt. Du musst diese allerdings mit Adminrechten ausführen.
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 03.06.17 00:45
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 03.06.17 08: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
Beiträge: 118
Erhaltene Danke: 34
|
Verfasst: Sa 03.06.17 10: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
|
Verfasst: Sa 03.06.17 12:58
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 03.06.17 15:03
Frühlingsrolle hat folgendes geschrieben : | 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
|
Verfasst: Sa 03.06.17 15:42
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 03.06.17 22:28
Du kannst ja die Werte einmal im Debugger bzw. im API Monitor vergleichen...
Einloggen, um Attachments anzusehen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 03.06.17 23:53
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 04.06.17 19: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
Beiträge: 118
Erhaltene Danke: 34
|
Verfasst: So 04.06.17 22: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
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 04.06.17 22:57
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 05.06.17 00:30
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 05.06.17 06:23
Frühlingsrolle hat folgendes geschrieben : | 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? 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...
Vielleicht funktioniert das erst ab Windows 10 auch ohne diesen Bufferteil...
Füge doch einfach mal diese IdeRegs noch in die OutParams ein: Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| _SENDCMDOUTPARAMS = record cBufferSize: DWord; DriverStatus: TDriverStatus; bBuffer: array[0..0] of 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?
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
|
Verfasst: Mo 05.06.17 07:41
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 05.06.17 08: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
|
Verfasst: Mo 05.06.17 08:43
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 06.06.17 09:26
- Nachträglich durch die Entwickler-Ecke gelöscht -
Zuletzt bearbeitet von Frühlingsrolle am Di 06.06.17 10:01, insgesamt 1-mal bearbeitet
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 06.06.17 09:43
Du hast wieder das ZeroMemory vergessen...
|
|