Partager via


User32.dll ou Kernel32.dll n’initialise pas

Cet article décrit un problème où une application exécutée par CreateProcess ou CreateProcessAsUser peut échouer.

S’applique à : Microsoft Windows
Numéro de base de connaissances d’origine : 184802

Symptômes

Une application exécutée par CreateProcess ou CreateProcessAsUser peut échouer, et vous recevez l’un des messages d’erreur suivants :

Échec de l'initialisation de la bibliothèque dynamique <system>\system32\user32.dll. Le processus se termine anormalement. Échec de l’initialisation de la bibliothèque dynamique <système>\system32\kernel32.dll. Le processus se termine anormalement.

En outre, le processus ayant échoué retourne le code de sortie 128 ou les éléments suivants :

error :ERROR_WAIT_NO_CHILDREN

La cause

Cet échec se produit pour l’une des raisons suivantes :

  • Le processus exécuté ne dispose pas d’un accès de sécurité correct à la station de fenêtre et au bureau associés au processus.

  • Le système est sorti du tas de bureau.

Plus d’informations

  • Première cause

    Le processus exécuté ne dispose pas d’un accès de sécurité correct à la station de fenêtre et au bureau associés au processus.

    Le membre lpDesktop de la structure STARTUPINFO, transmise à CreateProcess ou CreateProcessAsUser, spécifie la station de fenêtre et le bureau associés au processus exécuté. Le processus exécuté doit disposer d’un accès de sécurité correct à la station de fenêtre et au bureau spécifiés.

  • Deuxième cause

    Le système est sorti du tas de bureau.

    Chaque objet de bureau sur le système a un segment de mémoire de bureau qui lui est associé. L’objet de bureau utilise le tas pour stocker des menus, des hooks, des chaînes et des fenêtres. Dans Windows Server 2003 et Windows XP 32 bits, le système alloue le tas de bureau à partir d’une mémoire tampon de 48 mégaoctets (Mo) à l’échelle du système. Outre les tas du bureau, les pilotes d’imprimante et les pilotes de fonte utilisent également cette mémoire tampon.

    Les bureaux sont associés aux stations de travail. Une station de fenêtre peut contenir zéro ou plusieurs bureaux. Vous pouvez modifier la taille de la pile de bureau allouée pour un bureau associé à une station de travail en modifiant la valeur de Registre suivante.

    Remarque

    Nous vous déconseillons d’utiliser le commutateur /3 Go. Le commutateur /3GB est spécifié dans le fichier Boot.ini. Le commutateur /3GB est pris en charge uniquement pour les systèmes d’exploitation 32 bits. HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows

Dans Windows Server 2003 et Windows XP 32 bits, les données par défaut de cette valeur de Registre ressemblent à ce qui suit (toutes sur une ligne) :

%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows
SharedSection=1024,3072,512 Windows=On SubSystemType=Windows
ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3
ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off
MaxRequestThreads=16

Dans différentes versions de Windows, les données par défaut de cette valeur de Registre ressemblent à ce qui suit :

  • Pour Windows Vista RTM (32 bits)

    SharedSection=1024,3072,512
    
  • Pour Windows Vista SP1, Windows 7, Windows 8, Windows 8.1 (32 bits) et Windows Server 2008 (32 bits)

    SharedSection=1024,12288,512
    
  • Pour Windows Vista, Windows 7, Windows 8, Windows 8.1 (64 bits), Windows Server 2008, Windows Server 2008 R2, Windows Server 2012 et Windows Server 2012 R2 (64 bits)

    SharedSection=1024,20480,768
    

Les valeurs numériques qui suivent SharedSection= contrôlent la façon dont le tas de bureau est alloué. Ces SharedSection valeurs sont spécifiées en kilo-octets. Il existe des paramètres distincts pour les bureaux associés à des stations de fenêtre interactives et non interactives.

Remarque

Si vous modifiez les SharedSection valeurs dans le Registre, vous devez redémarrer le système pour que les modifications prennent effet.

Important

Cette section, méthode ou tâche contient des étapes qui vous indiquent comment modifier le registre. Cependant, des problèmes sérieux peuvent survenir si vous modifiez le registre de manière incorrecte. Par conséquent, veillez à suivre attentivement ces étapes. Pour une protection supplémentaire, sauvegardez le Registre avant de le modifier. Ensuite, vous pouvez restaurer le registre si un problème survient. Pour plus d’informations sur la sauvegarde et la restauration du Registre, consultez Comment sauvegarder et restaurer le Registre dans Windows.

La première SharedSection valeur (1024) est la taille de la mémoire partagée commune à tous les bureaux. Cela inclut la table de handles globaux. Ce tableau contient des références aux fenêtres, menus, icônes, curseurs, etc., et les paramètres système partagés. Il est peu probable que vous deviez modifier cette valeur.

La deuxième SharedSection valeur est la taille du segment de mémoire de bureau pour chaque bureau lié à la station de fenêtre interactive WinSta0. Les objets utilisateur tels que les hooks, les menus, les chaînes et les fenêtres consomment de la mémoire dans la pile mémoire du bureau. Il est peu probable que vous deviez modifier cette valeur.

Chaque bureau créé dans la station de fenêtre interactive utilise le tas de bureau par défaut de 3 072 Ko. Par défaut, le système crée les trois bureaux suivants dans Winsta0 :

  • Winlogon

  • Par défaut

    Le bureau d’application par défaut sera utilisé par tous les processus pour lesquels Winsta0\default est spécifié dans le membre de structure STARTUPINFO.lpDesktop. Lorsque le membre de la structure lpDesktop a la valeur NULL, la station de fenêtre et le bureau sont hérités du processus parent. Tous les services exécutés sous le compte LocalSystem avec l’option Autoriser le service d’interagir avec l’option de démarrage desktop sélectionnée seront utilisés Winsta0\Default. Tous ces processus partageront le heap de bureau qui est associé au bureau de l'application par défaut.

  • Économiseur d’écran

    Le bureau de l'économiseur d'écran est créé dans la station de fenêtre interactive (WinSta0) lorsqu'un économiseur d'écran est affiché.

La troisième valeur SharedSection est la taille du tas de bureau pour chaque bureau associé à une station de fenêtre noninteractive. Si cette valeur n'est pas présente, la taille du segment de mémoire du bureau pour les stations de fenêtre non interactives sera identique à celle spécifiée pour les stations de fenêtre interactives (c'est-à-dire, la deuxième valeur de SharedSection).

Si seules deux valeurs SharedSection sont présentes, vous pouvez ajouter une troisième valeur pour spécifier la taille du tas de bureau pour les bureaux créés dans les stations de fenêtre non interactives.

Chaque processus de service exécuté sous un compte d’utilisateur reçoit un nouveau bureau dans une station de fenêtre noninteractive créée par le Gestionnaire de contrôle de service (SCM). Par conséquent, chaque service exécuté sous un compte d'utilisateur utilise la quantité de kilo-octets de mémoire de bureau spécifiée dans la troisième valeur SharedSection. Tous les services exécutés sous le compte LocalSystem lorsque l'option "Autoriser le service à interagir avec le Bureau" n'est pas sélectionnée partagent le tas de bureau du bureau par défaut dans la station de services non interactive (Service-0x0-3e7$).

La pile de bureau totale utilisée dans les stations de fenêtres interactives et non interactives doit s’intégrer dans le tampon.

La réduction de la deuxième ou troisième valeur de SharedSection permet d'augmenter le nombre de bureaux pouvant être créés dans les stations de travail correspondantes. Les valeurs plus petites limitent le nombre de hooks, de menus, de chaînes et de fenêtres qui peuvent être créés dans un bureau. En revanche, augmenter la valeur du deuxième ou troisième paramètre de SharedSection réduit le nombre de bureaux qui peuvent être créés. Toutefois, cela augmente également le nombre de hooks, de menus, de chaînes et de fenêtres qui peuvent être créés dans un bureau.

Étant donné que le SCM crée un nouveau bureau dans la station de fenêtres non interactive pour chaque processus de service qui s’exécute sous un compte utilisateur, une valeur plus grande de la troisième SharedSection réduit le nombre de services de comptes utilisateur qui peuvent fonctionner correctement sur le système. La valeur minimale qui peut être spécifiée pour la deuxième ou troisième valeur SharedSection est 128. Toute tentative d’utilisation d’une valeur plus petite utilise plutôt 128.

Le "desktop heap" est alloué par User32.dll lorsqu’un processus a besoin d’objets utilisateur. Si une application ne dépend pas de User32.dll, elle n’utilisera pas le heap du bureau.

Remarque

Dans Windows Server 2003, l’événement spécifique est journalisé dans le journal système quand l’une des conditions suivantes est remplie :

  • Si le tas de bureau est plein, l’événement suivant est journalisé :

    Event Type: Warning
    Event Source: Win32k
    Event Category: None
    Event ID: 243
    Date: Date
    Time: Time
    User: N/A
    Computer: ServerName
    Description: A desktop heap allocation failed.
    

    Dans ce cas, augmentez la taille du tas de bureau.

  • Si le heap de bureau total devient la taille de mémoire tampon au niveau du système, l’événement suivant est enregistré :

    Event Type: Warning
    Event Source: Win32k
    Event Category: None
    Event ID: 244
    Date: Date
    Time: Time
    User: N/A
    Computer: ServerName
    Description: Failed to create a desktop due to desktop heap exhaustion.
    

    Dans ce cas, diminuez la taille du tas de bureau.

Dans Windows Server 2003, une mémoire tampon à l’échelle du système est de 20 Mo lorsque l’une des conditions suivantes est remplie :

  • Vous êtes dans un environnement Terminal Services.
  • Le commutateur /3GB est spécifié dans le fichier Boot.ini.

S’applique à

  • Microsoft Windows XP Professionnel
  • Microsoft Windows XP Home Edition
  • Windows Vista Édition Intégrale
  • Windows Vista Entreprise
  • Windows Vista Professionnel
  • Windows Vista Édition Familiale Premium
  • Windows 7 Édition Intégrale
  • Windows 7 Entreprise
  • Windows 7 Professionnel
  • Windows 7 Édition Familiale Premium
  • Windows 8 Entreprise
  • Windows 8 Professionnel, Windows 8
  • Windows 8.1 Enterprise
  • Windows 8.1 Professionnel
  • Windows 8.1
  • Microsoft Windows Server 2003 Datacenter Edition (x86 32 bits)
  • Microsoft Windows Server 2003 Datacenter x64 Edition
  • Microsoft Windows Server 2003 Êdition Entreprise (x86 32 bits)
  • Microsoft Windows Server 2003 Enterprise x64 Edition
  • Microsoft Windows Server 2003 Édition Standard (x86 32 bits)
  • Microsoft Windows Server 2003 Standard x64 Edition
  • Windows Server 2008 Datacenter
  • Windows Server 2008 Enterprise
  • Windows Server 2008 R2 Datacenter
  • Windows Server 2008 R2 Entreprise
  • Windows Server 2008 Standard
  • Windows Server 2012 Datacenter
  • Windows Server 2012 Standard
  • Windows Server 2012 R2Centre de données
  • Windows Server 2012 R2 Standard