Pipes sous windows

Résolu
Signaler
Messages postés
43
Date d'inscription
mercredi 30 novembre 2005
Statut
Membre
Dernière intervention
5 décembre 2008
-
Messages postés
41
Date d'inscription
vendredi 31 mars 2006
Statut
Membre
Dernière intervention
11 mai 2009
-
Bonjour à tous,
Voilà je voudrais piloter CMD.EXE gràce à mon prog pour au final pouvoir réaliser une sorte de telnet...
J'ai redirigé l'entrée et la sortie standard de CMD.EXE vers des pipes ds lesquels j'écrit....
Le souci c'est tout simplement que le programme ne fonctionne pas et je ne vois vrément pas  la source du problème. Les symptômes du disfonctionnement ne sont pas évidents à décrire vous pouvez compiler pour les voir...

Mon code :

#include<windows.h>
#include<stdio.h>





main()
{



STARTUPINFO si;
PROCESS_INFORMATION pi;
SECURITY_ATTRIBUTES sa;
HANDLE rdpipesend, rdpipercv, wrpipesend, wrpipercv;
DWORD dwRead;
char buffer[4096];



sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = 0;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);



CreatePipe( &rdpipesend, &wrpipesend, &sa, 0);
CreatePipe( &rdpipercv, &wrpipercv, &sa, 0);





ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdInput = rdpipesend;
si.hStdOutput = wrpipercv;
ZeroMemory(&pi, sizeof(pi));




 





CreateProcess("cmd.exe", NULL, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);



memset(buffer,0,sizeof(buffer));



while(strncmp(buffer, "exit", 4))
{





memset(buffer,0,sizeof(buffer));
ReadFile(rdpipercv, buffer, sizeof(buffer), &dwRead, NULL);
puts(buffer);



Sleep(500);



memset(buffer,0,sizeof(buffer));
gets(buffer);
WriteFile(wrpipesend, buffer, sizeof(buffer), &dwRead, NULL);




 



}





   CloseHandle(rdpipesend);
   CloseHandle(rdpipercv);
   CloseHandle(wrpipesend);
   CloseHandle(wrpipercv);
  
   system("pause");
}







Merci d'avance...

6 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
J'ai un peu modifié ton code pour avoir un truc qui marche:

#include<windows.h>
#include<stdio.h>

HANDLE rdpipesend, rdpipercv, wrpipesend, wrpipercv;

DWORD WINAPI ReadThread(LPVOID lpParameter)
{
  char buffer[4096];
  DWORD dwRead;

  while(1)
  {
    ReadFile(rdpipercv, buffer, sizeof buffer - 1, &dwRead, NULL);
    buffer[dwRead] = 0;
    CharUpper(buffer);
    printf(buffer);
  }
   
  return 1;
}

DWORD WINAPI WriteThread(LPVOID lpParameter)
{
  char buffer[4096];
  DWORD dwWritten;

  while(1)
  {
    fgets(buffer, sizeof buffer, stdin);

    WriteFile(wrpipesend, buffer, strlen(buffer), &dwWritten, 0);
  }

  return 1;
}

int main()
{
  STARTUPINFO si;
  PROCESS_INFORMATION pi;
  SECURITY_ATTRIBUTES sa;

  sa.bInheritHandle = TRUE;
  sa.lpSecurityDescriptor = 0;
  sa.nLength = sizeof(SECURITY_ATTRIBUTES);

  CreatePipe( &rdpipesend, &wrpipesend, &sa, 0);
  CreatePipe( &rdpipercv, &wrpipercv, &sa, 0);

  ZeroMemory(&si, sizeof(si));
  si.cb = sizeof(si);
  si.dwFlags = STARTF_USESTDHANDLES;
  si.hStdInput = rdpipesend;
  si.hStdOutput = wrpipercv;
  ZeroMemory(&pi, sizeof(pi));

  BOOL b = CreateProcess(0, "cmd", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);

  CreateThread(0, 0, ReadThread, 0, 0, 0);
  WaitForSingleObject(CreateThread(0, 0, WriteThread, 0, 0, 0), INFINITE);

  CloseHandle(rdpipesend);
  CloseHandle(rdpipercv);
  CloseHandle(wrpipesend);
  CloseHandle(wrpipercv);

  system("pause");
}

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
Tu veux faire quoi exactement?
Lire dans ta console, envoyer a cmd.exe et lire la réponse dans ta console?
J'aimerais être sûr de bien comprendre avant de commencer à chercher

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
43
Date d'inscription
mercredi 30 novembre 2005
Statut
Membre
Dernière intervention
5 décembre 2008

Je voudrais taper une commande dans ma console. Cette commmande est  alors envoyée à cmd.exe puis le résultat de la commande est affiché dans ma console...
J'espère être à peu près clair, n'hésite pas à me demander des précisions.
 
Messages postés
43
Date d'inscription
mercredi 30 novembre 2005
Statut
Membre
Dernière intervention
5 décembre 2008

Une fois de plus tu m'as encore dépanné, merci à toi vecchio56...

PS: juste une petite chose pourquoi utilises tu la fonction CharUpper() dans le thread de lecture, il n'y a pourtant pas de problèmes en minuscules..?
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
L'utilisation de CharToUpper était juste pour montrer qu'on était pas dans cmd.exe mais bien dans notre programme

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
41
Date d'inscription
vendredi 31 mars 2006
Statut
Membre
Dernière intervention
11 mai 2009

Quels sont les modifications à faire sur ce code pour exécuter plusieurs commandes sur le même processus, par nécessairement consécutives, non pas lancer à chaque fois un processus cmd ?

foza juve