Il se peut que vous subissiez un problème de connexion à vos machines virtuelles via VMConnect.
Dans ce cas, vous trouverez le bulletin officiel concernant ce comportement sur le blog officiel de la division Windows Server : Hyper-V certificate expiration and resolution.
Et l’article technique correspondant : KB967902 - You cannot connect to a virtual machine when the Windows Server 2008 Hyper-V VMMS certificate has expired
Guillaume
Windows Core Support Escalation Engineer
Au delà de la cible initiale de ce blog, nous avons décidé de collationner dans un bulletin mensuel (si nous avons le temps et si nous trouvons des choses intéressantes) les annonces et ressources qui nous paraissent pertinentes et qui concernent les technologies que nous supportons.
Cette newsletter nous permettra de sortir un peu du cadre du support en élargissant le périmètre de ce blog aux nouveautés, évènements, tendances, etc… autour de notre monde.
En voici donc la première édition où l’on parle beaucoup de virtualisation… Vous ne nous en voudrez pas, c’est un sujet très actuel et actif en ce moment !
Microsoft and Red Hat Cooperative Technical Support
Microsoft et Red Hat s’entendent pour travailler en collaboration afin de pouvoir héberger des Red Hat Enterprise Linux dans Hyper-V et des systèmes Windows dans l’hypervisor Red Hat. Red Hat a donc rejoint le programme Server Virtualization Validation Program. L’annonce sur le blog officiel Microsoft : Microsoft and Red Hat Cooperative Technical Support L’annonce de Red Hat
Microsoft et Red Hat s’entendent pour travailler en collaboration afin de pouvoir héberger des Red Hat Enterprise Linux dans Hyper-V et des systèmes Windows dans l’hypervisor Red Hat.
Red Hat a donc rejoint le programme Server Virtualization Validation Program.
L’annonce sur le blog officiel Microsoft : Microsoft and Red Hat Cooperative Technical Support
L’annonce de Red Hat
Citrix Essentials for Hyper-V
Citrix amène à Hyper-V et SCVMM des fonctionnalités d’automatisation avancées. Lien : Citrix Essentials for Hyper-V Demo : Barry Flanagan > StorageLink in Essentials for Hyper-V
Citrix amène à Hyper-V et SCVMM des fonctionnalités d’automatisation avancées.
Lien : Citrix Essentials for Hyper-V
Demo : Barry Flanagan > StorageLink in Essentials for Hyper-V
WindowsServerCalculator
Cet outil permet de calculer le nombre de licences et le coût estimés pour un scénario de virtualisation particulier. Il prend en compte la configuration matérielle de l’hôte Hyper-V (ou d’un hypervisor tiers), des applications Microsoft qui seront virtualisées, etc… Lien : WindowsServerCalculator
Cet outil permet de calculer le nombre de licences et le coût estimés pour un scénario de virtualisation particulier. Il prend en compte la configuration matérielle de l’hôte Hyper-V (ou d’un hypervisor tiers), des applications Microsoft qui seront virtualisées, etc…
Lien : WindowsServerCalculator
Microsoft Hyper-Green
Ressources concernant l’aspect particulier de la virtualisation menant à réduire les coûts et l’empreinte énergétique. Lien : Microsoft Hyper-Green
Ressources concernant l’aspect particulier de la virtualisation menant à réduire les coûts et l’empreinte énergétique.
Lien : Microsoft Hyper-Green
Ressources de quelques uns de nos partenaires concernant le stockage et Hyper-V
The Sun xVM Virtualization Portfolio: Virtualizing the Dynamic datacenter
Best practices for a Microsoft Hyper-V Dynamic Data Center in an HP BladeSystem environment
NetApp Storage Solutions for Microsoft Hyper-V - Optimize Your Virtual Infrastructure by Using 50% Less Storage
Emulex: Enhanced SAN Connectivity with Hyper-V and System Center Virtual Machine Manager
Ou Hyper-V uniquement : Implementing Microsoft Windows Server 2008 Hyper-V with HP ProLiant servers Using HP ProLiant Network Teaming Software with Microsoft Windows Server 2008 Hyper-V How To Un bulletin non officiel pour le Teaming Broadcom : Broadcom NIC Teaming and Hyper-V Un petit rappel du support du Teaming sur un cluster : KB254101 - Network adapter teaming and server clustering
Ou Hyper-V uniquement :
WinHEC
Mis à jour une fois par an à l’occasion de cet évènement, ce site propose quelques documents parfois très technique décrivant les nouveautés technologiques inclues dans les produits Microsoft.
Lien : WinHEC 2008
System Center Virtual Machine Manager 2008 Configuration Analyzer Update 1
Cet outil permet d’identifier les éventuels problèmes de configuration logiciels ou matériels des machines qui sont ou seront utilisés par SCVMM (serveur SCVMM, agents SCVMM, VMware Virtual Center, machines éligibles au P2V, agent SCOM). Lien : Téléchargement
Cet outil permet d’identifier les éventuels problèmes de configuration logiciels ou matériels des machines qui sont ou seront utilisés par SCVMM (serveur SCVMM, agents SCVMM, VMware Virtual Center, machines éligibles au P2V, agent SCOM).
Lien : Téléchargement
Les Data Centers de 4ème génération
Si vous étiez aux TechDays vous avez pu assister à la présentation de ces nouveaux types de centres de traitement par Bernard Ourghanlian. Voici la vidéo illustrant le concept :
Si vous étiez aux TechDays vous avez pu assister à la présentation de ces nouveaux types de centres de traitement par Bernard Ourghanlian.
Voici la vidéo illustrant le concept :
L’Agility Center
Partenaires historiques, IBM, Intel et Microsoft s’associent pour vous proposer le nouveau socle de virtualisation de votre infrastructure. Prêt à l’emploi, tout intégré, l’Agility Center offre une solution économique pour une infrastructure performante, évolutive et hautement disponible. Basé sur le châssis BladeCenter S d'IBM cette solution dispose d'un haut niveau d'intégration. L'Agility Center vous permet de proposer à vos clients une solution « tout en un » intégrant dans un châssis de 7U : 4 lames équipées des dernières technologies processeurs Intel 1 stockage performant, flexible et mutualisé de type SAN (SAS 3 Gb) 3 licences Windows Server® 2008 Datacenter avec Hyper-VTM (incluant un nombre illimité de licences Windows Server® pour les machines virtuelles) 1 licence Windows Server® 2008 Standard pour le serveur d'administration Les licences System Center (SCVMM et SCDPM) pour administrer, sauvegarder et restaurer la plateforme de virtualisation
Partenaires historiques, IBM, Intel et Microsoft s’associent pour vous proposer le nouveau socle de virtualisation de votre infrastructure. Prêt à l’emploi, tout intégré, l’Agility Center offre une solution économique pour une infrastructure performante, évolutive et hautement disponible.
Basé sur le châssis BladeCenter S d'IBM cette solution dispose d'un haut niveau d'intégration. L'Agility Center vous permet de proposer à vos clients une solution « tout en un » intégrant dans un châssis de 7U :
Lien : Agility Center
Guide de licencing pour les hébergeurs
Ce document de 28 pages couvre des scénarii comme : Unmanaged dedicated server with Hyper-V Virtual dedicated server (VDS) for Web scenarios (using Windows Server guests in anonymous mode) Virtual dedicated server with line-of-business (LOB) scenarios (using Windows Server guests in authenticated mode) Use of virtualization in shared hosting scenarios Desktops as Hyper-V guests End customers running Microsoft products using the customers own licenses on the guest OS
Ce document de 28 pages couvre des scénarii comme :
Lien : Hyper-V Hosting Guidance: Using and Licensing Microsoft Server Products in Hyper-V Virtual Hosting Scenarios
Windows 7 et Windows Server 2008 R2
Compilation non exhaustive des nouvelles fonctionnalités de ces deux systèmes qui ne font pas forcément la une :
Support matériel pour Windows 7
Quelques drivers et logiciels pour les périphériques Microsoft pour Windows 7 (LifeCams, Presenter Mouse 8000, …).
Lien : Microsoft Hardware Support for Windows 7
Partagez vos documents, photos, etc… depuis Windows 7
Avec cet outil, vous pourrez partager vos données avec les personnes que vous souhaitez.
Lien : Windows Live ID Sign-in Assistant 6.5 (Beta)
Un peu d’information technique sur Direct Access
Vous connaissez peut-être cette fonctionnalité qui permet d’accéder aux ressources d’un réseau d’entreprise sans monter de VPN mais en restant très sécurisé ? Non ? Voici un document qui présente l’architecture technique nécessaire pour faire fonctionner cette technologie (ou pourrait-on dire cette combinaison de technologies). Lien : Technical Overview of DirectAccess in Windows 7 and Windows Server 2008 R2
Vous connaissez peut-être cette fonctionnalité qui permet d’accéder aux ressources d’un réseau d’entreprise sans monter de VPN mais en restant très sécurisé ?
Non ? Voici un document qui présente l’architecture technique nécessaire pour faire fonctionner cette technologie (ou pourrait-on dire cette combinaison de technologies).
Lien : Technical Overview of DirectAccess in Windows 7 and Windows Server 2008 R2
Windows Vista Resource Kit en téléchargement
Sous forme d’un PDF de 45MB. Lien : Windows Vista Resource Kit, 2nd Edition
Sous forme d’un PDF de 45MB.
Lien : Windows Vista Resource Kit, 2nd Edition
In the cloud…
Iron Mountain a annoncé la disponibilité de sa solution CloudRecovery pour System Center DPM 2007. Lien : ONLINE BACKUP AND RECOVERY FOR Microsoft® System Center Data Protection Manager (DPM) 2007 Lien : Microsoft DPM website for cloud backup
Iron Mountain a annoncé la disponibilité de sa solution CloudRecovery pour System Center DPM 2007.
Lien : ONLINE BACKUP AND RECOVERY FOR Microsoft® System Center Data Protection Manager (DPM) 2007
Lien : Microsoft DPM website for cloud backup
Windows “Expert mode” ?
Why doesn't Windows have an "expert mode"?
Et une dernière pour la route
Parcequ’il y a du lourd de chez lourd dans cette équipe : How the Red Dog dream team built a cloud OS from scratch
Vincent & Guillaume
Dans ce bulletin, je vais aborder l’aspect de l’aggrégation de lien aussi appelée “Teaming” sur les plateformes Hyper-V. Il y a d’autres applications liées à cette fonctionnalité comme la tolérance de panne, ou répartition de charge mais j’en resterais à la fonctionnalité générique.
Pour plus de détails : Tutorial on Link Aggregation and Trunking
En ce qui concerne la mise en oeuvre d’une telle solution sur des serveurs Windows, la politique de support de Microsoft n’est pas ambigüe : les technologies mises en oeuvre pour faire du teaming sont supportées par le fabricant des cartes réseau. La fiche technique suivante en est l’application : KB254101 - Network adapter teaming and server clustering.
Ce qui peut vouloir dire en clair : dans le cas où un dysfonctionnement interviendrait et dans lequel la pile réseau pourrait être impliquée, Microsoft n’a pas les moyens de diagnostiquer les problèmes qui pourraient provenir d’un composant tierce partie. Ce qui implique que dans de telles configurations, le Support Microsoft pourrait avoir à demander la désactivation du teaming pour isoler les composants afin de mettre en évidence celui qui pourrait être la cause du problème.
Cependant, cette fiche n’aborde que l’aspect cluster… alors qu’en est-il pour Hyper-V ?
La réponse est la même que pour le cluster à la différence qu’il n’existe aucun document officiel le spécifiant… Du moins pas encore.
Alors que faire ? La réponse est simple encore une fois : se reposer sur le constructeur.
HP a mis à disposition un document public décrivant la façon de mettre en oeuvre sa solution de teaming pour Hyper-V : Using HP ProLiant Network Teaming Software with Microsoft Windows Server 2008 Hyper-V.
En ce qui concerne Broadcom, rien à l’horizon (du moins, je n’ai rien trouvé). Cependant, quelques testeurs sont parvenus à faire fonctionner la solution Broadcom (Broadcom Advanced Control Suite) sur Hyper-V :
Using VMM to manage you Hyper-V NIC teams created with BACS Broadcom NIC Teaming and Hyper-V
Using VMM to manage you Hyper-V NIC teams created with BACS
Broadcom NIC Teaming and Hyper-V
Note : ces liens n’engagent en rien Microsoft sur la faisabilité ni la supportabilité de ce qui y est décrit.
Quelques liens supplémentaires vers des ressources constructeurs (il y en a d’autres bien sûr) :
Dell - Hyper-V Important Information Guide
Dell Networking Solutions Guide for Microsoft Hyper-V
HP Virtualization with Microsoft où l’on peut trouver un lien vers la matrice de supportabilité des serveurs HP pour Hyper-V : Windows support for HP ProLiant Servers
IBM System x and BladeCenter servers with Microsoft virtualization
Autre question que l’on m’a posé lorsque j’ai présenté Hyper-V : comment configurer le teaming dans un serveur Core ?
Je sais que HP, via le SmartStart Scripting Tookit, permet d’exporter une configuration de teaming dans un fichier XML et de l’importer sur un autre serveur en ligne de commande. Ce qui se révèle assez aisé.
Pour les autres solutions, je n’en ai pas la moindre idée… et vous me pardonnerez !
Suite au bulletin identifiant après quelques mois les incidents le plus souvent rencontrés avec Hyper-V, voici le premier bulletin présentant les meilleurs pratiques a adopter afin d’optimiser la mise en place de Hyper-V.
Certains comportements, peut-être liées au côté parfois un peu intrusif des anti-virus (ou au côté parfois un peu protecteur des mécanismes Windows), peuvent avoir pour conséquences certains dysfonctionnements comme ceux-ci :
Dans ces cas de figure, nous recommandons d’ajouter des exclusions au scan temps-réel des anti-virus installés sur les hôtes.
Exclure :
Vous retrouverez l'intégralité de l'article technique à l'adresse suivante : http://support.microsoft.com/kb/961804
Pour de plus amples informations, je vous propose de vous inscrire pour assister à la JTE du 31 mars prochain :
http://blogs.technet.com/windowsinternals/archive/2008/12/18/journ-e-technique-d-expertise-th-matique-windows-server-2008.aspx
Raphael
Windows Core Support Engineer
Les problématiques de performances dégradées sont régulièrement remontées à notre attention dans le cadre de notre métier de support. Parmi elles, les consommations excessives de certains types de pool mémoire que nous appelons entre nous les 2019 et les 2020.
Ce bulletin va donc traiter de ces problématiques.
Ici nous allons nous focaliser uniquement sur l'architecture 32Bits.
Par défaut, sous Windows 32bits chaque processus utilisateur peut avoir jusqu'à 2Go d'espace d'adressage privé et le système prend les 2 autres restants. Ci-dessous un schéma représentant l'espace d'adressage virtuel en 32Bits.
Il est possible d'allouer plus de mémoire en mode user via l'option /3GB dans le boot.ini. Cette option n'est exploitable que pour des applications qui sont à même d'utiliser de l'espace mémoire au delà des 2Go, c'est à dire celle compilées pour avoir dans leur fichier image le flag IMAGE_FILE_LARGE_ADDRESS_AWARE. Ce fût le cas par exemple, pour des applications de base de données entre autres.
L'utilisation de l'option /3GB ne doit pas être prise à la légère. Le fait d'utiliser cette option, va allouer 3Go en mode User et réduire de 1Go le mode kernel, donc notre kernel n'a plus qu'un seul Giga pour son utilisation. Comme vous le comprendrez cela peut avoir un impact sur les performances.
Dans l'espace Kernel nous avons entre autre 2 espaces mémoire appelés Paged Pool et Non Paged Pool.
Le Paged Pool est la région de la mémoire virtuelle de l’espace système qui peut être déchargée vers le fichier de pagination puis rechargée en mémoire physique.
Les pilotes de périphérique qui n’ont pas besoin d’accéder à la mémoire depuis le niveau DPC/Dispatch ou supérieur peuvent utiliser le pool paginé, qui est accessible depuis n’importe quel contexte de processus.
Le Non Paged Pool se compose de plages d’adresses virtuelles qui sont assurées de résider en permanence en mémoire physique et auxquelles on peut donc accéder en permanence (depuis n’importe quel IRQL et contexte de processus) sans risquer d’avoir une faute de page.
Les pilotes faisant appel à ces espaces mémoire utilisent les fonctions comme ExAllocatePoolWithTag et ExFreePoolWithTag.
Ces 2 espaces mémoire ne sont pas illimités : En fonction de la taille de la mémoire physique et de l'utilisation où pas du /3GB la quantité de Paged Pool et Non Paged Pool peut être différente.
Ci-dessous un tableau indiquant approximativement la quantité de Paged Pool et Non Paged Pool dans Windows 2000 :
Ci-dessous un tableau indiquant approximativement la quantité de Paged Pool et Non Paged Pool Windows 2003 32Bit :
Si vous voulez connaître la taille maximale de Non Paged Pool ou Paged Pool disponible sur votre serveur (taille calculée au démarrage du serveur), suivre la procédure suivante :
Il arrive parfois que vous ayez un serveur qui devient de plus en plus lent jusqu'au hang total du serveur lui même, vous obligeant à procéder à un redémarrage électrique du serveur.
Fréquemment ce genre de problème est lié à un manque de ressources. Nous allons voir ici, le manque de ressources lié au Paged Pool ou Non Paged Pool.
Suite au redémarrage du serveur, le fonctionnement redeviens normal, jusqu'à la prochaine apparition des problèmes de lenteur et/ou de hang. Il peut se passer plusieurs heures, plusieurs jours ou plusieurs semaines avant la réapparition des symptômes.
Généralement si vous regardez dans le journal Système vous devriez trouver des erreurs de source Srv et comme Event ID 2019 ou 2020. Les 2019 correspondent à un manque de Non Paged Pool et les 2020 à un manque de Paged Pool.
Event ID 2019
Event Type: Error Event Source: Srv Event Category: None Event ID: 2019
Event Type: Error
Event Source: Srv
Event Category: None
Event ID: 2019
Description: The server was unable to allocate from the system NonPaged pool because the pool was empty.
Event ID 2020
Event Type: Error Event Source: Srv Event Category: None Description: The server was unable to allocate from the system paged pool because the pool was empty.
Description: The server was unable to allocate from the system paged pool because the pool was empty.
Ce manque de Paged Pool ou Non Paged Pool est souvent lié à une fuite mémoire (memory leak).
C'est le Service Serveur (Srv.sys) qui logue ces erreurs. Dans de rare cas il se peut que le Service Server ne puisse pas générer ces évents, toutefois cela ne veut pas dire que ce ne soit pas un problème avec les Paged Pool ou Non Paged Pool.
Lorsque vous avez des symptômes de lenteur qui apparaissent dans le temps avec l'un des 2 évènements ID cité ci-dessus, le plan d'action à mettre en place est le suivant :
Perfmon
Memsnap (fournis dans les Support Tools se trouvant sur le CD d'installation de Windows 2003)
Planifier l'exécution de Memsnap
Lorsque le problème se reproduit, vous allez analyser le fichier de log Perfmon généré.
Dans ce log Perfmon, vous devez regarder dans l'objet Memory (Mémoire) les compteurs:
Vous devez mettre à l'échelle ces compteurs afin de voir leur progression dans le temps.
Dans le cas d'une fuite mémoire, vous devriez voir une consommation croissante sans relâchement de la mémoire Paged Pool ou Non Paged Pool, la consommation peut être linéaire, par escalier ou brutal.
Ci-dessous un exemple de fuite mémoire, ici en blanc et concernant le Non Paged Pool:
Après avoir identifié la fuite mémoire, vous pouvez regarder dans l'objet Processus (Process) les compteurs Pool Non Paged Bytes et/ou Pool Paged Bytes afin de voir si l'un des processus est à l'origine de la fuite mémoire. Si vous ne trouvez pas un processus qui semble effectuer une fuite mémoire ou si c'est le processus System, vous devez analyser le log Memsnap afin d'identifier quel driver est à l'origine de la fuite mémoire.
Memsnap va permettre de prendre des "clichés" de l'utilisation de l'espace mémoire du Paged Pool et Non Paged Pool.
Lorsqu'un composant fait une demande d'allocation de cette mémoire, un tag est positionné afin de pouvoir suivre les demandes d'allocations. Ce tag est comme une balise, qui nous permettra d'identifier le driver.
Le tag est sur 4 Bytes, chaque drivers a en principe un tag qui lui est propre.
Ci-dessous un petit extrait du fichier Memsnap
Dans le log Memsnap, vous devez regarder quel tag consomme de façon croissante du Paged Pool ou Non Paged Pool.
Une fois que vous avez identifié le Tag, vous pouvez rechercher quel driver utilise ce tag.
Pour cela, via un cmd, positionnez-vous dans le répertoire Windows\System32\Drivers puis exécuter la commande suivante:
C:\WINDOWS\system32\drivers>Findstr /M "XXXX" *.sys (XXXX correspond au tag)
Ensuite en fonction du résultat, contacter l'éditeur de ce driver afin de lui remonter le problème et obtenir un correctif ou mettre à jour vous même le drivers vers une version plus récente.
Dans un prochain bulletin, nous parlerons des problèmes de lenteurs et de hang liés à un manque de Paged Pool et Non Paged Pool sans qu’il y ait de fuite mémoire (memory leak).
Philippe
Windows Core Senior Support Escalation Engineer
Une nouvelle journée de geeks en perspective ! Malheureusement réservée encore une fois à nos clients Premier. Elle prendra place le 31 Mars 2009.
Nous serons plus nombreux cette fois, car Serge, Vincent, Philippe, Hervé et moi-même seront sur les planches !
“Au cours de la présentation des différentes solutions de virtualisation Microsoft, nous verrons comment une entreprise peut mener à bien la consolidation de son environnement en le virtualisant. L’objectif étant d’assurer la stabilité de la plateforme virtualisée tout en s’appuyant sur le Failover Clustering et les bonnes pratiques, facilitant à terme le passage des environnements critiques sur ce type de plateforme en assurant un niveau de disponibilité élevé.”
Matinée
Hyper-V
SCVMM
Après-midi
MEDV / App-V
DPM et Hyper-V
Seront présents également des Product Managers, des représentants du licencing et des managers des équipes support qui pourront répondre à vos questions.
Comme indiqué plus haut, cette journée est réservée aux clients Premier. Pour ceux d’entre vous qui disposent d’un tel contrat, contactez votre TAM pour obtenir les modalités d’inscriptions.
Nous vous donnons rendez-vous pour cette journée qui vous permettra d’appréhender les solutions de virtualisation proposées par Microsoft en comprenant ce qui se cache derrière les acronymes.
Nouvelle alerte proactive concernant Windows…
Les kits permettant de bloquer l’installation automatique du Service Pack 3 de Windows XP et du Service Pack 1 de Windows Vista depuis Windows Update vont bientôt expirer.
Une FAQ concernant ces kits de blocage est disponible ici.
Je ne saurais trop vous recommander de vous préparer à ces mises à jour :
Chacun devrait le savoir, WSUS 2.0 SP1 ne sera plus supporté à partir de la fin Avril 2009, tout comme la version 3.0 (RTM = SP0). Reste donc WSUS 3.0 SP1 aussi appelé WSUS 3.1.
Plus d’informations sur la fin du support sur la page FAQ du produit : http://technet.microsoft.com/en-us/wsus/bb980625.aspx
Q. When does support end for WSUS 2.0?
A. Support for WSUS 2.0 has already ended. WSUS 2.0 SP1 support will end April 2009 (two years after WSUS 3.0 was released).
Nous allons voir comment procéder à la migration d’un serveur WSUS 2.0 vers WSUS 3.1
La migration vers WSUS 3.1 se fait en lieu et place de la version déjà installée contrairement au passage de SUS 1.0 vers WSUS 2.0. Sur le papier tout doit se faire sans problème, mais pour peu que votre WSUS ait un peu de vécu, on n’est pas à l’abris d’un petit problème. La procédure qui va suivre va nous permettre de faire l’opération de migration même en cas de pépin.
Tout d’abord, préparons le terrain en téléchargeant les prérequis et quelques outils qui pourront se réveler utiles !
Prérequis:
Outils supplémentaires:
Installons les 2 versions des “API Samples and Tools” et le WSUSMigrationImport dans le répertoire WSUSMigrate\WSUSMigrationImport des API v3 (cette version corrige le problème décrit dans l’article http://support.microsoft.com/kb/945348)
Par mesure de précaution, nous allons sauvegarder la base de données SQL sur laquelle est basé WSUS. Un simple backup des fichiers de la base avec NTBackup suffit. Les 2 fichiers à sauvegarder sont SUSDB.MDF et SUSDB_LOG.LDF. Cela permettra un retour arrière si nécessaire.
Sauvegarder vos paramètres de synchronisation (proxy, source des mises à jour, classifications, produits, langues …) sur le support de votre choix (papier, document word, capture écran)
Après la ceinture, les bretelles … Nous allons exporter les approbations et les groupes WSUS (les 2 sont liés) dans un fichier .xml, si jamais il fallait repartir d’une installation “from scratch” cela évitera de revalider les mises à jour une par une en rejouant automatiquement ces approbations. Lancer la commande suivante :
%Program Files%\Update Services API Samples and Tools\WSUSMigrate\WSUSMigrationExport\wsusmigrationExport groupapprobations.xml
Une fois l’export terminé, la migration en temps que telle peut commencer. La bonne pratique consiste à lancer le setup d’installation de WSUS 3.1 par la ligne de commande pour lui ajouter le paramètre /g (qui signifie : upGrade)
WSUSSetup_30SP1_x86.exe /g
La migration commence, et devrait normalement aboutir correctement. Sauf que la vie est parfois injuste et que le setup peut s’arrêter avant la fin. Dans ce cas, une installation propre ou “from scratch” est obligatoire. Désinstaller la version 2.0, le moteur de base de données si vous utilisez MSDE ou wMSDE car la version 3 est basée sur WIDB (Windows Internal DataBase). Garder seulement le “Content” ce qui épargnera le retéléchargement des binaires des mises à jour. Une fois le serveur débarassé de la version précédente, installer la version 3.1. A la fin de l’installation, l’assistant de configuration s’ouvre et vous demande de remplir les champs nécessaires à son fonctionnement (Proxy, Source des données, Classifications et Produits à synchroniser, Langues à prendre en charge …). Synchroniser le serveur afin de récupérer le catalogue des mises à jour que vous souhaitez déployer sur votre parc. Lorsque le serveur a fini sa synchronisation, que toutes les mises à jour de chacun des produits et des classifications sont bien présentes, vous pouvez alors réimporter les groupes et les approbations. Pour cela, utiliser la commande suivante (celle téléchargée sur Codeplex) :
%Program Files%\Update Services API Samples and Tools\WSUSMigrate\WSUSMigrationImport\wsusmigrationImport groupapprobations.xml All None
Lorsque la magie de la commande a fini d’opérer, vous avez un serveur WSUS 3.1 prêt à distribuer les mêmes mises à jour aux mêmes clients que votre ancien WSUS 2.
Les clients devront effectuer leur cycle de détection avant de réapparaitre dans la console. Au bout de 2 ou 3 jours, l’ensemble du parc devrait s’être réinscrit.
Le cas SQL Server 2005 …
Certains d’entre vous auront peut être effectué un déplacement de la base de données de WSUS vers la version complète de SQL afin de bénéficier des outils d’administration ou pour pouvoir déporter la base sur une autre machine.
Le guide d’opérations de WSUS décrit la marche à suivre (http://technet.microsoft.com/en-us/library/cc708558.aspx), sauf qu’il y a un petit manque. Cette démarche ne modifie pas les informations dans le registre et a pour conséquence de bloquer la migration de WSUS vers la version 3 (ou vers le SP1 pour ceux qui sont déjà en 3.0) . Le setup ne peut plus se connecter à la base de données avec ces informations. En modifiant les valeurs de registre suivantes sous HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Update Services\Server\Setup on peut rétablir la situation :
wMSDE
Windows Internal DataBase
SQL Server 2005 Local
SQL Server 2005 Remote
WmsedInstalled
wYukonInstalled
0
1
SqlInstanceIsRemote
Après avoir ajusté vos valeurs de registre, la migration doit s’effectuer correctement.
GaetanB – Windows Core Support Engineer
Un nouveau correctif est disponible pour Hyper-V.
Celui-ci permet de corriger certains comportements en erreur mais surtout permet de sauvegarder les machines virtuelles à chaud depuis System Center DPM 2007 SP1.
KB959962 - An update is available for Windows Server 2008-based computers to address issues with backing up and restoring Hyper-V virtual machines
Comme vous ne le savez peut-être pas, Windows Server 2003 Service Pack 1 ne sera plus supporté à partir du 14 avril 2009.
Cela veut dire pour vous que tout incident ouvert au support Microsoft pour traiter un problème apparaissant sur cette version de système ne pourra plus être traitée à partir de cette date…
Pourquoi ? Rien de neuf dans cette politique mais sans rentrer dans des considérations qui me dépassent, il y a bien un momet où les produits qui vieillissent doivent laisser la place aux versions plus récentes. Ceci permettant de focaliser le maximum de ressources sur les nouveaux produits en cours d’adoption afin de les rendre les plus stables et performants possible.
Vous imaginez un constructeur automobile continuer à fournir des pièces pour une voiture créée en 1937 ? Cela aurait un coût exhorbitant pour le peu de modèles restant en circulation… Et à l’heure d’aujourd’hui, on ne compte plus en années en ce qui concerne l’évolution technologique !
Voici quelques liens qui vous permettront de mieux comprendre le cycle de vie des produits Microsoft :
Donc, un seul crédo : passez au Service Pack 2 avant le 14 Avril ! même s’il est clair que cela peut se réveler complexe dans un environnement de production, faites-le !
Quelques recommandations cependant :
La suite des articles concernant Hyper-V, parmi lesquelles des oublis du bulletin précédent et de nouvelles publications :
KB959403 - Windows Server 2008 may restart unexpectedly when you open the Hyper-V manager console to manage virtual machines KB958668 - You cannot shutdown a locked Windows 2000 SP4 virtual machine in Hyper-V Manager on a server that is running Windows Server 2008 KB959781 - Windows 2000 with Integration Services may shut down slowly while running as a guest on Server 2008 with Hyper-V KB961661 - Video performance may decrease when a Windows Server 2008-based computer has the Hyper-V role enabled and an accelerated display adapter installed KB954283 - You experience issues after you install Windows Server 2008 Hyper-V Integration Services on a Vista Home Premium virtual machine or a Vista Home Basic virtual machine KB960578 - The IRET and IRETD instructions do not support the Nested Task (NT) flag in protected mode in a Windows Server 2008 Hyper-V environment KB958669 - Event ID 12 is logged in the System log when you back up or compact a Hyper-V virtual hard disk on a Windows Server 2008-based computer KB959403 - Windows Server 2008 may restart unexpectedly when you open the Hyper-V manager console to manage virtual machines KB954357 -Error message when you use the Virtual Machine Connection tool to connect to a virtual machine on a Windows Server 2008 Hyper-V-based computer: "A connection will not be made because credentials may not be sent to the remote computer" KB959962 - An update is available for Windows Server 2008-based computers to address issues with backing up and restoring Hyper-V virtual machines
KB959403 - Windows Server 2008 may restart unexpectedly when you open the Hyper-V manager console to manage virtual machines
KB958668 - You cannot shutdown a locked Windows 2000 SP4 virtual machine in Hyper-V Manager on a server that is running Windows Server 2008
KB959781 - Windows 2000 with Integration Services may shut down slowly while running as a guest on Server 2008 with Hyper-V
KB961661 - Video performance may decrease when a Windows Server 2008-based computer has the Hyper-V role enabled and an accelerated display adapter installed
KB954283 - You experience issues after you install Windows Server 2008 Hyper-V Integration Services on a Vista Home Premium virtual machine or a Vista Home Basic virtual machine
KB960578 - The IRET and IRETD instructions do not support the Nested Task (NT) flag in protected mode in a Windows Server 2008 Hyper-V environment
KB958669 - Event ID 12 is logged in the System log when you back up or compact a Hyper-V virtual hard disk on a Windows Server 2008-based computer
KB954357 -Error message when you use the Virtual Machine Connection tool to connect to a virtual machine on a Windows Server 2008 Hyper-V-based computer: "A connection will not be made because credentials may not be sent to the remote computer"
Et depuis peu, il existe un lien sur TechNet qui maintient à jour une liste des correctifs mettant à jour Hyper-V : Hyper-V Update List
Ajoutez cette adresse à vos favoris !
Dans le cadre des déploiements de Windows XP ou de Windows Server 2003, si les drivers ne sont pas intégrés dans l’image ou dans l’installation unattended, l’apparition des messages annonçant la découverte d’un nouveau périphérique peut se révéler très vite agaçant !
Cette nouvelle fiche technique met à disposition un correctif permettant de les supprimer :
KB938596 - Hotfix adds new functionality to suppress Plug and Play-related UI messages in Windows Server 2003 or in Windows XP
Le Blocker Toolkit d’Internet Explorer 8 est enfin disponible.
Tout comme Internet Explorer 7, Internet Explorer 8 sera distribué via les mises à jour automatiques (AU), Windows update (WU) et Microsoft update (MU).
Internet Explorer 8 sera disponible comme une mise à jour prioritaire sur Windows XP SP2 et Windows Server 2003 SP2.
Il s’agira d’une mise à jour importante sur Windows Vista et Windows Server 2008.
Dans un environnement d’entreprise, le déploiement d’un nouveau navigateur dépend souvent de la finalisation des tests de compatibilité des applications et des sites internes.
Afin d’empêcher les utilisateurs d’installer IE8 par un scan manuel sur les sites Windows update ou Microsoft update ou par les mises à jour automatiques, il est possible d’installer le Blocker Toolkit d’Internet Explorer 8 (disponible en anglais uniquement).
Note: Il n’empêche pas les utilisateurs qui sont administrateurs locaux de leur machine d’installer Internet Explorer 8 depuis un media externe ou le centre de téléchargement Microsoft par exemple.
Il est téléchargeable depuis le centre de téléchargement Microsoft depuis le lien suivant :
http://www.microsoft.com/downloads/details.aspx?FamilyID=21687628-5806-4ba6-9e4e-8e224ec6dd8c&displaylang=en
Le Blocker Toolkit n’a pas besoin d’être déployé dans des organisations qui utilisent des solutions de gestion de mise à jour telles que Windows Server Update Services (WSUS), System Center Configuration Manager (SCCM) ou Systems Management Server (SMS).
Le Blocker Toolkit n’a pas de date d’expiration et contient deux composants :
Paramètres : /B :bloque /U :débloque /H :aide
Exemple : IE80Blocker.cmd <nom de la machine> /B
Clé de registre: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Setup\8.0 Nom de la valeur: DoNotAllowIE80
· Si la valeur est égale à 0, la distribution n’est pas bloquée
· Si la valeur est égale à 1, la distribution est bloquée
Il permet aux administrateurs d’importer les nouveaux paramètres de stratégie de groupe du Toolkit pour bloquer ou débloquer la distribution automatique d’Internet Explorer 8.
Note : il ne permet qu’une configuration au niveau machine et pas utilisateur.
Après l’ajout du fichier adm, cliquer droit sur Modèles d'administration dans la console de stratégie de groupe puis sur Affichage et sélectionner Filtrage :
Décocher « Afficher uniquement les paramètres de stratégie pouvant être entièrement gérés »
Pour Windows Vista ou Windows server 2008 la stratégie sera disponible sous :
Configuration ordinateur / Modèles d’administration / Modèles d'administration classiques (ADM) / Windows Components / Windows Update / Automatic Updates Blockers v2
Pour Windows XP ou Windows Server 2003 la stratégie sera disponible sous :
Configuration ordinateur / Modèles d'administration / Windows Components / Windows Update / Automatic Updates Blockers v2
Liens complémentaires :
BLOG Internet Explorer
http://blogs.msdn.com/ie/archive/2009/01/06/ie8-blocker-toolkit-available-today.aspx
Technet FAQ du Blocker Toolkit
http://technet.microsoft.com/en-us/updatemanagement/dd365124.aspx
Internet Explorer 8 Delivery through Automatic Updates
http://technet.microsoft.com/en-us/updatemanagement/dd365125.aspx
Laetitia
Technical Lead
Dans le cadre du déploiement de systèmes Windows, il vous est peut-être arrivé d’utiliser un média bootable (CD-ROM, DVD) contenant votre image de référence incluant elle-même toutes les applications que vous utilisez dans votre environnement.
Vous aurez remarqué que plus Windows et les applications (quelles qu’elles soient) évoluent et plus l’espace nécessaire pour stocker cette image est important.
Dans ce cas de figure il peut arriver que l’image (ou les images) dépassent les 4GB, entrainant une impossibilité de démarrer sur ce média.
Ceci concerne les médias de démarrage construits avec WinPE 2.x et oscdimg (fourni avec le WAIK) et l’erreur se concrétise par le message suivant lors des tentatives de démarrage :
File: \Boot\BCD Status: 0xc000014c Info: An error occurred while attempting to read the boot configuration data.
File: \Boot\BCD
Status: 0xc000014c
Info: An error occurred while attempting to read the boot configuration data.
Cette erreur peut survenir si les fichiers requis pour le démarrage sont situés au delà des 4 premiers Giga Octets sur le DVD.
La partie bootable de WinPE doit être dans les 4 premiers Go du DVD.
Il est nécessaire d'ordonner la façon dont les fichiers sont placés sur le media afin que les fichiers critiques pour le boot se trouvent au dessus du reste des données. Avec 4, 7 GO, les fichiers de boot ne sont pas disponibles assez tôt dans l'ISO et on obtient l'erreur ci-dessus.
OSCDIMG -m -n -yoC:\TEMP\bootorder.txt -bC:\WINPE_X86\etfsboot.com C:\WINPE_X86\ISO C:\TEMP\WINPE.ISO
où :
Exemple de fichier BOOTORDER.TXT :
bootmgr boot\bcd boot\boot.sdi boot\bootfix.bin boot\bootsect.exe boot\etfsboot.com boot\memtest.efi boot\memtest.exe boot\en-us\bootsect.exe.mui boot\fonts\chs_boot.ttf boot\fonts\cht_boot.ttf boot\fonts\jpn_boot.ttf boot\fonts\kor_boot.ttf boot\fonts\wgl4_boot.ttf sources\boot.wim
Une fois le fichier ISO généré, vous pouvez le graver à l’aide de DVDBURN.EXE (inclus dans le Resource Kit de Windows Server 2003).
Note : OSCDIMG et DVDBURN sont les seuls outils permettant de générer des fichiers ISO bootables et de les graver sur des médias de manière supportée par Microsoft.
Liens complémentaires:
http://technet.microsoft.com/en-us/library/cc749036.aspx
A propos de cette initiative visant à automatiser la correction de problèmes automatiquement depuis une fiche technique, dont je vous parlait dans un bulletin précédent, de nouvelles KBs ont été mises à disposition permettant le paramétrage de plusieurs composants de Windows ou la correction de dysfonctionnements.
A savoir :
N’hésitez pas à visiter le blog de l’équipe en charge de Fix It : Fix it for me blog
Ou abonnez-vous à leur fil RSS.
Ce titre pourrait annoncer un nouveau film avec une vague de super héros, mais il n’en est rien !
L’intention de ce bulletin est d’expliquer brièvement ce qu’est AzMan et comment l’utiliser pour mettre en oeuvre de la délégation d’administration sur un serveur hébergeant le rôle Hyper-V.
AzMan
Hyper-V est désormais bien connu mais AzMan reste un peu dans l’ombre. De son vrai nom Windows Authorization Manager, AzMan est un framework de gestion des accès basé sur la notion de rôles (ou role-based access control, soit RBAC) qui permet de mettre à disposition des applications des stratégies auxquelles elles peuvent se référer pour contrôler ce que chaque utilisateur a la permission de faire.
Ce framework doit donc être pris en compte lors du développement de ces applications.
Je ne m’étendrais pas sur AzMan car cela ne fait pas parti de mes compétences au sein de l’équipe Windows Core mais il est nécessaire de détailler les quelques notions de base utilisées dans la suite de ce bulletin :
Comment attribuer des permissions sur Hyper-V
L’objectif ici est donc de détailler toutes les étapes nécessaires pour donner à certains utilisateurs la possibilité de travailler avec certaines machines virtuelles s’exécutant sur un hôte Hyper-V.
Avant de manipuler l’authorization store de Hyper-V, quelques pré-requis doivent être mis en oeuvre pour autoriser l’accès à distance de l’hôte Hyper-V :
Pour référence, voici la liste des opérations qui peuvent être déléguées à des utilisateurs dans Hyper-V :
Pour la partie réseau, ces deux schémas seront peut-être plus explicites pour décrire a quoi correspondent les différents composants :
Démarche
Je vais prendre l’exemple suivant : un administrateur Hyper-V souhaite déléguer la création et l’administration des machines virtuelles à un groupe d’utilisateurs (groupe Hyper-V Admins) et autoriser un autre groupe de personnes à utiliser ces machines virtuelles (groupe Hyper-V Users).
La démarche consiste donc à créer dans cette ordre depuis AzMan :
Pour simplifier la compréhension, j’utilise une terminologie spécifique pour chaque type d’élément créé en préfixant chacun de ces éléments :
Création des définitions de tâches
L’adresse suivante donne un grand nombre d’exemples de tâches correspondants à des scénarios de délégation : Example Authorization Manager Tasks and Operations
Il s’agit tout d’abord d’ouvrir l’authorization store de Hyper-V :
Note : si SCVMM est utilisé pour gérer l’hôte Hyper-V, les modifications apportées au fichier InitialStore.xml ne seront pas prises en compte. SCVMM permet de déléguer l’accès à un hôte Hyper-V via son propre fichier (HyperVAuthStore.xml). La modification de ce fichier n’est pas supportée.
La première définition de tâche que je vais créer permettra de donner l’accès à la console Hyper-V (visualisation des machines virtuelles) :
La seconde définition de tâche que je vais créer permettra de donner les permissions suffisantes pour gérer les machines virtuelles :
La dernière définition de tâche que je vais créer permettra de donner les permissions suffisantes pour utiliser les machines virtuelles sans pouvoir modifier leur configuration :
Au final, j’ai donc la liste suivante de définitions de tâches :
Création des définitions de rôle
Depuis AzMan :
Au final, j’ai donc la liste suivante de définitions de rôles :
Il faut maintenant attribuer à chaque définition de rôle les permissions adéquates :
Assignation des rôles
Si nous suivons les best practices Microsoft, l’attribution définitive des permissions sur l’hôte Hyper-V se fera par des groupes Active Directory (à la rigueur à travers les groupes locaux de l’hôte Hyper-V).
Je reprends donc la nomenclature AD-Hyper-V Admins et AD-Hyper-V Users pour créer mes deux groupes dans Active Directory.
Ensuite, depuis AzMan, je vais créer des groupes “application” dans l’authorization store incluant ces groupes Active Directory :
Je vais ensuite lier les groupes Active Directory avec les groupes applicatifs :
Au final, j’ai donc les groupes applicatifs suivants :
Cette étape n’est pas nécessaire mais elle permet de définir une seule fois dans l’authorization store le relation entre les groupes Active Directory et des groupes propres à ce store.
Il s’agit enfin d’attribuer à ces groupes applicatifs la délégation créée au travers des définitions de rôles et de tâches.
Depuis AzMan, je vais créer des assignations de rôles dans l’authorization store :
Jusque là, ces assignations de rôles ne sont définies que par les opérations qui leur sont autorisées et ne définissent pas encore quels utilisateurs peuvent en bénéficier. Il faut donc lier ces assignations de rôles aux groupes applicatifs.
Ce qui me donne en définitive ceci :
Scopes
La seule notion que je n’ai pas encore abordé sont les scopes.
Un scope définit un périmètre au sein d’un authorization store sur lequel s’appliquent des définitions de rôles et de tâches ainsi que des assignations de rôles.
Il est ainsi possible de définir plusieurs scopes (Maquettage, Pré-Production, Production, …) disposant de leur propre délégation. Ceci permet d’affiner encore plus la délégation en attribuant des permissions à un groupe de machines virtuelles et non à toutes.
Des exemples de scripts permettant de mainpuler les scopes sont disponibles ici : Script AzMan Scopes in Hyper-V
Ressources
Windows Authorization Manager (en Anglais)
Developing Applications Using Windows Authorization Manager (en Anglais)
Authorization Manager Terminology (en Anglais)
Configure Hyper-V for Role-based Access Control (en Anglais)
Virtualization Security Best Practices – How to Lockdown a Hyper-V Host (blog de Tony Soper en Anglais)
Hyper-V Security Getting Started Guide (blog de Tony Soper en Anglais)
Ayant essuyé quelques revers lors de l’installation manuelle (installation de l’instance SQL Server effectuée par mes soins) de DPM 2007, j’ai collecté et ordonné les informations requises pour réaliser une installation de DPM 2007 sur un serveur Windows Server 2008.
Pré-requis
Ils sont décris ici : DPM 2007 System Requirements, mais quelques remarques importantes :
Installation des pré-requis logiciels
Installer manuellement les pré-requis sur Windows Server 2008 (Manually Install Required Windows Components, section “Installing the Required Components for Windows Server 2008”), dans l’ordre indiqué :
Configuration de SQL Reporting Services / IIS
S’assurer que l’application Pool du Default Web Site est bien Classic .NET AppPool :
S’assurer que l’application Pool des deux applications est bien ReportServer$DPM2007 :
Modifier les permissions de l’application Report Server :
Installation de DPM 2007
Exécuter le setup de DPM 2007 (voir Install DPM 2007)
Installation du Feature Pack de DPM 2007
Ce Feature Pack permet, entre autres, de pouvoir protéger les serveurs Windows Server 2008.
En se référant à System Center Data Protection Manager 2007 Feature Pack, voici la procédure d’installation :
Installation du SP1 de DPM 2007
En se référant à Description of System Center Data Protection Manager 2007 Service Pack 1, voici la procédure pour installer le Service Pack 1 de DPM 2007 :
Installation des clients DPM
Dans un environnement simple (i.e. sans firewall), la procédure décrite ici devrait fonctionner : Installing Protection Agents
Dans le cas où les serveurs sur lesquels l’agent DPM doit être installé sont protégés par un firewall : Installing Protection Agents behind a Firewall
Dans mon cas, les serveurs sur lesquels j’ai installé l’agent disposent du Windows Firewall et certaines de ces machines sont des serveurs Core.
Les étapes d’installation sont les suivantes :
Au préalable, sur les serveurs Hyper-V qui seront clients DPM, il est nécessaire d’installer les correctifs suivants :
N’oubliez pas de faire un petit tour sur Microsoft Updates (en allant sur ce site Web vous aurez la possibilité de détecter et installer des correctifs autres que ceux pour Windows) pour installer les correctifs post-SQL Server SP2 et ceux pour Windows Server 2008.
Après nous être concertés longuement, nous sommes tombés d’accord sur ce que nous pouvions vous souhaiter pour l’année à venir.
Tout ce que nous espérons pour vous c’est de n’être impactés que par peu de problèmes (suffisament pour nous permettre de vous aider et de toujours faire ce métier passionnant) et surtout nous ne vous en voudrons pas si la complexité des incidents que vous nous remontez baisse un peu l’an prochain, cela nous permettra de souffler un peu !
Plus traditionnellement, meilleurs voeux, bonne santé et réussite pour vous et vos proches !
Restez connectés !
L’équipe de Support Windows Core
Nous allons analyser ensemble un dump relatif à des problème de crash réguliers sur un serveur de fichiers.
D’abord, regardons sur quel type de serveur le crash s’est produit :
0: kd> vertarget
Windows Server 2003 Kernel Version 3790 (Service Pack 1) MP (4 procs) Free x86 compatible
Product: Server, suite: TerminalServer SingleUserTS
Built by: 3790.srv03_sp1_rtm.050324-1447
Kernel base = 0x80800000 PsLoadedModuleList = 0x808af988
Debug session time: Tue Oct 21 02:22:03.749 2008 (GMT+2)
System Uptime: 6 days 7:23:43.156
Il s’agit donc d’un serveur 2003 en SP1, un premier plan d’action serait de le mettre à jour en SP2 :-)
D’autre part, le serveur semble avoir tourné pendant 6 jours avant la génération du dump.
Aussi, chaque crash ou stop est associé un code qui définie le type de problème rencontré, examinons le stop en question :
0: kd> .bugcheck
Bugcheck code 0000007F
Arguments 00000008 80042000 00000000 00000000
C’est un stop 7F avec le paramètre 00000008 ….intéressant !!
Les documents techniques qui détaillent ce type de stop, font référence à un problème de stack overflow :
“Bug Check 0x7F: UNEXPECTED_KERNEL_MODE_TRAP
The UNEXPECTED_KERNEL_MODE_TRAP bug check has a value of 0x0000007F. This bug check indicates that the Intel CPU generated a trap and the kernel failed to catch this trap.
This trap could be a bound trap (a trap the kernel is not permitted to catch) or a double fault (a fault that occurred while processing an earlier fault, which always results in a system failure).
0x00000008, or Double Fault, indicates that an exception occurs during a call to the handler for a prior exception. Typically, the two exceptions are handled serially. However, there are several exceptions that cannot be handled serially, and in this situation the processor signals a double fault. There are two common causes of a double fault: A kernel stack overflow Or A hardware problem”
Ok, nous savons maintenant qu’il peut s’agir d’un stack overflow ..il va falloir se mettre sur le thread qui a causé le crash pour en savoir plus :
0: kd> .tss 0x28
eax=854b8300 ebx=854b8310 ecx=00000003 edx=89756000 esi=89fc3f30 edi=89756000
eip=bae30bf7 esp=f78f7f88 ebp=f78f81b8 iopl=0 nv up ei ng nz na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00010286
q57xp32+0x9bf7:
bae30bf7 53 push ebx
0: kd> .thread
Implicit thread is now 8ab868d0
0: kd> !thread
THREAD 8ab868d0 Cid 0004.0048 Teb: 00000000 Win32Thread: 00000000 RUNNING on processor 0
IRP List:
859c0370: (0006,0220) Flags: 00000010 Mdl: 00000000
85391008: (0006,0220) Flags: 00000884 Mdl: 00000000
8a02af68: (0006,0094) Flags: 00000000 Mdl: 00000000
Not impersonating
DeviceMap d6402818
Owning Process 8ab8a238 Image: System
Wait Start TickCount 34881482 Ticks: 0
Context Switch Count 21126271
UserTime 00:00:00.000
KernelTime 00:03:14.531
Start Address nt!ExpWorkerThread (0x8083f671)
Stack Init f78fb000 Current f78f9150 Base f78fb000 Limit f78f8000 Call 0
Priority 12 BasePriority 12 PriorityDecrement 0
ChildEBP RetAddr Args to Child
00000000 bae30bf7 00000000 00000000 00000000 nt!_KiTrap08+0x75 (FPO: TSS 28:0)
WARNING: Stack unwind information not available. Following frames may be wrong.
f78f81b8 bae29c53 89756000 89fc3f30 8975bf54 q57xp32+0x9bf7
f78f8200 bae29edb 854b8310 f78f8278 f78f8248 q57xp32+0x2c53
f78f8210 bae2a199 02756000 878032e0 897ef950 q57xp32+0x2edb
f78f8248 f76ee804 00000001 f78f8278 00000000 q57xp32+0x3199
f78f8260 80a7a24f 897ef850 00000000 86e62a20 NDIS!ndisMProcessSGList+0x90
f78f828c f76ee6fe 86e62a20 897ef850 878032c0 hal!HalBuildScatterGatherList+0x1c7
f78f82e4 f76d249d 8a3d5008 854b8310 862fe230 NDIS!ndisMAllocSGList+0xd9
f78f8300 ba782f37 89e90290 854b8310 89d16c48 NDIS!ndisMSendX+0x1a0
f78f8328 ba78223a 8a3d5008 854b8310 8638eae8 tcpip!IPRcvComplete+0x12d3
f78f8350 ba782622 8638ea02 f78f8402 00000001 tcpip!IPRcvComplete+0x5d6
f78f848c ba783c01 ba7bbbb8 862fe2a4 862fe230 tcpip!IPRcvComplete+0x9be
f78f84fc ba783da0 f3b3f555 00000002 875d30c0 tcpip!IPRcvComplete+0x1f9d
f78f8524 ba784478 00000001 00000000 00000002 tcpip!IPRcvComplete+0x213c
f78f8558 bab209ac 875d3008 89443364 89d2d540 tcpip!IPRcvComplete+0x2814
f78f857c bab29a46 89e8e000 89429058 89e8e000 msiscsi+0x99ac
f78f8624 bab2c101 01429058 84f25502 84f2552c msiscsi+0x12a46
f78f8644 bab1a435 808a5180 84f25502 00000000 msiscsi+0x15101
f78f866c bab036ca 8a02b65c 89e8e000 f78f8698 msiscsi+0x3435
f78f867c bab03afc 897c31a0 84f2552c 884b7d28 iscsiprt!RaCallMiniportStartIo+0x1e
f78f8698 bab0c182 84f2552c 870a48a0 89d17e18 iscsiprt!RaidAdapterPostScatterGatherExecute+0x5e
f78f86b8 bab07823 00000000 00000001 00000000 iscsiprt!RaUnitStartIo+0xc4
f78f86d8 bab0b575 89d17e18 014b7d28 00000000 iscsiprt!RaidStartIoPacket+0x49
f78f86fc bab0c8a6 89d17d30 884b7d28 84c6d270 iscsiprt!RaidUnitSubmitRequest+0x63
f78f8718 bab06844 89d17d30 884b7d28 f78f873c iscsiprt!RaUnitScsiIrp+0x92
f78f8728 8083f9d0 89d17c78 884b7d28 89e8caa0 iscsiprt!RaDriverScsiIrp+0x2a
f78f873c f7409440 884b7d28 884b7dfc 884b7d28 nt!IofCallDriver+0x45
f78f8764 f74094e0 89cfba88 884b7d28 884b7d28 mpio!MPIOReadWrite+0x19e
f78f8830 f7409b34 89cfba88 84c6d1f0 884b7dd8 mpio!MPIOPdoHandleRequest+0x76
f78f8848 f7408945 89cfbb40 884b7d28 884b7d28 mpio!MPIOPdoInternalDeviceControl+0x3c
f78f8870 f740916f 89cfba88 89cfbd78 01000000 mpio!MPIOPdoCommonDeviceControl+0x1fb
f78f8890 f74062ef 89cfba88 884b7d28 f78f88b4 mpio!MPIOPdoDispatch+0x8f
f78f88a0 8083f9d0 89cfba88 884b7d28 84f25480 mpio!MPIOGlobalDispatch+0x19
f78f88b4 f7139a20 84f25480 68d0e000 f78f88f8 nt!IofCallDriver+0x45
f78f88c4 f7139635 84f25480 89419b70 85a52e2c CLASSPNP!SubmitTransferPacket+0xbb
f78f88f8 f7139712 00000000 00001000 85a52e50 CLASSPNP!ServiceTransferRequest+0x1e4
f78f891c 8083f9d0 89419ab8 00000000 8ab96b38 CLASSPNP!ClassReadWrite+0x159
f78f8930 f74d80cf 8756c3a8 85a52e50 f78f8954 nt!IofCallDriver+0x45
f78f8940 8083f9d0 893e7780 85a52cc0 85a52cc0 PartMgr+0x10cf
f78f8954 f73b4802 890bd008 8756c3a8 89595d08 nt!IofCallDriver+0x45
La, il n’y a pas de doute, nous somme bien en présence d’un beau “stack overflow”.
En effet, chaque thread a le droit à un espace limité pour gérer la stack.
Ici la limite est à f78fb000 (on commence la stack à à l’adresse f78f8000 ) : Stack Init f78fb000 Current f78f9150 Base f78fb000 Limit f78f8000
Le dernier appel a été fait à l’adresse f78f81b8 ; par conséquent l’appel d’après aurait utiliser de la mémoire et dépasser ainsi la limite du f78f8000 d’où le stack overflow et le crash.
Voici les détails de consommation de la stack au moment du Stop:
Module Stack Usage Percentage
fltMgr 280 2
volsnap 584 5
Ntfs 4844 42
iscsiprt 188 2
NDIS 140 1
msiscsi 276 2
q57xp32 144 1
CLASSPNP 104 1
mfetdik 144 1
hal 44 0
dmio 328 3
tcpip 600 5
mpio 356 3
PartMgr 16 0
mfehidk 660 6
nt 1988 17
df2k 848 7
Nous constatons que Ntfs utilise 42% de celle-ci ce qui est beaucoup. Maintenant si l’on regarde attentivement la stack nous allons constater que c’est le driver df2k.sys qui est réentrant dans le file system.
0: kd> kv 100
00000000 bae30bf7 00000000 00000000 00000000 nt!_KiTrap08+0x75
f78f899c f73cdfa3 8756c3a8 010bd008 04000000 dmio!voldiskiostart+0x482
f78f89ec f73bf8dc 8756c3a8 f78f8a44 f78f8a38 dmio!vol_subdisksio_start+0x107
f78f8a5c f73b5e2c 8712c408 00000001 00000001 dmio!volkiostart+0x32c
f78f8a88 f73b85e2 88dc1a60 85a52cc0 8ab50418 dmio!volrdwr+0xa0
f78f8a9c 8083f9d0 88dc1a60 85a52cc0 85a52e98 dmio!volread+0x58
f78f8ab0 f73899c4 8ab2d248 88db7af0 88d246d0 nt!IofCallDriver+0x45
f78f8ac8 8083f9d0 88d246d0 85a52cc0 85a52cc0 volsnap+0x19c4
f78f8adc f70d9881 88db7a38 88db7af0 88ba5c98 nt!IofCallDriver+0x45
f78f8b34 f70dae17 88db7a38 85a52cc0 85a52cc0 df2k+0x6881
f78f8b5c f701d0ce f78f8e40 f78f8d40 f701c702 df2k+0x7e17
f78f8b68 f701c702 f78f8e40 88db7a38 9c09a000 Ntfs!NtfsSingleAsync+0x91
f78f8d40 f701a75e f78f8e40 85a52cc0 88ba5c98 Ntfs!NtfsNonCachedIo+0x2db
f78f8e2c f701d8de f78f8e40 85a52cc0 00000001 Ntfs!NtfsCommonRead+0xaf5
f78f8fd8 8083f9d0 88be6718 85a52cc0 85a52cc0 Ntfs!NtfsFsdRead+0x113
f78f8fec f7117b43 88f2aae8 85a52cc0 88eeb008 nt!IofCallDriver+0x45
f78f9010 f7117d03 f78f9030 88f2aae8 00000000 fltMgr!FltpLegacyProcessingAfterPreCallbacksCompleted+0x20b
f78f9048 8083f9d0 88f2aae8 85a52cc0 88db7af0 fltMgr!FltpDispatch+0x11f
f78f905c f70d8ab1 89944588 89944640 88fcd5c0 nt!IofCallDriver+0x45
f78f9100 f70dae17 89944588 85a52cc0 85a52ebc df2k+0x5ab1
f78f9128 ba9efa40 88d1da08 89705218 88bed008 df2k+0x7e17
f78f913c 8083f9d0 88aacf10 85a52cc0 85a52cc0 SYMEVENT!SYMEvent_AllocVMData+0x5f00
f78f9150 f7117d36 0010e000 8a0d1768 00000000 nt!IofCallDriver+0x45
f78f917c 8083f9d0 88d1da08 85a52cc0 85a52cc0 fltMgr!FltpDispatch+0x152
f78f9190 8082f0de 83e86308 8ab868d0 83e862f8 nt!IofCallDriver+0x45
f78f91a8 8082f17c 88f04f0c 83e86330 83e86310 nt!IoPageRead+0x109
f78f922c 80849ce5 00000001 c16ce000 c0305b38 nt!MiDispatchFault+0xd2a
f78f9288 8082fd4f 00000000 c16ce000 00000000 nt!MmAccessFault+0x64a
f78f92b8 80845b53 c16ce000 00000000 f78f93e4 nt!MmCheckCachedPageState+0x48e
f78f9300 80845d5a 88ba5b60 f78f9340 00001000 nt!CcMapAndRead+0x93
f78f9394 8092f599 88f04f90 f78f93d4 00001000 nt!CcPinFileData+0x24a
f78f9408 f7054d25 88f04f90 f78f9440 00001000 nt!CcPinRead+0xc4
f78f9430 f704842b 84f7a168 88ba5c98 0010e000 Ntfs!NtfsPinStream+0x76
f78f945c f7049751 84f7a168 88be67f8 00870000 Ntfs!NtfsMapOrPinPageInBitmap+0x9d
f78f94d8 f704851f 84f7a168 88be67f8 0087312e Ntfs!NtfsAllocateBitmapRun+0x4b
f78f9614 f7040136 84f7a168 88be67f8 87342a00 Ntfs!NtfsAllocateClusters+0x9fd
f78f96d4 f7047e53 84f7a168 87342a00 00000020 Ntfs!NtfsAllocateAttribute+0x156
f78f9774 f704835c 84f7a168 d6650468 00000020 Ntfs!NtfsCreateNonresidentWithValue+0xde
f78f9874 f706e627 84f7a168 d6650468 d1911898 Ntfs!NtfsConvertToNonresident+0x2ec
f78f99cc f7076cc4 84f7a168 d6650468 00000240 Ntfs!NtfsChangeAttributeValue+0x467
f78f9ab8 f7071d04 84f7a168 d6650468 000fe6ad Ntfs!NtfsAddToAttributeList+0x177
f78f9ca0 f7047a50 84f7a168 d6650530 f78f9cd0 Ntfs!NtfsAddAttributeAllocation+0xf71
f78f9d64 f70845ef 84f7a168 8523cc68 d6650530 Ntfs!NtfsAddAllocation+0x397
f78f9e74 f7041c94 84f7a168 8523cc68 859c0370 Ntfs!NtfsSetAllocationInfo+0x3dd
f78f9ee0 f701d2fb 84f7a168 859c0370 00000000 Ntfs!NtfsCommonSetInformation+0x48c
f78f9f48 8083f9d0 88be6718 859c0370 859c0370 Ntfs!NtfsFsdSetInformation+0xa3
f78f9f5c f7117b43 88f2aae8 859c0370 88eeb008 nt!IofCallDriver+0x45
f78f9f80 f7117d03 f78f9fa0 88f2aae8 00000000 fltMgr!FltpLegacyProcessingAfterPreCallbacksCompleted+0x20b
f78f9fb8 8083f9d0 88f2aae8 859c0370 88db7af0 fltMgr!FltpDispatch+0x11f
f78f9fcc f70d8ab1 89944588 89944640 f78fa0e8 nt!IofCallDriver+0x45
f78fa070 f70dae17 89944588 859c0370 859c056c df2k+0x5ab1
f78fa098 ba9ef7b1 859c056c 859c0590 f78fa0e8 df2k+0x7e17
f78fa0b0 ba9f8d68 89944588 00000000 f78fa0e8 SYMEVENT!SYMEvent_AllocVMData+0x5c71
f78fa0cc ba9ef91b f78fa0e8 8082b0b9 ba9ef9e3 SYMEVENT!EventObjectCreate+0xba8
f78fa10c 8083f9d0 88aacf10 859c0370 859c0370 SYMEVENT!SYMEvent_AllocVMData+0x5ddb
f78fa120 f7117b43 88d1da08 859c0370 88bed008 nt!IofCallDriver+0x45
f78fa144 f7117d03 f78fa164 88d1da08 00000000 fltMgr!FltpLegacyProcessingAfterPreCallbacksCompleted+0x20b
f78fa17c 8083f9d0 88d1da08 859c0370 859c0370 fltMgr!FltpDispatch+0x11f
f78fa190 8098911f 85391008 84c497a0 f78fa434 nt!IofCallDriver+0x45
f78fa1c8 f707e07c 0123cc68 00000013 85391018 nt!IoSetInformation+0x1c2
f78fa1f4 f706c7b7 84c497a0 85391008 d66506b8 Ntfs!NtfsCompleteLargeAllocation+0x40
f78fa3f4 f70531e5 84c497a0 85391008 f78fa434 Ntfs!NtfsCommonCreate+0x1472
f78fa4f8 8083f9d0 88be6718 85391008 85391008 Ntfs!NtfsFsdCreate+0x17d
f78fa50c f7117b43 00000000 85391008 85391198 nt!IofCallDriver+0x45
f78fa530 f71255af f78fa550 88f2aae8 00000000 fltMgr!FltpLegacyProcessingAfterPreCallbacksCompleted+0x20b
f78fa56c 8083f9d0 88f2aae8 85391008 853911d8 fltMgr!FltpCreate+0x23b
f78fa580 f70da51c 8081fd79 899446b0 899446f4 nt!IofCallDriver+0x45
f78fa5b0 f70d942b 899446b0 85391008 00000000 df2k+0x751c
f78fa5e4 f70d8fed 89944640 85391008 89944588 df2k+0x642b
f78fa690 f70dae17 89944588 85391008 853911e0 df2k+0x5fed
f78fa6b8 ba9ef8a1 853911e0 85391204 f78fa718 df2k+0x7e17
f78fa6e0 ba9f8d58 89944588 00000000 f78fa718 SYMEVENT!SYMEvent_AllocVMData+0x5d61
f78fa6fc ba9ef91b f78fa718 8082b0b9 ba9ef9e3 SYMEVENT!EventObjectCreate+0xb98
f78fa73c 8083f9d0 88aacf10 85391008 85391008 SYMEVENT!SYMEvent_AllocVMData+0x5ddb
f78fa750 f7117b43 00000000 85391008 85391204 nt!IofCallDriver+0x45
f78fa774 f71255af f78fa794 88d1da08 00000000 fltMgr!FltpLegacyProcessingAfterPreCallbacksCompleted+0x20b
f78fa7b0 8083f9d0 88d1da08 85391008 85391008 fltMgr!FltpCreate+0x23b
f78fa7c4 8092e269 f78fa96c 88dc1a48 00000000 nt!IofCallDriver+0x45
f78fa8ac 80936caa 88dc1a60 00000000 88e62860 nt!IopParseDevice+0xa35
f78fa92c 80936aa5 00000000 f78fa96c 00000240 nt!ObpLookupObjectName+0x5a9
f78fa980 80936f27 00000000 00000000 00000100 nt!ObOpenObjectByName+0xea
f78fa9fc 80936ff8 8a2f22e4 0012019f f78fab7c nt!IopCreateFile+0x447
f78faa58 8092ed98 8a2f22e4 0012019f f78fab7c nt!IoCreateFile+0xa3
f78faa98 80834d3f 8a2f22e4 0012019f f78fab7c nt!NtCreateFile+0x30
f78faa98 8083c1ec 8a2f22e4 0012019f f78fab7c nt!KiFastCallEntry+0xfc
f78fab3c f7396acb 8a2f22e4 0012019f f78fab7c nt!ZwCreateFile+0x11
f78fabc4 f739c6f7 8a2f22d0 00000001 f78fabec volsnap+0xeacb
f78fabf8 f73a5d5d 86a966e0 12c00000 00000000 volsnap+0x146f7
f78fad50 f73945e5 8aa020d8 851a5798 8ab868d0 volsnap+0x1dd5d
f78fad6c 809180a0 875603d0 88eb2ab8 808b70dc volsnap+0xc5e5
f78fad80 8083f72e 875603d0 00000000 8ab868d0 nt!IopProcessWorkItem+0x13
f78fadac 8092ccff 875603d0 00000000 00000000 nt!ExpWorkerThread+0xeb
f78faddc 80841a96 8083f671 00000001 00000000 nt!PspSystemThreadStartup+0x2e
00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16
La stack contient aussi plusieurs occurrences du module SYMEVENT qui est connu pour causer des problèmes de stack overflow
La solution au problème rencontré passera par:
- Désinstallation ou mise à jour du composant Df2K.sys
- Suivi des recommandations de Symantec pour la partie Symevent : http://service1.symantec.com/SUPPORT/ent-security.nsf/docid/2002071208532048?Open&src=w
Mounia
Windows Core Technical Lead
Définition du problème
Aléatoirement, lors de connexions RDP sur un serveur TS, le phénomène suivant se produit : après son ouverture de session, un utilisateur se retrouve uniquement avec le fond d’écran du bureau sans aucun icônes.
Action
Lors de l’apparition du problème, nous avons forcé la génération d’un memory dump du serveur manuellement:
KB254649 Overview of memory dump file options for Windows Server 2003, Windows XP, and Windows 2000 http://support.microsoft.com/default.aspx?scid=kb;EN-US;254649 KB244139 Windows feature lets you generate a memory dump file by using the keyboard http://support.microsoft.com/default.aspx?scid=kb;EN-US;244139
KB254649 Overview of memory dump file options for Windows Server 2003, Windows XP, and Windows 2000
http://support.microsoft.com/default.aspx?scid=kb;EN-US;254649
KB244139 Windows feature lets you generate a memory dump file by using the keyboard
http://support.microsoft.com/default.aspx?scid=kb;EN-US;244139
Analyse du dump
Pour le téléchargement et l’installation de Windbg, voir mon précédent post « Debugger un 100% CPU du spooler ». Concernant les commandes utilisées ici, vous pouvez trouver plus d’informations dans l’aide de Windbg.
Dans l’analyse du dump, nous pouvons voir des threads en attente d’une « critical section » (voir définition ici http://fr.wikipedia.org/wiki/Section_critique) .
Voici un exemple de thread en attente d’une « critical section » :
0:018> ~11s <- Cette commande permet de ce placer dans le contexte d’un thread en particulier, ici le thread 11 du process spoolsv.exe eax=00002f9c ebx=00000000 ecx=00000187 edx=00002f9c esi=7c8877a0 edi=00000000 eip=7c8285ec esp=01b2f3bc ebp=01b2f3f8 iopl=0 nv up ei pl zr na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246 ntdll!KiFastSystemCallRet: 7c8285ec c3 ret 0:011> kv <- permet d’afficher la pile du thread ChildEBP RetAddr Args to Child 01b2f3b8 7c827d0b 7c83d236 00000124 00000000 ntdll!KiFastSystemCallRet 01b2f3bc 7c83d236 00000124 00000000 00000000 ntdll!NtWaitForSingleObject+0xc 01b2f3f8 7c83d281 00000124 00000004 00000001 ntdll!RtlpWaitOnCriticalSection+0x1a3 01b2f418 7c82d243 7c8877a0 00000000 000000e9 ntdll!RtlEnterCriticalSection+0xa8 01b2f44c 7c834029 00000001 00000000 01b2f488 ntdll!LdrLockLoaderLock+0xe4 01b2f6bc 77e41bf3 027125c8 01b2f708 01b2f6e8 ntdll!LdrLoadDll+0xc9 01b2f724 77e5c70b 72451460 00000000 00000000 kernel32!LoadLibraryExW+0x1b2 01b2f738 72451310 72451460 01b2fc90 000000e9 kernel32!LoadLibraryW+0x11 01b2f750 724516f9 01b2f75c 01bf8a50 00000780 usbmon!LoadSetupApiDll+0x1f 01b2f778 72451687 72455068 01b2f794 01b2fca0 usbmon!BuildPortList+0x11 01b2f79c 76136227 00000000 00000002 00000000 usbmon!DynaMon_EnumPorts+0x64 01b2f7bc 7615c9ce 00aded40 00000000 00000002 localspl!DpEnumPorts+0x1d 01b2f808 7615d2fb 00000000 00000002 00000000 localspl!SplEnumPorts+0xb8 01b2f834 740706e4 00000000 00000002 00000000 localspl!LocalEnumPorts+0x2f 01b2f874 01008d1e 00000000 00000002 00000000 spoolss!EnumPortsW+0x6d 01b2f8a8 01006d07 00000000 00000002 00000000 spoolsv!YEnumPorts+0x8b 01b2f8cc 77c80193 00000000 00000002 00000000 spoolsv!RpcEnumPorts+0x1e 01b2f8f8 77ce33e1 01006ce9 01b2fae0 00000006 rpcrt4!Invoke+0x30 01b2fcf8 77ce35c4 00000000 00000000 000eb3b4 rpcrt4!NdrStubCall2+0x299 01b2fd14 77c7ff7a 000eb3b4 000d3888 000eb3b4 rpcrt4!NdrServerCall2+0x19
0:018> ~11s <- Cette commande permet de ce placer dans le contexte d’un thread en particulier, ici le thread 11 du process spoolsv.exe
eax=00002f9c ebx=00000000 ecx=00000187 edx=00002f9c esi=7c8877a0 edi=00000000
eip=7c8285ec esp=01b2f3bc ebp=01b2f3f8 iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
ntdll!KiFastSystemCallRet:
7c8285ec c3 ret
0:011> kv <- permet d’afficher la pile du thread
01b2f3b8 7c827d0b 7c83d236 00000124 00000000 ntdll!KiFastSystemCallRet
01b2f3bc 7c83d236 00000124 00000000 00000000 ntdll!NtWaitForSingleObject+0xc
01b2f3f8 7c83d281 00000124 00000004 00000001 ntdll!RtlpWaitOnCriticalSection+0x1a3
01b2f418 7c82d243 7c8877a0 00000000 000000e9 ntdll!RtlEnterCriticalSection+0xa8
01b2f44c 7c834029 00000001 00000000 01b2f488 ntdll!LdrLockLoaderLock+0xe4
01b2f6bc 77e41bf3 027125c8 01b2f708 01b2f6e8 ntdll!LdrLoadDll+0xc9
01b2f724 77e5c70b 72451460 00000000 00000000 kernel32!LoadLibraryExW+0x1b2
01b2f738 72451310 72451460 01b2fc90 000000e9 kernel32!LoadLibraryW+0x11
01b2f750 724516f9 01b2f75c 01bf8a50 00000780 usbmon!LoadSetupApiDll+0x1f
01b2f778 72451687 72455068 01b2f794 01b2fca0 usbmon!BuildPortList+0x11
01b2f79c 76136227 00000000 00000002 00000000 usbmon!DynaMon_EnumPorts+0x64
01b2f7bc 7615c9ce 00aded40 00000000 00000002 localspl!DpEnumPorts+0x1d
01b2f808 7615d2fb 00000000 00000002 00000000 localspl!SplEnumPorts+0xb8
01b2f834 740706e4 00000000 00000002 00000000 localspl!LocalEnumPorts+0x2f
01b2f874 01008d1e 00000000 00000002 00000000 spoolss!EnumPortsW+0x6d
01b2f8a8 01006d07 00000000 00000002 00000000 spoolsv!YEnumPorts+0x8b
01b2f8cc 77c80193 00000000 00000002 00000000 spoolsv!RpcEnumPorts+0x1e
01b2f8f8 77ce33e1 01006ce9 01b2fae0 00000006 rpcrt4!Invoke+0x30
01b2fcf8 77ce35c4 00000000 00000000 000eb3b4 rpcrt4!NdrStubCall2+0x299
01b2fd14 77c7ff7a 000eb3b4 000d3888 000eb3b4 rpcrt4!NdrServerCall2+0x19
RtlpWaitOnCriticalSection indique que ce thread est en attente sur une « critical section ».
On fait un KP pour avoir les paramètres des appels de fonctions :
0:011> kP ChildEBP RetAddr 01b2f3b8 7c827d0b ntdll!KiFastSystemCallRet(void) 01b2f3bc 7c83d236 ntdll!NtWaitForSingleObject(void)+0xc 01b2f3f8 7c83d281 ntdll!RtlpWaitOnCriticalSection( struct _RTL_CRITICAL_SECTION * CriticalSection = 0x00000124, long Increment = 4)+0x1a3 01b2f418 7c82d243 ntdll!RtlEnterCriticalSection( struct _RTL_CRITICAL_SECTION * CriticalSection = 0x7c8877a0)+0xa8 01b2f44c 7c834029 ntdll!LdrLockLoaderLock( unsigned long Flags = 1, unsigned long * Disposition = 0x00000000, void ** Cookie = 0x01b2f488)+0xe4 01b2f6bc 77e41bf3 ntdll!LdrLoadDll( unsigned short * DllPath = 0x027125c8, unsigned long * DllCharacteristics = 0x01b2f708, struct _UNICODE_STRING * DllName = 0x01b2f6e8 "setupapi", void ** DllHandle = 0x01b2f704)+0xc9 [ 01b2f724 77e5c70b kernel32!LoadLibraryExW( unsigned short * lpwLibFileName = 0x72451460, void * hFile = 0x00000000, unsigned long dwFlags = 0)+0x1b2 01b2f738 72451310 kernel32!LoadLibraryW( unsigned short * lpwLibFileName = 0x72451460)+0x11 01b2f750 724516f9 usbmon!LoadSetupApiDll( struct _SETUPAPI_INFO * pSetupInfo = 0x01b2f75c)+0x1f 01b2f778 72451687 usbmon!BuildPortList( struct DynaMon_Monitor_Info_Struct * pMonitorInfo = 0x72455068, struct Port_Update_Struct ** ppPortUpdateList = 0x01b2f794)+0x11 01b2f79c 76136227 usbmon!DynaMon_EnumPorts( unsigned short * pszName = 0x00000000, unsigned long dwLevel = 2, unsigned char * pPorts = 0x00000000 "", unsigned long cbBuf = 0, unsigned long * pcbNeeded = 0x01b2fc90, unsigned long * pcReturned = 0x01b2fca0)+0x64 01b2f7bc 7615c9ce localspl!DpEnumPorts( void * hMonitor = 0x00aded40, unsigned short * pName = 0x00000000, unsigned long Level = 2, unsigned char * pPorts = 0x00000000 "", unsigned long cbBuf = 0, unsigned long * pcbNeeded = 0x01b2fc90, unsigned long * pcReturned = 0x01b2fca0)+0x1d 01b2f808 7615d2fb localspl!SplEnumPorts( unsigned short * pName = 0x00000000, unsigned long Level = 2, unsigned char * pPorts = 0x00000000 "", unsigned long cbBuf = 0, unsigned long * pcbNeeded = 0x01b2fc90, unsigned long * pcReturned = 0x01b2fca0, struct _INISPOOLER * pIniSpooler = 0x00a956a8)+0xb8 01b2f834 740706e4 localspl!LocalEnumPorts( unsigned short * pName = 0x00000000, unsigned long Level = 2, unsigned char * pPorts = 0x00000000 "", unsigned long cbBuf = 0, unsigned long * pcbNeeded = 0x01b2fc90, unsigned long * pcReturned = 0x01b2fca0)+0x2f 01b2f874 01008d1e spoolss!EnumPortsW( unsigned short * pName = 0x00000000, unsigned long Level = 2, unsigned char * pPort = 0x00000000 "", unsigned long cbBuf = 0, unsigned long * pcbNeeded = 0x01b2fc90, unsigned long * pcReturned = 0x01b2fca0)+0x6d 01b2f8a8 01006d07 spoolsv!YEnumPorts( unsigned short * pName = 0x00000000, unsigned long Level = 2, unsigned char * pPort = 0x00000000 "", unsigned long cbBuf = 0, unsigned long * pcbNeeded = 0x01b2fc90, unsigned long * pcReturned = 0x01b2fca0, Call_Route Route = RPC_CALL (1))+0x8b 01b2f8cc 77c80193 spoolsv!RpcEnumPorts( unsigned short * pName = 0x00000000, unsigned long Level = 2, unsigned char * pPort = 0x00000000 "", unsigned long cbBuf = 0, unsigned long * pcbNeeded = 0x01b2fc90, unsigned long * pcReturned = 0x01b2fca0)+0x1e [ 01b2f8f8 77ce33e1 rpcrt4!Invoke(void)+0x30 01b2fcf8 77ce35c4 rpcrt4!NdrStubCall2( struct IRpcStubBuffer * pThis = 0x00000000, struct IRpcChannelBuffer * pChannel = 0x00000000, struct _RPC_MESSAGE * pRpcMsg = 0x000eb3b4, unsigned long * pdwStubPhase = 0x01b2fd10)+0x299 01b2fd14 77c7ff7a rpcrt4!NdrServerCall2( struct _RPC_MESSAGE * pRpcMsg = 0x000eb3b4)+0x19
0:011> kP
ChildEBP RetAddr
01b2f3b8 7c827d0b ntdll!KiFastSystemCallRet(void)
01b2f3bc 7c83d236 ntdll!NtWaitForSingleObject(void)+0xc
01b2f3f8 7c83d281 ntdll!RtlpWaitOnCriticalSection(
struct _RTL_CRITICAL_SECTION * CriticalSection = 0x00000124,
long Increment = 4)+0x1a3
01b2f418 7c82d243 ntdll!RtlEnterCriticalSection(
struct _RTL_CRITICAL_SECTION * CriticalSection = 0x7c8877a0)+0xa8
01b2f44c 7c834029 ntdll!LdrLockLoaderLock(
unsigned long Flags = 1,
unsigned long * Disposition = 0x00000000,
void ** Cookie = 0x01b2f488)+0xe4
01b2f6bc 77e41bf3 ntdll!LdrLoadDll(
unsigned short * DllPath = 0x027125c8,
unsigned long * DllCharacteristics = 0x01b2f708,
struct _UNICODE_STRING * DllName = 0x01b2f6e8 "setupapi",
void ** DllHandle = 0x01b2f704)+0xc9 [
01b2f724 77e5c70b kernel32!LoadLibraryExW(
unsigned short * lpwLibFileName = 0x72451460,
void * hFile = 0x00000000,
unsigned long dwFlags = 0)+0x1b2
01b2f738 72451310 kernel32!LoadLibraryW(
unsigned short * lpwLibFileName = 0x72451460)+0x11
01b2f750 724516f9 usbmon!LoadSetupApiDll(
struct _SETUPAPI_INFO * pSetupInfo = 0x01b2f75c)+0x1f
01b2f778 72451687 usbmon!BuildPortList(
struct DynaMon_Monitor_Info_Struct * pMonitorInfo = 0x72455068,
struct Port_Update_Struct ** ppPortUpdateList = 0x01b2f794)+0x11
01b2f79c 76136227 usbmon!DynaMon_EnumPorts(
unsigned short * pszName = 0x00000000,
unsigned long dwLevel = 2,
unsigned char * pPorts = 0x00000000 "",
unsigned long cbBuf = 0,
unsigned long * pcbNeeded = 0x01b2fc90,
unsigned long * pcReturned = 0x01b2fca0)+0x64
01b2f7bc 7615c9ce localspl!DpEnumPorts(
void * hMonitor = 0x00aded40,
unsigned short * pName = 0x00000000,
unsigned long Level = 2,
unsigned long * pcReturned = 0x01b2fca0)+0x1d
01b2f808 7615d2fb localspl!SplEnumPorts(
unsigned long * pcReturned = 0x01b2fca0,
struct _INISPOOLER * pIniSpooler = 0x00a956a8)+0xb8
01b2f834 740706e4 localspl!LocalEnumPorts(
unsigned long * pcReturned = 0x01b2fca0)+0x2f
01b2f874 01008d1e spoolss!EnumPortsW(
unsigned char * pPort = 0x00000000 "",
unsigned long * pcReturned = 0x01b2fca0)+0x6d
01b2f8a8 01006d07 spoolsv!YEnumPorts(
Call_Route Route = RPC_CALL (1))+0x8b
01b2f8cc 77c80193 spoolsv!RpcEnumPorts(
unsigned long * pcReturned = 0x01b2fca0)+0x1e [
01b2f8f8 77ce33e1 rpcrt4!Invoke(void)+0x30
01b2fcf8 77ce35c4 rpcrt4!NdrStubCall2(
struct IRpcStubBuffer * pThis = 0x00000000,
struct IRpcChannelBuffer * pChannel = 0x00000000,
struct _RPC_MESSAGE * pRpcMsg = 0x000eb3b4,
unsigned long * pdwStubPhase = 0x01b2fd10)+0x299
01b2fd14 77c7ff7a rpcrt4!NdrServerCall2(
struct _RPC_MESSAGE * pRpcMsg = 0x000eb3b4)+0x19
Ceci nous montre les paramètres des appels de fonctions et nous montre que ce thread est bloqué car il attend la « critical section » 0x7c8877a0.
0:011> dt _RTL_CRITICAL_SECTION 0x7c8877a0 spoolsv!_RTL_CRITICAL_SECTION +0x000 DebugInfo : 0x7c8877c0 _RTL_CRITICAL_SECTION_DEBUG +0x004 LockCount : -38 +0x008 RecursionCount : 1 +0x00c OwningThread : 0x000046ac +0x010 LockSemaphore : 0x00000124 +0x014 SpinCount : 0
0:011> dt _RTL_CRITICAL_SECTION 0x7c8877a0
spoolsv!_RTL_CRITICAL_SECTION
+0x000 DebugInfo : 0x7c8877c0 _RTL_CRITICAL_SECTION_DEBUG
+0x004 LockCount : -38
+0x008 RecursionCount : 1
+0x00c OwningThread : 0x000046ac
+0x010 LockSemaphore : 0x00000124
+0x014 SpinCount : 0
Cette critical section est détenue par le thread 0x000046ac.
Voyons à quel numéro de thread cela correspond :
0:011> !runaway <- permet d’afficher le temps consommé par chaque thread User Mode Time Thread Time 11:4784 0 days 0:00:01.562 13:46ac 0 days 0:00:00.890 15:4ef8 0 days 0:00:00.406 16:4f60 0 days 0:00:00.125 3:680 0 days 0:00:00.093 10:78c 0 days 0:00:00.031 22:4dc8 0 days 0:00:00.000 21:4e08 0 days 0:00:00.000 20:3bf0 0 days 0:00:00.000 19:4340 0 days 0:00:00.000 18:4b80 0 days 0:00:00.000 17:1e1c 0 days 0:00:00.000 14:4b3c 0 days 0:00:00.000 12:47f0 0 days 0:00:00.000 9:724 0 days 0:00:00.000 8:720 0 days 0:00:00.000 7:71c 0 days 0:00:00.000 6:718 0 days 0:00:00.000 5:6c4 0 days 0:00:00.000 4:68c 0 days 0:00:00.000 2:57c 0 days 0:00:00.000 1:570 0 days 0:00:00.000 0:558 0 days 0:00:00.000
0:011> !runaway <- permet d’afficher le temps consommé par chaque thread
User Mode Time
Thread Time
11:4784 0 days 0:00:01.562
13:46ac 0 days 0:00:00.890
15:4ef8 0 days 0:00:00.406
16:4f60 0 days 0:00:00.125
3:680 0 days 0:00:00.093
10:78c 0 days 0:00:00.031
22:4dc8 0 days 0:00:00.000
21:4e08 0 days 0:00:00.000
20:3bf0 0 days 0:00:00.000
19:4340 0 days 0:00:00.000
18:4b80 0 days 0:00:00.000
17:1e1c 0 days 0:00:00.000
14:4b3c 0 days 0:00:00.000
12:47f0 0 days 0:00:00.000
9:724 0 days 0:00:00.000
8:720 0 days 0:00:00.000
7:71c 0 days 0:00:00.000
6:718 0 days 0:00:00.000
5:6c4 0 days 0:00:00.000
4:68c 0 days 0:00:00.000
2:57c 0 days 0:00:00.000
1:570 0 days 0:00:00.000
0:558 0 days 0:00:00.000
On se place dans le contexte du thread :
0:011> ~13s eax=00000001 ebx=77792c30 ecx=0207f501 edx=00000000 esi=00000a60 edi=00000000 eip=7c8285ec esp=0207fd60 ebp=0207fdd0 iopl=0 nv up ei pl zr na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246 ntdll!KiFastSystemCallRet: 7c8285ec c3 ret
0:011> ~13s
eax=00000001 ebx=77792c30 ecx=0207f501 edx=00000000 esi=00000a60 edi=00000000
eip=7c8285ec esp=0207fd60 ebp=0207fdd0 iopl=0 nv up ei pl zr na pe nc
Puis on liste toute la stack :
0:013> kv ChildEBP RetAddr Args to Child 0207fd5c 7c827d0b 77e61d1e 00000a60 00000000 ntdll!KiFastSystemCallRet 0207fd60 77e61d1e 00000a60 00000000 00000000 ntdll!NtWaitForSingleObject+0xc 0207fdd0 77e61c8d 00000a60 ffffffff 00000000 kernel32!WaitForSingleObjectEx+0xac 0207fde4 776f56f4 00000a60 ffffffff 77792cf0 kernel32!WaitForSingleObject+0x12 0207fe00 7768dac2 00000a60 00000000 00000080 ole32!CDllHost::ClientCleanupFinish+0x2a 0207fe2c 7768da32 00000000 0207fe7c 777966d4 ole32!DllHostProcessUninitialize+0x80 0207fe4c 776bce20 00000000 00000000 02702988 ole32!ApartmentUninitialize+0xf8 0207fe64 776bcdd2 0207fe7c 00000000 00000001 ole32!wCoUninitialize+0x7d 0207fe80 776e4de6 00000001 77670000 776bc793 ole32!CoUninitialize+0x65 0207fe8c 776bc793 0207feb4 776bc732 77670000 ole32!DoThreadSpecificCleanup+0x63 0207fe94 776bc732 77670000 00000003 00000000 ole32!ThreadNotification+0x37 0207feb4 776bc6da 77670000 00000003 00000000 ole32!DllMain+0x194 0207fed4 7c81a352 77670000 00000003 00000000 ole32!_DllMainCRTStartup+0x52 0207fef4 7c819178 776bc692 77670000 00000003 ntdll!LdrpCallInitRoutine+0x14 0207ffa8 77e4f920 00000000 00000000 0207ffec ntdll!LdrShutdownThread+0xd2 0207ffb8 77e6482e 00000000 00000000 00000000 kernel32!ExitThread+0x2f 0207ffec 00000000 77c7b0f5 000bb338 00000000 kernel32!BaseThreadStart+0x39
0:013> kv
0207fd5c 7c827d0b 77e61d1e 00000a60 00000000 ntdll!KiFastSystemCallRet
0207fd60 77e61d1e 00000a60 00000000 00000000 ntdll!NtWaitForSingleObject+0xc
0207fdd0 77e61c8d 00000a60 ffffffff 00000000 kernel32!WaitForSingleObjectEx+0xac
0207fde4 776f56f4 00000a60 ffffffff 77792cf0 kernel32!WaitForSingleObject+0x12
0207fe00 7768dac2 00000a60 00000000 00000080 ole32!CDllHost::ClientCleanupFinish+0x2a
0207fe2c 7768da32 00000000 0207fe7c 777966d4 ole32!DllHostProcessUninitialize+0x80
0207fe4c 776bce20 00000000 00000000 02702988 ole32!ApartmentUninitialize+0xf8
0207fe64 776bcdd2 0207fe7c 00000000 00000001 ole32!wCoUninitialize+0x7d
0207fe80 776e4de6 00000001 77670000 776bc793 ole32!CoUninitialize+0x65
0207fe8c 776bc793 0207feb4 776bc732 77670000 ole32!DoThreadSpecificCleanup+0x63
0207fe94 776bc732 77670000 00000003 00000000 ole32!ThreadNotification+0x37
0207feb4 776bc6da 77670000 00000003 00000000 ole32!DllMain+0x194
0207fed4 7c81a352 77670000 00000003 00000000 ole32!_DllMainCRTStartup+0x52
0207fef4 7c819178 776bc692 77670000 00000003 ntdll!LdrpCallInitRoutine+0x14
0207ffa8 77e4f920 00000000 00000000 0207ffec ntdll!LdrShutdownThread+0xd2
0207ffb8 77e6482e 00000000 00000000 00000000 kernel32!ExitThread+0x2f
0207ffec 00000000 77c7b0f5 000bb338 00000000 kernel32!BaseThreadStart+0x39
On peu voir que ce thread est en attente avec un WaitForSingleObject.
On fait un kP pour avoir l’objet sur lequel ce thread est en attente :
0:013> kP ChildEBP RetAddr 0207fd5c 7c827d0b ntdll!KiFastSystemCallRet(void) [ 0207fd60 77e61d1e ntdll!NtWaitForSingleObject(void)+0xc 0207fdd0 77e61c8d kernel32!WaitForSingleObjectEx( void * hHandle = 0x00000a60, unsigned long dwMilliseconds = 0xffffffff, int bAlertable = 0)+0xac 0207fde4 776f56f4 kernel32!WaitForSingleObject( void * hHandle = 0x00000a60, unsigned long dwMilliseconds = 0xffffffff)+0x12 0207fe00 7768dac2 ole32!CDllHost::ClientCleanupFinish( void * hEvent = 0x00000a60)+0x2a 0207fe2c 7768da32 ole32!DllHostProcessUninitialize(void)+0x80 0207fe4c 776bce20 ole32!ApartmentUninitialize( int fHostThread = 0)+0xf8 0207fe64 776bcdd2 ole32!wCoUninitialize( class COleTls * Tls = 0x0207fe7c, int fHostThread = 0)+0x7d 0207fe80 776e4de6 ole32!CoUninitialize(void)+0x65 0207fe8c 776bc793 ole32!DoThreadSpecificCleanup(void)+0x63 0207fe94 776bc732 ole32!ThreadNotification( struct HINSTANCE__ * hDll = 0x77670000, unsigned long dwReason = 3, void * lpvReserved = 0x00000000)+0x37 0207feb4 776bc6da ole32!DllMain( void * hInstance = 0x77670000, unsigned long dwReason = 3, void * lpvReserved = 0x00000000)+0x194 0207fed4 7c81a352 ole32!_DllMainCRTStartup( void * hDllHandle = 0x77670000, unsigned long dwReason = 3, void * lpreserved = 0x00000000)+0x52 0207fef4 7c819178 ntdll!LdrpCallInitRoutine(void)+0x14 0207ffa8 77e4f920 ntdll!LdrShutdownThread(void)+0xd2 0207ffb8 77e6482e kernel32!ExitThread( unsigned long dwExitCode = 0)+0x2f 0207ffec 00000000 kernel32!BaseThreadStart( <function> * lpStartAddress = 0x77c7b0f5, void * lpParameter = 0x000bb338)+0x39
0:013> kP
0207fd5c 7c827d0b ntdll!KiFastSystemCallRet(void) [
0207fd60 77e61d1e ntdll!NtWaitForSingleObject(void)+0xc
0207fdd0 77e61c8d kernel32!WaitForSingleObjectEx(
void * hHandle = 0x00000a60,
unsigned long dwMilliseconds = 0xffffffff,
int bAlertable = 0)+0xac
0207fde4 776f56f4 kernel32!WaitForSingleObject(
unsigned long dwMilliseconds = 0xffffffff)+0x12
0207fe00 7768dac2 ole32!CDllHost::ClientCleanupFinish(
void * hEvent = 0x00000a60)+0x2a
0207fe2c 7768da32 ole32!DllHostProcessUninitialize(void)+0x80
0207fe4c 776bce20 ole32!ApartmentUninitialize(
int fHostThread = 0)+0xf8
0207fe64 776bcdd2 ole32!wCoUninitialize(
class COleTls * Tls = 0x0207fe7c,
int fHostThread = 0)+0x7d
0207fe80 776e4de6 ole32!CoUninitialize(void)+0x65
0207fe8c 776bc793 ole32!DoThreadSpecificCleanup(void)+0x63
0207fe94 776bc732 ole32!ThreadNotification(
struct HINSTANCE__ * hDll = 0x77670000,
unsigned long dwReason = 3,
void * lpvReserved = 0x00000000)+0x37
0207feb4 776bc6da ole32!DllMain(
void * hInstance = 0x77670000,
void * lpvReserved = 0x00000000)+0x194
0207fed4 7c81a352 ole32!_DllMainCRTStartup(
void * hDllHandle = 0x77670000,
void * lpreserved = 0x00000000)+0x52
0207fef4 7c819178 ntdll!LdrpCallInitRoutine(void)+0x14
0207ffa8 77e4f920 ntdll!LdrShutdownThread(void)+0xd2
0207ffb8 77e6482e kernel32!ExitThread(
unsigned long dwExitCode = 0)+0x2f
0207ffec 00000000 kernel32!BaseThreadStart(
<function> * lpStartAddress = 0x77c7b0f5,
void * lpParameter = 0x000bb338)+0x39
Puis on tape la commande suivante :
0:013> !handle 0x00000a60 Handle 00000a60 Type Event
0:013> !handle 0x00000a60
Handle 00000a60
Type Event
Cet objet est un Event, donc ce thread attend qu’un Event soit signalé.
Regardons un peu plus loin dans la stack :
0:013> kv n (le “n” permet d’afficher les numéro de frame) # ChildEBP RetAddr Args to Child 00 0207fd5c 7c827d0b 77e61d1e 00000a60 00000000 ntdll!KiFastSystemCallRet 01 0207fd60 77e61d1e 00000a60 00000000 00000000 ntdll!NtWaitForSingleObject+0xc 02 0207fdd0 77e61c8d 00000a60 ffffffff 00000000 kernel32!WaitForSingleObjectEx+0xac 03 0207fde4 776f56f4 00000a60 ffffffff 77792cf0 kernel32!WaitForSingleObject+0x12 04 0207fe00 7768dac2 00000a60 00000000 00000080 ole32!CDllHost::ClientCleanupFinish+0x2a 05 0207fe2c 7768da32 00000000 0207fe7c 777966d4 ole32!DllHostProcessUninitialize+0x80 06 0207fe4c 776bce20 00000000 00000000 02702988 ole32!ApartmentUninitialize+0xf8 07 0207fe64 776bcdd2 0207fe7c 00000000 00000001 ole32!wCoUninitialize+0x7d 08 0207fe80 776e4de6 00000001 77670000 776bc793 ole32!CoUninitialize+0x65 09 0207fe8c 776bc793 0207feb4 776bc732 77670000 ole32!DoThreadSpecificCleanup+0x63 0a 0207fe94 776bc732 77670000 00000003 00000000 ole32!ThreadNotification+0x37 0b 0207feb4 776bc6da 77670000 00000003 00000000 ole32!DllMain+0x194 0c 0207fed4 7c81a352 77670000 00000003 00000000 ole32!_DllMainCRTStartup+0x52 0d 0207fef4 7c819178 776bc692 77670000 00000003 ntdll!LdrpCallInitRoutine+0x14 0e 0207ffa8 77e4f920 00000000 00000000 0207ffec ntdll!LdrShutdownThread+0xd2 0f 0207ffb8 77e6482e 00000000 00000000 00000000 kernel32!ExitThread+0x2f 10 0207ffec 00000000 77c7b0f5 000bb338 00000000 kernel32!BaseThreadStart+0x39
0:013> kv n (le “n” permet d’afficher les numéro de frame)
# ChildEBP RetAddr Args to Child
00 0207fd5c 7c827d0b 77e61d1e 00000a60 00000000 ntdll!KiFastSystemCallRet
01 0207fd60 77e61d1e 00000a60 00000000 00000000 ntdll!NtWaitForSingleObject+0xc
02 0207fdd0 77e61c8d 00000a60 ffffffff 00000000 kernel32!WaitForSingleObjectEx+0xac
03 0207fde4 776f56f4 00000a60 ffffffff 77792cf0 kernel32!WaitForSingleObject+0x12
04 0207fe00 7768dac2 00000a60 00000000 00000080 ole32!CDllHost::ClientCleanupFinish+0x2a
05 0207fe2c 7768da32 00000000 0207fe7c 777966d4 ole32!DllHostProcessUninitialize+0x80
06 0207fe4c 776bce20 00000000 00000000 02702988 ole32!ApartmentUninitialize+0xf8
07 0207fe64 776bcdd2 0207fe7c 00000000 00000001 ole32!wCoUninitialize+0x7d
08 0207fe80 776e4de6 00000001 77670000 776bc793 ole32!CoUninitialize+0x65
09 0207fe8c 776bc793 0207feb4 776bc732 77670000 ole32!DoThreadSpecificCleanup+0x63
0a 0207fe94 776bc732 77670000 00000003 00000000 ole32!ThreadNotification+0x37
0b 0207feb4 776bc6da 77670000 00000003 00000000 ole32!DllMain+0x194
0c 0207fed4 7c81a352 77670000 00000003 00000000 ole32!_DllMainCRTStartup+0x52
0d 0207fef4 7c819178 776bc692 77670000 00000003 ntdll!LdrpCallInitRoutine+0x14
0e 0207ffa8 77e4f920 00000000 00000000 0207ffec ntdll!LdrShutdownThread+0xd2
0f 0207ffb8 77e6482e 00000000 00000000 00000000 kernel32!ExitThread+0x2f
10 0207ffec 00000000 77c7b0f5 000bb338 00000000 kernel32!BaseThreadStart+0x39
Nous pouvons voir que ce thread est en cours de fermeture (kernel32!ExitThread) et dans une phase de fermeture d’un thread nous notifions toutes les dlls du processus pour leurs indiquer que ce thread se termine et dans cette stack nous avons :
0b 0207feb4 776bc6da 77670000 00000003 00000000 ole32!DllMain+0x194 0c 0207fed4 7c81a352 77670000 00000003 00000000 ole32!_DllMainCRTStartup+0x52 0d 0207fef4 7c819178 776bc692 77670000 00000003 ntdll!LdrpCallInitRoutine+0x14 0e 0207ffa8 77e4f920 00000000 00000000 0207ffec ntdll!LdrShutdownThread+0xd2 0f 0207ffb8 77e6482e 00000000 00000000 00000000 kernel32!ExitThread+0x2f
On se met sur la frame 0c :
0:013> .frame 0c 0c 0207fed4 7c81a352 ole32!_DllMainCRTStartup+0x52
0:013> .frame 0c
0c 0207fed4 7c81a352 ole32!_DllMainCRTStartup+0x52
Puis on fait un DV pour afficher les paramètres :
0:013> dv hDllHandle = 0x77670000 dwReason = 3 lpreserved = 0x00000000 retcode = 3
0:013> dv
hDllHandle = 0x77670000
dwReason = 3
lpreserved = 0x00000000
retcode = 3
Regardons maintenant à quoi correspond ce « hDllHandle » :
0:013> !lmi 0x77670000 Loaded Module Info: [0x77670000] Module: ole32 Base Address: 77670000 Image Name: ole32.dll Machine Type: 332 (I386) Time Stamp: 45d70aa5 Sat Feb 17 15:01:09 2007 Size: 139000 CheckSum: 14357b Characteristics: 210e perf Debug Data Dirs: Type Size VA Pointer CODEVIEW 22, 11a44c, 11984c RSDS - GUID: {DC8A079C-AE0B-4A0C-89EC-5A936EAF1F7F} Age: 2, Pdb: ole32.pdb CLSID 4, 11a448, 119848 [Data not mapped] Image Type: MEMORY - Image read successfully from loaded memory. Symbol Type: PDB - Symbols loaded successfully from symbol server. Compiler: C++ - front end [13.10 bld 4035] - back end [13.10 bld 4035]
0:013> !lmi 0x77670000
Loaded Module Info: [0x77670000]
Module: ole32
Base Address: 77670000
Image Name: ole32.dll
Machine Type: 332 (I386)
Time Stamp: 45d70aa5 Sat Feb 17 15:01:09 2007
Size: 139000
CheckSum: 14357b
Characteristics: 210e perf
Debug Data Dirs: Type Size VA Pointer
CODEVIEW 22, 11a44c, 11984c RSDS - GUID: {DC8A079C-AE0B-4A0C-89EC-5A936EAF1F7F}
Age: 2, Pdb: ole32.pdb
CLSID 4, 11a448, 119848 [Data not mapped]
Image Type: MEMORY - Image read successfully from loaded memory.
Symbol Type: PDB - Symbols loaded successfully from symbol server.
Compiler: C++ - front end [13.10 bld 4035] - back end [13.10 bld 4035]
Nous voyons que dans la phase de shutdown on appelle OLE32 et nous somme en attente d’un Event.
En regardant les autres thread du spooler, nous pouvons voir un thread qui est dans une phase de LdrUnloadDll (déchargement d’une dll). Mais ce thread est en attente sur une « critical section » qui est celle détenue par le thread précédent :
0:013> ~18s eax=77ec1944 ebx=00000000 ecx=77e424de edx=03311b00 esi=7c8877a0 edi=00000000 eip=7c8285ec esp=032cfcb8 ebp=032cfcf4 iopl=0 nv up ei pl zr na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246 ntdll!KiFastSystemCallRet: 7c8285ec c3 ret 0:018> kv ChildEBP RetAddr Args to Child 032cfcb4 7c827d0b 7c83d236 00000124 00000000 ntdll!KiFastSystemCallRet 032cfcb8 7c83d236 00000124 00000000 00000000 ntdll!NtWaitForSingleObject+0xc 032cfcf4 7c83d281 00000124 00000004 00000000 ntdll!RtlpWaitOnCriticalSection+0x1a3 032cfd14 7c839844 7c8877a0 032cfe70 032cfeac ntdll!RtlEnterCriticalSection+0xa8 032cfe1c 77e6b1bb 02100000 032cfeac 032cfedc ntdll!LdrUnloadDll+0x35 032cfe30 77691d0f 02100000 032cff04 77691d23 kernel32!FreeLibrary+0x41 032cfe3c 77691d23 032cfeb8 777965b0 00000000 ole32!CClassCache::CDllPathEntry::CFinishObject::Finish+0x2f 032cfe50 77691afe 77671af0 00000000 00000000 ole32!CClassCache::CFinishComposite::Finish+0x1d 032cff04 7769182a 02702bd8 00000080 776bc944 ole32!CClassCache::CleanUpDllsForApartment+0x1d0 032cff30 7769174c 00000000 032cff84 777966d4 ole32!FinishShutdown+0xd7 032cff50 776bce20 00000001 00007530 77792c30 ole32!ApartmentUninitialize+0x94 032cff68 776f5797 032cff84 00000001 77e61c96 ole32!wCoUninitialize+0x7d 032cff88 7768f2a2 032cffac 776bbab4 77792c30 ole32!CDllHost::WorkerThread+0xdd 032cff90 776bbab4 77792c30 00000000 0270a1c0 ole32!DLLHostThreadEntry+0xd 032cffac 776b1704 00000000 032cffec 77e64829 ole32!CRpcThread::WorkerLoop+0x26 032cffb8 77e64829 0270a1c0 00000000 00000000 ole32!CRpcThreadCache::RpcWorkerThreadEntry+0x20 032cffec 00000000 776b16e4 0270a1c0 00000000 kernel32!BaseThreadStart+0x34
0:013> ~18s
eax=77ec1944 ebx=00000000 ecx=77e424de edx=03311b00 esi=7c8877a0 edi=00000000
eip=7c8285ec esp=032cfcb8 ebp=032cfcf4 iopl=0 nv up ei pl zr na pe nc
0:018> kv
032cfcb4 7c827d0b 7c83d236 00000124 00000000 ntdll!KiFastSystemCallRet
032cfcb8 7c83d236 00000124 00000000 00000000 ntdll!NtWaitForSingleObject+0xc
032cfcf4 7c83d281 00000124 00000004 00000000 ntdll!RtlpWaitOnCriticalSection+0x1a3
032cfd14 7c839844 7c8877a0 032cfe70 032cfeac ntdll!RtlEnterCriticalSection+0xa8
032cfe1c 77e6b1bb 02100000 032cfeac 032cfedc ntdll!LdrUnloadDll+0x35
032cfe30 77691d0f 02100000 032cff04 77691d23 kernel32!FreeLibrary+0x41
032cfe3c 77691d23 032cfeb8 777965b0 00000000 ole32!CClassCache::CDllPathEntry::CFinishObject::Finish+0x2f
032cfe50 77691afe 77671af0 00000000 00000000 ole32!CClassCache::CFinishComposite::Finish+0x1d
032cff04 7769182a 02702bd8 00000080 776bc944 ole32!CClassCache::CleanUpDllsForApartment+0x1d0
032cff30 7769174c 00000000 032cff84 777966d4 ole32!FinishShutdown+0xd7
032cff50 776bce20 00000001 00007530 77792c30 ole32!ApartmentUninitialize+0x94
032cff68 776f5797 032cff84 00000001 77e61c96 ole32!wCoUninitialize+0x7d
032cff88 7768f2a2 032cffac 776bbab4 77792c30 ole32!CDllHost::WorkerThread+0xdd
032cff90 776bbab4 77792c30 00000000 0270a1c0 ole32!DLLHostThreadEntry+0xd
032cffac 776b1704 00000000 032cffec 77e64829 ole32!CRpcThread::WorkerLoop+0x26
032cffb8 77e64829 0270a1c0 00000000 00000000 ole32!CRpcThreadCache::RpcWorkerThreadEntry+0x20
032cffec 00000000 776b16e4 0270a1c0 00000000 kernel32!BaseThreadStart+0x34
Regardons quelle DLL ce thread essaie de décharger :
0:018> kP ChildEBP RetAddr 032cfcb4 7c827d0b ntdll!KiFastSystemCallRet(void) 032cfcb8 7c83d236 ntdll!NtWaitForSingleObject(void)+0xc 032cfcf4 7c83d281 ntdll!RtlpWaitOnCriticalSection( struct _RTL_CRITICAL_SECTION * CriticalSection = 0x00000124, long Increment = 4)+0x1a3 032cfd14 7c839844 ntdll!RtlEnterCriticalSection( struct _RTL_CRITICAL_SECTION * CriticalSection = 0x7c8877a0)+0xa8 032cfe1c 77e6b1bb ntdll!LdrUnloadDll( void * DllHandle = 0x02100000)+0x35 032cfe30 77691d0f kernel32!FreeLibrary( struct HINSTANCE__ * hLibModule = 0x02100000)+0x41 032cfe3c 77691d23 ole32!CClassCache::CDllPathEntry::CFinishObject::Finish(void)+0x2f 032cfe50 77691afe ole32!CClassCache::CFinishComposite::Finish(void)+0x1d 032cff04 7769182a ole32!CClassCache::CleanUpDllsForApartment(void)+0x1d0 032cff30 7769174c ole32!FinishShutdown(void)+0xd7 032cff50 776bce20 ole32!ApartmentUninitialize( int fHostThread = 1)+0x94 032cff68 776f5797 ole32!wCoUninitialize( class COleTls * Tls = 0x032cff84, int fHostThread = 1)+0x7d 032cff88 7768f2a2 ole32!CDllHost::WorkerThread(void)+0xdd 032cff90 776bbab4 ole32!DLLHostThreadEntry( void * param = 0x77792c30)+0xd [ 032cffac 776b1704 ole32!CRpcThread::WorkerLoop(void)+0x26 032cffb8 77e64829 ole32!CRpcThreadCache::RpcWorkerThreadEntry( void * param = 0x0270a1c0)+0x20 032cffec 00000000 kernel32!BaseThreadStart( <function> * lpStartAddress = 0x776b16e4, void * lpParameter = 0x0270a1c0)+0x34 0:018> !lmi 0x02100000 Loaded Module Info: [0x02100000] Module: HPBOID Base Address: 02100000 Image Name: HPBOID.DLL Machine Type: 332 (I386) Time Stamp: 45c30dad Fri Feb 02 11:08:45 2007 Size: 9000 CheckSum: e266 Characteristics: 210e Debug Data Dirs: Type Size VA Pointer CODEVIEW 54, 1458, 858 RSDS - GUID: {6D0A74B4- DFB-4467-BA2A-27942C80B5FC} Image Type: MEMORY - Image read successfully from loaded memory. Symbol Type: EXPORT - PDB not found Load Report: export symbols
0:018> kP
032cfcb4 7c827d0b ntdll!KiFastSystemCallRet(void)
032cfcb8 7c83d236 ntdll!NtWaitForSingleObject(void)+0xc
032cfcf4 7c83d281 ntdll!RtlpWaitOnCriticalSection(
032cfd14 7c839844 ntdll!RtlEnterCriticalSection(
032cfe1c 77e6b1bb ntdll!LdrUnloadDll(
void * DllHandle = 0x02100000)+0x35
032cfe30 77691d0f kernel32!FreeLibrary(
struct HINSTANCE__ * hLibModule = 0x02100000)+0x41
032cfe3c 77691d23 ole32!CClassCache::CDllPathEntry::CFinishObject::Finish(void)+0x2f
032cfe50 77691afe ole32!CClassCache::CFinishComposite::Finish(void)+0x1d
032cff04 7769182a ole32!CClassCache::CleanUpDllsForApartment(void)+0x1d0
032cff30 7769174c ole32!FinishShutdown(void)+0xd7
032cff50 776bce20 ole32!ApartmentUninitialize(
int fHostThread = 1)+0x94
032cff68 776f5797 ole32!wCoUninitialize(
class COleTls * Tls = 0x032cff84,
int fHostThread = 1)+0x7d
032cff88 7768f2a2 ole32!CDllHost::WorkerThread(void)+0xdd
032cff90 776bbab4 ole32!DLLHostThreadEntry(
void * param = 0x77792c30)+0xd [
032cffac 776b1704 ole32!CRpcThread::WorkerLoop(void)+0x26
032cffb8 77e64829 ole32!CRpcThreadCache::RpcWorkerThreadEntry(
void * param = 0x0270a1c0)+0x20
032cffec 00000000 kernel32!BaseThreadStart(
<function> * lpStartAddress = 0x776b16e4,
void * lpParameter = 0x0270a1c0)+0x34
0:018> !lmi 0x02100000
Loaded Module Info: [0x02100000]
Module: HPBOID
Base Address: 02100000
Image Name: HPBOID.DLL
Time Stamp: 45c30dad Fri Feb 02 11:08:45 2007
Size: 9000
CheckSum: e266
Characteristics: 210e
CODEVIEW 54, 1458, 858 RSDS - GUID: {6D0A74B4- DFB-4467-BA2A-27942C80B5FC}
Symbol Type: EXPORT - PDB not found
Load Report: export symbols
Conclusion
Ici le problème semble lié au module HPBOID.
Résolution
Nous avons dans un premier temps renommé ce composant afin de vérifier :
1. Si cela permettait de résoudre le problème (ce fût le cas)
2. De s’assurer que cela n’avait pas d’impact sur le bon fonctionnement des imprimantes.
Ensuite, il a fallut contacter l’éditeur de ce composant afin soit de le désinstaller sans impacter les imprimantes ou de se procurer une version mise à jour corrigeant ce problème.
Bon réveillon et bonne année.
Voici une compilation des articles techniques concernant Hyper-V. La liste n’est pas exhaustive car elle n’inclue que les fiches concernant la version RTM et les problèmes et informations liés directement à Hyper-V, et j’ai pu en rater quelques unes...
Les titres sont en anglais (compréhension oblige) mais les liens dirigent vers la page traduite automatiquement en Français (je recommande tout de même de lire les articles en Anglais pour assurer une lecture non biaisée !).
A noter que certains articles sont en cours d’écriture, dont la fiche KB959962 (Hyper-V writer is required for backing up Hyper-V VMs with DPM) qui est prévue pour Janvier 2009.
Bonne lecture !
Supportabilité
KB897615 - Support policy for Microsoft software running in non-Microsoft hardware virtualization software KB951041 - Supported paths for upgrading from Windows Server 2003 to Windows Server 2008 KB954958 - Guest operating systems that are supported on a Hyper-V virtual machine KB957006 - Microsoft server software and supported virtualization environments KB957054 - Support for Microsoft Dynamics CRM 4.0 on a computer that is running Windows Server 2008 Hyper-V KB956893 - Support policy for Microsoft SQL Server products that are running in a hardware virtualization environment KB842301 - Microsoft BizTalk Server supportability on a virtual machine KB320220 - Microsoft support policies and recommendations for servers that are running Exchange Server in hardware virtualization environments KB909840 - Hardware virtualization support for SharePoint products and technologies KB958664 - Windows Server system software that is not supported in a Hyper-V virtual machine environment KB888794 - Considerations when hosting Active Directory domain controller in virtual hosting environments KB954418 - Sleep and hibernate power features are not available when you enable Hyper-V technology on a Windows Server 2008-based portable computer KB944987 - Support partners for non-Microsoft hardware virtualization software
KB897615 - Support policy for Microsoft software running in non-Microsoft hardware virtualization software
KB951041 - Supported paths for upgrading from Windows Server 2003 to Windows Server 2008
KB954958 - Guest operating systems that are supported on a Hyper-V virtual machine
KB957006 - Microsoft server software and supported virtualization environments
KB957054 - Support for Microsoft Dynamics CRM 4.0 on a computer that is running Windows Server 2008 Hyper-V
KB956893 - Support policy for Microsoft SQL Server products that are running in a hardware virtualization environment
KB842301 - Microsoft BizTalk Server supportability on a virtual machine
KB320220 - Microsoft support policies and recommendations for servers that are running Exchange Server in hardware virtualization environments
KB909840 - Hardware virtualization support for SharePoint products and technologies
KB958664 - Windows Server system software that is not supported in a Hyper-V virtual machine environment
KB888794 - Considerations when hosting Active Directory domain controller in virtual hosting environments
KB954418 - Sleep and hibernate power features are not available when you enable Hyper-V technology on a Windows Server 2008-based portable computer
KB944987 - Support partners for non-Microsoft hardware virtualization software
Mises à jours
KB950050 - Description of the update for the release version of the Hyper-V technology for Windows Server 2008 KB951636 - Description of the Hyper-V Language Pack for Windows Server 2008 KB956710 - A Hyper-V update is available to increase the number of logical processors and virtual machines on a Windows Server 2008 x64-based computer KB952627 - Description of the Windows Vista Service Pack 1 Management Tools update for the release version of Hyper-V KB951308 - Increased functionality and virtual machine control in the Windows Server 2008 Failover Cluster Management console for the Hyper-V role
KB950050 - Description of the update for the release version of the Hyper-V technology for Windows Server 2008
KB951636 - Description of the Hyper-V Language Pack for Windows Server 2008
KB956710 - A Hyper-V update is available to increase the number of logical processors and virtual machines on a Windows Server 2008 x64-based computer
KB952627 - Description of the Windows Vista Service Pack 1 Management Tools update for the release version of Hyper-V
KB951308 - Increased functionality and virtual machine control in the Windows Server 2008 Failover Cluster Management console for the Hyper-V role
Problèmes
KB950182 - A computer that is running an x86-based version of Windows Server 2008 or an x86-based version of Windows Vista may use fewer processors than expected if the number of cores on a socket is not a power of 2 KB956774 - A Background Intelligent Transfer Service (BITS) client cannot handle files that have paths that contain the volume GUID in Windows Server 2008 or in Windows Vista KB956697 - Windows Server 2008 Hyper-V VSS writer is not used during a backup job because of corrupted or invalid virtual machine configuration files KB950792 - When you try to enable, disable, or update Hyper-V technology, the process stops responding KB949222 - Virtual machines that were created on the beta version of the Hyper-V role do not start after the Hyper-V role is updated to a later version KB953828 - The NLB host does not converge as expected on Windows Server 2008 Hyper-V virtual machines KB953585 - Error message when you try to start a Hyper-V virtual machine on a Windows Server 2008-based or Windows Vista-based computer that uses the NUMA architecture: "An error occurred while attempting to change the state of virtual machine VMNAME" KB958829 - When Hyper-V is installed in SBS 2008 it causes the bindings for DHCP to bind to the incorrect interface KB960038 - You receive a "0x0000007E" Stop error on Windows Server 2008-based computers that host Hyper-V virtual machines when you use the Hyper-V writer to back up virtual machines KB954282 - The VMBus device does not load on a virtual machine that is running on a Windows Server 2008-based computer that has Hyper-V installed KB959978 - Error message when you back up a Windows Server 2003-based virtual machine on a Windows Server 2008 Hyper-V-based computer: "GetWriterStatus FAILED for Selected writer [Microsoft Hyper-V VSS Writer], writer is in state [9] [VSS_WS_FAILED_AT_FREEZE]" KB957967 - Stop error message on a Windows Server 2008-based computer that has the Hyper-V role installed: "STOP 0x0000001A" KB954281 - After you install Windows 2000 on a virtual machine that is running on a Windows Server 2008-based computer that uses Hyper-V technology, you can only create a maximum startup disk that is 127 GB KB958184 - Virtual machine backup operations fail in Windows Server 2008 when Hyper-V virtual machine files are saved on a volume that is mounted on a failover cluster by using a volume GUID KB958065 - You cannot configure a Hyper-V virtual machine by using Windows Server 2008 Failover Clustering when the virtual machine uses a storage device that is managed by a third-party clustered file system or a third-party replication solution KB954279 - You are not prompted for credentials after you receive an "Access Denied" error message when you try to connect to a virtual machine from the Windows Server 2008 Hyper-V MMC snap-in KB954280 - Error message when you try to export a virtual machine on a Windows Server 2008-based computer that uses Hyper-V: "An error occurred while attempting to export the virtual machine" KB954356 - After you deploy a Sysprep prepared image, the Hypervisor layer service does not start automatically in Windows Server 2008 KB958668 - You cannot shutdown a locked Windows 2000 SP4 virtual machine in Hyper-V Manager on a server that is running Windows Server 2008 KB959781 - Windows 2000 with Integration Services may shut down slowly while running as a guest on Server 2008 with Hyper-V KB960024 - Error message when you try to create a new virtual machine in Windows Vista or Windows Server 2008: "The Encountered an Error while creating a Virtual Machine" KB958665 - You do not receive an error message after you restore a Windows Server 2008 Hyper-V virtual machine
KB950182 - A computer that is running an x86-based version of Windows Server 2008 or an x86-based version of Windows Vista may use fewer processors than expected if the number of cores on a socket is not a power of 2
KB956774 - A Background Intelligent Transfer Service (BITS) client cannot handle files that have paths that contain the volume GUID in Windows Server 2008 or in Windows Vista
KB956697 - Windows Server 2008 Hyper-V VSS writer is not used during a backup job because of corrupted or invalid virtual machine configuration files
KB950792 - When you try to enable, disable, or update Hyper-V technology, the process stops responding
KB949222 - Virtual machines that were created on the beta version of the Hyper-V role do not start after the Hyper-V role is updated to a later version
KB953828 - The NLB host does not converge as expected on Windows Server 2008 Hyper-V virtual machines
KB953585 - Error message when you try to start a Hyper-V virtual machine on a Windows Server 2008-based or Windows Vista-based computer that uses the NUMA architecture: "An error occurred while attempting to change the state of virtual machine VMNAME"
KB958829 - When Hyper-V is installed in SBS 2008 it causes the bindings for DHCP to bind to the incorrect interface
KB960038 - You receive a "0x0000007E" Stop error on Windows Server 2008-based computers that host Hyper-V virtual machines when you use the Hyper-V writer to back up virtual machines
KB954282 - The VMBus device does not load on a virtual machine that is running on a Windows Server 2008-based computer that has Hyper-V installed
KB959978 - Error message when you back up a Windows Server 2003-based virtual machine on a Windows Server 2008 Hyper-V-based computer: "GetWriterStatus FAILED for Selected writer [Microsoft Hyper-V VSS Writer], writer is in state [9] [VSS_WS_FAILED_AT_FREEZE]"
KB957967 - Stop error message on a Windows Server 2008-based computer that has the Hyper-V role installed: "STOP 0x0000001A"
KB954281 - After you install Windows 2000 on a virtual machine that is running on a Windows Server 2008-based computer that uses Hyper-V technology, you can only create a maximum startup disk that is 127 GB
KB958184 - Virtual machine backup operations fail in Windows Server 2008 when Hyper-V virtual machine files are saved on a volume that is mounted on a failover cluster by using a volume GUID
KB958065 - You cannot configure a Hyper-V virtual machine by using Windows Server 2008 Failover Clustering when the virtual machine uses a storage device that is managed by a third-party clustered file system or a third-party replication solution
KB954279 - You are not prompted for credentials after you receive an "Access Denied" error message when you try to connect to a virtual machine from the Windows Server 2008 Hyper-V MMC snap-in
KB954280 - Error message when you try to export a virtual machine on a Windows Server 2008-based computer that uses Hyper-V: "An error occurred while attempting to export the virtual machine"
KB954356 - After you deploy a Sysprep prepared image, the Hypervisor layer service does not start automatically in Windows Server 2008
KB960024 - Error message when you try to create a new virtual machine in Windows Vista or Windows Server 2008: "The Encountered an Error while creating a Virtual Machine"
KB958665 - You do not receive an error message after you restore a Windows Server 2008 Hyper-V virtual machine
System Center Virtual Machine Manager
KB956589 - Description of the Hyper-V update for issues that may occur when you manage the Hyper-V role on the 64-bit editions of Windows Server 2008 by using SCVMM
How to
KB958662 - How to back up Hyper-V virtual machines from the parent partition on a Windows Server 2008-based computer by using Windows Server Backup KB958663 - How to move a virtual machine that is running on Microsoft Virtual Server to a Windows Server 2008 Hyper-V environment
KB958662 - How to back up Hyper-V virtual machines from the parent partition on a Windows Server 2008-based computer by using Windows Server Backup
KB958663 - How to move a virtual machine that is running on Microsoft Virtual Server to a Windows Server 2008 Hyper-V environment
Suite au succès rencontré le 5 Mai dernier, la journée technique d’expertise thématique (JTET) consacrée à Windows Server 2008, “Windows Server 2008 - Technologie et Méthodologie : Les clés de la réussite”, sera rejouée le 20 Janvier 2009 à nos clients Premier.
J’aurais à nouveau le plaisir d’y participer et de présenter les technologies Windows Server avec mes camarades Arnaud Lheureux, Julien Peyridieux et Jean Ragot.
D’un existant sous Windows 2000 (serveurs, AD, Exchange, client, Outlook) les trois intervenants upgraderont vers les toutes dernières versions de Windows Server, de Windows Vista, d’Exchange avec les tous derniers outils de déploiement Microsoft (MDT 2008, Microsoft Deployment Toolkit), et mettront en œuvre la quasi-totalité des nouvelles technologies présentes dans ces produits en suivant la méthodologie MOF, ce dont le spécialiste méthodologies s’assurera au fil de nos opérations.
D’une plateforme basique nous aboutirons à une plateforme représentant un condensé du savoir-faire Microsoft en matière d’architecture serveurs, le tout en suivant les principes et les règles MOF. Une plateforme transfigurée en quelques heures, des solutions neuves et efficaces mises à la disposition des utilisateurs, en bref, la vie d’une infrastructure IT en une journée.
Agenda :
Je vous donne rendez-vous pour cette journée hyper-intensive ! Ce sera l’occasion pour vous d’appréhender les problématiques techniques qui nous mobilisent tous les jours et la façon de les anticiper.
Dans ce post nous allons voir comment traiter un problème spécifique de 100% CPU causé par le spooler.
Après avoir constaté via Task Manager ou Process Explorer que le processus causant cette consommation de temps processeur était bien Spoolsv.exe (spooler d’impression), nous avons pris plusieurs dumps du processus avec l’outil Adplus.
Cette méthodologie peut être reprise pour identifier d’autres dysfonctionnements liés au spooler.
Collecte de dump
Pour cela, télécharger les « Debugging Tools » à cette adresse : http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx et les installer sur le serveur (il est possible d’installer ces outils sur une machine moins sensible puis de copier le répertoire d’installation vers le serveur).
Après avoir installé ces outils nous avons pris des dumps du processus Spoolsv.exe via la commande suivante :
Cscript Adplus.vbs –quiet –hang –pn spoolsv.exe –r 3 60
Après avoir pris les dumps, nous les avons ouverts avec Windbg (fournis aussi avec les Debugging tools) :
Menu Démarrer => Debugging tools for Windows => Windbg Depuis le menu File => Symbol file path entrez les paramètres suivants : SRV*C:\SYMBOLS*http://msdl.microsoft.com/download/symbols puis OK Il est important de disposer de symboles pour que Windbg puisse interpréter le contenu de la mémoire, de la pile, etc…On spécifie ici la source utilisée pour télécharger les symboles publics (en l’occurrence les serveurs publics Microsoft) File=> Open Crash Dump
Analyse des dumps
La première étape consiste à rechercher le thread consommant le plus de CPU :
>!runaway
4:1144 0 days 0:00:01.312 => Le thread 4 est celui qui utilise actuellement le plus de CPU
11:135c 0 days 0:00:00.015
17:1714 0 days 0:00:00.000
16:1710 0 days 0:00:00.000
15:170c 0 days 0:00:00.000
14:1708 0 days 0:00:00.000
13:1704 0 days 0:00:00.000
12:1700 0 days 0:00:00.000
10:16fc 0 days 0:00:00.000
9:16f8 0 days 0:00:00.000
8:16f0 0 days 0:00:00.000
7:16e8 0 days 0:00:00.000
6:16ac 0 days 0:00:00.000
5:113c 0 days 0:00:00.000
3:15c8 0 days 0:00:00.000
2:ff4 0 days 0:00:00.000
1:13c 0 days 0:00:00.000
0:148 0 days 0:00:00.000
Nous devons donc nous positionner dans le contexte du thread :
>~4s
eax=0000004b ebx=00000000 ecx=00a3dea8 edx=7ffe0300 esi=00a3e008 edi=00000000
eip=7c8285ec esp=00a3df94 ebp=00a3dfd4 iopl=0 nv up ei pl nz na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000206
On affiche la pile du thread :
>kv
00a3df90 7c82734b 77f5cd00 00a3dfe0 00010000 ntdll!KiFastSystemCallRet (FPO: [0,0,0])
00a3df94 77f5cd00 00a3dfe0 00010000 00a3dfb4 ntdll!ZwOpenKey+0xc (FPO: [3,0,0])
00a3dfd4 77f5cc4d 0000047c 00000000 00000000 advapi32!LocalBaseRegDeleteKeyEx+0xb0 (FPO: [Non-Fpo]) (CONV: stdcall)
00a3dfec 77f5cc0d 0000047c 00a3e008 00a3e2c4 advapi32!LocalBaseRegDeleteKey+0x14 (FPO: [Non-Fpo]) (CONV: stdcall)
00a3e038 7616687e 0000047c 00a3e2c4 00a3e288 advapi32!RegDeleteKeyW+0xd2 (FPO: [Non-Fpo]) (CONV: stdcall)
00a3e048 7613e295 0000047c 00a3e2c4 008f52a8 localspl!SplRegDeleteKey+0x3d (FPO: [Non-Fpo]) (CONV: stdcall)
00a3e288 7613e234 0000047c 000001e0 00a3e2c4 localspl!SplRegDeleteKey+0x17b (FPO: [Non-Fpo]) (CONV: stdcall)
00a3e4d0 7613e234 00000478 0000047c 00a3e50c localspl!SplRegDeleteKey+0x126 (FPO: [Non-Fpo]) (CONV: stdcall)
00a3e718 7613e234 00000480 00000478 00a3e754 localspl!SplRegDeleteKey+0x126 (FPO: [Non-Fpo]) (CONV: stdcall)
00a3e960 76143a57 00000174 00000480 008f9e78 localspl!SplRegDeleteKey+0x126 (FPO: [Non-Fpo]) (CONV: stdcall)
00a3e990 76143ac2 008f9e78 008f52a8 008f52a8 localspl!DeletePrinterIni+0x7a (FPO: [Non-Fpo]) (CONV: stdcall)
00a3e9a8 7613f590 00958078 00000001 00000000 localspl!DeletePrinterForReal+0x2b (FPO: [Non-Fpo]) (CONV: stdcall)
00a3e9bc 76133674 008f52a8 008f52a8 00a3f68c localspl!CleanupDeletedPrinters+0x2b (FPO: [Non-Fpo]) (CONV: stdcall)
00a3f230 761374eb 008f52a8 00000000 008f2ab8 localspl!BuildPrinterInfo+0xee5 (FPO: [Non-Fpo]) (CONV: stdcall)
00a3f668 761391f8 0090e8a0 00000001 00a3f68c localspl!SplCreateSpooler+0x644 (FPO: [Non-Fpo]) (CONV: stdcall)
00a3f908 74064c44 008f2ab8 00000158 00000000 localspl!InitializePrintProvidor+0x1bc (FPO: [Non-Fpo]) (CONV: stdcall)
00a3f930 74064915 74064cd0 00000000 00000000 spoolss!InitializeProvidor+0x89 (FPO: [Non-Fpo]) (CONV: stdcall)
00a3ffb8 77e64829 008f1ea8 00000000 00000000 spoolss!InitializeRouter+0x25b (FPO: [Non-Fpo]) (CONV: stdcall)
00a3ffec 00000000 01003f90 008f1ea8 00000000 kernel32!BaseThreadStart+0x34 (FPO: [Non-Fpo]) (CONV: stdcall)
Ici on peut voir que nous essayons de faire une suppression d’une clé de registre, localspl!SplRegDeleteKey, et cela en boucle car il semble que le processus n’arrive pas à la supprimer, d’où la consommation de CPU dans le temps.
Voyons à quoi correspond cette clé (du moins trouver l’adresse du handle qui pointe vers cette clé) avec la commande suivante :
>Kp
00a3df90 7c82734b ntdll!KiFastSystemCallRet(void)
00a3df94 77f5cd00 ntdll!ZwOpenKey(void)+0xc
00a3dfd4 77f5cc4d advapi32!LocalBaseRegDeleteKeyEx(struct HKEY__ * hKey = 0x0000047c, struct _UNICODE_STRING * lpSubKey = 0x00000000, unsigned long samDesired = 0, unsigned long Reserved = 0)+0xb0
00a3dfec 77f5cc0d advapi32!LocalBaseRegDeleteKey(struct HKEY__ * hKey = 0x0000047c, struct _UNICODE_STRING * lpSubKey = 0x00a3e008 "(0x1A01)")+0x14
00a3e038 7616687e advapi32!RegDeleteKeyW(struct HKEY__ * hKey = 0x0000047c, unsigned short * lpKeyName = 0x00a3e2c4)+0xd2
00a3e048 7613e295 localspl!SplRegDeleteKey(void * hKey = 0x0000047c, unsigned short * pszSubKey = 0x00a3e2c4, struct _INISPOOLER * pIniSpooler = 0x008f52a8)+0x3d
00a3e288 7613e234 localspl!SplDeleteThisKey(void * hParentKey = 0x0000047c, void * hThisKey = 0x000001e0, unsigned short * pThisKeyName = 0x00a3e2c4, int bDeleteNullKey = 1, struct _INISPOOLER * pIniSpooler = 0x008f52a8)+0x17b
00a3e4d0 7613e234 localspl!SplDeleteThisKey(void * hParentKey = 0x00000478, void * hThisKey = 0x0000047c, unsigned short * pThisKeyName = 0x00a3e50c, int bDeleteNullKey = 1, struct _INISPOOLER * pIniSpooler = 0x008f52a8)+0x126
00a3e718 7613e234 localspl!SplDeleteThisKey(void * hParentKey = 0x00000480, void * hThisKey = 0x00000478, unsigned short * pThisKeyName = 0x00a3e754, int bDeleteNullKey = 1, struct _INISPOOLER * pIniSpooler = 0x008f52a8)+0x126
00a3e960 76143a57 localspl!SplDeleteThisKey(void * hParentKey = 0x00000174, void * hThisKey = 0x00000480, unsigned short * pThisKeyName = 0x008f9e78, int bDeleteNullKey = 1, struct _INISPOOLER * pIniSpooler = 0x008f52a8)+0x126
00a3e990 76143ac2 localspl!DeletePrinterIni(struct _INIPRINTER * pIniPrinter = 0x008f9e78)+0x7a
00a3e9a8 7613f590 localspl!DeletePrinterForReal(struct _INIPRINTER * pIniPrinter = 0x00958078, int bIsInitTime = 1)+0x2b
00a3e9bc 76133674 localspl!CleanupDeletedPrinters(struct _INISPOOLER * pIniSpooler = 0x008f52a8)+0x2b
00a3f230 761374eb localspl!BuildPrinterInfo(struct _INISPOOLER * pIniSpooler = 0x008f52a8, int UpdateChangeID = 0)+0xee5
00a3f668 761391f8 localspl!SplCreateSpooler(unsigned short * pMachineName = 0x0090e8a0, unsigned long Level = 1, unsigned char * pSpooler = 0x00a3f68c "", unsigned char * pReserved = 0x00000000 "")+0x644
00a3f908 74064c44 localspl!InitializePrintProvidor(struct _PRINTPROVIDOR * pPrintProvidor = 0x008f2ab8, unsigned long cbPrintProvidor = 0x158, unsigned short * pFullRegistryPath = 0x00000000)+0x1bc
00a3f930 74064915 spoolss!InitializeProvidor(unsigned short * pProvidorName = 0x74064cd0, unsigned short * pFullName = 0x00000000)+0x89
00a3ffb8 77e64829 spoolss!InitializeRouter(struct RouterInitializationParams * pRouterParams = 0x008f1ea8)+0x25b
00a3ffec 00000000 kernel32!BaseThreadStart(<function> * lpStartAddress = 0x01003f90, void * lpParameter = 0x008f1ea8)+0x34
La commande suivante permet d’afficher la clé de registre qui ne peut être supprimée :
>!handle 0000047c 4
Handle 0000047c
Name \REGISTRY\MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers\bg-picklabel on bgmprint (from BG-JLP) in session 1\PrinterDriverData\Papers
Cette clé est vraisemblablement corrompue car la tentative de suppression manuelle avec Regedit s’est avérée impossible. Le nom de la clé est peu commun et peut donc contenir des caractères null.
La suppression via Regedit n'étant pas possible nous avons utilisé l'outil RegDelNull.exe (disponible depuis http://www.microsoft.com/technet/sysinternals/utilities/regdelnull.mspx ) via la commande : RegDelNull.exe hklm -s puis nous avons répondu « Yes » concernant la suppression de la clé « bg-picklabel on bgmprint (from BG-JLP) in session 1\PrinterDriverData\Papers »
Un redémarrage du spooler a permis de remettre en service le service d’impression.
Hervé Chapalain aura l’occasion de présenter une session orientée debugging le Mardi 10 Février. Ne manquez pas cette session et profitez du talent d’Hervé pour découvrir le quotidien d’un ingénieur support dans l’équipe Windows Core !
Session FRA408 - Débogage d’applications en production (Web, Service NT et autres…)
Des problèmes de crash, de fuites mémoires, de performances, ou tout autres bogues insaisissables sur votre site Web ? Cette session est faite pour vous. En direct du centre d'escalade Européen, venez rencontrer Hervé Chapalain, qui nous propose de voir les outils et méthodologie lorsque nous rencontrons ce type de situation. De l'utilisation des symboles, des dumps et autre bonne pratiques, Hervé se propose de vous montrer le « Microsoft Windows Performance Toolkit », ainsi que quelques trucs et astuces méconnus de Windows Vista et Windows 2008.
Pour vous mettre en bouche, la session de l’an passée Déboguer avec Visual Studio 2008.
Avez-vous déjà rencontré un article de base de connaissances Microsoft ou vous êtes vous déjà vu présenter une solution Windows Error Reporting (WER) et demandé pourquoi Microsoft ne pouvait pas corriger cela pour vous ?
Aujourd'hui les articles KB et les solutions WER vous fournissent les étapes qui permettent de résoudre votre problème. Dans l’avenir nous espérons automatiser le plus de solutions et mettre en place un mécanisme qui permettra de résoudre les problèmes que vous avez avec nos produits plus rapidement et plus facilement en exécutant pour vous les actions documentées.
C’est l’objectif de l’initiative Fix it qui est déjà implémentée dans deux articles techniques :
Autre nouveauté (qui date un peu tout de même !), la possibilité de télécharger les correctifs n’étant pas disponibles sur Microsoft Updates et corrigeant des problématiques très spécifiques grâce au programme Hotfix Online Submission.
Pour ce type de correctif, vous devriez voir ceci en haut des fiches techniques un lien symbolisé par l’image ci-dessous :
En cliquant sur ce lien, vous serez à même de sélectionner la version qui convient à votre environnement (x86 ou x64) et le télécharger.
Ce projet vise à rendre plus fluide la délivrance des correctifs à nos clients alors que jusqu'à présent, il fallait passer un appel au support pour ouvrir un dossier (non décompté dans les contrats de support), être contacté par un ingénieur support qui identifiait la plateforme cible, la langue, etc... pour ensuite recevoir le correctif.
C’est plus simple non ?