IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 32-bits / 64-bits Assembleur Discussion :

Pipes - Comment faire ?


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut Pipes - Comment faire ?
    Bonjour à tous.

    Outils: Masm32 v8.0, Radasm

    J'essaye d'apprendre à implémenter des communications entre threads. Pour cela j'utilise les pipes non-nommés (anonymous pipes).

    Pour essayer j'ai créer deux programmes (appelons les A et B).

    Voilà les opérations réalisé par le programme A:
    -Le Programme A génere un message aléatoire (basé sur GetTickCount, la chaine retourné est sous forme ASCII), ce message est ensuite placé dans un buffer temporaire.
    -Ensuite je crée le pipe.
    -J'écris ma chaine ASCII dans le pipe avec Writefile.
    -J'appelle "CreateProcess" pour démarrer le programme B
    -Je ferme le pipe en écriture
    -J'appelle ReadFile pour lire le pipe.

    C'est dans cette dernière opération que le bas blesse. J'essaye de me conformer au tutorial d'Iczelion (là je dois dire que celui sur les pipes n'est pas très clair).
    En fait je ne comprend pas quel est le programme qui lit le pipe à ce moment là (avec ReadFile). Est-ce le programme A ou le B (puisqu'il est appelé avec CreateProcess) ?

    Que dois je implémenter dans mon programme B pour qu'il puisse lire dans le pipe (le problème n'est pas comment dois-je faire mais plutot, comment passé le handle du pipe à un programme externe).

    J'ai beau lire la MSDN et le tut d'Iczelion, je suis toujours bloqué...

    Si vous pouviez m'indiquer une marche à suivre pour faire communiquer deux programmes avec des pipes, je vous en serais reconnaissant.

    Merci à tous.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Le programme a qui doit être transmis le messages est celui qui lit le pipe. Donc le B si j'ai bien compris. Pour refiler le pipe au deuxième prog, soit tu fait hériter le handle par l'application fille, sois tu nommes le pipe, soit tu utilises la mémoire partagée. Je dis tout ca de mémoire. Tout est expliqué dans le Win32 SDK. Si tu veux des détails sur une méthode, n'hésite pas à demander, je suis pas sur de réussir, mais je testerais, je l'ai déjà fait. :)

  3. #3
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Merci Blustuff,

    Donc, si j'ai bien compris, je dois implémenter mon code de lecture du pipe dans le programme B. Le problème (et c'est ce dont tu parles), c'est de passer l'handle du pipe au programme B (puisque c'est le programme A qui le crée). DOnc à première vue c'est faire "hériter le handle par l'application fille" qui est intéressant.

    Pour les autres solutions: je pensais que les pipes nommés (nammed pipes) était relatif aux connexions entre ordinateurs, je ne pensais pas que l'on pouvais s'en servir pour une communication entre thread sur le même PC [rien d'explicite dans la MSDN, mais la syntaxe des arguments des pipes nommés y prete à penser).
    J'aurais pu effectivement passer par une mémoire partagée (Global Alloc et tutti quanti), mais là je connais le truc,, le but de mon "mini défi" étant d'essayer de n'utiliser que les pipes.

    Je vais tenter de réécrire mon programme B, et de voir comment on passe un handle à un autre programme (là s'il le faut j'essaierais de passer par la mémoire).

    Si toutefois qq'un pouvait m'indiquer comment passer un handle à un programme externe...

    Merci.

    Amicalement, Neitsa.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Voilà qui confirme mes propos :

    Citation Envoyé par Win 32 SDK
    An anonymous pipe is an unnamed, one-way pipe that transfers data between a parent process and a child process or between two child processes of the same parent process. Although it is possible to use anonymous pipes for communication between unrelated processes, it is easier to use named pipes for that purpose (for more information, see Named Pipes). Anonymous pipes are always local; they cannot be used for communication over a network.

    The CreatePipe function creates an anonymous pipe and returns two handles, one to the read end and one to the write end of the pipe. The read handle has only read access to the pipe, and the write handle has only write access to the pipe. To communicate through the pipe, a handle to one of the ends must be passed to another process. Usually, this is done through inheritance; that is, a child process inherits a handle from its parent process. The inheritability of these handles is controlled by the creating process in the following ways:

    · The CreatePipe function specifies a SECURITY_ATTRIBUTES structure. If the bInheritHandle member of this structure is TRUE, the handles can be inherited.
    · The DuplicateHandle function can change the inheritability of a pipe handle. This function enables a process to create a noninheritable duplicate of an inheritable pipe handle or to create an inheritable duplicate of a noninheritable pipe handle.
    · The CreateProcess function enables a parent process to specify whether the new child process will inherit all or none of the parent's inheritable handles.



    When a child process inherits a handle, the system enables the process to access the pipe referred to by that handle. However, the parent process must communicate the handle value to the child process. Typically, this is done by using the SetStdHandle and GetStdHandle functions, which set and retrieve the standard handles (standard input, standard output, or standard error) of a process. The parent process can specify a pipe handle in a call to SetStdHandle before the child process is created. The current standard handles of the parent process are inherited by the child process. So, when the child process starts up, it can use the GetStdHandle function to retrieve the handle value. The parent process can change its own standard handles without affecting the standard handles of its existing child processes.

    To read from the pipe, a process uses the read handle in a call to the ReadFile function. When a write operation of any number of bytes completes, the ReadFile call returns. The ReadFile call also returns when all handles to the write end of the pipe have been closed or if any errors occur before the read operation completes normally.
    To write to the pipe, a process uses the write handle in a call to the WriteFile function. WriteFile does not return until the specified number of bytes has been written or an error occurs. If the pipe's buffer is full and bytes remain to be written, WriteFile does not return until some other process or thread reads from the pipe, making more buffer space available. CreatePipe enables the creating process to specify a buffer size for the pipe, or it can use the default buffer size.

    Asynchronous (overlapped) read and write operations are not supported for anonymous pipes. This means that the ReadFileEx and WriteFileEx functions cannot be used with anonymous pipes. The lpOverLapped parameter of the ReadFile and WriteFile functions is ignored when used with an anonymous pipe.
    An anonymous pipe exists until all handles to both read and write ends of the pipe are closed by the CloseHandle function.

  5. #5
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Merci Blustuff,

    c'est exactement ce qu'il me fallait ! Avec cela je devrais être en mesure de faire communiquer mes threads de manière convenable.

    Merci encore.

    Problème résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 01/02/2009, 02h44
  2. [Runtime,exec] Comment faire un pipe unix dans le exec ?
    Par Escuzze dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 06/03/2008, 12h48
  3. Réponses: 8
    Dernier message: 18/09/2002, 03h20
  4. Comment faire pour mettre l'ecran en veille ?
    Par March' dans le forum MFC
    Réponses: 6
    Dernier message: 29/08/2002, 14h25
  5. Comment faire pour créer un bitmap
    Par GliGli dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/04/2002, 15h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo