Remise à l'heure

XaThom Messages postés 5 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 2 novembre 2007 - 30 oct. 2007 à 09:39
XaThom Messages postés 5 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 2 novembre 2007 - 2 nov. 2007 à 07:41
bonjour,

Sous windows XP, je réalise une acquisition de données avec une carte au format  PCI, le logiciel est développé avec c++ Builder 6. Lorsque le processeur gere l'acquisition,  l'horloge windows n'est pas mise à jour, car tout les processus sont bloqués (ceci est dû à la dll que j'utilise et je dois faire avec).A la fin de l'acquisition, par quel processus forcer windows à aller lire l'horloge CMOS-RTC pour une remise à l'heure. En ce moment j'ai la possibilité de lire l'horloge CMOS par des fonctions In- Out assembleur  à l'adresse 0x70-0x71 en implantant giveio.sys. Cela fonctionne mais de temps à autre ma lecture est erronée, et parfois plante windows sur certaines machines.
Existe -t-il une api windows qui autorise le forcage de la lecture de la cmos-rtc, ou une autre méthode qui permet une remise à l'heure propre.
Merci
XaThom

8 réponses

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
31 oct. 2007 à 00:12
Essaye d'envoyer un WM_TIMECHANGE à toutes les fenêtres.
0
XaThom Messages postés 5 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 2 novembre 2007
31 oct. 2007 à 07:41
Bonjour,

Le problème dans un premier temps est de récupérer la bonne heure sauvegardée dans la cmos. Ensuite, effectivement, prévenir par un message à toute les fenetres que l'heure à changer.
Cordialement
XaThom
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
31 oct. 2007 à 13:00
Salut,
Tu peux essayer de faire ton propre pilote en Kernel-Mode. Ce pilote utilisera la fonction WRITE_PORT_UCHAR() exportée par hal.dll. Cette fontion te permettra de lire le contenu de la CMOS directement en utilisant les ports 0x70 et 0x71. Elle sera appelée suite à une commade passée en paramètre à DeviceIoControl() depuis ton application en User-Mode. Cette dernière récupère alors l'heure courante et met à jour le système grâce à SetSystemTime(). Cette mise à jour pourra aussi être effectuée au sein même du pilote.
Pour faire ton pilote, il te faudra le DDK téléchargeable gratuitement sur le site de Microsoft.
0
XaThom Messages postés 5 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 2 novembre 2007
31 oct. 2007 à 17:12
Rebonjour,

En fait j'arrive à lire la valeur par l'intermédiaire de "Giveio" et inp/outp, mais ne passant pas par le canal standard j'ai 2 problèmes:
Parfois je ne lis pas la bonne valeur: cela semble dire que la sélection interne faite par l'intermédiaire du registre accessible à l'adresse 0x70 a été modifié entre ma programmation et ma lecture effective. Mon programme a t-il été interrompu? et par qui?
Sur certaines machines (portable centrino duo) le système d'exploitation se plante. En fait ce que je voudrai c'est utiliser le canal standard du système d'exploitation pour aller lire l'heure et non pas passer par un canal non protégé par des possibles interruptions.
Je me demande si la solution que tu me proposes risques d'avoir le meme problème au niveau des interruptions.
Cordialement
XaThom
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
31 oct. 2007 à 20:47
Justement, avec ton propre pilote tu maitriseras mieux l'accès aux ports 0x70 et 0x71. En ce qui concerne les interruptions, tu peux les bloquer momentannément, juste le temps de lire le contenu CMOS, grâce à l'instruction assembleur CLI. L'instruction STI réactive les interruptions materielles. Tu peux aussi donner à ton pilote un IRQL (Interrupt ReQuest Level) maximal (DIRQL) pour interdire à tout autre processus d'interrompre le tien pendant son accès aux ports 0x70 et 0x71.
Je reviens à mon post précédent  pour ajouter que la fonction WRITE_PORT_UCHAR() sera suivie de READ_PORT_UCHAR() pour la lecture du port 0x71.
0
XaThom Messages postés 5 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 2 novembre 2007
1 nov. 2007 à 18:14
Bonsoir,

Je viens de rappatrier DDK. J'ai peur de devoir mettre en oeuvre un processus qui ve me prendre beaucoup de temps, alors que windows XP possede la méthode.
Savez vous ou je pourrai trouver une documentation simple sue DDK?
Merci
XaThom
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
2 nov. 2007 à 03:07
Le Kernel-mode est un monde à part. Il est donc normal que ça demande un peu de temps au début. Le développement en Kernel-Mode permet de résoudre plein de problèmes insolubles en User-Mode. En général, un petit pilote de quelques lignes de code permet d'accèder directement à une ressource matérielle, ou logicielle,  pour la mettre à la disposition d'une application en User-Mode.
Le DDK est accompagné d'une documentation et des exemples de code. Beaucoup de fonctions ne sont pas documentées car Microsoft se reserve le droit de modifier les prototypes des fonctions et des types de données uitilisées par le système dès qu'elle le juge nécessaire. Elle le fait souvent avec des correctifs, des services packs et les différentes versions de Windows. Pour compléter cette documentation, il existe des livres, certains électroniques, et des sites web comme:
http://www.osronline.com
Il existe aussi, en anglais,  des tutoriaux pour débuter:
http://www.codeproject.com/system/driverdev.asp
Il y'aura assez de nouvelles notions à assimiler mais au bout d'un certain temps tu seras capable de créer tes propres pilotes sur mesure et éviter les trucs, comme GiveIo, qui sont conçus pour fonctionner de manière générique donc inadaptés à des cas spécifiques.
Voilà. Bon courage.
0
XaThom Messages postés 5 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 2 novembre 2007
2 nov. 2007 à 07:41
Et bien maintenant on va essayer de s'y mettre.
Meric
0
Rejoignez-nous