Estoy mirando algo de las pipes... pero tengo una duda.
Hasta que punto son útiles?
Porque resulta que yo lo quiero sustituir por el método que utilizaba hasta ahora que era el de dir>prueba.txt que todos conoceis.
Pero me he encontrado un código fuente y me permite poner en un TextBox un comando... Por ejemplo netstat, pero como podria dar yo una respuesta?
Es que estoy un poco liado jeje, yo lo que quiero es poder interactuar con la consola, por ejemplo que si pongo un comando que me pida Si o No, que YO pueda responder lo que quiera, porque con el metodo de guardarlo en un archivo no me sirve.
Slasher, ya se que hay algo sobre pipes en el foro... pero no lo he encontrado...
Algun link con codigos?¿
Saludos.
Mira, yo tengo un módulo para las pipes, no es mio y ahora mismo no se el nombre de lautor.
Public Declare Function CreatePipe Lib "kernel32" ( _
phReadPipe As Long, _
phWritePipe As Long, _
lpPipeAttributes As Any, _
ByVal nSize As Long) As Long
'Leer Tunel
Public Declare Function ReadFile Lib "kernel32" ( _
ByVal hFile As Long, _
ByVal lpBuffer As String, _
ByVal nNumberOfBytesToRead As Long, _
lpNumberOfBytesRead As Long, _
ByVal lpOverlapped As Any) As Long
'Esto lo usa la funcion CreateProcessA
Public Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
'Esto lo usa la funcion CreateProcessA
Public Type STARTUPINFO
cb As Long
lpReserved As Long
lpDesktop As Long
lpTitle As Long
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type
'Esto lo usa la funcion CreateProcessA
Public Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessId As Long
dwThreadID As Long
End Type
'Esta funcion lanza el proceso y
'devuelve sus datos a traves de PROCESS_INFORMATION
Public Declare Function CreateProcessA Lib "kernel32" ( _
ByVal lpApplicationName As Long, _
ByVal lpCommandLine As String, _
lpProcessAttributes As SECURITY_ATTRIBUTES, _
lpThreadAttributes As SECURITY_ATTRIBUTES, _
ByVal bInheritHandles As Long, _
ByVal dwCreationFlags As Long, _
ByVal lpEnvironment As Long, _
ByVal lpCurrentDirectory As Long, _
lpStartupInfo As STARTUPINFO, _
lpProcessInformation As PROCESS_INFORMATION) As Long
'Cierra el tunel
Public Declare Function CloseHandle Lib "kernel32" ( _
ByVal hHandle As Long) As Long
'Constantes necesarias para lo de antes
Public Const NORMAL_PRIORITY_CLASS = &H20&
Public Const STARTF_USESTDHANDLES = &H100&
Public Const STARTF_USESHOWWINDOW = &H1
Public Function CMD(ByVal Comando As String) As String
On Error GoTo ACAGAR
Dim proc As PROCESS_INFORMATION 'Informacion de CreateProcessA
Dim Ret As Long 'Esto se usa para obtener el retorno de las
'funciones API
Dim start As STARTUPINFO 'Informacion de inicio para CreateProcessA
Dim sa As SECURITY_ATTRIBUTES 'Atributos de seguridad para
'CreateProcessA
Dim hReadPipe As Long 'Lectura de Tunel
Dim hWritePipe As Long 'Escritura de Tunel
Dim lngBytesread As Long 'Cantidad de Bytes leidos
Dim strBuff As String * 256 'Buffer de lectura de tunel
'Creamos el tunel...
sa.nLength = Len(sa)
sa.bInheritHandle = 1&
sa.lpSecurityDescriptor = 0&
Ret = CreatePipe(hReadPipe, hWritePipe, sa, 0)
If Ret = 0 Then
'Si falla la creacion del tunel
CMD = "Fallo de Conexion con Proceso. Error: " & Err.LastDllError
Exit Function
End If
'Lanzamos el interprete de comandos...
start.cb = Len(start)
start.dwFlags = STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW
start.hStdOutput = hWritePipe
start.hStdError = hWritePipe
'Buscar la ruta del CMD.exe y añadir /c y el comando
mCommand = Environ("COMSPEC") + " /c " + Comando
'Creamos el proceso usando la String mCommand de antes...
'y obtenemos RET para saber si se ha ejecutado
Ret& = CreateProcessA(0&, mCommand, sa, sa, 1&, _
NORMAL_PRIORITY_CLASS, 0&, 0&, start, proc)
If Ret <> 1 Then
'si no se encuentra el comando...
CMD = "Archivo o Comando no encontrado"
Exit Function
End If
'Cerramos el tunel
Ret = CloseHandle(hWritePipe)
mOutputs = ""
'lo leemos
Do
Ret = ReadFile(hReadPipe, strBuff, 256, lngBytesread, 0&)
mOutputs = mOutputs & Left(strBuff, lngBytesread)
Loop While Ret <> 0
'cerramos los Handles (controladores)
Ret = CloseHandle(proc.hProcess)
Ret = CloseHandle(proc.hThread)
Ret = CloseHandle(hReadPipe)
'y hacemos que la funcion devuelva el resultado del comando a traves
' de la string mOutputs
CMD = mOutputs
Exit Function
ACAGAR:
CMD = "Error:" + Err.Description
End Function
Se usa así:
Dim resultado As String
Dim dato As String
Winsock1.GetData dato
resultado = CMD(dato)
Winsock1.SendData resultado
Saludos ;)
Uuuhmmm te lo plagio para mis cositas reydelmundo11. Thanks :)
Lo sacaste de hackxcrack.
En ese mismo código crea otro pipe para leer y establecelo en el registro hStdInput.
Luego es sencillo, con ReadFile y WriteFile lees las respuestas y envías los comandos (escribis en el pipe), respectivamente.
Saludos.
P.D: si alguien sabe la respuesta a ESTE (http://foro.elhacker.net/index.php/topic,86389.0.html) post que me ayude por favor.
Pero como lo hago para que si devuelve "Si o No" yo pueda contestar??
Citar
P.D: si alguien sabe la respuesta a ESTE post que me ayude por favor.
A que te refieres?
Se refiere a esto:
http://foro.elhacker.net/index.php/topic,86389.0.html
Saludos ;)
Hey polux porfavor me puedes explicar un poco que no entiendo:
CitarEn ese mismo código crea otro pipe para leer y establecelo en el registro hStdInput.
Luego es sencillo, con ReadFile y WriteFile lees las respuestas y envías los comandos (escribis en el pipe), respectivamente
Tengo la misma duda que Ertay:
CitarPero como lo hago para que si devuelve "Si o No" yo pueda contestar??
Intente dejar abierto el tunel pero se me colgaba la aplicacion, si me puedes dar algun link de donde lo aprendiste a manejar porfavor, me seria muy util.
Muchas gracias, y la verdad me asombras PoluX porque sabes un monton, cada ves que me meto al foro casi todas las respuestas son tuyas, abria que hacerte como un omenaje XDDD.
Salu2!! suerte.
Hey .Polux, porfavor me respondes ?? auque sea insultame XDD.
Salu2!
¿que es un pipe? yo se lo que es una pipa xDD
Es un tunel que se crea en este caso con la aplicacion y la consola de comandos de windows, asi se puede "interactuar" con ella, pero yo quiero poder responder a las respuestas de la consola de commandos, por ejmplo, uno simple, como lo hace bifrost pero es como que el tunel queda abierto porque le das a "satart" y leugo a "stop" para cerrarlo.
Que carajo pasa aca que soy el unico que intenta hacer esto? XD
hay dios me voy a tener que poner a buscar en otros idiomas haber si encuntro algo, Si llego a encontrar algo, que supongo que lo tengo que hacer, poque sino .Polux como lo sabe?, lo posteo.
SAlu2!!
No te entendio muy bien, no se que es un tunel. Yo lo que si tenia ganas de hacer era de una aplicacion en visual basic, pero que mostrara las cosas en la consola, como el C, sin tener forms ni nada, pero no se como hacerlo, tendre que aprender C
Saludos!!
Para poder enviar comandos establece el registro hStdIn de la estructura STARTUPINFO al valor de hReadPipe, de esa forma va a leer los datos que haya en la pipe.
Para escribir en la pipe y que ejecute los comandos usa WriteFile.
No tengo tiempo, por eso ando pasando poco por el foro, pero en cuanto pueda a ver si escribo algo de código... El código anterior es bastante malo, existen funciones que te indican la cantidad de datos (en bytes) que hay sin leer, te permiten leer la pipe y otras.
Para más información miren el siguiente link en MSDN que explica todo el funcionamiento de los pipes y la manera de implementarlos.
Pipes en Windows (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ipc/base/pipes.asp)
Saludos.
gracias .Polux !! !! !! :D
Veo que le das gran uso a la MSDN, Voy a empezar a hacer lo mismo.
Salu2!, y gracias de vuelta.
Hola de vuelta yo, jeje ;D.
Ya con un poco mas de informacion encontre este codigo para VB de named pipes, funciona exelentemente bien.
Les dejo el link por si a alguien le interesa, es recmendable que le hechen una ojeada al code.
Pipes (http://www.planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=61262&lngWId=1)
Salu2!! ;)
Bua!
Gracias Chief y Slasher!
Alguien revivio mi post!! xDD
Escucha, a tí te da a veces errores al usar la pipe??
Es que a mi sí, y se me cuelga.
Y has conseguido responder a la consola? Es que no estoy ahora en mi ordenador y no puedo probarlo >:( >:( :-\
Saludos!
Hola Ertai
CitarAlguien revivio mi post!! xDD
Si es fui yo XDDDD jeje, lo resusite.
Te referis al code del link que deje? ?
Si es ese ami me va perfecto, con ese codigo si se puede responder a la consola, yo lo probe creando una un valor alfanumerico en una clave cualquiera y despues la borre con la pipe te dice si estas seguro de eliminar el el valor (Y/N?) y le mando "y" y dice que se completo la operacion con exito, y la borra.
No me fije muy bien como funciona el code, pero he visto que crea dos pipes con los valores que dice Slasher para leer y escribir en el pipe, pero algo que he visto muy rapidamente para matar su proceso como por si se cuelga o algo asi.
salu2!! ;D
OK, cuando este en mi ordenador o probaré y te diré que tal.
Saludos.
Va perfecto.
Pero el comando edit archivo.txt no funciona no?
Saludos.
A no ese no, lo probe, es como que el pipe recibe los bytes pero no los podemos visualisar en la aplicacion.
Pero en lo demas si va perfecto.
Salu2!!
Y una cosa que me olvidaba, poniento edit archivo.txt es como que quedas dentro del editor, y si envias otro comando como dir no recivis respuesta, es como que se cuelga. Cuando cerras la aplicacion te dice que si queres finalizar tarea, la del cmd.exe
Ahora si, salu2! Ertai