lucidiot's cybrecluster

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é.

Capture d'écran de l'Explorateur Windows, où une souris survole le bouton de commande d'impressions en ligne
Bouton de commande d'impressions en ligne

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 :

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 :

  1. L'utilisateur clique sur Suivant après la page de présentation de l'assistant.

  2. 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.

  3. L'assistant tente de charger le Provider Manifest en ligne.

  1. L'utilisateur sélectionne un fournisseur dans la liste et clique sur Suivant.

  2. 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:// ou res://.

    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.

  3. 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.

  4. 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é :

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 directement lol.ico si on veut pointer vers C:\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 !