Les assistants Web de Windows XP
Lucidiot —
Informatique —
2022-07-31
À la découverte de quelques assistants très particuliers de Windows XP.
Internet Explorer est un composant très intégré au sein de Windows, au point que malgré sa dépréciation au profit de Microsoft Edge, certaines parties de son intégration pour les développeurs, comme MSHTML restent maintenues jusqu'en 2029. Cette intégration assez profonde a été l'objet de critiques sur le monopole que Microsoft imposait en fournissant Internet Explorer directement avec Windows, mais même si on désinstalle IE ou on utilise une version « N » de Windows, qui ne contient pas Internet Explorer, on aura quand même Internet Explorer caché dans son système.
Depuis Windows 98, Internet Explorer est tout simplement partout. Microsoft a rapidement voulu intégrer les technologies du Web partout dans son système, donnant lieu par exemple à Active Desktop, la fonctionnalité qui a permis jusqu'à Windows XP de définir une page Web comme fond d'écran de son ordinateur. Cette fonctionnalité est rendue possible par le fait que explorer.exe
soit secrètement une version particulière d'Internet Explorer. Il est possible de modifier des fichiers DHTML pour personnaliser son explorateur dans Windows 98 ou 2000, et taper une URL dans la barre d'adresse dans ces systèmes transforme l'interface en celle d'Internet Explorer directement.
Avec DHTML, Active Desktop, ActiveX et moult autres intégrations du Web dans Windows, on peut en fait dire que Microsoft a introduit l'équivalent des applications Electron 15 ans avant l'apparition de celui-ci.
Dans Windows Longhorn, qui devait initialement être un nouveau Service Pack pour Windows XP, puis est devenu un successeur à Windows XP avant de finalement être repris à zéro pour devenir Windows Vista, Microsoft montre encore son approche différente au Web en faisant la démonstration d'un client de bureau pour Amazon. Une application native, et pas juste une énième application Web, donc plus de performances, plus d'accessibilité, de stabilité. Vous n'avez probablement jamais entendu parler de cette application car elle a disparu, comme beaucoup d'autres fonctionnalités comme le mélange d'une base de données SQL avec le système de fichiers lors du redémarrage du développement qui a donné lieu à Vista.
J'apprécie donc explorer ces intégrations particulières du Web dans Windows XP, un peu comme une réalité alternative où les développeurs Web étaient restés sains d'esprit, où ça n'est pas encore à l'opposé de la performance, de l'accessibilité, de la perma-informatique. Ça me permet d'échapper aux horreurs que j'observe quotidiennement surtout dans mon travail, et de rêver d'un jour peut-être retrouver ce genre de choses sur les systèmes utilisés par le grand public.
En théorie, ces intégrations Web pourraient se retrouver dans Windows sous deux formes : soit il y a utilisation d'un service Web, qu'on pourrait simuler avec quelques bricolages et un serveur local pour le détourner et faire ce qu'on veut avec, soit il y a utilisation de pages Web locales, hors ligne, qu'on pourrait juste modifier sur son ordinateur pour faire un peu ce qu'on veut. Je me mets donc à la recherche des fonctionnalités de Windows XP qui utilisent le Web pour pouvoir les modifier un peu, d'abord juste pour pouvoir expérimenter avec, et peut-être que plus tard je pourrais commencer à les remettre au goût du jour, peut-être restaurer certaines fonctionnalités ou les étendre pour les mettre à jour vers 2022.
Impression de photos en ligne
La première expérimentation que j'ai voulu faire s'est faite quand j'ai voulu un peu mieux comprendre comment un assistant particulier de Windows XP fonctionne. Lorsqu'un dossier est personnalisé pour l'affichage d'images, de nouvelles options s'affichent dans le volet de gauche : on peut prendre des photos avec la webcam, afficher un diaporama des images du dossier, mais surtout on peut « commander des photos via Internet ». Cliquer sur cette dernière option ouvre l'Assistant Commande d'impressions en ligne, ou en anglais l'Internet Photo Printing Wizard. Cet assistant est un peu comme si vous aviez la bonne vieille borne d'impression de photos qu'on retrouve dans les supermarchés, souvent non loin d'un Photomaton, mais sur votre ordinateur et sans même utiliser un navigateur. Si ça passe par Internet, c'est qu'il y a forcément quelque part un service Web utilisé.

