Partager via


Fonction CreateNamedPipeA (winbase.h)

Crée un instance d’un canal nommé et retourne un handle pour les opérations de canal suivantes. Un processus de serveur de canal nommé utilise cette fonction soit pour créer la première instance d’un canal nommé spécifique et établir ses attributs de base, soit pour créer une nouvelle instance d’un canal nommé existant.

Syntaxe

HANDLE CreateNamedPipeA(
  [in]           LPCSTR                lpName,
  [in]           DWORD                 dwOpenMode,
  [in]           DWORD                 dwPipeMode,
  [in]           DWORD                 nMaxInstances,
  [in]           DWORD                 nOutBufferSize,
  [in]           DWORD                 nInBufferSize,
  [in]           DWORD                 nDefaultTimeOut,
  [in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes
);

Paramètres

[in] lpName

Nom de canal unique. Cette chaîne doit avoir la forme suivante :

\\.\pipe\pipename

La partie pipename du nom peut inclure n’importe quel caractère autre qu’une barre oblique inverse, y compris des nombres et des caractères spéciaux. La chaîne de nom de canal entière peut avoir jusqu’à 256 caractères. Les noms de canal ne respectent pas la casse.

[in] dwOpenMode

Mode ouvert.

La fonction échoue si dwOpenMode spécifie autre chose que 0 ou les indicateurs répertoriés dans les tableaux suivants.

Ce paramètre doit spécifier l’un des modes d’accès au canal suivants. Le même mode doit être spécifié pour chaque instance du canal.

Mode Signification
PIPE_ACCESS_DUPLEX
0x00000003
Le canal est bidirectionnel ; Les processus serveur et client peuvent lire et écrire dans le canal. Ce mode donne au serveur l’équivalent de GENERIC_READ et GENERIC_WRITE accès au canal. Le client peut spécifier GENERIC_READ ou GENERIC_WRITE, ou les deux, lorsqu’il se connecte au canal à l’aide de la fonction CreateFile .
PIPE_ACCESS_INBOUND
0x00000001
Le flux de données dans le canal passe du client au serveur uniquement. Ce mode donne au serveur l’équivalent de GENERIC_READ accès au canal. Le client doit spécifier GENERIC_WRITE accès lors de la connexion au canal. Si le client doit lire les paramètres du canal en appelant les fonctions GetNamedPipeInfo ou GetNamedPipeHandleState , le client doit spécifier GENERIC_WRITE et FILE_READ_ATTRIBUTES accès lors de la connexion au canal.
PIPE_ACCESS_OUTBOUND
0x00000002
Le flux de données dans le canal passe du serveur au client uniquement. Ce mode donne au serveur l’équivalent de GENERIC_WRITE accès au canal. Le client doit spécifier GENERIC_READ accès lors de la connexion au canal. Si le client doit modifier les paramètres de canal en appelant la fonction SetNamedPipeHandleState , le client doit spécifier GENERIC_READ et FILE_WRITE_ATTRIBUTES accès lors de la connexion au canal.
 

Ce paramètre peut également inclure un ou plusieurs des indicateurs suivants, qui activent l’écriture directe et les modes superposés. Ces modes peuvent être différents pour différentes instances du même canal.

Mode Signification
FILE_FLAG_FIRST_PIPE_INSTANCE
0x00080000
Si vous tentez de créer plusieurs instances d’un canal avec cet indicateur, la création du premier instance réussit, mais la création du instance suivant échoue avec ERROR_ACCESS_DENIED.
FILE_FLAG_WRITE_THROUGH
0x80000000
Le mode d’écriture directe est activé. Ce mode affecte uniquement les opérations d’écriture sur les canaux de type octet, puis uniquement lorsque les processus client et serveur se trouvent sur des ordinateurs différents. Si ce mode est activé, les fonctions qui écrivent dans un canal nommé ne retournent pas les données écrites tant que les données écrites ne sont pas transmises sur le réseau et se situent dans la mémoire tampon du canal sur l’ordinateur distant. Si ce mode n’est pas activé, le système améliore l’efficacité des opérations réseau en mettant en mémoire tampon les données jusqu’à ce qu’un nombre minimal d’octets s’accumule ou jusqu’à ce qu’un temps maximal s’écoule.
FILE_FLAG_OVERLAPPED
0x40000000
Le mode chevauché est activé. Si ce mode est activé, les fonctions effectuant des opérations de lecture, d’écriture et de connexion qui peuvent prendre beaucoup de temps peuvent être retournées immédiatement. Ce mode permet au thread qui a démarré l’opération d’effectuer d’autres opérations pendant que l’opération chronophage s’exécute en arrière-plan. Par exemple, en mode chevauchant, un thread peut gérer des opérations d’entrée et de sortie simultanées (E/S) sur plusieurs instances d’un canal ou effectuer des opérations de lecture et d’écriture simultanées sur le même handle de canal. Si le mode superposé n’est pas activé, les fonctions effectuant des opérations de lecture, d’écriture et de connexion sur le handle de canal ne sont pas retournées tant que l’opération n’est pas terminée. Les fonctions ReadFileEx et WriteFileEx ne peuvent être utilisées qu’avec un handle de canal en mode superposé. Les fonctions ReadFile, WriteFile, ConnectNamedPipe et TransactNamedPipe peuvent s’exécuter de manière synchrone ou en tant qu’opérations qui se chevauchent.
 

Ce paramètre peut inclure n’importe quelle combinaison des modes d’accès de sécurité suivants. Ces modes peuvent être différents pour différentes instances du même canal.

Mode Signification
WRITE_DAC
0x00040000L
L’appelant aura un accès en écriture à la liste de contrôle d’accès discrétionnaire (ACL) du canal nommé.
WRITE_OWNER
0x00080000L
L’appelant aura un accès en écriture au propriétaire du canal nommé.
ACCESS_SYSTEM_SECURITY
0x01000000L
L’appelant aura un accès en écriture à la SACL du canal nommé. Pour plus d’informations, consultez Access-Control Listes (ACL) et Droit d’accès SACL.

[in] dwPipeMode

Mode canal.

La fonction échoue si dwPipeMode spécifie autre chose que 0 ou les indicateurs répertoriés dans les tableaux suivants.

L’un des modes de type suivants peut être spécifié. Le même mode de type doit être spécifié pour chaque instance du canal.

Mode Signification
PIPE_TYPE_BYTE
0x00000000
Les données sont écrites dans le canal sous la forme d’un flux d’octets. Ce mode ne peut pas être utilisé avec PIPE_READMODE_MESSAGE. Le canal ne distingue pas les octets écrits au cours des différentes opérations d’écriture.
PIPE_TYPE_MESSAGE
0x00000004
Les données sont écrites dans le canal sous forme de flux de messages. Le canal traite les octets écrits pendant chaque opération d’écriture comme une unité de message. La fonction GetLastError retourne ERROR_MORE_DATA lorsqu’un message n’est pas lu complètement. Ce mode peut être utilisé avec PIPE_READMODE_MESSAGE ou PIPE_READMODE_BYTE.
 

L’un des modes de lecture suivants peut être spécifié. Différentes instances du même canal peuvent spécifier différents modes de lecture.

Mode Signification
PIPE_READMODE_BYTE
0x00000000
Les données sont lues à partir du canal sous la forme d’un flux d’octets. Ce mode peut être utilisé avec PIPE_TYPE_MESSAGE ou PIPE_TYPE_BYTE.
PIPE_READMODE_MESSAGE
0x00000002
Les données sont lues à partir du canal en tant que flux de messages. Ce mode ne peut être utilisé que si PIPE_TYPE_MESSAGE est également spécifié.
 

L’un des modes d’attente suivants peut être spécifié. Différentes instances du même canal peuvent spécifier différents modes d’attente.

Mode Signification
PIPE_WAIT
0x00000000
Le mode de blocage est activé. Lorsque le handle de canal est spécifié dans la fonction ReadFile, WriteFile ou ConnectNamedPipe , les opérations ne sont pas terminées tant qu’il n’y a pas de données à lire, que toutes les données sont écrites ou qu’un client n’est pas connecté. L’utilisation de ce mode peut signifier attendre indéfiniment, dans certaines situations, qu’un processus client effectue une action.
PIPE_NOWAIT
0x00000001
Le mode sans blocage est activé. Dans ce mode, ReadFile, WriteFile et ConnectNamedPipe retournent toujours immédiatement.

Notez que le mode sans blocage est pris en charge pour la compatibilité avec Microsoft LAN Manager version 2.0 et ne doit pas être utilisé pour effectuer des E/S asynchrones avec des canaux nommés. Pour plus d’informations sur les E/S de canal asynchrones, consultez Entrée et sortie synchrones et superposées.

 

L’un des modes client distants suivants peut être spécifié. Différentes instances du même canal peuvent spécifier différents modes de client distant.

Mode Signification
PIPE_ACCEPT_REMOTE_CLIENTS
0x00000000
Connections de clients distants peuvent être acceptés et vérifiés par rapport au descripteur de sécurité du canal.
PIPE_REJECT_REMOTE_CLIENTS
0x00000008
Connections des clients distants sont automatiquement rejetés.

[in] nMaxInstances

Nombre maximal d’instances qui peuvent être créées pour ce canal. La première instance du canal peut spécifier cette valeur ; le même nombre doit être spécifié pour les autres instances du canal. Les valeurs acceptables se trouvent entre 1 et PIPE_UNLIMITED_INSTANCES (255).

Si ce paramètre est PIPE_UNLIMITED_INSTANCES, le nombre d’instances de canal qui peuvent être créées est limité uniquement par la disponibilité des ressources système. Si nMaxInstances est supérieur à PIPE_UNLIMITED_INSTANCES, la valeur de retour est INVALID_HANDLE_VALUE et GetLastError retourne ERROR_INVALID_PARAMETER.

[in] nOutBufferSize

Nombre d’octets à réserver pour la mémoire tampon de sortie. Pour une discussion sur le dimensionnement des tampons de canal nommés, consultez la section Remarques suivante.

[in] nInBufferSize

Nombre d’octets à réserver pour la mémoire tampon d’entrée. Pour une discussion sur le dimensionnement des tampons de canal nommés, consultez la section Remarques suivante.

[in] nDefaultTimeOut

Valeur de délai d’attente par défaut, en millisecondes, si la fonction WaitNamedPipe spécifie NMPWAIT_USE_DEFAULT_WAIT. Chaque instance d’un canal nommé doit spécifier la même valeur.

Une valeur de zéro entraîne un délai d’attente par défaut de 50 millisecondes.

[in, optional] lpSecurityAttributes

Pointeur vers une structure de SECURITY_ATTRIBUTES qui spécifie un descripteur de sécurité pour le nouveau canal nommé et détermine si les processus enfants peuvent hériter du handle retourné. Si lpSecurityAttributes a la valeur NULL, le canal nommé obtient un descripteur de sécurité par défaut et le handle ne peut pas être hérité. Les listes de contrôle d’accès dans le descripteur de sécurité par défaut d’un canal nommé accordent un contrôle total au compte LocalSystem, aux administrateurs et au propriétaire du créateur. Ils accordent également l’accès en lecture aux membres du groupe Tout le monde et au compte anonyme.

Valeur retournée

Si la fonction réussit, la valeur de retour est un handle à l’extrémité du serveur d’un canal nommé instance.

Si la fonction échoue, la valeur de retour est INVALID_HANDLE_VALUE. Pour obtenir des informations détaillées sur l’erreur, appelez GetLastError.

Remarques

Pour créer une instance d’un canal nommé à l’aide de CreateNamedPipe, l’utilisateur doit avoir FILE_CREATE_PIPE_INSTANCE accès à l’objet de canal nommé. Si un nouveau canal nommé est en cours de création, la liste de contrôle d’accès (ACL) du paramètre attributs de sécurité définit le contrôle d’accès discrétionnaire pour le canal nommé.

Toutes les instances d’un canal nommé doivent spécifier le même type de canal (type d’octet ou de message), l’accès au canal (duplex, entrant ou sortant), le même nombre de instance et la même valeur de délai d’attente. Si des valeurs différentes sont utilisées, cette fonction échoue et GetLastError retourne ERROR_ACCESS_DENIED.

Un processus client se connecte à un canal nommé à l’aide de la fonction CreateFile ou CallNamedPipe . Le côté client d’un canal nommé démarre en mode octet, même si le côté serveur est en mode message. Pour éviter les problèmes de réception des données, définissez également le mode message côté client. Pour modifier le mode du canal, le client de canal doit ouvrir un canal en lecture seule avec un accès GENERIC_READ et FILE_WRITE_ATTRIBUTES .

Le serveur de canal ne doit pas effectuer une opération de lecture bloquante tant que le client de canal n’a pas démarré. Sinon, une condition de race peut se produire. Cela se produit généralement lorsque le code d’initialisation, tel que l’exécution C, doit verrouiller et examiner les handles hérités.

Chaque fois qu’un canal nommé est créé, le système crée les mémoires tampons entrantes et/ou sortantes à l’aide d’un pool non paginé, qui est la mémoire physique utilisée par le noyau. Le nombre d’instances de canal (ainsi que d’objets tels que des threads et des processus) que vous pouvez créer est limité par le pool non paginé disponible. Chaque demande de lecture ou d’écriture nécessite de l’espace dans la mémoire tampon pour les données de lecture ou d’écriture, ainsi que de l’espace supplémentaire pour les structures de données internes.

Les tailles de mémoire tampon d’entrée et de sortie sont des conseils. La taille de mémoire tampon réelle réservée à chaque extrémité du canal nommé est soit la valeur par défaut du système, la valeur minimale ou maximale du système, soit la taille spécifiée arrondie à la limite d’allocation suivante. La taille de mémoire tampon spécifiée doit être suffisamment petite pour que votre processus ne soit pas à court de pool non paginé, mais suffisamment grande pour prendre en charge les demandes standard.

Chaque fois qu’une opération d’écriture de canal se produit, le système tente d’abord de charger la mémoire sur le quota d’écriture du canal. Si le quota d’écriture de canal restant est suffisant pour répondre à la demande, l’opération d’écriture se termine immédiatement. Si le quota d’écriture de canal restant est trop petit pour répondre à la demande, le système tente d’étendre les mémoires tampons pour prendre en charge les données à l’aide d’un pool non paginé réservé au processus. L’opération d’écriture est bloquée jusqu’à ce que les données soient lues à partir du canal afin que le quota de mémoire tampon supplémentaire puisse être libéré. Par conséquent, si la taille de la mémoire tampon spécifiée est trop petite, le système augmente la mémoire tampon en fonction des besoins, mais l’inconvénient est que l’opération se bloque. Si l’opération se chevauche, un thread système est bloqué ; sinon, le thread d’application est bloqué.

Pour libérer les ressources utilisées par un canal nommé, l’application doit toujours fermer les handles lorsqu’elles ne sont plus nécessaires, ce qui s’effectue soit en appelant la fonction CloseHandle, soit lorsque le processus associé à la instance handles se termine. Notez qu’un instance d’un canal nommé peut avoir plusieurs handles associés. Une instance d’un canal nommé est toujours supprimée lorsque le dernier handle du instance du canal nommé est fermé.

Windows 10, version 1709 : les canaux ne sont pris en charge que dans un conteneur d’application, c’est-à-dire d’un processus UWP vers un autre processus UWP faisant partie de la même application. En outre, les canaux nommés doivent utiliser la syntaxe \\.\pipe\LOCAL\ du nom du canal.

Exemples

Pour obtenir un exemple, consultez Multithreaded Pipe Server.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows 2000 Professionnel [applications de bureau | Applications UWP]
Serveur minimal pris en charge Windows 2000 Server [applications de bureau | Applications UWP]
Plateforme cible Windows
En-tête winbase.h (inclure Windows.h)
Bibliothèque Kernel32.lib
DLL Kernel32.dll

Voir aussi

ConnectNamedPipe

CreateFile

Fonctions de canal

Vue d’ensemble des canaux

ReadFile

ReadFileEx

SECURITY_ATTRIBUTES

TransactNamedPipe

WaitNamedPipe

WriteFile

WriteFileEx