HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Пайпы
  #1  
Старый 19.10.2009, 14:09
St0nX
Участник форума
Регистрация: 19.05.2007
Сообщений: 281
С нами: 9989619

Репутация: 106
По умолчанию Пайпы

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, но конкретно не особо понял.

Последний раз редактировалось St0nX; 19.10.2009 в 15:17..
 
Ответить с цитированием

  #2  
Старый 19.10.2009, 23:44
Hiro Protagonist
Участник форума
Регистрация: 26.08.2009
Сообщений: 133
С нами: 8795069

Репутация: 79
По умолчанию

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 байта).

Последний раз редактировалось Hiro Protagonist; 20.10.2009 в 00:03..
 
Ответить с цитированием
Ответ



Предыдущая тема Следующая тема

Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.