elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Pipes (tuberias) sincronas, estancadas (Solucionado)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Pipes (tuberias) sincronas, estancadas (Solucionado)  (Leído 2,038 veces)
Usuario887


Desconectado Desconectado

Mensajes: 310


Ver Perfil
Pipes (tuberias) sincronas, estancadas (Solucionado)
« en: 11 Noviembre 2021, 22:29 pm »

Hola,

Estoy intentando escribir la entrada y leer la salida de un proceso (independientemente hijo o "detached") como cmd.exe (da igual que proceso es, porque estoy haciendo esto por practica) y mi programa se estanca en ReadFile:

Código
  1. #include <stdio.h>
  2. #include <windows.h>
  3.  
  4. int main()
  5. {
  6.    HANDLE hPipeOutWr, hPipeOutRd,
  7.           hPipeInWr, hPipeInRd;
  8.  
  9.    char szBuffer[BUFSIZ];
  10.    char szAns[BUFSIZ];
  11.    DWORD dwRead;
  12.  
  13.    STARTUPINFO si;
  14.    PROCESS_INFORMATION pi;
  15.    SECURITY_ATTRIBUTES sa;
  16.  
  17.    ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
  18.  
  19.    printf("\r\nCreating pipes... ");
  20.  
  21.    sa.nLength=sizeof(SECURITY_ATTRIBUTES);
  22.    sa.lpSecurityDescriptor=NULL;
  23.    sa.bInheritHandle=TRUE;
  24.  
  25.    if(!CreatePipe(&hPipeInRd, &hPipeInWr, &sa, 0))
  26.    {
  27.        return ("\r\nError: Windows RTL: CreatePipe(): %d", GetLastError());
  28.        return -1;
  29.    }
  30.  
  31.    if(!CreatePipe(&hPipeOutRd, &hPipeOutWr, &sa, 0))
  32.    {
  33.        return ("\r\nError: Windows RTL: CreatePipe(): %d", GetLastError());
  34.        return -1;
  35.    }
  36.  
  37.    printf("ok ");
  38.  
  39.  
  40.    ZeroMemory(&si, sizeof(STARTUPINFO));
  41.    ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
  42.    ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
  43.  
  44.    si.cb=sizeof(STARTUPINFO);
  45.    si.dwFlags=STARTF_USESTDHANDLES;
  46.  
  47.    si.hStdError=hPipeOutWr;
  48.    si.hStdInput=hPipeInRd;
  49.    si.hStdOutput=hPipeOutWr;
  50.  
  51.    printf("\r\nCreating process... ");
  52.  
  53.    if(!CreateProcess("C:\\Windows\\System32\\cmd.exe",
  54.                      NULL,
  55.                      NULL,
  56.                      NULL,
  57.                      TRUE,
  58.                      0,
  59.                      NULL,
  60.                      NULL,
  61.                      &si,
  62.                      &pi))
  63.    {
  64.        printf("\r\nError: Windows RTL: CreateProcess: %d", GetLastError());
  65.        return -1;
  66.    }
  67.  
  68.    printf("ok ");
  69.  
  70.    CloseHandle(hPipeOutWr);
  71.    CloseHandle(hPipeInRd);
  72.  
  73.    printf("\r\nStarting communication... ");
  74.  
  75.    while(strcmp(szBuffer, "exit")&&\
  76.          strcmp(szBuffer, "end"))
  77.    {
  78.  
  79.        if(ReadFile(hPipeOutRd,
  80.                        szAns,
  81.                        BUFSIZ,
  82.                        &dwRead,
  83.                        NULL))
  84.        {
  85.            while(ReadFile(hPipeOutRd,
  86.                            szBuffer,
  87.                            BUFSIZ,
  88.                            &dwRead,
  89.                            NULL))
  90.            {
  91.                    zBuffer[dwRead]='\0';
  92.                strcat(szAns, szBuffer);
  93.            }
  94.        }
  95.        printf("%s", szAns);
  96.        ZeroMemory(szAns, BUFSIZ);
  97.  
  98.        gets(szBuffer);
  99.        szBuffer[strlen(szBuffer)]='\n';
  100.        szBuffer[strlen(szBuffer)+1]='\0';
  101.        if(!WriteFile(hPipeInWr,
  102.                      szBuffer,
  103.                      strlen(szBuffer),
  104.                      &dwRead,
  105.                      NULL))
  106.        {
  107.            printf("\r\nError: Windows RTL: WriteFile(): %d", GetLastError());
  108.        }
  109.    }
  110.  
  111.    TerminateProcess(pi.hProcess, 0);
  112.    return 0;
  113. }

Se como hacer que funcione, el punto es que no quiero que funcione de esa manera porque es una manera no optima. Si pongo un Sleep(1000); antes de ReadFile, el programa funciona, porque le da tiempo al proceso (hijo, en este caso) de ejecutarse y meter datos en el buffer de la tuberia.

Esto no tiene sentido. Es un segundo de ejecucion que no esta haciendo nada.

¿Alguien sabe una forma eficiente de hacer tuberias en Windows?

He hecho tuberias nombradas y no he tenido ningun problema, aunque tambien es cierto que el programa hijo en ese momento lo hice yo especificamente para ser un programa hijo con tuberias, asi que no aplica en este caso.

En realidad me gustaria saber como hacer una tuberia anonima, asincrona y estable. No encuentro ningun ejemplo de ello en Windows.

Cualquier informacion me seria util.

Gracias.

Buenas noches.



PD: El problema no esta en el while(ReadFile... Porque ya lo quite y tampoco funciona asi. Ademas eso solo confirma que no hay mas entradas.

Si la funcion no detecta ningun byte deberia fallar y ya. No quedarse en un ciclo infinito  :huh: :huh: :huh:



Solucion:

Ya quisieramos tu y yo que fuera posible hacer async listen con tuberias en Windows. La unica forma aparentemente es crear hilos que escuchen

Como se que me explico como el c*** mejor dejo el codigo y ya:

Código
  1.    #include <stdio.h>
  2.    #include <windows.h>
  3.  
  4.    DWORD AsyncListen(HANDLE hPipeOutRd)
  5.    {
  6.        char szBuffer[BUFSIZ];
  7.        DWORD dwRead;
  8.  
  9.        while(ReadFile(hPipeOutRd,
  10.                       szBuffer,
  11.                        BUFSIZ,
  12.                        &dwRead,
  13.                        NULL))
  14.        {
  15.            szBuffer[dwRead]='\0';
  16.            printf("%s", szBuffer);
  17.        }
  18.    }
  19.  
  20.    int main()
  21.    {
  22.        HANDLE hPipeOutWr, hPipeOutRd,
  23.               hPipeInWr, hPipeInRd;
  24.  
  25.        char szBuffer[BUFSIZ];
  26.        char szAns[BUFSIZ];
  27.        DWORD dwRead;
  28.  
  29.        HANDLE hAsyncReadT;
  30.  
  31.        STARTUPINFO si;
  32.        PROCESS_INFORMATION pi;
  33.        SECURITY_ATTRIBUTES sa;
  34.  
  35.        ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
  36.  
  37.        printf("\r\nCreating pipes... ");
  38.  
  39.        sa.nLength=sizeof(SECURITY_ATTRIBUTES);
  40.        sa.lpSecurityDescriptor=NULL;
  41.        sa.bInheritHandle=TRUE;
  42.  
  43.        if(!CreatePipe(&hPipeInRd, &hPipeInWr, &sa, 0))
  44.        {
  45.            return ("\r\nError: Windows RTL: CreatePipe(): %d", GetLastError());
  46.            return -1;
  47.        }
  48.  
  49.        if(!CreatePipe(&hPipeOutRd, &hPipeOutWr, &sa, 0))
  50.        {
  51.            return ("\r\nError: Windows RTL: CreatePipe(): %d", GetLastError());
  52.            return -1;
  53.        }
  54.  
  55.        printf("ok ");
  56.  
  57.  
  58.        ZeroMemory(&si, sizeof(STARTUPINFO));
  59.        ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
  60.        ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
  61.  
  62.        si.cb=sizeof(STARTUPINFO);
  63.        si.dwFlags=STARTF_USESTDHANDLES;
  64.  
  65.        si.hStdError=hPipeOutWr;
  66.        si.hStdInput=hPipeInRd;
  67.        si.hStdOutput=hPipeOutWr;
  68.  
  69.        printf("\r\nCreating process... ");
  70.  
  71.        if(!CreateProcess("C:\\Windows\\System32\\cmd.exe",
  72.                          NULL,
  73.                          NULL,
  74.                          NULL,
  75.                          TRUE,
  76.                          0,
  77.                          NULL,
  78.                          NULL,
  79.                          &si,
  80.                          &pi))
  81.        {
  82.            printf("\r\nError: Windows RTL: CreateProcess(): %d", GetLastError());
  83.            return -1;
  84.        }
  85.  
  86.        printf("ok ");
  87.  
  88.        CloseHandle(hPipeOutWr);
  89.        CloseHandle(hPipeInRd);
  90.  
  91.        printf("\r\nStarting communication... ");
  92.  
  93.        ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
  94.        sa.nLength=sizeof(SECURITY_ATTRIBUTES);
  95.        sa.lpSecurityDescriptor=NULL;
  96.        sa.bInheritHandle=TRUE;
  97.  
  98.        if((hAsyncReadT=CreateThread(&sa, 0, (LPTHREAD_START_ROUTINE)AsyncListen, (PHANDLE)hPipeOutRd, 0, NULL))==NULL)
  99.        {
  100.            printf("\r\nError: Windows RTL: CreateThread(): %d", GetLastError());
  101.            return -1;
  102.        }
  103.  
  104.        while(strcmp(szBuffer, "exit")&&\
  105.              strcmp(szBuffer, "end"))
  106.        {
  107.            printf("\r\n");
  108.            gets(szBuffer);
  109.            szBuffer[strlen(szBuffer)]='\n';
  110.            szBuffer[strlen(szBuffer)+1]='\0';
  111.            if(!WriteFile(hPipeInWr,
  112.                          szBuffer,
  113.                          strlen(szBuffer),
  114.                          &dwRead,
  115.                          NULL))
  116.            {
  117.                printf("\r\nError: Windows RTL: WriteFile(): %d", GetLastError());
  118.            }
  119.        }
  120.  
  121.        TerminateProcess(pi.hProcess, 0);
  122.        return 0;
  123.    }

Aun asi!!!! Si alguien conoce una forma mas eficiente, "Navaja-suiziosa" de hacer esto, le agradeceria un comentario.

Y gracias de antemano, sin embargo.

Un saludo y buenas noches.


« Última modificación: 12 Noviembre 2021, 14:54 pm por marax » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Las llamadas tuberias y redirecciones [SH]
Scripting
Erik# 1 3,560 Último mensaje 27 Septiembre 2008, 23:41 pm
por leogtz
Problema de tuberias
Java
darkxxx 0 1,962 Último mensaje 19 Junio 2009, 17:57 pm
por darkxxx
[Solucionado][Batch] Find (buscar archivos por fecha) y tuberias
Scripting
Baranoides 2 14,732 Último mensaje 13 Enero 2012, 21:05 pm
por Baranoides
problemas con el uso de tuberias
Programación C/C++
xservice 0 1,301 Último mensaje 5 Septiembre 2013, 02:38 am
por xservice
Imprime texto de la nada. Tuberias (Solucionado)
Programación General
Usuario887 0 1,932 Último mensaje 13 Noviembre 2021, 18:08 pm
por Usuario887
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines