PDA

Просмотр полной версии : Пайпы


St0nX
19.10.2009, 14:09
.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,0 ,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,0

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

Hiro Protagonist
19.10.2009, 23:44
;.....некий код
;Обнуляем буферы
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
;--


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



lea edi, BufDate
mov ecx, 512 ;=2048/4
xor eax, eax
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 байта).