Héritage du handle de canal
Le serveur de canal contrôle si ses handles peuvent être hérités des manières suivantes :
- La fonction CreatePipe reçoit une structure SECURITY_ATTRIBUTES . Si le serveur de canal définit le membre bInheritHandle de cette structure sur TRUE, les handles créés par CreatePipe peuvent être hérités.
- Le serveur de canal peut utiliser la fonction DuplicateHandle pour modifier l’héritage d’un handle de canal. Le serveur de canal peut créer un doublon non inhéritable d’un handle de canal pouvant être hérité ou un doublon pouvant être hérité d’un handle de canal non inhéritable.
- La fonction CreateProcess permet au serveur de canal de spécifier si un processus enfant hérite de tout ou aucun de ses handles pouvant être hérités.
Lorsqu’un processus enfant hérite d’un handle de canal, le système permet au processus d’accéder au canal. Toutefois, le processus parent doit communiquer la valeur de handle au processus enfant. Le processus parent effectue généralement cette opération en redirigeant le handle de sortie standard vers le processus enfant, comme indiqué dans les étapes suivantes :
- Appelez la fonction GetStdHandle pour obtenir le handle de sortie standard actuel ; enregistrez ce handle afin de pouvoir restaurer le handle de sortie standard d’origine après la création du processus enfant.
- Appelez la fonction SetStdHandle pour définir le handle de sortie standard sur le handle d’écriture du canal. À présent, le processus parent peut créer le processus enfant.
- Appelez la fonction CloseHandle pour fermer le handle d’écriture sur le canal. Une fois que le processus enfant hérite du handle d’écriture, le processus parent n’a plus besoin de sa copie.
- Appelez SetStdHandle pour restaurer le handle de sortie standard d’origine.
Le processus enfant utilise la fonction GetStdHandle pour obtenir son handle de sortie standard, qui est désormais un handle à la fin d’écriture d’un canal. Le processus enfant utilise ensuite la fonction WriteFile pour envoyer sa sortie au canal. Lorsque l’enfant a terminé avec le canal, il doit fermer la poignée de canal en appelant CloseHandle ou en terminant, ce qui ferme automatiquement le handle.
Le processus parent utilise la fonction ReadFile pour recevoir des entrées du canal. Les données sont écrites dans un canal anonyme sous la forme d’un flux d’octets. Cela signifie que le processus parent lisant à partir d’un canal ne peut pas faire la distinction entre les octets écrits dans des opérations d’écriture distinctes, sauf si les processus parent et enfant utilisent un protocole pour indiquer où se termine l’opération d’écriture. Lorsque tous les handles d’écriture dans le canal sont fermés, la fonction ReadFile retourne zéro. Il est important que le processus parent ferme son handle à la fin d’écriture du canal avant d’appeler ReadFile. Si ce n’est pas le cas, l’opération ReadFile ne peut pas retourner zéro, car le processus parent a un handle ouvert à la fin de l’écriture du canal.
La procédure de redirection du handle d’entrée standard est similaire à celle de la redirection du handle de sortie standard, à ceci près que le handle de lecture du canal est utilisé comme handle d’entrée standard de l’enfant. Dans ce cas, le processus parent doit s’assurer que le processus enfant n’hérite pas du handle d’écriture du canal. Si ce n’est pas le cas, l’opération ReadFile effectuée par le processus enfant ne peut pas retourner zéro, car le processus enfant a un handle ouvert à la fin de l’écriture du canal.
Pour obtenir un exemple de programme qui utilise des canaux anonymes pour rediriger les handles standard d’un processus enfant, consultez Création d’un processus enfant avec une entrée et une sortie redirigées.