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,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, но конкретно не особо понял.
PHP: ;.....некий код ;Обнуляем буферы 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 ;-- я бы прилюдно растреливал за такой код ... несудьба использовать для того предназначенные цепочечные команды? PHP: lea edi, BufDate mov ecx, 512 ;=2048/4 xor eax, eax rep stosd одним махом оба буфера =\ далее, ReadFile ты вызываешь _синхроно_, те поток там ожидает пока придут все данные (размер ктр ты передавал) или пайп убъется: Естественно все будет замораживатся. Решение состоит либо в асинхронном вызове 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 байта).