Pipes sous windows

Résolu
ssmint Messages postés 43 Date d'inscription mercredi 30 novembre 2005 Statut Membre Dernière intervention 5 décembre 2008 - 26 août 2006 à 15:11
ZMJUVENTINO Messages postés 41 Date d'inscription vendredi 31 mars 2006 Statut Membre Dernière intervention 11 mai 2009 - 14 mars 2009 à 19:48
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

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
26 août 2006 à 22:19
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
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
26 août 2006 à 16:12
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
0
ssmint Messages postés 43 Date d'inscription mercredi 30 novembre 2005 Statut Membre Dernière intervention 5 décembre 2008
26 août 2006 à 20:48
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.
 
0
ssmint Messages postés 43 Date d'inscription mercredi 30 novembre 2005 Statut Membre Dernière intervention 5 décembre 2008
27 août 2006 à 15:53
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..?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
29 août 2006 à 16:08
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
0
ZMJUVENTINO Messages postés 41 Date d'inscription vendredi 31 mars 2006 Statut Membre Dernière intervention 11 mai 2009
14 mars 2009 à 19:48
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
0
Rejoignez-nous