Hyper‑V : corriger les crashs VM « CRITICAL_STRUCTURE_CORRUPTION (Bug Check 0x109) » sur Windows 10 et Windows Server 2022

Des VM Hyper‑V (Windows 10 Pro et Windows Server 2022) redémarrent plusieurs fois par jour avec CRITICAL_STRUCTURE_CORRUPTION (0x109). Voici une méthode éprouvée, pas à pas, pour diagnostiquer, isoler puis corriger ces crashs récurrents.

Sommaire

Contexte et symptômes observés

  • Hôte Hyper‑V Server 2016 à jour, hébergeant six machines virtuelles : quatre Windows 10 Pro et deux Windows Server 2022 Standard.
  • Trois VM (deux Windows 10, une Windows Server 2022) s’arrêtent brutalement plusieurs fois par jour avec le code 0x109.
  • Les journaux Hyper‑V reprennent l’ID d’arrêt invité et les quatre paramètres du bug check.
  • DISM /RestoreHealth, SFC /scannow, CHKDSK /R /F ne détectent aucune anomalie.
  • Les minidumps pointent vers ntoskrnl.exe à des offsets variables : signature typique d’une corruption mémoire causée en amont par un pilote tiers ou un défaut matériel.

Ce que signifie CRITICAL_STRUCTURE_CORRUPTION (0x109)

Ce bug check est déclenché quand le noyau détecte une altération de structures critiques : code en lecture seule, descripteurs de mémoire, listes internes, etc. Dans la pratique, les causes les plus fréquentes sont :

  • Défaillance de RAM (invité ou hôte) ou de contrôleur mémoire.
  • Pilote en mode noyau instable (filtre réseau, antivirus/EDR, cryptage, sauvegarde/VSS, pilote de stockage virtuel, anti‑cheat, outils d’overclocking).
  • Corruption de stockage (VHDX, contrôleur virtuel, file system) ou délais/E/S anormaux.

Les paramètres d’un 0x109 aident à classer l’incident :

  • P1 : catégorie de corruption (p. ex. modification de mémoire en lecture seule, MDL invalide, structure noyau incohérente).
  • P2 : détail additionnel (souvent un code/flag), utile pour WinDbg.
  • P3 : adresse de la structure touchée (indicateur précieux pour remonter au composant fautif).
  • P4 : valeur complémentaire/réservée selon le cas.

Check‑list express de stabilisation

  1. Figer le contexte : désactiver toute forme d’overclocking (hôte et invités), vérifier que les VM ne sont pas sur‑allouées (CPU/RAM), et activer la génération de kernel dumps complets.
  2. Mettre à jour : BIOS/firmware hôte, pilotes de contrôleurs hôte (stockage/NIC), et Services d’intégration Hyper‑V dans chaque VM.
  3. Tester la mémoire : hôte via MemTest86/Windows Memory Diagnostic ; invités si possible hors production.
  4. Isoler les pilotes tiers : activer Driver Verifier ciblé sur non‑Microsoft, démarrer en clean boot dans les VM affectées.
  5. Contrôler le stockage : cohérence VHDX, latences, événements disque (storport, disk), et intégrité des contrôleurs virtuels.
  6. Corréler les journaux : Event Viewer Hyper‑V‑VMMS / Hyper‑V‑Worker, System, et minidumps via WinDbg.

Plan de diagnostic détaillé

Mesures immédiates côté invité

Assurez‑vous que chaque VM produit un kernel memory dump exploitable :

sysdm.cpl
> Avancé > Démarrage et récupération > Écriture des informations de débogage : 
  - Décharge de la mémoire du noyau
  - Répertoire : %SystemRoot%\MEMORY.DMP
  - Écraser tout fichier existant : coché

Activez la protection supplémentaire des prises mémoire et un tag de pool pour faciliter l’analyse :

gflags /r +ptg

Tester la mémoire (hôte et invités)

Même si plusieurs VM seulement plantent, un défaut RAM hôte peut être non déterministe et n’impacter que certaines pages mappées. Procédez comme suit :

  • Hôte : exécuter un test prolongé (plusieurs passes) avec un outil dédié. Idéalement, planifier une fenêtre de maintenance et charger la RAM au maximum.
  • Invités : si possible, arrêter l’un des invités affectés et exécuter un test mémoire depuis un ISO de diagnostic.

En parallèle, vérifiez la configuration Mémoire dynamique Hyper‑V :

ParamètreRecommandationImpact
Minimum RAMÉviter les valeurs < 1 Go pour des OS modernesBallooning agressif = fragmentation et pression mémoire
Maximum RAMNe pas dépasser la RAM physique disponibleSur‑allocation = paging, contention, timeouts pilotes
Buffer10–20 % en production typiqueMarges pour pics transitoires

Mettre à jour composants critiques

  • Services d’intégration / Guest Services : depuis Windows 10/Server 2016, ils sont inclus et mis à jour via Windows Update. Vérifiez dans chaque VM : Get-Service vm* | Sort-Object Status,Name | Format-Table -Auto
  • Pilotes de stockage & réseau invités : réinstallez/actualisez :
    • Filtres NDIS (agents EDR/IDS, QoS, pare‑feu tiers),
    • Filtres de stockage (chiffrement, HSM, antivirus à accès direct),
    • Agents de sauvegarde (VSS provider, CBT).
  • Hôte Hyper‑V : appliquez microcodes CPU, BIOS/UEFI, pilotes NIC (RSS/VMQ/SR‑IOV), contrôleurs HBA/RAID.

Vérifier la charge et la sur‑allocation

Inspectez la pression CPU/RAM/stockage en continu :

# Hôte : liste RAM/CPU par VM
Get-VM | Select Name, State, CPUUsage, MemoryAssigned, Uptime | Format-Table -Auto

# Disques virtuels : IOPS, latence

Get-VMHardDiskDrive | Get-VHD | Select Path, VhdType, VhdFormat, FileSize, Size, FragmentationPercentage 

Surveillez les Event IDs typiques côté invité : 129/153/157 (storport/disk), 41 (Kernel‑Power), avertissements volsnap/VSS. Une latence élevée ou une fragmentation VHDX peut accentuer des timings qui exposent des pilotes fragiles.

Analyser les journaux Hyper‑V et Windows

Où chercher :

  • Event Viewer > Applications and Services Logs > Microsoft > Windows > Hyper‑V‑VMMS et Hyper‑V‑Worker : erreurs corrélées au moment du bug check (arrêt invité, reset, watchdog).
  • System : storport/disk/ntfs, miniport NIC, ACPI, WHEA (Machine Check).

Exemples PowerShell :

# Événements Hyper‑V autour des 2 dernières heures
$since=(Get-Date).AddHours(-2)
Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-Hyper-V-Worker-Admin'; StartTime=$since} | 
  Select TimeCreated, Id, LevelDisplayName, Message | Format-Table -Auto

# Disque/Storport

Get-WinEvent -FilterHashtable @{LogName='System'; Id=@(129,153,157)} |
Select TimeCreated, ProviderName, Id, Message | Format-Table -Auto 

WinDbg : tirer parti des minidumps

Le fait que ntoskrnl.exe apparaisse avec des offsets divers n’innocente pas un pilote tiers ; cela signifie plutôt que la corruption s’est produite avant le crash pointé. Procédure type :

.symfix
.reload
!analyze -v
.bugcheck
kv
!thread
!process 0 1
!poolused 2
!memusage 1
lmtn

Points d’attention :

  • !analyze -v : donne la classe de corruption (interprétez P1–P4) et liste souvent le pilote le plus suspect.
  • lmtn : modules non Microsoft chargés (versions, timestamps) ; ciblez les plus récents ou non signés.
  • !poolused : fuites et tags de pool anormaux (activez le pool tagging via gflags si besoin).

Activer Driver Verifier (ciblé)

Driver Verifier force les chemins d’erreur des pilotes instables. Activez‑le uniquement sur les pilotes non‑Microsoft des VM affectées, idéalement en créneau de maintenance car il peut provoquer des crashs volontaires révélateurs.

Option VerifierPourquoiRemarques
Special PoolDétecte débordements/underruns de buffersTrès utile sur filtres NDIS/stockage
Force IRQL CheckingSignale l’usage d’API au mauvais IRQLExpose rapidement les DPC mal gérés
Pool TrackingIdentifie leaks et free invalidesÀ combiner avec Special Pool
Security ChecksVérifie structures/limitesComplémente 0x109/0x139
DMA VerificationPour pilotes faisant du DMASurveillez l’impact perf
# Lister pilotes non‑Microsoft
pnputil /enum-drivers | findstr /I /V "Microsoft Windows"

# Activer Driver Verifier (sélectif)

verifier /standard /driver 

# Vérifier l’état

verifier /querysettings

# Désactiver au besoin (mode sans échec si boot loop)

verifier /reset 

Comparer les VM touchées vs saines

Quand seules certaines VM plantent, inspectez ce qu’elles partagent :

  • Mêmes agents : antivirus/EDR, sauvegarde, chiffrement, monitoring matériel, DLP.
  • Mêmes chemins de stockage : même VHDX parent/diff, même CSV/LUN, même contrôleur virtuel.
  • Même version d’OS : build, cumulative updates, pilotes in‑box.

Automatisez la comparaison :

# Export rapide de la liste de pilotes tiers
Get-WmiObject Win32_PnPSignedDriver |
  Where-Object {$_.DriverProviderName -ne "Microsoft"} |
  Select DeviceName, DriverProviderName, DriverVersion, DriverDate, InfName |
  Export-Csv C:\Temp\drivers_non_ms.csv -NoTypeInformation

# Version de configuration VM et intégration

Get-VM | Select Name, Version
Get-VMIntegrationService -VMName  | Select Name, Enabled, PrimaryStatusDescription 

Stockage : VHDX, contrôleurs, latence

  • VHDX : convertir un différentiels enchaînés en VHDX consolidé (merge) et tester en taille fixe pour éliminer la fragmentation.
  • Contrôleur virtuel : préférer SCSI pour disques de données (hot‑add, file‑trimming). Éviter d’empiler trop de VHDX sur un même contrôleur.
  • Mesures : relevez IOPS/latences et corrélez à l’heure du bug check.
# Exemple&nbsp;: vérifier la fragmentation de VHDX
Get-VMHardDiskDrive -VMName &lt;VM&gt; | Get-VHD |
  Select Path, FileSize, Size, FragmentationPercentage | Format-Table -Auto

Paramètres BIOS/UEFI et sécurité

  • DEP/NX activé, VT‑x/AMD‑V et VT‑d/AMD‑Vi actifs, UEFI Secure Boot correct.
  • Désactiver tout overclocking CPU/RAM/GPU sur l’hôte.
  • Si des composants de sécurité noyau « hookent » la mémoire (anti‑cheat/anti‑rootkit), validez leur compatibilité avec les versions Windows en place.

Procédure d’isolement recommandée

  1. Clonage contrôlé : créer un checkpoint ou exporter une VM instable, la restaurer sur un autre hôte (si disponible). Si le problème disparaît, suspectez le matériel hôte/chemin de stockage ; s’il persiste, la cause est interne à l’invité.
  2. Clean boot invité : msconfig > Services : Masquer les services Microsoft > Désactiver tout > Démarrage : Désactiver les éléments non essentiels redémarrer, puis réactiver par lots pour isoler l’agent fautif.
  3. Driver Verifier ciblé sur les pilotes récemment ajoutés/mis à jour. Collecter immédiatement le dump généré, puis l’analyser dans WinDbg.
  4. Tests de charge : exécuter des charges réseau et disque (copie volumineuse, tests SMB, fio équivalent) pour déclencher le problème de manière reproductible.
  5. Régression : si aucune cause nette, désinstaller/mettre à jour les agents communs (EDR, sauvegarde, chiffrement) un par un, avec redémarrage et observation.

Interpréter les paramètres du bug check

Sans reproduire une table exhaustive, utilisez cette grille :

ParamètreInterprétation pratiqueAction immédiate
P1 : catégorieModification mémoire en lecture seule / structure noyau incohérente / MDL invalidePointer les pilotes filtrant noyau (NDIS, stockage, sécurité)
P2 : flagsCode interne supplémentaireComparer entre crashs pour un motif récurrent
P3 : adresseStructure affectéeDans WinDbg : dd P3 l64, !pte, et !pool
P4 : réserveSelon le casReporter tel quel dans vos notes d’enquête

Scripts utiles de collecte

Regroupez en quelques minutes les informations clés à attacher au ticket d’incident.

# 1) Inventaire OS et correctifs
Get-ComputerInfo | Select OsName, OsVersion, OsBuildNumber, WindowsInstallDateFromRegistry
Get-HotFix | Sort-Object InstalledOn | Select HotFixID, InstalledOn

# 2) Pilotes non Microsoft

Get-WmiObject Win32_PnPSignedDriver |
Where-Object {$_.DriverProviderName -ne "Microsoft"} |
Select DeviceName, DriverProviderName, DriverVersion, DriverDate |
Export-Csv C:\Temp\drivers.csv -NoTypeInformation

# 3) Services d'intégration

Get-VMIntegrationService -VMName  |
Select Name, Enabled, PrimaryStatusDescription

# 4) Événements system critiques & storport

Get-WinEvent -FilterHashtable @{LogName='System'; Level=2} -MaxEvents 200 |
Select TimeCreated, Id, ProviderName, Message | Out-File C:\Temp\system_crit.log
Get-WinEvent -FilterHashtable @{LogName='System'; Id=@(129,153,157)} -MaxEvents 200 |
Select TimeCreated, Id, Message | Out-File C:\Temp\storport.log 

Bonnes pratiques Hyper‑V pour réduire le risque

  • Version de configuration des VM : utiliser la version la plus élevée supportée par l’hôte, cohérente avec l’invité. Vérifier avec Get-VM | Select Name,Version.
  • Affinités & NUMA : éviter d’épingle r les vCPU inutilement ; laisser Hyper‑V planifier. Sur des hôtes multi‑socket, respecter la topologie NUMA.
  • Répartition des VHDX : éviter de concentrer trop d’E/S sur un même CSV/LUN ; surveiller le cache et le journalisation.
  • Backups : préférer des agents compatibles Hyper‑V (VSS) et tester la restauration ; certains outils CBT non certifiés peuvent corrompre des chemins I/O.

Quand envisager des mesures radicales

  • Réinstallation in‑place de l’OS invité : efficace si l’image a hérité d’une corruption logicielle ou d’un empilement de pilotes obsolètes.
  • Migration vers un nouvel hôte : si l’analyse pointe du doigt le matériel (RAM/MCH/CPU) ou un firmware douteux.
  • Conversion disque : passer d’un VHDX dynamique très fragmenté à un VHDX fixe propre.

Exemple de parcours de résolution

  1. Observation : trois VM (2×Windows 10, 1×Server 2022) quittent inopinément avec 0x109, aucun SFC/DISM/CHKDSK en défaut.
  2. Collecte : kernel dumps + journaux Hyper‑V‑Worker + export des pilotes tiers. On constate un filtre NDIS et un agent de sauvegarde communs aux 3 VM.
  3. Isolation : clean boot ; plus de crashs. Réactivation par lots : crash dès réactivation du filtre réseau ; Driver Verifier confirme (0xC4 sous charge réseau).
  4. Action : mise à jour du pilote incriminé + correctif de l’agent de sauvegarde. Re‑tests de charge : plus d’incidents pendant 7 jours.

Tableau récapitulatif des actions prioritaires

AxeActionsRésultat attendu
RAMTests prolongés hôte/VM, ajustement mémoire dynamiqueExclure défaut matériel, réduire pression mémoire
PilotesMAJ/réinstall filtres NDIS/stockage/EDR, Verifier cibléIdentifier et corriger le driver fautif
StockageContrôler VHDX, latences, événements 129/153/157Éliminer corruption et timeouts E/S
ParamètresDésactiver OC, vérifier Secure Boot, VT‑d/AMD‑ViConformité plateforme de virtualisation
Journaux & DumpsWinDbg, Event Viewer, corrélation temporellePreuves solides pour une remédiation ciblée

FAQ ciblée

Pourquoi ntoskrnl.exe ressort‑il toujours ?

Parce que le noyau est l’endroit où la corruption est détectée, pas nécessairement créée. Un pilote tiers peut corrompre la mémoire, puis le noyau tombe en défaut ailleurs. D’où l’importance de Driver Verifier et des dumps complets.

La mémoire dynamique Hyper‑V peut‑elle provoquer un 0x109 ?

Indirectement seulement. Une pression mémoire extrême peut révéler des courses/panneaux mal gérés par des pilotes fragiles. Ajustez Minimum, Maximum et Buffer, surveillez le paging et l’utilisation réelle.

Dois‑je activer HVCI/« Intégrité de la mémoire » dans l’invité ?

Oui si vos pilotes sont compatibles. HVCI peut au contraire prévenir certaines corruptions, mais des pilotes anciens peuvent planter sous charge. Validez d’abord en pré‑production.

Faut‑il réinstaller l’OS invité tout de suite ?

Non. Essayez d’abord la mise à jour des pilotes, l’isolement par clean boot et Driver Verifier. La réinstallation in‑place est le dernier recours, utile si l’image traîne des héritages problématiques.

Conclusion

Les plantages répétés 0x109 dans des VM Hyper‑V sont presque toujours la conséquence d’un pilote noyau instable ou d’une mémoire/plateforme défaillante. En appliquant un protocole rigoureux — tests RAM, mise à jour des composants, analyse WinDbg, Driver Verifier ciblé, contrôle du stockage — vous transformez un incident intermittent difficile en une cause reproductible et donc corrigeable. Gardez des preuves (dumps, journaux, versions) : elles accélèrent grandement la remédiation et évitent les régressions ultérieures.


Annexe : Playbook rapide

  1. Configurer kernel dumps et gflags /r +ptg.
  2. Mettre à jour : BIOS/firmware hôte, NIC/HBA, intégration Hyper‑V, pilotes réseau/stockage/EDR invités.
  3. Tester RAM (hôte → long run, invités si possible).
  4. Contrôler stockage : latence, fragmentation, événements 129/153/157.
  5. WinDbg sur minidump : !analyze -v, lmtn, corrélation P1–P4.
  6. Activer Driver Verifier ciblé sur non‑Microsoft, reproduire.
  7. Clean boot des VM, réactivation par lots, confirmer le composant fautif.
  8. Corriger : mise à jour/remplacement du pilote ou de l’agent, re‑test sous charge.
  9. Si doute matériel : snapshot/export vers autre hôte, comparer le comportement.
  10. Documenter : versions, dumps, commandes, résultats de tests.
Sommaire