Пайпы

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by St0nX, 19 Oct 2009.

  1. St0nX

    St0nX Elder - Старейшина

    Joined:
    19 May 2007
    Messages:
    257
    Likes Received:
    46
    Reputations:
    0
    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,0
    Вообщем создается консоль пытаюсь писать и читать данные туда, останавливается на ReadFile и чего то ждет. не пойму в чем проблема. Порыл в инете нашел что ее можно решить через PeekNamedPipe или же OVERLAPPED, но конкретно не особо понял.
     
    #1 St0nX, 19 Oct 2009
    Last edited: 19 Oct 2009
  2. Hiro Protagonist

    Joined:
    26 Aug 2009
    Messages:
    132
    Likes Received:
    24
    Reputations:
    -2
    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 ты вызываешь _синхроно_, те поток там ожидает пока придут все данные (размер ктр ты передавал) или пайп убъется:
    Естественно все будет замораживатся. Решение состоит либо в асинхронном вызове 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 байта).
     
    #2 Hiro Protagonist, 19 Oct 2009
    Last edited: 20 Oct 2009
    1 person likes this.