[C / C++] Lire informations disque dur

Lire informations disque dur [C / C++] - C - Programmation

Marsh Posté le 04-09-2012 à 18:35:10    

Bonjour,
 
Quelqu'un connaitrait-il le moyen de lire les informations relatives au disque dur comme le fait CrystalDiskInfo (nombre d'allumage, temps de fonctionnement, numéro de série etc) en C ou C++ ? Je suis sous Windows XP.
 
En fait je souhaite exécuter un programme à chaque allumage de mon PC. Le problème est que ce programme doit être lancé à chaque mise sous tension or lors d'une reprise de veille prolongée je dois relancer le programme manuellement.
 
Mon idée est donc de faire un programme qui vérifie toutes les minutes si le nombre d'allumages du disque dur a augmenté et qui dans ce cas là lance un .exe via une commande système.
 
Merci.

Reply

Marsh Posté le 04-09-2012 à 18:35:10   

Reply

Marsh Posté le 05-09-2012 à 14:06:45    

Le seul endroit ou j'ai trouvé du code pour accéder aux infos S.M.A.R.T. est ici: http://www.codeproject.com/Article [...] -S-M-A-R-T
Le code intéressant est dans le fichier SmartReader.cpp
A+,


Message édité par gilou le 05-09-2012 à 14:10:06

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-09-2012 à 16:29:13    

Merci beaucoup :)  
 
Je devrais pouvoir faire ce dont j'ai besoin avec ça :jap:

Reply

Marsh Posté le 05-09-2012 à 18:07:54    

Je ne sais pas pourquoi, mais quand tu décris ton besoin, j'ai l'impression que c'est une solution overkill et qu'il doit forcément y avoir une fonctionnalité du système pour t'aider à faire ca.


---------------
last.fm
Reply

Marsh Posté le 05-09-2012 à 21:20:59    

J'ai également cette impression.
En fait j'avais déjà créé un topic ici mais apparemment personne n'avait de solution.
J'ai donc pensé à cette approche qui peut sembler disproportionnée.

Reply

Marsh Posté le 06-09-2012 à 10:56:36    

Pitètre en powershell/vbs (mm xp :??:) utilisant le WMI
http://powershell.com/cs/forums/t/8595.aspx
http://msdn.microsoft.com/en-us/wi [...] 63395.aspx


Message édité par bjone le 06-09-2012 à 10:58:41
Reply

Marsh Posté le 06-09-2012 à 11:02:46    

Une approche plus simple, mais nécessitant aussi d'écrire un programme Windows:
 
- faire une appli windows qui fasse un appel à RegisterPowerSettingNotification pour demander à recevoir un message WM_POWERBROADCAST (cf aussi ceci)
- Si c'est pour Windows 8 seulement, il y a maintenant la fonction PowerRegisterSuspendResumeNotification
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 06-09-2012 à 11:40:28    

Sous windows 7, on devrait s'en sortir avec le planificateur de taches non? Je ne sais pas ce qu'il vaut sous XP par contre....


---------------
Seul Google le sait...
Reply

Marsh Posté le 08-09-2012 à 04:45:33    

Ça y est j'ai réussi !
 
Tout d'abord j'ai installé S.M.A.R.T. Monitoring Tools afin d'ajouter la commande smartctl qui permet d'afficher les informations S.M.A.R.T dans la console.
 
J'ai ensuite écrit un programme qui récupère le résultat de la commande dans un fichier. Il me suffit ensuite de vérifier à intervalle régulier si le nombre de mise sous tension (Power_Cycle_Count) a augmenté.
 
Voici le code pour ceux que ça intéresse :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <windows.h>
  5. int main()
  6. {
  7.     char buffer1[128], buffer2[128];
  8.     int i;
  9.     FILE *pPipe;
  10.     HWND hwnd = GetForegroundWindow();
  11.     ShowWindow(hwnd, SW_HIDE); //on cache la console
  12.     buffer1[0] = '\0';
  13.     while(1)
  14.     {
  15.         if( (pPipe = _popen("smartctl -A sda", "r" )) == NULL ) exit(1); //on récupère le résultat de la commande
  16.         for(i=0; i<17; i++) fgets(buffer2, 128, pPipe); //on récupère la ligne qui nous intéresse
  17.         if(strcmp(buffer1, buffer2) < 0) //l'ordinateur a été redémarré
  18.         {
  19.             strcpy(buffer1, buffer2);
  20.             system("C:/SetFSB/Tools/AutoToolOC_ON.exe" );
  21.         }
  22.         _pclose(pPipe);
  23.         Sleep(60000);
  24.     }
  25.     return 0;
  26. }


 
La reprise de veille et la reprise de veille prolongée sont parfaitement détectées. [:never let me down]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed