L’API SetFileCompletionNotificationModes empêche un port de saisie semi-automatique d’E/S de fonctionner correctement si un LSP non-IFS est installé

Cet article vous aide à résoudre le problème lié au fait qu’un LSP non-IFS ne prend pas correctement en charge un port de saisie semi-automatique d’E/S lorsque l’utilisateur change de mode de notification à l’aide SetFileCompletionNotificationModesde .

Version d’origine du produit : Windows 7 Entreprise, Windows 7 Édition Familiale Basique, Windows 7 Édition Familiale Premium, Windows 7 Édition Intégrale
Numéro de la base de connaissances d’origine : 2568167

Symptômes

Certaines applications peuvent entrer en conflit avec des fournisseurs de services de base Winsock (BSP) ou des fournisseurs de services en couches (LSP). Une application crée un port de saisie semi-automatique d’E/S et l’associe à un socket, puis appelle SetFileCompletionNotificationModes avec l’indicateur FILE_SKIP_COMPLETION_PORT_ON_SUCCESS sur le handle de socket. Pour tous les appels Winsock asynchrones ultérieurs sur ce socket qui ont une OVERLAPPED structure passée, l’application ne connaîtra pas d’achèvements pour cette fonction Winsock appels sur le port de saisie semi-automatique d’E/S associé.

Remarque

Ce problème concerne uniquement les applications qui s’exécutent dans Windows Vista et les versions ultérieures, car ce nouvel indicateur IOCP (FILE_SKIP_COMPLETION_PORT_ON_SUCCESS) a été ajouté dans Vista.

Cause

Les fournisseurs BSP ou LSP Winsock non-IFS ne sont pas compatibles avec l’indicateur FILE_SKIP_COMPLETION_PORT_ON_SUCCESS . L’incompatibilité entraîne la présence d’appels Winsock asynchrones utilisés par le socket et qui ne OVERLAPPED fonctionnent pas correctement lorsque des BSP winsock ou des fournisseurs LSP non-IFS ont été installés. Tous les BSP Winsock fournis par Microsoft utilisent des handles IFS et les BSP tiers sont rares. Ce problème est donc principalement dû à l’installation de LSP non-IFS.

Résolution

Pour résoudre ce problème, appliquez l’une des méthodes suivantes :

  • Ne spécifiez pas l’indicateur FILE_SKIP_COMPLETION_PORT_ON_SUCCESS .
  • Supprimez tous les fournisseurs LSP Winsock non-IFS installés.
  • Passer d’un LSP non-IFS à la plateforme de filtrage Windows (PAM).

Informations supplémentaires

Pour déterminer si un BSP ou un LSP non-IFS est installé, utilisez la netsh WinSock Show Catalog commande et examinez chaque élément d’entrée du fournisseur de catalogue Winsock retourné. Si la valeur Indicateurs de service a le bit 0x20000 défini, le fournisseur utilise des handles IFS et fonctionne correctement. Si le bit 0x20000 est clair (non défini), il s’agit d’un BSP ou LSP non-IFS. Pour déterminer par programmation si un BSP ou un LSP non-IFS est installé, énumérez les protocoles disponibles à l’aide de la fonction WSCEnumerateProtocols. Ensuite, dans chaque structure retournéeWSAPROTOCOL_INFO, case activée le dwServiceFlag1 membre pour voir si l’indicateur XP1_IFS_HANDLES (0x20000) est défini. La documentation du Kit de développement logiciel (SDK) Windows pour la WSCEnumProtocols fonction inclut le code source d’un exemple de programme qui montre comment procéder.

Remarque

  • La valeur Indicateurs de service a été introduite dans la commande netsh dans Windows 7 et Windows Server 2008 R2. Par conséquent, l’utilisation de la commande netsh pour case activée cette valeur ne fonctionne pas dans Windows Vista ou Windows Server 2008.
  • La WSCEnumerateProtocols fonction peut être utilisée pour récupérer des WSAPROTOCOL_INFOW structures et le dwServiceFlag1 membre pour déterminer si les BSP ou les fournisseurs de services de sécurité logiques (BSP) IFS/non-IFS sont installés. La WSCEnumerateProtocols fonction est prise en charge dans Windows 2000 et versions ultérieures.