Introduction

Vous êtes développeur Windows ou C#/NET et vous vous rendez compte que le système Windows est complexe. Ce n’est aussi simple qu’il y parait. Et vous cherchez des pistes pour augmenter vos compétences sur le sujet. Laissez-moi vous aider. Avec mes 25 ans d’expérience en développement logiciel C++, je vais vos donner tous les tips & tricks sur Windows qui feront de vous un maître Jedi (je ne fournis pas le sabre laser).

Microsoft, que peux-tu faire pour moi ?

Sur le site Microsoft, il y a tellement de choses que c’est impossible de trouver par où commencer. Je vous aide. La bible se nomme MSDN Library ou Microsoft Developer Network Library. Progressivement, MSDN Library se trouve renommé en Microsoft Docs. L’url est https://docs.microsoft.com/. Le contenu est énorme en quantité. C’est la documentation officielle des développeurs. On y trouve la documentation de NET, de C++, de SQL Server, Visual Studio, etc. Pour être un expert Windows en développement, il n’y a pas 50 chemins c’est le premier item : Windows.

L’url de docs est la suivante : https://docs.microsoft.com/en-us/windows/apps/desktop/  

Le monde dit “Desktop” est le monde du PC, du poste de travail. On ne parle pas de Web, on parle d’applications Windows traditionnelles. Il y a 4 catégories et un joker :

  • UWP : C’est la plateforme Windows 10 pour les applications et les jeux. Vous pouvez y inclure les API et contrôles UWP
  • Win32 : C’est l’API native des développeurs C/C++. C’est le cœur de Windows
  • WPF : Le modèle WPF fait partie de l’écosystème NET avec son XAML UI
  • Windows Forms : Le modèle WinForms est basé au-dessus du GDI et est un modèle UI léger

Microsoft Press

Si on parle du cœur de Windows, le kernel, les sous-systèmes, les drivers et le mode User & Kernel, il faut livre le livre de Mark Russinovich qu’est « Windows Internal ». C’est le livre de l’Architecture Windows.

On retrouve les principes du système d’exploitation dans docs aussi : https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/overview-of-windows-components

Ce diagramme comporte tous les éléments du système d’exploitation, Windows.

  • Le service control manager : il gère les services Windows User et Kernel
  • LSASS : le gestionnaire local de sécurité
  • WinLogon : le processus de logon
  • Session manager : le gestionnaire de session
  • SvcHost.exe : le processus host générique de services en dll
  • SpoolSvc.exe : le processus gestionnaire de spooler
  • Services.exe : le processus gestionnaire de services
  • Task Manager : le gestionnaire de tâches
  • Explorer : le bureau Windows avec le gestionnaire de fichier, le menu démarrer, etc
  • Les applications User Mode
  • Les sous-systèmes Windows, Linux et les anciens subsystems Posix et OS/2.
  • NTDLL.dll , le runtime dll NT
  • Les modules du Kernel que sont :
  • Les System Service Dispatcher
  • Local procedure call
  • Configuration manager
  • Processes and threads
  • Virtual memory manager
  • Security Monitor
  • Plug and Play Manager
  • Object Manager
  • File System Cache
  • I/O Manager
  • User32, Gdi32
  • Files system drivers
  • Graphics drivers              

Les fichiers systèmes Core de Windows  (extrait de Windows Internals):

Liste des processus System

La liste des processus système qui fonctionnent sur chaque système Windows est :

■ Idle process

■ System process (contient la majorité des threads system en mode kernel)

■ Session manager (Smss.exe)

■ Local session manager (Lsm.exe)

■ Windows subsystem (Csrss.exe)

■ Session 0 initialization (Wininit.exe)

■ Logon process (Winlogon.exe)

■ Service control manager (Services.exe) et le child service process qu’il créé  (comme le processus self-host de service, Svchost.exe)

■ Local security authentication server (Lsass.exe)

Pour bien comprendre l’architecture Windows, il faut distinguer les modes User et Kernel. Cf https://docs.microsoft.com/en-us/windows-hardware/drivers/gettingstarted/user-mode-and-kernel-mode

Ce diagramme illustre la communication entre les composants en mode utilisateur et en mode noyau :

Un processeur dans un ordinateur exécutant Windows a deux modes différents : le mode utilisateur et le mode noyau. Le processeur bascule entre les deux modes en fonction du type de code exécuté sur le processeur. Les applications s’exécutent en mode utilisateur et les composants principaux du système d’exploitation s’exécutent en mode noyau. Alors que de nombreux pilotes s’exécutent en mode noyau, certains pilotes peuvent s’exécuter en mode utilisateur.

Lorsque vous démarrez une application en mode utilisateur, Windows crée un processus pour l’application. Le processus fournit à l’application un espace d’adressage virtuel privé et une table de gestion privée. Étant donné que l’espace d’adressage virtuel d’une application est privé, une application ne peut pas modifier les données appartenant à une autre application. Chaque application s’exécute de manière isolée et si une application se bloque, le plantage est limité à cette seule application. Les autres applications et le système d’exploitation ne sont pas affectés par le plantage.

En plus d’être privé, l’espace d’adressage virtuel d’une application en mode utilisateur est limité. Un processeur exécuté en mode utilisateur ne peut pas accéder aux adresses virtuelles réservées au système d’exploitation. La limitation de l’espace d’adressage virtuel d’une application en mode utilisateur empêche l’application de modifier et éventuellement d’endommager les données critiques du système d’exploitation.

Tout le code qui s’exécute en mode noyau partage un seul espace d’adressage virtuel. Cela signifie qu’un pilote en mode noyau n’est pas isolé des autres pilotes et du système d’exploitation lui-même. Si un pilote en mode noyau écrit accidentellement vers la mauvaise adresse virtuelle, les données appartenant au système d’exploitation ou à un autre pilote pourraient être compromises. Si un pilote en mode noyau tombe en panne, l’ensemble du système d’exploitation se bloque.

Le système d’API Windows alias Win32 fait appel à des API du Kernel qui font appels elle mêmes à des drivers et passent par la HAL pour accéder au matériel. C’est du natif. Métal. D’où l’expression, « build on the metal ». Un autre ouvrage est celui de Jeffrey Richter, la Pape de la Programmation Windows. Lui et Christophe Nasarre ont écrits Windows via C++ :

Le système d’exploitation Windows

A partir de là, on connait l’architecture de base de Windows. Maintenant, on attaque les éléments du système d’exploitation à savoir le kernel et le Scheduler de threads. Windows ordonnance des threads, Linux ordonnance des processus. Ces deux systèmes ne fonctionnent pas de la même façon. La doc sur les Processes & Threads est ici : https://docs.microsoft.com/en-us/windows/win32/procthread/about-processes-and-threads

Ensuite on passe à la pratique, comment créer un thread, un processus, atteindre la fin, etc. La documentation des API appelée aussi documentation de référence est ici: https://docs.microsoft.com/en-us/windows/win32/procthread/process-and-thread-reference

Les exemples les plus faciles sont visualisables via https://docs.microsoft.com/en-us/windows/win32/procthread/process-and-thread-functions#process-and-thread-functions et plus particulièrement la fonction CreateThreadhttps://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createthread?redirectedfrom=MSDN et son exemple: https://docs.microsoft.com/en-us/windows/win32/procthread/creating-threads

Pour tester cela, il faut installer Visual C++ disponible dans Visual Studio 2019 par exemple, Community Edition ou Pro 30 day trial.  Le préambule est peut-être d’avoir des notions de langage C. En effet, les API requiert le passage de structures via des pointeurs et de l’allocation de buffer in, out, in/out. C’est de la programmation système.

Une fois que l’on a compris comment fonctionne Windows en concept et théorie, il faut inspecter la bête et là , il n’y a pas mille outils : c’est la suite SysInternals qu’il faut télécharger sur https://docs.microsoft.com/en-us/sysinternals/downloads/sysinternals-suite

On va y trouver les outils comme :

  • Process Explorer : Task Manager en mieux
  • Proc Mon qui contient aussi Reg Mon : processus monitor et registry monitor : espion de la registry

Tcpview : dump les connexions in/out tcp : indispendable

Voici à quoi ressemble Process Explorer :

Voici à quoi ressemble Process Monitor qui capture les opérations de I/O et de la base de Registres :

Voici TcpView :

En natif, il n’existe pas beaucoup d’outils pour introspecter Windows à part Task Manager et Perf Monitor. Voici PerfMon qui permet d’afficher des compteurs internes au système :

SysInternals est une série d’outils qui ont été faits en C/C++ Win32 dans les années 2000 par Mark Russinovich, le CTO de Azure. Azure c’est Windows Server, Service Fabric & co donc il fallait un boss de Windows et du C/C++ Win32 à sa tête.

Le développement

