Перенаправление ввода/вывода.

Тема в разделе "WASM.WIN32", создана пользователем Mika0x65, 20 июн 2009.

  1. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Мое почтение всем.

    Есть некая программа, которая выполняет такие действия:

    printf("some_text");
    scanf("some_values%d", ...);
    printf("some_text");
    scanf("some_values%d", ...);
    etc.

    Мне надо запустить оную, прочитать, что она пишет и передать ей данные. Все хорошо, кроме передачи данных. Перенаправляю ввод/вывод, но при чтении вижу данные следующего за scanf'ом printf'а. Т.е. получается, что целевая программа откуда-то взяла данные и продолжила выполнение (printf/scanf/printf/... выполняются в одном потоке). Почему так происходит пока не понимаю.

    Вот код, стартующий программу и перенаправляющий ввод/вывод:
    Код (Text):
    1. format PE
    2.  
    3. include 'win32a.inc'
    4.  
    5. struct SECURITY_ATTRIBUTES
    6.        nLength              dd 0x0
    7.        lpSecurityDescriptor dd 0x0
    8.        bInheritHandle       dd 0x0
    9. ends
    10.  
    11. HANDLE_FLAG_INHERIT = 0x1
    12.  
    13. str_cmd:     db 'program.exe', 0x0
    14. hin_read:    dd 0x0
    15. hin_write:   dd 0x0
    16. hout_read:   dd 0x0
    17. hout_write:  dd 0x0
    18. tmp:         dd 0x0
    19. buff:        db 0x40 dup 0x0
    20. pi:          PROCESS_INFORMATION
    21. sinfo:       STARTUPINFO
    22. sa:          SECURITY_ATTRIBUTES
    23.  
    24. entry start
    25.  
    26. start:
    27.  mov [sa + SECURITY_ATTRIBUTES.nLength], sizeof.SECURITY_ATTRIBUTES
    28.  mov [sa + SECURITY_ATTRIBUTES.bInheritHandle], 0x1
    29.  mov [sa + SECURITY_ATTRIBUTES.lpSecurityDescriptor], 0x0
    30.  push 0x0
    31.  push sa
    32.  push hout_write
    33.  push hout_read
    34.  call [CreatePipe]
    35.  test eax, eax
    36.  jnz @f
    37.   int3
    38.  @@:
    39.  push 0x0
    40.  push HANDLE_FLAG_INHERIT
    41.  push dword [hout_read]
    42.  call [SetHandleInformation]
    43.  test eax, eax
    44.  jnz @f
    45.   int3
    46.  @@:
    47.  
    48.  push 0x0
    49.  push sa
    50.  push hin_write
    51.  push hin_read
    52.  call [CreatePipe]
    53.  test eax, eax
    54.  jnz @f
    55.   int3
    56.  @@:
    57.  push 0x0
    58.  push HANDLE_FLAG_INHERIT
    59.  push dword [hin_read]
    60.  call [SetHandleInformation]
    61.  test eax, eax
    62.  jnz @f
    63.   int3
    64.  @@:
    65.  
    66.  mov ecx, sizeof.STARTUPINFO
    67.  mov edi, sinfo
    68.  xor al, al
    69.  rep stosb
    70.  mov [sinfo + STARTUPINFO.cb], sizeof.STARTUPINFO
    71.  mov eax, [hout_write]
    72.  mov [sinfo + STARTUPINFO.hStdError], eax
    73.  mov [sinfo + STARTUPINFO.hStdOutput], eax
    74.  mov eax, [hin_read]
    75.  mov [sinfo + STARTUPINFO.hStdInput], eax
    76.  or [sinfo + STARTUPINFO.dwFlags], STARTF_USESTDHANDLES
    77.  push pi
    78.  push sinfo
    79.  push 0x0
    80.  push 0x0
    81.  push 0x0
    82.  push TRUE
    83.  push 0x0
    84.  push 0x0
    85.  push 0x0
    86.  push str_cmd
    87.  call [CreateProcess]
    88.  test eax, eax
    89.  jnz @f
    90.   int3
    91.  @@:
    92.  
    93.  push 0x0
    94.  push tmp
    95.  push 0x40
    96.  push buff
    97.  push dword [hout_read]
    98.  call [ReadFile] ; <---в буфере оказывается строка следующего за scanf'ом printf'а...
    99.  
    100.  ret
    101.  
    102. data import
    103.  library kernel32, 'kernel32.dll'
    104.  
    105.  import kernel32,\
    106.         CreatePipe, 'CreatePipe',\
    107.         CreateProcess, 'CreateProcessA',\
    108.         SetHandleInformation, 'SetHandleInformation',\
    109.         ReadFile, 'ReadFile'
    110. end data
    В чем может быть причина?

    Заранее благодарен.
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Так, все разобрался -- не тому хэндлу наследование убрал :).