Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Пайпы (https://forum.antichat.xyz/showthread.php?t=149473)

St0nX 19.10.2009 14:09

Пайпы
 
PHP код:

.data?
hRead DWORD ?
hWrite DWORD ?
bWrite DWORD ?
hRead1 DWORD ?
hWrite1 DWORD ?
sat SECURITY_ATTRIBUTES <>
cif STARTUPINFO <>
pi PROCESS_INFORMATION <>
BufDate db 1024 dup(?)
BufDate1 db 1024 dup(?)
;.....
некий код
.data
lpCmdParam BYTE 
"cmd",0
.code
start
:
;.....
некий код
;Обнуляем буферы
mov ecx
,1024
mov edi
,offset BufDate1
l
mov byte ptr [edi],0
inc edi
loop l
mov ecx
,1024
mov edi
,offset BufDate
ll
mov byte ptr [edi],0
inc edi
loop ll
;--
mov sat.nLength,sizeof SECURITY_ATTRIBUTES
mov sat
.lpSecurityDescriptor,0
mov sat
.bInheritHandle,TRUE

invoke CreatePipe
,ADDR hRead,ADDR hWrite,ADDR sat,NULL
invoke CreatePipe
,ADDR hRead1,ADDR hWrite1,ADDR sat,NULL

mov cif
.cb,sizeof STARTUPINFO
invoke GetStartupInfo
,ADDR cif
mov cif
.wShowWindow,SW_HIDE
mov cif
.dwFlags,STARTF_USESHOWWINDOW STARTF_USESTDHANDLES

mov eax
hRead
mov cif
.hStdOutput,eax
mov eax
hWrite1
mov cif
.hStdInput,eax

invoke CreateProcess
,,ADDR lpCmdParam,0,0,FALSE,CREATE_NEW_CONSOLE,0,0,ADDR cif,ADDR pi

invoke WriteFile
,hWrite,ADDR BufDate,sizeof BufDate,ADDR bWrite,0
invoke ReadFile
,hRead1,ADDR BufDate1,sizeof BufDate1,ADDR bWrite,

Вообщем создается консоль пытаюсь писать и читать данные туда, останавливается на ReadFile и чего то ждет. не пойму в чем проблема. Порыл в инете нашел что ее можно решить через PeekNamedPipe или же OVERLAPPED, но конкретно не особо понял.

Hiro Protagonist 19.10.2009 23:44

PHP код:

 
;.....некий код 
;Обнуляем буферы 
mov ecx
,1024 
mov edi
,offset BufDate1 
l
mov byte ptr [edi],
inc edi 
loop l 
mov ecx
,1024 
mov edi
,offset BufDate 
ll
mov byte ptr [edi],
inc edi 
loop ll 
;-- 

я бы прилюдно растреливал за такой код ... несудьба использовать для того предназначенные цепочечные команды?

PHP код:


lea edi
BufDate
mov ecx
512     ;=2048/4
xor eaxeax
rep stosd 

одним махом оба буфера =\

далее, ReadFile ты вызываешь _синхроно_, те поток там ожидает пока придут все данные (размер ктр ты передавал) или пайп убъется:
Цитата:

MSDN

ReadFile returns when one of the following is true: a write operation completes on the write end of the pipe, the number of bytes requested has been read, or an error occurs

Естественно все будет замораживатся. Решение состоит либо в асинхронном вызове ReadFile (та самая структура overlapped + порты завершения ввода-вывода), что неплохо описано у Рихтера. Так придется поступать, когда не знаешь сколько байт запишет в пайп другой процесс.

PS

да, и заполнять в твоем случае структуру через eax слишком накладно по размеру и регистрам

вместо

mov eax, hRead ;6 байт
mov cif.hStdOutput,eax ;6 байт

используй

push dword [hRead] ;5 байт
pop dword [cif.hStdOutput] ;5 байт

хотя и медленнее, зато экономятся байтеги и освобождается регистр, ктр можно использовать при передаче нулевых значений функции (push reg короче чем push imm на 3 байта).


Время: 07:23