begin process at 2012 05 29 16:04:28
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Débutant(e)

 > 

Pipes sous windows


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Pipes sous windows

samedi 26 août 2006 à 15:11:31 | Pipes sous windows

ssmint

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...

samedi 26 août 2006 à 16:12:41 | Re : Pipes sous windows

vecchio56

Administrateur CodeS-SourceS
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

samedi 26 août 2006 à 20:48:34 | Re : Pipes sous windows

ssmint

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.

 

samedi 26 août 2006 à 22:19:08 | Re : Pipes sous windows

vecchio56

Administrateur CodeS-SourceS
Réponse acceptée !
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

dimanche 27 août 2006 à 15:53:57 | Re : Pipes sous windows

ssmint



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..?

mardi 29 août 2006 à 16:08:32 | Re : Pipes sous windows

vecchio56

Administrateur CodeS-SourceS
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

samedi 14 mars 2009 à 19:48:26 | Re : Pipes sous windows

ZMJUVENTINO

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


Cette discussion est classée dans : buffer, sizeof, pi, rdpipesend, rdpipercv


Répondre à ce message

Sujets en rapport avec ce message

CreateProcess et processus infini [ par Rankin ] Salut à tous,Je suis en train de développer une appli qui lance pas mal de commandes système pour récupérer notamment la configuration du réseau. Pour Sockets [ par Suxyt ] Bonjour à tous, Actuellement, je travaille sur un projet qui consiste d'envoyer et de recevoir des données en construisant l'en-tête soi-même. Pour e Récupération "au fil de l'eau" du résulat d'une commande DOS [ par 10MilleSabords ] Bonjour,Tout est dans le sujet. Est-ce possible?Voici ou j'en suis:Je lance ma ligne de commande par un CreateProcess puis je récupère le résulat dans probleme avec une boucle do while [ par miki42 ] Bonjour a tous,voila je realise un logiciel de brute force ftp ceci etant pour améliorer mon niveau en programation,bref j'ai un probleme sur ma boucl Socket en C [ par RM50Man ] WSADATA ws;                    WSAStartup(MAKEWORD(2,0), &ws);              &n probleme boucles mutliple avec les sockets [ par miki42 ] Bonjour a tous voila j'ai pa le choix,deja une semaine que je mord la langue pour trouver dou vient mon probleme mais rien y fait suit obliger de fari ecrire mdp sesion telnet [ par Max77240 ] Bonjour à tous, Je travail avec visualc++ 2008 et les windows form. Sur ma form, j'ai un bouton permettant d'ouvrir une session telnet sur un switch, taille chaine de char [ par langedechu ] Salut , voila mon prob (je sais plus comment faire) :j'ai une variable : const char *buffer; et j aimerais savoir le nombre de caractere stocker dans passage d'argement chaine [ par victorcoasne ] Je fais :int taille(char chaine[]){ cout return (sizeof(chaine)/sizeof(chaine[0])); }int main(){char Pb d'impression [ par cecel ] SalutJe devellope une appli qui permet d'imprimer des etiquettes sur une imprimante ZEBRA.J'utilise un driver "Generic text" car j'imprime un fichier


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,780 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales