Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DrKillador en 22 Febrero 2013, 10:44 am



Título: [C] [AYUDA] Problema ejecutando comando en XP 32bits
Publicado por: DrKillador en 22 Febrero 2013, 10:44 am
Hi! Les comento un problema a ver si pueden ayudarme.

He programado una shell en C para Win, que me permite ejecutar comandos. Para ello utilizo las 2 siguientes funciones:

Código
  1. char* ReadAndHandleOutput(HANDLE hPipeRead)
  2. {
  3.    char lpBuffer[256]="";
  4.    DWORD nBytesRead;
  5.    char *partialResult;
  6.    char result[10000]="";
  7.    while(1)
  8.    {
  9.        if (!ReadFile(hPipeRead,lpBuffer,sizeof(lpBuffer),&nBytesRead,NULL) || !nBytesRead)
  10.        {
  11.            if (GetLastError() == ERROR_BROKEN_PIPE)
  12.                break; // pipe done - normal exit path.
  13.        }
  14.        partialResult = (char *) malloc(10000);
  15.        strncpy(partialResult,lpBuffer,nBytesRead);
  16.        sprintf(result,"%s%s",result,partialResult);
  17.    }
  18.    return result;
  19. }
  20.  
  21. char* executeCommand(char *argument)
  22. {
  23.    SECURITY_ATTRIBUTES sa;
  24.    STARTUPINFO si;
  25.    PROCESS_INFORMATION pi;
  26.  
  27.    void * leer;
  28.    void * escribir;
  29.  
  30.    ZeroMemory(&sa,sizeof(&sa));
  31.  
  32.    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
  33.    sa.bInheritHandle = TRUE;
  34.    sa.lpSecurityDescriptor = NULL;
  35.  
  36.    CreatePipe(&leer,&escribir,&sa,0);
  37.  
  38.    GetStartupInfoA(&si);
  39.  
  40.    si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
  41.    si.wShowWindow = SW_HIDE;
  42.    si.hStdOutput = escribir;
  43.    si.hStdError  = escribir;
  44.    si.hStdInput = leer;
  45.  
  46.    CreateProcess(0,argument,0,0,TRUE,0,NULL,NULL,&si,&pi);
  47.  
  48.    CloseHandle(escribir);
  49.  
  50.    return ReadAndHandleOutput(leer);
  51. }

La shell me funciona perfectamente en Windows Vista y 7 (tanto en 32 como en 64bits), pero en XP (32bits) el programa se me queda pillado en la siguiente instrucción:

Código
  1. if (!ReadFile(hPipeRead,lpBuffer,sizeof(lpBuffer),&nBytesRead,NULL) || !nBytesRead)

No consigo dar con el error por el que en XP se queda pillado en ese punto del código, porque el programa no se para, sigue funcionando sin hacer nada...

Por si les sirve el dato, he probado a escribir en un fichero un dato justo antes del IF ese que da el problema y despues, y el fichero lo deja pillado, porque no llega a la instruccion de cierre (logicamente).

La lectura la hago sincrona, poniendo la ultima variable de la llamada a ReadFile a NULL, asi que no veo donde puede estar el problema :/

Cualquier ayuda se la agradezco, que ando perdiendo mucho tiempo con esto

saludoss


Título: Re: [C] [AYUDA] Problema ejecutando comando en XP 32bits
Publicado por: DrKillador en 23 Febrero 2013, 02:10 am
El problema parece que viene por el handle, pq sí le pongo una cadena a pelo en la cabecera de la llamada a ReadAndHandleOutput()  sí q avanza...

Ideas?