Arrêt ou redémarrage rapide de Windows (95/98 ou NT)

La procédure d'arrêt ou de redémarrage de Windows est un peu fastidieuse (et longue) :
Menu "Démarrer", item "Arrêter", puis choix dans la boite de dialogue "Arrêt de Windows",...
On peut accélérer ce processus en lançant une application particulière pour laquelel on aura créé un raccourci. Plusieurs méthodes existent :

1) Méthode Windows (de base)

Exemple : c:\windows\rundll  user.exe,ExitWindows
hand_right.gif (969 octets)il ne doit y avoir AUCUN espace de part et d'autre de la virgule.
Mais cette astuce ne fonctionne pas toujours, et rundll, qui semble plus conciliant, n'existe pas sous Windows NT.De plus, elle se limite à arrêter Windows, or on peut vouloir redémarrer complètement le PC, ou simplement fermer la session en cours.

2) Méthode JCB (1ère version : EXIT.DLL)

C'est pourquoi j'ai conçu une autre librairie 32 bits, nommée exit.dll, qui fonctionne aussi bien sous Windows 9x que Windows NT, et qui admet des paramètres, permettant de choisir le mode d'arrêt ou de redémarrage. Par ailleurs, sa taille est inférieure à 30 ko.
Elle peut être placée dans n'importe quel répertoire (p.ex. c:\util), et est également lancée à l'aide de rundll32. Elle se compose d'une seule fonction nommée exitwin.
La syntaxe de la commande (à placer dans un raccourci, un fichier batch, un programme) est la suivante :

rundll32.exe <répertoire_de_exit.dll>\exit.dll,exitwin <liste de paramètres>

avec :

<répertoire_de_exit.dll> par exemple c:\util
<liste de paramètres> Si cette liste est vide, il y a affichage d'une boite de dialogue rappelant les paramètres disponibles :
exit.jpg (18094 octets)
Si la liste n'est pas vide, les paramètres doivent être séparés les uns des autres par un ou plusieurs espaces :
par exemple : Reboot force ?
ou encore   : P

 

 

  • L'ordre des paramètres n'a pas d'importance
  • La présence du caractère ? entrainera l'affichage d'une boite de dialogue de confirmation :confirm.jpg (7081 octets)

Exemple récapitulatif :

c:\windows\rundll32.exe c:\util\exit.dll,exitwin reboot F

hand_right.gif (969 octets)Le PC redémarrera sans confirmation, avec fermeture éventuelle de toutes les applications, même celles qui ne répondent plus au système.

Cliquez ici pour télécharger (gratuitement) exit.dll ("zippé" en exit.zip)

3) Méthode JCB (2ème version : WINEXIT.EXE)

L'utilisation de rundll me plaisant modérément, surtout en raison de sa syntaxe peu pratique, j'ai conçu WINEXIT.EXE, un exécutable autonome, ayant des fonctionnalités identiques à EXIT.DLL. (j'ai changé le nom pour éviter des confusions de modules binaires)
C'est une application Windows en interface graphique. Au départ, je l'avais conçue en mode console, mais j'ai découvert que l'utilisation de la fonction ExitWindowsEx est INTERDITE sous Windows 9x en mode console (NT4 et Windows 2000 l'acceptent sans problème).

Le lancement de Winexit sans aucun paramètre affiche la fenêtre d'aide
Les paramètres sont les mêmes que pour exitwin.dll (logoff, poweroff, shutdown, force, reboot, ?)
La syntaxe de la commande (à placer dans un raccourci, un fichier batch, un programme) est la suivante :

winexit.exe <liste de paramètres>

Exemple récapitulatif :

d:\outils\winexit.exe reboot F

hand_right.gif (969 octets)Le PC redémarrera sans confirmation, avec fermeture éventuelle de toutes les applications, même celles qui ne répondent plus au système.

Cliquez ici pour télécharger (gratuitement) winexit.exe ("zippé" en winexit.zip)

La défragmentation des disques

Sur un disque, en plus de la création de fichiers (ajouts) on est généralement amené à supprimer, modifier, agrandir un ou plusieurs fichiers. Donc quand on veut écrire quelque chose sur un disque, à moins qu'il soit vierge ou que l'on n'ait JAMAIS effectué de suppressions de fichiers, on va copier les informations là où il y a de l'espace libre. Et comme cet espace peut provenir d'anciens fichiers supprimés, lesquels, à moins d'un très grand hasard, n'ont pas la même taille que le nouveau fichier, ce dernier va être en plusieurs morceaux.

Suivant les systèmes d'exploitation et les systèmes de fichiers, la défragmentation peut être opérée soit en continu (UNIX), soit ponctuellement (à la demande : DOS, Windows).

Et comme un bon dessin vaut mieux qu'un mauvais discours, je vais prendre un exemple :

Soit un disque vierge au départ, dans lequel :

On écrit 2 fichiers, A et B, de 1 ko chacun (pour faire simple)

<--------------------Le disque------------------>
AAAAAAAA BBBBBBBB ................................
1k 1k  

Puis on ajoute un fichier C, de 2 ko  
AAAAAAAA BBBBBBBB CCCCCCCCCCCCCCCC ................
1k 1k 2k  


On veut ensuite modifier A, et le passer à 1.5ko 
Or on voit qu'il n'y a pas assez de place, là où est A
2 possibilités : 
1) Déplacer TOUS les fichiers B, C derrière A, de 0.5 ko "vers la droite" 
AAAAAAAAAAAA BBBBBBBB CCCCCCCCCCCCCCCC ............
1.5k 1k 2k  
Opération TRÈS coûteuse en temps CPU et déplacement des têtes 
=> Inutilisée par la plupart des systèmes de fichiers.

2) Copier le "restant" du fichier derrière tous les autres, là où c'est libre : 
AAAAAAAA BBBBBBBB CCCCCCCCCCCCCCCC AAAA ...........
1k 1k 2k .5  

Opération devenue très classique, retenue par presque tous les systèmes de fichiers, en particulier les FAT. par contre : 

Et la fragmentation va se poursuivre : 

On supprime le fichier B 
AAAAAAAA ........ CCCCCCCCCCCCCCCC AAAA ............
1k 1k 2k .5  

On crée un fichier D de 2 ko 
Le système ne va pas le copier à la fin directement, il va commencer par regarder s'il n'y a pas de la place libre avant. C'est justement le cas ici, mais c'est insuffisant. On va obtenir ceci :
AAAAAAAA DDDDDDDD CCCCCCCCCCCCCCCC AAAA DDDDDDDD ....
1k 1k 2k .5 1k  

On ramène la taille de C à 0.5ko 
AAAAAAAA DDDDDDDD CCCC ............ AAAA DDDDDDDD ....
1k 1k .5 1.5k .5 1k  

On passe la taille de A à 2.5 ko
AAAAAAAA DDDDDDDD CCCC AAAAAAAA .... AAAA DDDDDDDD ....
1k 1k .5 1k .5 .5 1k  

On devine facilement la complexité de l'ensemble !!! 
De plus, si on prend le cas du fichier A, on se rend compte qu'il est en 3 zones, le début est au début du disque, puis la suite vers la fin du disque, et la fin du fichier est au milieu du disque, soit un désordre total!

Le défragmenteur va (p.ex.) commencer par supprimer tous les trous, en les déplaçant et les fusionnant à la fin du disque

AAAAAAAA DDDDDDDD CCCC AAAAAAAAAAAA DDDDDDDD ........
1k 1k .5 1.5k 1k  

Ensuite, il va prendre les fichiers un par un, voir s'ils sont en plusieurs morceaux, et si oui essayer de les réorganiser : 

  1. Calcul de la taille totale 
  2. Recherche d'une zone libre en un seul bloc de cette taille 
  3. Si elle existe, on déplace le fichier dans cette zone 
  4. Si elle n'existe pas, on déplace un ou plusieurs blocs suivants., 
  5. Et ainsi de suite 

Exemple : 

AAAAAAAA ........ CCCC AAAAAAAAAAAA DDDDDDDDDDDDDDDD ....
1k 1k .5 1.5k 2k .5
AAAAAAAA ............ AAAAAAAAAAAA DDDDDDDDDDDDDDDD CCCC
1k 1.5k 1.5k 2k .5
AAAAAAAAAAAAAAAAAAAA ............ DDDDDDDDDDDDDDDD CCCC
2.5k 1.5k 2k .5
AAAAAAAAAAAAAAAAAAAA DDDDDDDDDDDD ............ DDDD CCCC
2.5k 1.5k 1.5k .5 .5
AAAAAAAAAAAAAAAAAAAA DDDDDDDDDDDDDDDD ............ CCCC
2.5k 2k 1.5k .5
AAAAAAAAAAAAAAAAAAAA DDDDDDDDDDDDDDDD CCCC ........ CCCC
2.5k 2k .5 1k .5
AAAAAAAAAAAAAAAAAAAA DDDDDDDDDDDDDDDD CCCCCCCC ........
2.5k 2k 1k 1k

L'efficacité d'un défragmenteur repose sur l'algorithme utilisé. Certains peuvent décider de rechercher pour commencer les plus gros fichiers, ou au contraire les plus petits, de les déplacer temporairement juste à la fin des fichiers, ou à la fin du disque,... 
La défragmentation prendra aussi plus ou moins de temps suivant la place libre sur le disque : si la place est très faible, le défragmenteur va devoir s'y prendre à plusieurs reprises pour déplacer un fichier.

C'est pourquoi il y a intérêt à défragmenter TRÈS RÉGULIÈREMENT (personnellement, je le fais quotidiennement, vers 2h du matin, par programmation automatique), ainsi la défragmentation est rapide (puisqu'il n'y a pas grand chose à faire, et aussi parce qu'il n'y a pas besoin d'une grande zone libre temporaire)

Si on attend trop longtemps, il n'y aura plus assez de place libre temporairement à la fin du disque, et donc le défragmenteur va devoir "ruser" un nombre incalculable de fois! Et on a intérêt à défragmenter, car un fichier fragmenté sera beaucoup plus long à lire ou à écrire, vu que les têtes vont devoir se déplacer à la surface du disque.

Contrairement à une idée reçue (et alimentée au départ par Microsoft lui-même), NTFS, qui est pourtant un excellent système de fichiers, fragmente les fichiers.
La preuve : sous Windows 2000, un défragmenteur est désormais livré avec le système d'exploitation (une version "allégée" de DiskKeeper).
Pour ma part, j'utilise (sous NT4 et Windows 2000) "OO-Defrag" (http://www.oosoft.de/index-e.html)

En conclusion, les seuls cas où défragmenter ne sert à rien sont :
- Quand le disque est neuf
- Quand le disque vient d'être défragmenté! ;+)
- Quand on ne supprime JAMAIS rien sur un disque! ;+)

sommaireLes clefs fondamentales (les plus usitées)

Le tableau ci-dessous regroupe d'une façon synthétique les clefs les plus couramment utilisées sous Windows. Pour avoir plus de détails, veuillez consulter les liens associés.

Abréviations utilisées:
HKCR   HKEY_CLASSES_ROOT
HKLM  HKEY_LOCAL_MACHINE
HKCU  HKEY_CURRENT_USER
HKU  HKEY_USERS

 

Clefs

Rôles

HKCR\CLSID\ {20D04FE0-3AEA-1069-A2D8-08002B30309D}
{645FF040-5081-101B-9F08-00AA002F954E}
{208D2C60-3AEA-1069-A2D7-08002B30309D}
Icônes  Poste de travail
Corbeille
Voisinage réseau
HKCR\http\shell\open\command
HKCR\http\shell\open\ddeexec\Application
HKCR\http\DefaultIcon
Navigateur Internet par défaut
HKCU\Control Panel\Keyboard Verrouillage pavé numérique
HKLM\Network\Logon  Authentification via un serveur
HKLM\Software\Microsoft\Windows\CurrentVersion Dossier applications
HKLM\Software\Microsoft\Windows\CurrentVersion\Run Applications lancées au démarrage
HKLM\Software\Microsoft\Windows\CurrentVersion\Setup  Lecteur d'installation
HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall Désinstallation d'applications
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon Autologon
HKLM\System\CurrentControlSet\Control\Keyboard Layouts\0000040C Verrouillage majuscules
HKU\.Default\Control Panel\Desktop Logo de connexion

sommaireClef des références d'applications en vue de leur désinstallation

Commentaires : Cette clef est utile à connaître. Elle permet de "nettoyer" la liste des applications, affichée dans le panneau de configuration, qui fait encore apparaître certaines applications alors qu'elles ont été supprimées directement sans passer par la procédure de désinstallation.

sommaireClefs des programmes à exécuter au démarrage de Windows :

hand_right.gif (969 octets)toutes ces clefs ne sont pas forcément présentes (cela dépend du système d'exploitation utilisé)
Commentaires : C'est souvent dans l'une de ces clefs  que se "cache" un exécutable plus ou moins indésirable lancé systématiquement au démarrage de Windows, alors qu'on a rien trouvé dans le groupe/dossier "Démarrage" ni dans le fichier "win.ini" (entrées "Load=" et "Run=").
C'est le cas par exemple du cheval de Troie "Back Orifice", dont le lancement est localisé (sous Windows 95/98) dans la clef :
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices

sommaireClef des informations de paramétrage "international" (format date, séparateur décimal,...)

Commentaires : Dans le cas de où l'on a besoin de changer rapidement ces paramètres (tests d'applications multilingues p.ex.), il est intéressant de sauvegarder cette clef dans un fichier .reg (p.ex. "langfr.reg"), puis de faire de même avec d'autres configurations (p.ex. "langen.reg"). Placer alors ces fichiers (ou leurs raccourcis) sur le bureau. Ensuite, un simple click sur l'un d'eux permet de basculer instantanément d'un paramétrage à un autre, sans devoir passer par le panneau de configuration.

Réafficher l'écran d'accueil au démarrage de Windows

La 1ère fois que Windows est lancé s'affiche une boite de dialogue "Le saviez-vous ?", que, généralement, on s'empresse de désactiver pour les fois suivantes ! Mais rien ne permet ensuite de rétablir cet affichage.
Pour cela, il suffit d'exécuter le programme welcome.exe, et de cocher la case "Afficher cet écran d'accueil au démarrage de Windows"

Pour information, la clef correspondante de la base de registres s'appelle
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Tips
entrée "Show", dont la valeur est :

Définition des dossiers "Program Files"et installation de Windows

Quand on veut installer une nouvelle application, Windows propose comme répertoire par défaut :
"c:\program files", "c:" étant la lettre de la partition contenant Windows.
Même si on peut parfaitement installer l'application n'importe où ailleurs, cela peut devenir fastidieux de modifier systématiquement cette proposition. On peut modifier le nom de ce répertoire par défaut, à l'aide de la clef :

 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion

dans laquelle l'entrée de type chaîne "ProgramFilesDir" contient le chemin par défaut.
Il suffit donc de le remplacer sa valeur par ce que l'on veut (par exemple, "E:\Mes programmes")

Dans cette clef on trouve également l'entrée de type chaîne "CommonFilesDir", utilisée par MS Office, Adobe, ... (qui est au départ égale à "c:\Program Files\Fichiers communs").
On peut la modifier de la même façon. 
Il peut y avoir plusieurs répertoires du style "Program Files" pour y stocker des applications, par contre il ne doit y avoir qu'un seul répertoire "...\fichiers communs", sinon il risque d'y avoir des problèmes!

Le répertoire d'installation de Windows est stocké dans :

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup 

dans laquelle l'entrée de type chaîne "SourcePath" contient généralement la lettre du lecteur de CD ayant servi à installer Windows. Si on est amené à modifier la lettre affectée au lecteur de CD, il peut être pratique de modifier la valeur de cette entrée, en indiquant la nouvelle lettre du CD.
On peut aussi avoir été amené à recopier l'intégralité du CD de Windows dans un répertoire d'un disque dur (pour des questions d'autonomie et de souplesse de (ré)installation). Dans ce cas, l'entrée SourcePath contiendra le nom de ce répertoire.

Personnaliser le panneau de configuration "Système"

Ce qui suit n'a pas d'intérêt vital, mais permet de donner un peu de fantaisie à votre système !

La manipulation décrite permet d'afficher une image et des informations  personnalisées dans l'onglet "Général" du panneau de configuration "Système" : (ici sous Windows NT4 et Windows XP, mais tout ceci est valable également sous Windows 9x/ME et Windows 2000)

Quand on appuie sur le bouton "Informations de support technique", la boite de dialogue suivante s'affiche :

En fonction du système d'exploitation utilisé, il suffit de créer dans le répertoire :

  1. un fichier texte nommé oeminfo.ini , ayant la structure traditionnelle d'une fichier ".ini",
    constitué de 2 sections [General] et [Support Information] :

    Le nombre de lignes affichées dans la deuxième boite de dialogue n'est pas limité. Il suffit de définir autant de clefs "Linenn" qu'il y a effectivement de lignes (lignes blanches comprises).

  1. un fichier image (format .bmp) nommé oemlogo.bmp
    Les caractéristiques de ce fichier ne sont pas critiques.
    Pour information, les dimensions de l'image de l'exemple ci-dessus sont de 180 sur 120 pixels.
    (ce "gros nounours" en plein effort me plait beaucoup! :+))

Impossible d'afficher l'onglet "Chercher" dans un fichier d'aide Windows

Après avoir lancé l'aide de Windows 9x ou Windows NT (menu Démarre), et essayé d'ouvrir l'onglet de recherche, on reçoit le message d'erreur suivant:

Impossible d'afficher l'onglet Chercher (177)

Comment remplacer un fichier en cours d'utilisation

On peut être amené à devoir remplacer un ou plusieurs fichiers (DLL, EXE, ...) alors qu'ils sont en cours d'utilisation, ce qui rend impossible toute manipulation habituelle (commande copy, opérations dans l'explorer,...). Il est existe néanmoins une méthode pour le faire, propre à chaque système d'exploitation.

Windows NT/2000

Il suffit d'utiliser dans un programme la fonction "MoveFileEx" (dans kernel32.dll), avec le commutateur MOVEFILE_DELAY_UNTIL_REBOOT. Cette fonction, une fois exécutée, se contente de modifier ou créer dans la clef :
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager
l'entrée PendingFileRenameOperation (de type REG_MULTI_SZ), laquelle va contenir les opérations à effectuer lors du redémarrage suivant.

Si la programmation en C rebute certains, il existe un tout petit utilitaire en mode console, FREEWARE, nommé "MOVEEX", disponible ici, qui fait cela très bien !

En voici la source :

Sa syntaxe est très simple :
Dans une fenêtre de commande (ou depuis le menu Démarrer/Exécuter), taper la commande suivante :

moveex <source> <destination>

Déplace (et renomme) <source> en <destination> l'opération ayant lieu lors du prochain redémarrage.

Fonctionne seulement sous Windows NT et avec des disques locaux! 
Avec des partitions NTFS, le compte SYSTEM doit avoir le droit 'Controle total' sur les fichiers en question! 

Exemples

moveex c:\temp\nouvelle_gina.dll c:\winnt\system32\nwgina.dll 

Déplace la librairie c:\temp\nouvelle_gina.dll dans le répertoire c:\winnt\system32 et la renomme en nwgina.dll .
S'il existe déja un fichier de ce nom dans c:\winnt\system32, il sera remplacé par le nouveau. 

moveex test.dll c:\temp 

Syntaxe incorrecte : La destination doit être un nom de fichier 

moveex c:\test.dll d:\test.dll 

Syntaxe incorrecte : On ne peut pas mélanger plusieurs disques

Pour annuler une opération de renommage avant que le système soit redémarré, i lsuffit de modifier ou supprimer l'entrée PendingFileRenameOperation dans la clef HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager

Téléchargement de "MOVEEX" :

Source (en C) (4 ko)
Exécutable (40 ko)

 

Windows 9x/ME

On ne peut pas utiliser la solution précédente, car la fonction "MoveFileEx" n'existe pas dans l'environnement Windows 9x/ME.
On va par contre se servir de WININIT, qui est un utilitaire système prévu pour cela. Ce programme, lancé au démarrage de Windows (avant chargement de l'interface graphique) vient lire le contenu du fichier wininit.ini (section "[rename]")
La syntaxe de chaque ligne de cette section est :
<nouvelle destination>=<origine>

Exemple :

[rename] 
NUL=C:\TEMP.TXT 
C:\NEW_DIR\EXISTING.TXT=C:\EXISTING.TXT 
C:\NEW_DIR\NEWNAME.TXT=C:\OLDNAME.TXT 
C:\EXISTING.TXT=C:\TEMP\NEWFILE.TXT 


La 1ère ligne entraîne la suppression de Temp.txt
La 2ème déplace Existing.txt vers un nouveau répertoire.
La 3ème déplace Oldname.txt vers le nouveau répertoire et le renomme.
La 4ème déplace et renomme Newfile.txt , qui va d'ailleurs écraser un fichier existant (Existing.txt)

Les applications ne doivent pas utiliser la fonction WritePrivateProfileString() pour écrire les entrée de la section [rename], car plusieurs lignes peuvent désigner la même destination  en particulier "NUL".

Une application qui utilise Wininit.ini doit vérifier son existence au préalable dans le répertoire de Windows. Si c'est le cas, cela signifie qu'une autre application en a eu besoin. S'il n'est pas trouvé, l'application devra le créer, ajouter la section [rename] et toutes les entrées nécessaires. 

Pour annuler une opération de renommage avant que le système soit redémarré, il suffit de supprimer la ou les lignes correspondantes dans le fichier wininit.ini.

Dates de fin de vie de produits Microsoft

Les produits Microsoft (Systèmes d'exploitation, logiciels bureautique,...) ont une durée de vie limitée. En particulier, à partir d'une certaine date plus aucun support n'est disponible. Voici une liste relative aux systèmes d'exploitation et principaux autres logiciels (d'après http://support.microsoft.com/DIRECTORY/DISCONTINUE.ASP) : 

Logiciel

Date de fin

Produit de remplacement

annoncée

réelle

DOS 1.x à 6.22 01/12/2000 31/12/2001 Windows 2000 Pro / ME
Win32s  01/05/2000 01/11/2000 Windows 2000 Pro / ME
Windows 1.x à 3.11 01/12/2000 31/12/2001 Windows 2000 Pro / ME
Windows 95  04/08/2000 31/12/2001 Windows 2000 Pro / ME
Windows 98 01/02/2001 30/06/2003 Windows 2000 Pro / ME
Windows 98 SE 01/02/2001 30/06/2003 Windows 2000 Pro / ME
Windows NT 4.0 Workstation 01/02/2001 30/06/2003 Windows 2000 Pro / ME
Site Server Entreprise 2.0 01/08/2000 01/02/2001 Site Server Commerce 3.0
Access 1.x 01/01/1999 01/07/1999 Access 2000
Access 2.x 01/05/2000 01/11/2000 Access 2000
Excel 4.x à 5.x 01/05/2000 01/11/2000 Excel 2000
PowerPoint 2.x à 4.x 01/05/2000 01/11/2000 PowerPoint 2000
Word 1.x 01/01/1999 01/07/1999 Word 2000
Word 2.x 01/05/2000 01/11/2000 Word 2000
FrontPage 1.x à 2.x 01/05/2000 01/11/2000 FrontPage 2000
Project 1.0 à 4.0 01/05/2000 01/11/2000 Project 2000
FoxPro 2.5 et 2.6 01/01/1999 01/07/1999 Visual FoxPro (6.0)
Internet Explorer 1.x à 2.x 01/12/2000 01/06/2001 IE 5.5
C/C++ 7.0 01/01/1999 01/07/1999 Visual C++ (6.0)
Quick C 01/01/1999 01/07/1999 Visual C++ (6.0)
Visual Basic 1.à à 3.0 01/01/1999 01/07/1999 Visual Basic (6.0)
Cobol 01/01/1999 01/07/1999 cf. produits tiers
Fortran 01/01/1999 01/07/1999 cf. produits tiers
MASM 6.0 01/01/1999 01/07/1999 cf. produits tiers
Pascal 01/01/1999 01/07/1999 cf. produits tiers

Modifications de la base de registres en ligne de commande

Il est peut s'avérer utile de modifier la base de registres en ligne de commande (et non pas via l'interface graphique de REGEDIT), cela essentiellement pour incorporer cette commande dans un fichier batch (.bat ou .cmd sous NT/W2K/XP), ou encore pour l'exécuter depuis un raccourci posé sur le bureau. 

Pour cela, il suffit de lui passer en paramètre à REGEDIT un fichier ayant l'extension .reg

La syntaxe est la suivante :


REGEDIT [/s] <nom_de_fichier.reg>
 

Le commutateur facultatif /s permet un fonctionnement en mode silencieux, c'est à dire sans apparition de la boite de dialogue de confirmation (ce mode est nécessaire dans le cas d'utilisation d'un fichier batch) :

Sous Windows 9x/ME/NT4, les fichiers .reg sont des fichiers texte de type ANSI (1 octet par caractère). 
 
Sous Windows 2000 et XP, ils sont, par défaut, de type UNICODE (2 octets par caractère), mais le type ANSI est également supporté. On retiendra ici le type ANSI traditionnel.

La première ligne du fichier est :

Type ANSI REGEDIT4
Type UNICODE Windows Registry Editor Version 5.00

Elle est suivie d'une ligne vide, puis des lignes propres à chaque clef à ajouter, modifier ou supprimer.

Pour ajouter ou modifier une clef :

On insère le nom complet de la clef, encadré par des crochets : [ et ].
Exemple :
REGEDIT4

[HKEY_CLASSES_ROOT\htmlfile\shell\open\command]

 

Pour ajouter ou modifier une entrée dans une clef :

On insère à la suite du nom de la clef une ligne de la forme :
<nom_de_l'entrée>=<valeur_de_l'entrée>
On encadre le nom de l'entrée par des guillemets " ", sauf si l'entrée concernée est l'entrée par défaut. Dans ce cas , le nom est symbolisé par le caractère @ (sans guillemets)
Exemple :
REGEDIT4

[HKEY_CLASSES_ROOT\.html]
@="htmlfile"
"Content Type"="text/html"

La valeur d'une entrée peut être de 3 types :

  • REG_SZ (chaîne de caractères)
    La chaîne doit être encadrée par des guillemets.
    Le caractère \ est un caractère d'échappement. C'est pourquoi il faut le doubler si on doit l'insérer dans la chaîne (cas fréquent quand la valeur est un nom de fichier). Ce caractère sert aussi à insérer des guillemets dans la chaîne. Ainsi un guillemet sera représenté par la séquence \" 
    Exemple :
    @="\"D:\\Program Files\\Internet Explorer\\iexplore.exe\" -nohome"

  • REG_DWORD (mot binaire de 4 octets)
    La valeur exprimée en hexadécimal doit être précédée du mot-clef dword suivi de 2 points :
    Exemple :
    "InstallDate"=dword:3a020c30

  • REG_BINARY (donnée binaire de longueur quelconque)
    La valeur est exprimée sous la forme d'une suite d'octets exprimés en hexadécimal, séparés par des virgules, le premier étant précédé du mot-clef hex suivi de deux points :
    Si la ligne est trop grande,
    on peut la couper à l'aide du caractère \, qui indique que la valeur se continue sur la ligne suivante.
    Exemple :
    "DigitalProductId"=hex:a4,00,00,00,03,00,00,00,35,32,33,34,30,2d,30,30,35,2d,\
    30,30,34,30,31,30,32,2d,30,35,34,30,31,00,0a,00,00,00,41,32,32,2d,30,30,30,\
    ...
    00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,43,19,d1,3a

  • Sous Windows NT/W2K/XP, les valeurs de type :
    • REG_EXPAND_SZ (chaîne contenant le nom d'une variable d'environnement)
    • REG_MULTI_SZ (plusieurs chaînes à la suite)
    doivent être exprimées sous la forme de valeurs binaires (hex:...) 

Pour supprimer une clef 

Il suffit de faire précéder le nom de la clef à supprimer du signe - (moins) 
Exemple : 
Suppression de la clef HKEY_LOCAL_MACHINE\SOFTWARE\jcb
REGEDIT4

[-HKEY_LOCAL_MACHINE\SOFTWARE\jcb]

 

Pour supprimer une entrée

Il suffit de faire suivre le signe "=" (après le nom de l'entrée) du signe - (moins) 
Exemple : 
Dans la clef HKey_Current_User\Software\Policies\Microsoft\Internet Explorer\Control Panel 
suppression de l'entrée de nom "Home Page
(pour information, c'est cette entrée qui interdit de modifier la page d'accueil de I.E.)
REGEDIT4 

[HKey_Current_User\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"Home Page"=-

Pour renommer une clef

Rien n'est prévu pour le faire en ligne de commande.
Le seul moyen de base est d'effectuer cette opération depuis l'interface graphique de REGEDIT

Afin de pallier ce manque, j'ai conçu un utilitaire : RenameReg.exe

Renommage de clef dans la Base de registres
JCB © 2003
http://www.bellamyjc.net
-------------------------------------------
Syntaxe
  RenameReg <ancienne> <nouvelle>
Paramètres
  <ancienne> : Nom complet de la clef à renommer
  <nouvelle> : Nouveau nom de la clef à renommer (partie finale uniquement)
Dans le nom complet, les racines autorisées sont :
  HKEY_CLASSES_ROOT  (ou HKCR)
  HKEY_LOCAL_MACHINE (ou HKLM)
  HKEY_CURRENT_USER  (ou HKCU)
  HKEY_USERS         (ou HKU )

La clef à renommer doit exister
Le nouveau nom peut ne pas exister

Exemples :
----------
 RenameReg HKEY_LOCAL_MACHINE\software\test essai
  la clef "HKEY_LOCAL_MACHINE\software\test" sera renommée en
          "HKEY_LOCAL_MACHINE\software\essai"

 RenameReg HKCU\mykey ma clef
  la clef "HKEY_CURRENT_USER\mykey" sera renommée en
          "HKEY_CURRENT_USER\ma clef"


Télechargement de (48 ko - gratuit)
 

Un fichier .reg doit se terminer par une ligne vide.

Il est possible également d'exporter un fichier .reg depuis la base de registres à l'aide de REGEDIT en ligne de commande.
La syntaxe est la suivante :


REGEDIT [/e] <nom_de_fichier.reg> [clef_à_exporter]
 

Exemple :
Exportation du contenu de HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet dans le fichier ccs.reg :


regedit /e css.reg HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet
 

 

Structure des répertoires et stockage des noms longs avec le système FAT

Un répertoire est un fichier, constitué d'entrées de 32 octets chacune, servant à définir un fichier ou un autre répertoire. Au départ, un fichier était nommé à l'aide de 8+3 caractères, si bien que ces 32 octets étaient suffisants pour stocker le nom du fichier (11 octets), ses attributs ("D", "R", "H", "S", "A", sur 1 octet), sa taille (4 octets, ou 32 bits, donc valeur limitée à 2^32 octets), sa date de création (2 octets), le n° du 1er cluster (4 octets), ...

Avec l'arrivée des "noms longs", apparus avec Windows 95 (exception faite de Windows NT, utilisant un autre système), pouvant atteindre 255 caractères, il est évident que cette structure s'est avérée insuffisante, mais dans un but de compatibilité, il fallait aussi préserver l'ancien système.

On a donc, pour un fichier donné, la disposition suivante :

Données
nom court
Taille 
(octets)

Remarques

Nom de fichier 8
Extension 3
Attributs 1 N° de bit Signification
réservé
réservé
archive
4 sous-répertoire
nom de volume
fichier système
fichier caché
0 fichier lecture seule
Reservé 10
Heure 2
Date 2
1er cluster 2
Taille 4
Total 32
Données
nom long
Taille 
(octets)

Remarques

N° d'entrée 1
Nom de fichier 10 UNICODE =5 caractères
Attributs 1 toujours 0x0F
Checksum 2
Suite nom 12 UNICODE =6 caractères
Réservé 2
Suite nom 4 UNICODE =2 caractères
Total 32

Une entrée de nom long peut donc contenir au maximum 5+6+2 =  13 caractères

Un nom long sera défini sous la forme de PLUSIEURS entrées supplémentaires, qui vont PRÉCÉDER l'entrée PRINCIPALE (= celle qui contient le nom court). 
L'ordre a énormément d'importance! 
En particulier, il ne faut surtout pas utiliser un outil de TRI de noms de fichiers dans un répertoire (je pense à l'antique "DS" - Directory Sort - des Norton Utilities des années 1985, qui était très pratique et rapide au demeurant!). Si on exécute un tel outil, c'est le désordre assuré dans le répertoire!

Par ailleurs, le nom long est exclusivement représenté en UNICODE (2 octets par caractère).
Le 1er octet de l'entrée indique le n° d'ordre de l'entrée (0x01, 0x02, ...), la dernière entrée se voyant le bit 6 mis à 1 (p.ex. 0x42 au lieu de 0x02)

Exemple : 
Soit le fichier de nom : "La connaissance s'accroit quand on la partage.txt
49 caractères au total => il faudra 4 entrées de nom long, 52=4x13 étant l'entier multiple de 13 immédiatement supérieur à 49.

Windows a déterminé comme nom court : "LACONN~1.TXT
Pour cela, il prend les 6 1ers caractères en éliminant tout ce qui n'est pas lettre ou chiffre (espace p.ex.), convertit en majuscule, ajoute le caractère tilde "~" , puis un chiffre (en fonction de ce qui existe déjà comme nom de fichier), et enfin rajoute la dernière extension (si elle existe)

Dans le répertoire contenant ce fichier, on trouve ceci :

00000100 44 61 00 72 00 74 00 61 00 67 00 0F 00 8C 65 00 Da.r.t.a.g....e. 
00000110 2E 00 74 00 78 00 74 00 00 00 00 00 FF FF FF FF ..t.x.t.........
00000120 03 71 00 75 00 61 00 6E 00 64 00 0F 00 8C 20 00 .q.u.a.n.d.... . 
00000130 6F 00 6E 00 20 00 6C 00 61 00 00 00 20 00 70 00 o.n. .l.a... .p.
00000140 02 63 00 65 00 20 00 73 00 27 00 0F 00 8C 61 00 .c.e. .s.'....a. 
00000150 63 00 63 00 72 00 6F 00 69 00 00 00 74 00 20 00 c.c.r.o.i...t. .
00000160 01 4C 00 61 00 20 00 63 00 6F 00 0F 00 8C 6E 00 .L.a. .c.o....n. 
00000170 6E 00 61 00 69 00 73 00 73 00 00 00 61 00 6E 00 n.a.i.s.s...a.n.
00000180 4C 41 43 4F 4E 4E 7E 31 54 58 54 20 00 27 25 8C LACONN~1TXT .'%. 
00000190 26 2A 26 2A 00 00 45 8C 26 2A FC 0A 33 00 00 00 &*&*..E.&*..3...

Il y a 5 entrées au total (4 entrées de nom long + 1 entrée de nom court) :

Commentaire personnel : on aurait pu faire plus simple !!!!! ;+)

Disquettes de test de configuration matérielle

Il existe (ou existait!) dans le CD de Windows NT4 deux outils entièrement autonomes (et très peu connus!) effectuant des tests de configuration matérielle (SCSI compris). Ils se présentent sous la forme de deux disquettes DOS 6.22 avec une version réduite de Windows 3.1.

Or ces outils n'ont pas été reconduits dans les versions postérieures de NT4 (2000, XP), et c'est fort dommage!

C'est pourquoi j'ai décidé de les mettre à disposition ici, sous la forme d'un fichier autoextractible hardtest.exe (2447 ko).  Il suffit d'exécuter ce programme (sous DOS, Windows 9X, NT, 2000, XP) puis d'exécuter le script MAKEDISK.BAT (son lancement est proposé automatiquement si la décompression de hardtest.exe a lieu sous Windows). Il faut prévoir 2 disquettes de 1.44Mo (formatées ou non, vierges ou non).

Ensuite il faut rebooter le PC avec l'une ou l'autre de ces disquettes, Windows 3 va alors se lancer, et les diagnostics vont se dérouler.

Cliquer ici pour télécharger hardtest.exe (2447 ko).

Verrouillage du pavé numérique (clavier externe de PC portable)

Il est possible d'adjoindre
aux ordinateurs portables
un pavé numérique externe
(connecté généralement
sur un port USB).
Cet accessoire est destiné à permettre une frappe rapide des touches numériques, au lieu de les chercher sur le clavier principal.

 

Le problème rencontré avec ce système est que lors d'un verrouillage numérique, les touches du clavier principal sont également basculées en mode numérique.

Ainsi il devient impossible (sans désactiver le verrouillage numérique) de saisir les caractères suivants :
U u I i O o P p
J j K k L l M m
? , / : § !  

Quelques constructeurs d'ordinateurs (Compaq, NEC) ont mis à disposition des utilitaires destinés à modifier ce comportement, mais ils fonctionnent mal et surtout sont liés à un type de matériel.

J'ai conçu un logiciel qui corrige cette anomalie : KNumLock.
Il fonctionne sous tout système Windows 32 bits (Windows 95,98, ME, NT4, 2000, XP,2003)
(Il a été écrit sous Delphi 6)

Quand il est actif, il force le mode numérique uniquement sur le pavé numérique externe (sans avoir à actionner la touche de verrouillage numérique). Ainsi les touches U, I, O, P, J, K, L, M, ? , /, ! ..., sont toujours disponibles en tant que telles.

Son principe repose sur l'utilisation d'un "hook" de type WH_GETMESSAGE, qui intercepte (avant traitement par l'application destinataire) tous les messages claviers, et modifie en conséquence uniquement ceux provenant du pavé numérique externe, qui sont ensuite transmis à l'application.

Comme ce "hook" concerne toutes les applications en cours d'exécution, il est installé dans une bibliothèque distincte du logiciel lui-même (DLL "libmsg.dll")

KNUMLOCK apparaît sous la forme d'une icône dans le "System Tray" : 
Un clic droit sur l'icône fait apparaître un menu permettant de verrouiller ou déverrouiller le pavé numérique, ou encore de quitter le logiciel (dans ce dernier cas, le fonctionnement du verrouillage de clavier numérique redevient habituel).

KNUMLOCK ne nécessite aucun redémarrage, il est opérationnel dès qu'on l'exécute.
Son installation est réalisée automatiquement à partir d'un exécutable : instknl.exe

Aucune modification n'est effectuée dans la Base de Registres (sauf la clef pour sa désinstallation de l'ordinateur)
Aucun fichier (dll,..) n'est placé dans l'arborescence Windows.

Ce logiciel est entièrement gratuit

Cliquer ici pour télécharger INSTKNL.EXE (373 ko) (version bilingue français/anglais)


Je remercie au passage Michel Bardou et son site consacré à Delphi , en particulier son composant "PIconeBarreTache" dont je me suis servi dans mon logiciel.

Pour les développeurs : cliquer pour télécharger ici les sources du programme  (exécutable et DLL)

Changement du mode graphique par ligne de commande

On peut être amené à modifier le mode graphique (essentiellement la résolution horizontale et verticale) pour diverses raisons (application prévue pour une résolution donnée, exécution de jeux, ...)

Le problème est que cette simple opération nécessite l'utilisation de l'interface graphique (panneau de configuration affichage) ou au mieux l'action sur une icône placée dans le "System Tray" ("quickres" des Powertoys, utilitaire de certains fabricants de cartes graphiques,..), et donc ne peut pas être automatisée.

J'ai conçu "SETVIDEO", un outil en mode console, qui se lance donc en ligne de commande (depuis le menu Exécuter, dans une fenêtre de commandes, ou encore dans un fichier de commandes .bat ou .cmd)

La syntaxe est la suivante :

c:\>Setvideo
(sans paramètre)

Exemple :
Carte graphique Matrox Marvel G450 eTV - Français
134 modes graphiques disponibles :
8 bits 320 x 200 74 Hz
8 bits 320 x 200 85 Hz
8 bits 320 x 240 63 Hz
8 bits 320 x 240 85 Hz
...
32 bits 1152 x 864 85 Hz
...
32 bits 1280 x 1024 75 Hz
32 bits 1280 x 1024 85 Hz
32 bits 1600 x 1200 60 Hz
32 bits 1600 x 1200 65 Hz
32 bits 1600 x 1200 70 Hz

Affiche la liste de tous les modes graphiques disponibles de la carte graphique, avec pour chaque mode :
  • Nombre de bits par pixel
  • Résolution horizontale
  • Résolution verticale
  • Fréquence de rafraîchissement verticale

Cette liste est suivie d'une aide en ligne.


c:\>Setvideo x=aaaa y=bbbb b=cc f=dd

Exemple :
c:\>Setvideo x=1280 y=1024 b=32 f=85


Modification
du mode graphique.
4 paramètres doivent être passés :
  • x=... résolution horizontale en pixels
  • y=... résolution verticale en pixels
  • b=... nombre de bits par pixels
  • f=... fréquence verticale en Hertz

Un contrôle de validité des paramètres est effectué. Si au moins l'un d'entre eux est manquant, ou si la configuration demandée n'est pas supportée par la carte, un message d'erreur sera affiché :

C:\>setvideo x=1024 y=768
paramètre b omis
paramètre f omis

C:\>setvideo x=1600 y=1200 b=32 f=85
Mode incompatible avec le matériel

S'il n'y a pas d'erreur, le nouveau mode graphique est immédiatement appliqué

Cet outil a été testé avec succès sous les systèmes d'exploitation suivants :

L'information de fréquence de rafraîchissement peut être inconsistante sous Windows 98 et ME, en affichant une valeur de 0 Hz. Cela correspond au taux de rafraîchissement par défaut de la carte graphique. Il faut néanmoins l'indiquer dans la commande de modification (setvideo x=1024 y=768 b=16 f=0).

SETVIDEO ne nécessite aucune installation. Il est autonome et directement opérationnel.

Ce logiciel est entièrement gratuit.

Cliquer ici pour télécharger SETVIDEO.EXE (134 ko)

(Il a été écrit en Delphi)

Les clefs de produits Microsoft ("ProductID","ProductKey","RAWKey")

Avertissement au lecteur :

L'exposé qui suit ne décrit nullement la façon de créer des clefs "pirates" d'installation de produits Microsoft !

Il a simplement pour but de :

  • montrer et comment sont stockées ces clefs dans la Base de registres.
  • retrouver facilement ces clefs en cas d'oubli, et permettre ainsi la réinstallation du logiciel.
  • expliquer certains mécanismes algorithmiques.

Cette partie de Windows n'est pas documentée par Microsoft !

Afin de garantir (en principe) leur authenticité, les logiciels Microsoft (Systèmes d'exploitation, applications bureautique, ...) nécessitent lors de leur installation la saisie d'une clef (fournie avec le support matériel) .


Les structures de ces clefs ont évolué au cours du temps.

On distingue essentiellement 2 types d'authentification de logiciels :

ProductID seul

Jusqu'à Windows 95 (1995), Windows NT4 (1996), Office 97 (1997), ... cette clef est unique, composée de 10 chiffres décimaux.

Cette clef est de la forme : xxx-xxxxxxx
Avec x = [0,1,2,3,4,5,6,7,8,9]
le 1er groupe de 3 caractères peut être parfois constitué de la chaine OEM

Le nombre maximal théorique de clefs est donc égal à 10^10 -1

Par exemple : 335-3353356 (suggérée pour les produits MSDN requérant ce genre de clef)
Le 1er nombre de 3 chiffres peut être quelconque,  le 2ème est tel que la somme de ses 7 chiffres doit être un multiple de 7.
Par exemple : 3 + 3 +5 + 3 + 3 + 5 + 6 = 28 (= 7 x 4)
On pourrait choisir aussi 0016077, 0005754, 7654321, 1111111, ...

: dans le cas de licences OEM (logiciels préinstallés par le fabricant de l'ordinateur), le 1er nombre de 3 chiffres est remplacé par la chaine alphanumérique "OEM".
Par exemple OEM-0016077

La clef xxx-xxxxxxx constitue la partie centrale d'un ensemble de 4 nombres xxxxx-xxx-xxxxxxx-xxxxx, appelé "ProductID" (identificateur de produit).

Le ProductID est stocké en clair dans la Base de registres dans une entrée de type REG_SZ :

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductID

Dans le ProductID, la clef (3+7) est encadré par 2 nombres de 5 chiffres :

ProductKey (avec ProductID dérivé)

Le système utilisé précédemment ne présentait aucune protection contre la copie illicite de logiciels, en raison de la simplicité triviale de l'algorithme de génération de clefs. 
Avec la sortie de Windows 98 (1998) puis Windows 2000 (2000), Microsoft a complexifié le mécanisme de saisie de clef.
Désormais l'utilisateur doit être en possession d'une clef constitué de 25 caractères alphanumériques appelée "ProductKey" (clef de produit).

Cette clef est de la forme : xxxxx-xxxxx-xxxxx-xxxxx-xxxxx
Avec x = [B,C,D,F,G,H,J,K,M,P,Q,R,T,V,W,X,Y,2,3,4,6,7,8,9]

Le nombre maximal théorique de clefs est donc égal à 24^25-1, soit environ 3,2 10^34. 
(3 10^24 fois plus qu'avec le système précédent !)

Par exemple : FCKGW-RHQQ2-YXRKT-8TG6W-2B7Q8
Pour information, cette clef - à ne surtout pas utiliser ! - est la plus célèbre des clefs "pirates" de Windows XP PRO Corporate, apparue lors du lancement de Windows XP en 2001.

On peut s'interroger sur ce jeu de caractères utilisé.
Il comporte 24 éléments, ce qui signifie tout simplement que l'on est en présence de nombres représentés en base 24.
D'où cette mixité de lettres et chiffres (comme c'est déjà le cas pour la représentation conventionnelle de nombre exprimés en base hexadécimale).
Il fallait donc choisir 24 caractères parmi les 26 lettres de l'alphabet et 10 chiffres.
Afin d'éviter toute confusion entre lettres et chiffres, Microsoft n'a pas retenu les lettres et chiffres suivants :

Par contre, il est regrettable que Microsoft ait laissé possible la confusion entre B et 8 .

Les chiffres de cette base 24 correspondent aux valeurs décimales suivantes :

B = 0   Q = 10   6 = 20  

  Puissances de 24

C = 1   R = 11   7 = 21   24^1 24
D = 2   T = 12   8 = 22   24^2 576
F = 3   V = 13   9 = 23   24^3 13824
G = 4   W = 14           24^4 331776
H = 5   X = 15           24^5 7962624
J = 6   Y = 16           ... ...
K = 7   2 = 17              
M = 8   3 = 18              
P = 9   4 = 19              
 
Exemples :

2B7Q8 est le codage en base 24 de :

2 = 17 x 24^4   5640192  
B = 0 x 24^3 0
7 = 21 x 24^2   12096  
Q = 10 x 24^1   240  
8 = 22 x 24^0   22  
            5652550 (en hexadécimal : 0x564046)

Inversement, le codage en base 24 de 2005 (en décimal) est :

2005 / 24 = 83 reste 13   V
83 / 24 = 3 reste 11   R
3 / 24 = 0 reste 3    F
          FRV

Contrairement au ProductID, il n'existe pas dans la base de registres d'entrée contenant en clair (5 fois 5 caractères) la clef de produit (ProductKey).

On trouve seulement une entrée nommée DigitalProductID de type REG_BINARY.
Cette entrée concerne Windows, mais aussi des applications telles que Office, Visio, FrontPage, OneNote, Money, Internet Explorer ...
Sa taille est de 164 octets en général, mais peut atteindre parfois (cas de Internet Explorer) 256 octets.

Windows HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DigitalProductID
Office 2003 HKLM\SOFTWARE\Microsoft\Office\11.0\Registration\{9011040C-6000-11D3-8CFE-0150048383C9}\DigitalProductID
FrontPage 2003 HKLM\SOFTWARE\Microsoft\Office\11.0\Registration\{9017040C-6000-11D3-8CFE-0150048383C9}\DigitalProductID
Visio 2003 HKLM\SOFTWARE\Microsoft\Office\11.0\Registration\{9051040C-6000-11D3-8CFE-0150048383C9}\DigitalProductID
One Note 2003 HKLM\SOFTWARE\Microsoft\Office\11.0\Registration\{90A1040C-6000-11D3-8CFE-0150048383C9}\DigitalProductID
Money 12 HKLM\SOFTWARE\Microsoft\Money\12.0\Registration\DigitalProductID
Internet Explorer HKLM\SOFTWARE\Microsoft\Internet Explorer\Registration\DigitalProductID

Le nombre maximal que l'on peut coder est donc 24^25 -1 (nombre de 25 chiffres compris entre 0 et 23), soit 3,2 x 10^34 comme cité plus haut.
Exprimé en puissances de 16, ce nombre est de l'ordre de 16^29.
Donc pour le représenter en base 16, il faudra 29 "chiffres" hexadécimaux, soit,  après arrondi, 15 octets (1 octet étant représenté par 2 chiffres hexadécimaux).
Cette représentation binaire de la ProductKey est appelée "Raw Key" (clef brute)
C'est ce que l'on observe  dans toutes entrées DigitalProductID,
la Raw Key étant stockée sur 15 octets, entre les offsets 0x34 à 0x42.

Ne pas oublier que dans les architectures "Intel" (et compatible), les grandeurs binaires sont représentées en "Little Endian", c'est à dire que les octets de poids faibles sont en tête.

Dans l'exemple ci-contre, la Raw Key est le nombre (en hexadécimal) 03D3FC979F6BA773C899DEA7EF6380


On peut être amené à réinstaller des logiciels Microsoft (Windows, Office,..)
Pour cela il faut ressaisir la ProductKey au cours de la procédure d'installation.
Or cette clef étant souvent fournie sous la forme d'un autocollant posé sur l'emballage, il arrive fréquemment que l'on ait perdu cette clef.

D'où l'intérêt de pouvoir obtenir la ProductKey en clair, par conversion de la "RAW key" en nombre exprimé en base24.

En raison de la grandeur des nombres rencontrés, cette conversion ne peut se faire que par programmation.
Avec de possibles variantes, l'algorithme est toujours le même :

Exemple :
Conversion de 7D5 (représentation hexadécimale de 2005) en base 24 
(18 est la représentation hexadécimale de 24)

7D5 = 53 x 18 + 0D   V
53 = 3 x 18 + 0B   R
3 = 0 x 18 + 03   F
              FRV

Il existe différents outils qui effectuent cette conversion :
  • Le 1er de cette catégorie fut le logiciel Aida32.
    Mais c'est devenu un produit commercial (Everest)
    Et seules les versions payantes donnent les "ProductKey".
     
  • WinfoKeys (Gratuit ) de Pierre TORRIS ,
    qui donne par ailleurs un grand nombre d'informations.
     
  • KeyFinder  (Gratuit )
    qui est spécialement dédié à cet usage. 
     
  • ViewPK (Gratuit)
    script WSF de ma conception.
    Il est doté de nombreuses fonctionnalités :
    • Affichage de la ProductKey de Windows
    • Recherche automatique de toutes les clefs DigitalProductID
      (Office, FrontPage, Money, Visio,...)
    • Fonctionnement sur ordinateur local ou distant !
    • Affichage de la RAWKey
    • Calcul et affichage du ProductID
    • Calcul du ProductID à partir de n'importe quelle ProductKey

Relation entre ProductKey et ProductID

En raison de l'absence de toute documentation de la part de Microsoft, ces informations sont susceptibles d'évoluer au fur et à mesure des expérimentations effectuées.

Malgré la présence de la ProductKey, le ProductID subsiste toujours car c'est lui qui permet à Microsoft de détecter la provenance authentique ou frauduleuse du logiciel correspondant.

C'est ainsi que le Service Pack 1 (et suivants) de Windows XP refuse de s'installer sur les machines dotées dont le ProductID est de la forme :
  • XXXXX-640-0000356-23XXX
  • XXXXX-640-2001765-23XXX

car il dénote l'utilisation de clefs "pirates" de Windows XP PRO Corporate (licence en volume, qui ne nécessite pas d'activation, réservée aux professionnels).
Cette information est extraite du document Microsoft Technical Details on SP1 Changes to Microsoft Product Activation for Windows XP.
Lors de la sortie du SP1 (2002), ce document était disponible sur le site Microsoft à l'adresse  http://www.microsoft.com/piracy/basics/activation/WPA_SP1_Market_Bulletin.doc mais il a disparu du site.

C'est par un procédé analogue que WGA (Windows Genuine Advantage) autorise ou non les téléchargements (hors correctifs de sécurité) depuis le site Windows Update. (via le contrôle ActiveX LegitCheckControl.dll)

Alors que le ProductID était autrefois saisi manuellement par l'utilisateur, et constituait le seul identificateur du produit, il est à présent dérivé de la ProductKey, par un algorithme (hachage) relativement complexe.
Microsoft ne fait qu'évoquer cet algorithme dans le document cité précédemment.
Il est contenu dans la DLL PIDgen.dll (située dans %systemroot%\system32) (PIDgen = acronyme de Product Identifier Generator) 

On peut néanmoins trouver des informations très pertinentes à ce sujet dans le document Inside Windows Product Activation dû à la Compagnie Licenturion spécialisée dans les solutions de protections de logiciels.

L'algorithme ProductID=f(ProductKey) dépend du produit (Windows, Suite Office, Money, ...)

Ce qui suit ne concerne que Windows :
 
Opérations Exemples
Il faut tout d'abord convertir la ProductKey
(5 fois 5 caractères) en RAWkey binaire
comme exposé précédemment
FCKGW-RHQQ2-YXRKT-8TG6W-2B7Q8
->                   
00C8D5F1B880E1C0EC45F9CC4B4046
(big endian)
Puis retenir les 31 1ers bits de poids faibles
(équivalent à effectuer un AND logique avec 0x7FFFFFFF)

4C4B4046

Puis décaler d'un bit vers la droite le résultat
(équivalent à une division euclidienne par 2)
2625A023
Convertir le résultat en décimal
(ajouter éventuellement des 0 en tête afin que le résultat comporte 9 chiffres)
640000035
Scinder ce nombre en 2 parties constituées des 3 premiers et des 6 derniers chiffres. 640
000035
Multiplier le 2ème nombre par 10, et lui ajouter un chiffre de telle façon que la somme de tous les chiffres soit un multiple de 7 0000350
+ 6
(0+0+0+0+3+5+6 = 2x7)
La partie centrale du ProductID est donc : 640-0000356

 dans cet exemple, on retrouve un ProductID de ProductKey "blacklistée"
par le Service Pack 1 de Windows XP, qui dénote donc une clef "pirate"!

Seuls les 2ème et 3ème nombres sont utiles ici pour détecter la "provenance" d'une ProductKey.

Le chiffre des centaines du 2ème nombre semble indiquer la catégorie du logiciel
(information non garantie, obtenue expérimentalement) :

0xx : licence au détail
2xx : licence contrat Select
3xx : licence MSDN
6xx : licence en volume ("Corporate")
7xx : licence OEM