Pour bien situer les choses il faut les rappeler les notions fondamentales. Windows est fait en C/C++. Windows c’est du natif. Il y a environs 3600 modules dll et 450 modules exe dans %System32%. Cela fait 25 ans que Windows est construit de cette manière et le code a évolué. Au début, il y a beaucoup de C (toujours pour le kernel) et peu de C++. Avec le temps, le C++ a pris position et progressivement le code est passé en C++ moderne avec un usage étendue des fonctionnalités offertes par C++.

Le C++ Moderne

C++ fait l’objet de beaucoup de rumeurs. Difficile, unsafe &  unsecure, dangereux, mais en fait il n’en est rien. Il s’agit de contrevérités dictées par le Marketing pour vendre des langages managés comme Java ou C#. Le but est de discréditer C++ mais cela ne marche pas. En 2011, Herb Sutter, le chairman du comité ISO C++ disait que 2000 était la décennie des langages productifs mais qu’avec le retour du mobile et du traitement des images et des vidéos, le natif reprenait sa place. IL s’agit d’un retour en grâce du fils prodige qui a évolué via C++11, C++14 et C++17 et bientôt C++20. Le C++ est moderne car il comporte des lambdas, des pointeurs intelligents, le support de containers souples et extrêmement rapide. La bibliothèque standard STL propose de nombreuses fonctionnalités et algorithmes prêts à l’emploi. Le code Windows utilise de plus en plus ses fonctionnalités.

Le monde du développement Windows

Il y a deux types de développeur Windows :

  • Les développeurs natifs C++ Win32
  • Les développeurs C#/NET sous Windows Forms ou WPF (ou SilverLight)

Attention, le monde NET est basé sur le Microsoft NET Framework alors que les développeurs natifs utilisent le Windows SDK alias le kit de développement Win32. Il existe plusieurs SDK Windows.

Chaque version de Windows fournit son propre SDK. Exemple :

  • Windows 1903
  • Windows 1909

La technologie XAML

Il existe une technologie que Microsoft a sortie en 2006 qui se nomme XAML. Diffusée au départ via WPF (Windows Presentation Foundation), elle a aussi été diffusée pour SilverLight et Windows Phone. Maintenant, Microsoft pousse une technologie nommée WinUI 3.0 avec XAML Islands qui permet aux application WinForms, WPF et Win32 d’utiliser les contrôles Win32 natifs. WinUI 2.2 est livrée et WInUI 3.0 est en preview et va permettre d’utiliser les contrôles XAML depuis n’importe quelle version de Windows, même Windows 1609 alors que WinUI 2.2 n’est exploitable avec le vieux XAML Islands qu’à partir de Windows 1903. Attention ! Il faut utiliser WinUI 3.0.

Pour bien comprendre pourquoi le XAML passe de WPF à Windows sous forme de contrôles natifs livrés dans System32, il faut faire un rappel sur le nouveau monde Windows.

UWP Universal Windows Platform

Le monde UWP est apparu avec Windows 8, les nouvelles API WinRT et le Store et le fameux modèle Métro renommé Fluent Design.  Initialement, UWP c’est le modèle de développement qui permet de cibler plusieurs plateformes Windows comme Windows Phone, Windows et Xbox et avec le Store d’applications. Avec NET Core, on passe un cran au-dessus avec le multiplateforme sur Windows, Linux et MacOS.

NET Core

NET Core supporte la programmation Windows dite legacy avec WinForms et WPF. En effet, l’environnement de développement Visual Studio possède un nouvel éditeur pour WinForms et WPF pour NET Core. Il est plus rapide car NET Core est plus rapide et léger que NET Framework mais WinForms et WPF ne fonctionnent que sous Windows et pas sous Linux ou MacOS. Pour faire du développement graphique sous Linux il faut utiliser Mono et GTK+ en NET alias GTK Sharp. Masi ce n’est pas du Windows…

NET 5

A partir de Novembre 2020, Microsoft va fusionner NET Framework et NET Core 3.0 pour faire NET 5. La plateforme NET 5 est unifiée. Il y a une technologie NET dédiée pour le Desktop, le Web, le Cloud, le Mobile, le Gaming, l’IoT et l’AI.

Conclusion

Windows est toujours le fleuron car Windows, Office sont toujours les produits phrases de Microsoft. Les tablettes Surface et autre Surface Book consomment de l’Office et du Windows. Windows est rapide, Office est rapide et les applications pour les entreprises sont faites en NET avec Azure. Tel est le monde selon Microsoft et le monde Windows.

Cet article est écrit par Christophe Pichaud, MVP Developer Technologies.