Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

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 16:29]
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)  |
-|[[#​READ_THRESHOLDS]] $D1 |Récupérer les valeurs de seuil qui indiquent quand un disque est sur le point de tomber en panne.| | | | | | +|[[#​READ_THRESHOLDS]] $D1 |Récupérer les valeurs de seuil qui indiquent quand un disque est sur le point de tomber en panne.|''​READ_THRESHOLD_BUFFER_SIZE''​ (512) |||''​SMART_CYL_LOW''​ ($4F) |''​SMART_CYL_HI''​ ($C2)  ​|
 |[[#​ENABLE_DISABLE_AUTOSAVE]] $D2 |Active l'​attribut optionnel autosave du périphérique lorsqu'​il est défini à 1. Désactive cette fonction lorsqu'​elle est définie à 0... | | | | | | |  |[[#​ENABLE_DISABLE_AUTOSAVE]] $D2 |Active l'​attribut optionnel autosave du périphérique lorsqu'​il est défini à 1. Désactive cette fonction lorsqu'​elle est définie à 0... | | | | | | |
 |[[#​SAVE_ATTRIBUTE_VALUES]] $D3 |Demande à l'​appareil de sauvegarder ses valeurs d'​attribut dans la mémoire non volatile de l'​appareil.|| | | | | | |  |[[#​SAVE_ATTRIBUTE_VALUES]] $D3 |Demande à l'​appareil de sauvegarder ses valeurs d'​attribut dans la mémoire non volatile de l'​appareil.|| | | | | | |
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 ====
 +=== 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>
 +   ​TTicSendCmdOutParams = packed record
 +      cBufferSize: ​ DWORD; ​           // Size of bBuffer in bytes
 +      DriverStatus:​ TDriverStatus; ​   // Driver status structure.
 +   end;
 +</​code>​
 +
 ==== READ_ATTRIBUTES ==== ==== READ_ATTRIBUTES ====
 le [[#​SENDCMDOUTPARAMS|SCOP (SendCmdOutParams)]] est suivi de deux Byte A et B dont je ne connais pas l'​utilité.\\ le [[#​SENDCMDOUTPARAMS|SCOP (SendCmdOutParams)]] est suivi de deux Byte A et B dont je ne connais pas l'​utilité.\\
Ligne 94: 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 102: 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 117: 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 131: Ligne 146:
  
 ==== READ_THRESHOLDS ====  ==== READ_THRESHOLDS ====
 +le [[#​SENDCMDOUTPARAMS|SCOP (SendCmdOutParams)]]\\
 +suivi d'un Word (2oct) indiquant la numéro de révision.\\
 +Puis un tableau de 30 Thresholds SMART (''​TSmartThresholds''​)\\
 +Et de quelques byte, ici pour combler l'​espace.
 +<code delphi>
 +   ​TSCOP_SmartThresholds = packed record
 +      SCOP : TTicSendCmdOutParams;​
 +      RevNumber : word; // 2 oct
 +      Results : TSmartThresholds;​ // 360 oct
 +      Reserved : array[0..148] of byte; // 149 oct
 +      Chksum: byte; // 1 oct
 +      // total 512 = READ_THRESHOLD_BUFFER_SIZE
 +   end;
 +</​code>​
 +Avec les types suivants
 +<code delphi>
 +   ​TSmartThreshold = packed record
 +      ID: byte; //1 oct
 +      Threshold : byte; //1 oct
 +      Reserved : array[0..9] of byte; //10 oct
 +      // Total = 12 oct
 +   end;
 +
 +   ​TSmartThresholds = array[0..C_SMART_MAX_ATTRS] of TSmartThreshold;​ //12x30 = 360 oct
 +</​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 136: 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 143: 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/​]]