Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
|
protocoles:smart:smart_rcv_drive_data [30/03/2020 17:48] thierry [Features] |
protocoles:smart:smart_rcv_drive_data [30/03/2020 18:58] (Version actuelle) thierry [Sources] |
||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | ====== SMART_RCV_DRIVE_DATA ====== | + | ====== SMART_RCV_DRIVE_DATA & SMART_SEND_DRIVE_COMMAND ====== |
| <note>Ce qui se trouve sur cette page n'engage que moi, n'ayant trouvé de documentation précise ce contenu découle directement de mes expériences, c'est donc peut etre totalement faux.\\ | <note>Ce qui se trouve sur cette page n'engage que moi, n'ayant trouvé de documentation précise ce contenu découle directement de mes expériences, c'est donc peut etre totalement faux.\\ | ||
| Je compte sur vous pour améliorer la qualité des informations contenue sur cette page...</note> | Je compte sur vous pour améliorer la qualité des informations contenue sur cette page...</note> | ||
| ===== DeviceIOControl ===== | ===== DeviceIOControl ===== | ||
| - | SMART_RCV_DRIVE_DATA est un code de controle (''dwIoControlCode'') utilisé dans l'appel a l'API [[https://docs.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-deviceiocontrol|DeviceIoControl]] | + | ''SMART_RCV_DRIVE_DATA'' et ''SMART_SEND_DRIVE_COMMAND'' sont des un codes de contrôle (''dwIoControlCode'') utilisé dans l'appel a l'API [[https://docs.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-deviceiocontrol|DeviceIoControl]] |
| ==== Déclaration ==== | ==== Déclaration ==== | ||
| <code c++> | <code c++> | ||
| Ligne 27: | Ligne 27: | ||
| ... | ... | ||
| DeviceIoControl(AHandle, SMART_RCV_DRIVE_DATA, @vSCIP, sizeof(TSendCmdInParams), @vSCOP, sizeof(TSendCmdOutParams)+BufferSize, vOutSize, nil); | DeviceIoControl(AHandle, SMART_RCV_DRIVE_DATA, @vSCIP, sizeof(TSendCmdInParams), @vSCOP, sizeof(TSendCmdOutParams)+BufferSize, vOutSize, nil); | ||
| + | // Ou... | ||
| + | DeviceIoControl(AHandle, SMART_SEND_DRIVE_COMMAND, @vSCIP, sizeof(TSendCmdInParams), @vSCOP, sizeof(TSendCmdOutParams), vOutSize, nil); | ||
| + | |||
| </code> | </code> | ||
| ==== Structures ==== | ==== Structures ==== | ||
| Ligne 76: | Ligne 79: | ||
| ===== Features ===== | ===== Features ===== | ||
| + | ^ SMART_RCV_DRIVE_DATA ^^^^^^ | ||
| ^IDEREGS Features ^ Rôle ^ SENDCMDINPARAMS BufferSize ^ IDEREGS SectorCount ^ IDEREGS SectorNumber ^ IDEREGS CylLow ^ IDEREGS CylHigh ^ | ^IDEREGS Features ^ Rôle ^ SENDCMDINPARAMS BufferSize ^ IDEREGS SectorCount ^ IDEREGS SectorNumber ^ IDEREGS CylLow ^ IDEREGS CylHigh ^ | ||
| | [[#READ_ATTRIBUTES]] $D0 |Récupérer les attributs SMART | ''READ_ATTRIBUTE_BUFFER_SIZE'' (512) | 1 |1 |''SMART_CYL_LOW'' ($4F) |''SMART_CYL_HI'' ($C2) | | | [[#READ_ATTRIBUTES]] $D0 |Récupérer les attributs SMART | ''READ_ATTRIBUTE_BUFFER_SIZE'' (512) | 1 |1 |''SMART_CYL_LOW'' ($4F) |''SMART_CYL_HI'' ($C2) | | ||
| Ligne 84: | Ligne 88: | ||
| |[[#SMART_READ_LOG]] $D5 |Récupère les Logs. | | | | | | | | |[[#SMART_READ_LOG]] $D5 |Récupère les Logs. | | | | | | | | ||
| |[[#SMART_WRITE_LOG]] $D6 |Écrit le nombre indiqué de secteurs de données de 512 octets dans les logs | | | | | | | | |[[#SMART_WRITE_LOG]] $D6 |Écrit le nombre indiqué de secteurs de données de 512 octets dans les logs | | | | | | | | ||
| - | |[[#ENABLE_SMART]] $D8 |Active SMART | | | | | | | ||
| - | |[[#DISABLE_SMART]] $D9 |Désactive SMART | | | | | | | ||
| |[[#RETURN_SMART_STATUS]] $DA |Récupère l'état de fiabilité de l'appareil.| | | | | | | | |[[#RETURN_SMART_STATUS]] $DA |Récupère l'état de fiabilité de l'appareil.| | | | | | | | ||
| |[[#ENABLE_DISABLE_AUTO_OFFLINE]] $DB |Active ou Désactive le mode hors ligne | | | | | | | | |[[#ENABLE_DISABLE_AUTO_OFFLINE]] $DB |Active ou Désactive le mode hors ligne | | | | | | | | ||
| + | ^ SMART_SEND_DRIVE_COMMAND ^^^^^^ | ||
| + | ^IDEREGS Features ^ Rôle ^ SENDCMDINPARAMS BufferSize ^ IDEREGS SectorCount ^ IDEREGS SectorNumber ^ IDEREGS CylLow ^ IDEREGS CylHigh ^ | ||
| + | |[[#ENABLE_SMART]] $D8 |Active SMART| 0 | 1 |1 |''SMART_CYL_LOW'' ($4F) |''SMART_CYL_HI'' ($C2) | | ||
| + | |[[#DISABLE_SMART]] $D9 |Désactive SMART | | | | | | | ||
| + | |||
| ==== Types communs pour les Features ==== | ==== Types communs pour les Features ==== | ||
| + | === TicSendCmdOutParams === | ||
| + | Le type ''TicSendCmdOutParams'' est une variante du type ''TSendCmdOutParams'' présent dans l'unité ''jwaWinIoCtl.pas'' (Ici on parle [[prog:lazarus:lazarus|Pascal et Lazarus]] plus précisément) | ||
| + | auquel j'ai enlevé le dernier membre (''bBuffer: array [0..0] of BYTE'') pour qu'il puisse être inclus dans un type TSCOP_XXXXXXX.\\ | ||
| + | Bon, je ne sais pas si c'est une bonne idée, mais c'est la mienne a l'instant T.\\ | ||
| + | Et ça fonctionne en plus ! | ||
| <code delphi> | <code delphi> | ||
| TTicSendCmdOutParams = packed record | TTicSendCmdOutParams = packed record | ||
| Ligne 102: | Ligne 114: | ||
| <code delphi> | <code delphi> | ||
| TSCOP_SmartAttrs = packed record | TSCOP_SmartAttrs = packed record | ||
| - | SCOP: TTicSendCmdOutParams; | + | SCOP: TTicSendCmdOutParams; (voir ci-dessus) |
| A, B: byte; // ??? | A, B: byte; // ??? | ||
| Results: TSmartAttrs; //array[0..29] of TSmartAttr; | Results: TSmartAttrs; //array[0..29] of TSmartAttr; | ||
| Ligne 110: | Ligne 122: | ||
| Avec les types suivants | Avec les types suivants | ||
| <code delphi> | <code delphi> | ||
| - | TTicSendCmdOutParams = packed record | ||
| - | cBufferSize: DWORD; // Size of bBuffer in bytes | ||
| - | DriverStatus: TDriverStatus; // Driver status structure. | ||
| - | end; | ||
| - | |||
| TSmartAttr = packed record | TSmartAttr = packed record | ||
| ID: byte; | ID: byte; | ||
| Ligne 125: | Ligne 132: | ||
| TSmartAttrs = array[0..29] of TSmartAttr; // max of 30 attributes | TSmartAttrs = array[0..29] of TSmartAttr; // max of 30 attributes | ||
| </code> | </code> | ||
| - | === Les Attributs === | + | === Les Membre d'un Attribut === |
| D’après ce que je constate il peut y avoir au maximum 30 attributs | D’après ce que je constate il peut y avoir au maximum 30 attributs | ||
| == ID == | == ID == | ||
| Ligne 164: | Ligne 171: | ||
| TSmartThresholds = array[0..C_SMART_MAX_ATTRS] of TSmartThreshold; //12x30 = 360 oct | TSmartThresholds = array[0..C_SMART_MAX_ATTRS] of TSmartThreshold; //12x30 = 360 oct | ||
| </code> | </code> | ||
| + | === Les Membres de Threshold === | ||
| + | 30 max comme le nombre d'attributs | ||
| + | == ID == | ||
| + | ID de l'attribut auquel correspond ce Threshold | ||
| + | == Threshold == | ||
| + | Valeur sur 1 octet, seuil indiquant quand un disque est sur le point de tomber en panne. | ||
| + | === Interpretation du Threshold === | ||
| + | Pour l'instant, je ne sais pas trop. | ||
| + | |||
| + | Dés que j'ai plus d'infos je les mettrai ici ! | ||
| + | |||
| + | |||
| ==== ENABLE_DISABLE_AUTOSAVE ==== | ==== ENABLE_DISABLE_AUTOSAVE ==== | ||
| ==== SAVE_ATTRIBUTE_VALUES ==== | ==== SAVE_ATTRIBUTE_VALUES ==== | ||
| Ligne 169: | Ligne 188: | ||
| ==== SMART_READ_LOG ==== | ==== SMART_READ_LOG ==== | ||
| ==== SMART_WRITE_LOG ==== | ==== SMART_WRITE_LOG ==== | ||
| - | ==== ENABLE_SMART ==== | + | ==== ENABLE_SMART ==== |
| + | On peut estimer que si la commande DeviceIOControl renvoi ''True'' alors le SMART est activé. | ||
| ==== DISABLE_SMART ==== | ==== DISABLE_SMART ==== | ||
| ==== RETURN_SMART_STATUS ==== | ==== RETURN_SMART_STATUS ==== | ||
| Ligne 176: | Ligne 196: | ||
| * [[https://docs.microsoft.com/en-us/previous-versions/windows/hardware/drivers/ff566204(v%3Dvs.85)]] | * [[https://docs.microsoft.com/en-us/previous-versions/windows/hardware/drivers/ff566204(v%3Dvs.85)]] | ||
| * [[https://docs.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-deviceiocontrol]] | * [[https://docs.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-deviceiocontrol]] | ||
| + | * [[https://alexandre-laurent.developpez.com/articles/hardware-disque-smart/]] | ||