Quand on ouvre l'assistant, sa première action est de rechercher une liste de fournisseurs sur Internet. De nos jours, cette recherche est complètement infructueuse, et on se retrouve avec une liste vide affichée, ne nous laissant donc que l'option d'annuler. Puisqu'il y a une recherche sur Internet, il y a utilisation du réseau, et donc je peux utiliser les logs de mon proxy HTTP, ou Wireshark s'il me faut les grands moyens, pour espionner le trafic réseau et comprendre ce qu'il se passe.
J'observe une requête HTTP GET classique vers l'URL http://shell.windows.com/publishwizard/fra.xml
. Cette requête renvoie une erreur 404, ce qui semble être géré par Windows XP et interprété comme un « tant pis, on continue quand même ». Il semble charger un fichier XML depuis une URL alternative, disponible localement : res://netplwiz.dll/xml/providers.xml
. res://
est un protocole de Windows permettant de charger un fichier depuis des ressources d'un fichier exécutable, ici la DLL qui gère cet assistant.
La Wayback Machine a, je ne sais trop comment, pu archiver cette URL en 2002. On y trouve un fichier XML très intéressant, le Provider Manifest. Il semble décrire trois groupes de fournisseurs, chacun avec un scope
différent. C'est à partir de ce fichier que j'ai vraiment pu en savoir plus sur le fonctionnement de cet assistant ; il fait partie de la catégorie des assistants Web de Windows XP.
Les assistants Web
Les assistants Web, ou Web Wizards dans l'API Win32, sont un type d'assistant qui mélange un assistant classique et des pages Web. Il y en a trois dans Windows XP :
- L'assistant d'impression de photos en ligne susmentionné, ou Internet Photo Printing Wizard, parfois aussi appelé Online Photo Ordering Wizard dans la documentation ;
- L'assistant de publication sur le Web, ou Web Publishing Wizard ;
- L'assistant d'ajout de favori réseau, ou Add Network Place Wizard, qui a aussi la capacité de fonctionner sans fournisseur, en laissant juste l'utilisateur entrer une URL (et c'est l'utilisation principale que tout le monde en fait).
Ces trois assistants sont en réalité un seul et même assistant, qui change juste de nom et un peu de comportement à chaque fois. C'est pour cela que le Provider Manifest contient les fournisseurs pour les trois assistants en même temps. L'assistant Web fonctionne selon ce principe :
L'utilisateur clique sur Suivant après la page de présentation de l'assistant.
Si on est dans l'assistant d'impression de photos en ligne, l'utilisateur est invité à sélectionner les photos à imprimer.
Si on est dans l'assistant de publication sur le Web, l'utilisateur est invité à sélectionner les fichiers à publier.
L'assistant tente de charger le Provider Manifest en ligne.
- Si ça fonctionne, il met à jour des clés dans le registre pour créer un cache de la liste des fournisseurs.
- Si une erreur réseau se produit, il n'affiche pas d'erreur et à la place continue en utilisant son cache dans le registre.
L'utilisateur sélectionne un fournisseur dans la liste et clique sur Suivant.
Si une URL est spécifiée pour ce fournisseur dans le Provider Manifest, alors cette URL est chargée dans une instance d'Internet Explorer 7.0 au beau milieu de l'assistant. L'URL peut utiliser n'importe quel protocole compatible avec Internet Explorer, y compris
file://
oures://
.Si une erreur se produit au chargement de cette page, une page par défaut s'affiche dans cette instance d'Internet Explorer, avec un texte en Arial sur fond gris expliquant l'erreur, et l'utilisateur peut cliquer sur Précédent ou Annuler.
S'il n'y a pas d'URL spécifiée, c'est le formulaire de saisie de chemin vers un partage réseau qui s'affiche, pour fournir l'option sans fournisseur de l'assistant d'ajout de favori réseau.
Si le formulaire de partage réseau est utilisé, alors l'utilisateur a seulement à remplir le chemin du partage, puis saisir un nom d'affichage pour son nouveau favori réseau, et arrivera ensuite à la page de fin de l'assistant.
Si on est dans un contexte de page Web, l'assistant fournit à la page Web une API ActiveX particulière via l'attribut
window.external
, qui peut être utilisée par la page pour contrôler l'assistant. La page obtient accès à la liste des fichiers que l'utilisateur veut envoyer, choisir d'en ignorer, configurer comment l'envoi doit se passer (via HTTP POST ou via WebDAV), et contrôler le titre et sous-titre de l'assistant ainsi que la disponibilité des boutons Précédent, Suivant et Annuler.Lorsque la page Web indique via l'API ActiveX qu'elle a terminé, l'assistant utilise tous les paramètres fournis par la page pour envoyer les fichiers et affiche une barre de progression. Une fois l'envoi terminé, la page de fin de l'assistant s'affiche.
Dans le cas de l'assistant d'ajout de favori réseau, au lieu d'envoyer des fichiers, l'assistant crée un favori réseau selon les instructions spécifiées par la page et va à la page de fin.
Les pages de documentation à destination des développeurs pour s'établir comme fournisseurs dans ces assistants existent toujours, et elles sont une ressource assez précieuse pour explorer cette fonctionnalité :
- Publishing Wizards Introduction, la présentation des assistants Web ;
- Client-Side Design, comment les scripts dans les pages Web de l'assistant peuvent donner des ordres à l'assistant ;
- Server-Side Design, comment les scripts dans les pages Web de l'assistant peuvent gérer des événements de l'assistant ;
- Registering a Service, comment ajouter un nouveau fournisseur aux assistants sans passer par le Provider Manifest ;
- Using the Transfer Manifest, comment les scripts dans les pages Web de l'assistant peuvent lire et modifier un document XML étrange pour lister les fichiers à imprimer ou publier et configurer leur envoi au serveur ;
- Transfer Manifest Schema, une description difficilement compréhensible du document XML susmentionné.
Le Provider Manifest
Bien que le Transfer Manifest, un document XML sur lequel nous reviendrons dans un autre article quand j'aurai vraiment fait des recherches dessus, soit un peu documenté, le Provider Manifest ne l'est pas du tout. Il semble être le moyen pour Microsoft de lister des fournisseurs que Windows XP va automatiquement intégrer sans aucune participation de l'utilisateur. La documentation officielle de Microsoft indique comment ajouter un fournisseur soi-même, ce qui pourrait par exemple être fait par un programme d'installation, mais n'indique rien sur comment on peut être ajouté à ce fichier officiel.
Le document est récupéré à l'URL http://shell.windows.com/publishwizard/<region>.xml
, où <region>
est un code de région à trois chiffres. J'ai pu découvrir dans la Wayback Machine les codes bra
(Brésil), chn
(Chine), deu
(Allemagne), esp
(Espagne), fra
(France), gbr
(Grande-Bretagne), hkg
(Hong Kong), jpn
(Japon), prt
(Portugal), et usa
(États-Unis). Je ne sais pas ce qui se passe si vous n'êtes pas dans un de ces pays. Malgré la division en région, certains de ces fichiers sont exactement les mêmes, et il y a un filtrage supplémentaire effectué par l'assistant en fonction d'attributs dans le XML, notamment pour ignorer tous les fournisseurs qui ne sont pas disponibles dans une langue particulière.
J'ai publié un fichier XSD pour valider un Provider Manifest, qui inclut un peu de documentation sur le fonctionnement du fichier. Bien que je pourrais utiliser un serveur Web local et un peu de bricolage pour définir mon propre manifest, je ne vais pas le faire et je ne vais pas m'attarder plus sur ce document, car l'assistant peut parfaitement bien fonctionner sans, et on peut bricoler plus facilement en ajoutant des clés dans le registre soi-même.
Clés du registre
La liste des fournisseurs regroupée par type d'assistant Web se trouve dans HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\PublishingWizard
. Cette clé contient trois sous-clés, une pour chaque assistant : PublishingWizard
pour la publication Web, InternetPhotoPrinting
pour l'impression de photos, et AddNetPlace
pour l'ajout de favoris réseau.
Dans chacune de ces clés, on trouve une valeur DefaultProvider
qui indique le dernier fournisseur sélectionné par l'utilisateur. On peut aussi parfois trouver une sous-clé LocationMRU
, qui n'est utilisée que par l'assistant d'ajout de favori réseau pour conserver un historique des emplacements réseau saisis par l'utilisateur. Enfin, il y a une autre sous-clé, Providers
, la plus intéressante. Elle contient une clé pour chaque fournisseur, qui doit juste être nommée après un identifiant unique quelconque pour le fournisseur. On peut y ajouter 5 valeurs :
DisplayName
- Nom du fournisseur affiché à l'utilisateur.
Description
- Description du fournisseur, affiché en dessous du nom dans la liste.
HREF
- URL de la première page à charger dans l'assistant pour ce fournisseur. Si cette valeur est absente, c'est le formulaire de saisie d'emplacement réseau qui s'affiche.
IconPath
- Optionnel. Chemin d'accès vers une icône sur le disque. Le Provider Manifest permet de spécifier une URL, mais l'icône sera téléchargée sur le disque et le registre ne contient qu'un chemin d'accès.
-
Si on utilise un chemin relatif, Windows utilisera les dossiers dans la variable d'environnement
PATH
pour trouver le fichier ; par exemple, on peut écrire directementlol.ico
si on veut pointer versC:\WINDOWS\system32\lol.ico
. -
On peut utiliser une icône incluse comme ressource dans un exécutable Windows, comme par exemple une icône qui se trouve dans
shell32.dll
, avec l'identifiant de l'icône après une virgule :shell32.dll,-172
. SupportedTypes
- Liste de types de fichiers pris en charge par ce fournisseur, séparée par des points-virgule :
*.jpg; *.png
. Le fournisseur ne sera affiché dans la liste que si un des fichiers sélectionné par l'utilisateur correspond à un de ces filtres. Si cette valeur est absente, le fournisseur est toujours affiché. N'a aucun effet sur l'assistant d'ajout de favori réseau.
On trouve également quelques valeurs dans HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\PublishingWizard
. Le registre de Windows est découpé en ruches, en anglais hives, d'où le H
au tout début des noms de registres. Nous étions jusque là dans la ruche HKCU, qui est une ruche spécifique à chaque utilisateur. Changer de session changerait cette ruche. Maintenant, nous sommes dans HKLM, qui est constant pour tout l'ordinateur.
Dans cette nouvelle clé, on retrouve par défaut uniquement une clé InternetPhotoPrinting
, qui contient deux valeurs :
ContentTypeFilter
- Optionnel. Un filtre équivalent à
SupportedTypes
, mais qui s'applique avant même la sélection du fournisseur et utilise des types MIME au lieu d'extensions de fichier. Il est défini àimage/*
, pour contrainte l'assistant d'impression de photos à ne fonctionner que sur des images. Si cette valeur est absente, tout est autorisé. DefaultIcon
- Optionnel. Une icône par défaut, avec la même syntaxe que
IconPath
, pour les fournisseurs qui n'auraient pas d'icônes ou dont l'icône est introuvable.
Ces deux valeurs peuvent être aussi définies pour PublishingWizard
et pour AddNetPlace
, même si ces clés sont complètement absentes par défaut.
Créer un fournisseur hors-ligne
De l'expérimentation a montré que des URL de type file:///C:\quelquechose.html
fonctionnent, ce qui signifie qu'on peut écrire un fichier HTML sur son ordinateur, modifier le registre, et créer son propre fournisseur directement. Je vais créer un fournisseur Hello World de démonstration pour montrer comment ça marche, et on verra dans un prochain article comment je me suis construit de meilleurs outils pour jouer avec cet environnement bizarre.
Ajouter le fournisseur au registre
On va commencer par faire apparaître le fournisseur dans la liste. Vous pouvez vous amuser à créer des valeurs à la main, ou vous pouvez enregistrer ce texte dans un fichier .reg
et l'importer avec l'Éditeur du Registre :
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\PublishingWizard]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\PublishingWizard\InternetPhotoPrinting]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\PublishingWizard\InternetPhotoPrinting\Providers]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\PublishingWizard\InternetPhotoPrinting\Providers\demo]
"HREF"="file:///C:\\demo.html"
"IconPath"="shell32.dll,31"
"DisplayName"="Hello World"
"Description"="Une incroyable démonstration de fournisseur d'impression de photos."
Notez que j'assume que votre fichier de démonstration se trouvera dans C:\demo.html
. Modifiez la valeur de HREF
si ça ne vous convient pas !
Créer une page Web
On va créer C:\demo.html
, pour l'instant avec une démonstration absolument splendide :
<html>
<head>
<title>Hello World!</title>
</head>
<body>
<marquee><h1>Bonjour le monde !</h1></marquee>
</body>
</html>
Rien qu'avec ça, on peut déjà ouvrir notre assistant d'impression de photos, et on verra apparaître un fournisseur appelé Hello World, avec une icône de corbeille. Par contre, si on sélectionne le fournisseur, l'assistant ne sera pas très content et indiquera qu'il y a une erreur avec cette page Web. Il nous faut en fait un petit peu plus que seulement du HTML, car ce n'est pas une page Web banale.
Utiliser l'API ActiveX
Je ne vais pas rentrer dans le détail sur les fonctionnalités de l'API ActiveX fournie par l'assistant Web. Je vous laisse pour cela référer aux pages de documentation officielles mentionnées précédemment, ainsi qu'à la référence du WebWizardHost
. Sachez seulement qu'il est nécessaire d'ajouter du code JavaScript ou VBScript qui, au chargement de la page, va activer le bouton Précédent de l'assistant pour que l'utilisateur ne soit pas coincé, et qui gère l'événement onback
pour répondre à un appui sur ledit bouton et indiquer à l'assistant qu'on abandonne complètement et retourne à la sélection de fournisseur.
<script language="JavaScript">
window.onload = function () {
window.external.SetWizardButtons(1, 0, 0);
}
window.onback = function () {
window.external.FinalBack();
}
</script>
Si on sélectionne notre fournisseur à présent, une page s'affiche avec un gros texte défilant indiquant « Bonjour le monde ! ». Tout est toujours plus joli avec un marquee. Ça rime. Le bouton Précédent est disponible, et cliquer dessus nous renvoie bien à la liste des fournisseurs.
Conclusion
Cette première promenade dans une fonctionnalité Web de Windows XP était assez fructueuse. Il y aura certainement des endroits où l'exploration ne sera pas aussi facile. Je n'ai pas vraiment fait grand chose ici avec ce que j'ai appris ; ce sera l'objet de futurs articles.
J'ai encore beaucoup à apprendre sur le fonctionnement exact du Transfer Manifest pour pouvoir faire des choses vraiment intéressantes, implémenter de véritables fournisseurs comme par exemple ajouter un mode de publication sur le Web qui enverrait vers un serveur que je contrôle, ou l'ajout d'emplacements réseau depuis Nextcloud, qui supporte WebDAV, ou d'autres protocoles que Windows XP ne prend pas vraiment en charge.
J'ai également mentionné très rapidement VBScript ; je n'ai jamais codé avec VBScript, mais c'est un des deux langages de script qu'Internet Explorer prend en charge. Les deux langages semblent avoir leurs avantages et leurs inconvénients lorsqu'il s'agit d'explorer l'API ActiveX dans window.external
, donc je voudrais pouvoir utiliser les deux pour avoir plus d'outils à disposition.
Enfin, avoir à modifier un script et recharger le fournisseur pour pouvoir expérimenter, parfois rouvrir l'assistant entier si quelque chose s'est mal passé, c'est assez lourd. J'aimerais bien pouvoir avoir un équivalent de la console du développeur, dont je dispose même sous Windows XP via Internet Explorer 8...
Commentaires
Il n'y a pour l'instant aucun commentaire. Soyez le premier !