ReadFile затирает 3 байта при чтении из пайпа

Тема в разделе "WASM.BEGINNERS", создана пользователем Mikola, 3 окт 2007.

  1. Mikola

    Mikola New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2007
    Сообщения:
    9
    Помогите разобраться с проблемой получения данных из пайпа: после ReadFile почему-то первые 3 байта по адресу, куда должны записаться данные, нули. Причем дальше все ок. Вот компилируемый кусок, который неправильно работает:
    Код (Text):
    1. format PE GUI 4.0
    2.  
    3. include 'win32axp.inc'
    4.  
    5. BUF_SIZE = 1024
    6.  
    7. struct SECURITY_ATTRIBUTES
    8.     nLength dd ?
    9.     lpSecurityDescriptor dd ?
    10.     bInheritHandle dd ?
    11. ends
    12.  
    13. .data
    14. clName      db  "clName",0
    15. capt        db  "Pipes",0
    16. comLine     db  "help /?",0
    17. errPipe     db  "Error while creating pipe!",0
    18. errProcess  db  "Error while creating process!",0
    19.  
    20. hReadPipe   dd  ?
    21. hWritePipe  dd  ?
    22.  
    23. .code
    24. start:
    25.     call winProc
    26.     invoke  ExitProcess, ebx
    27.  
    28. ; #############
    29. ;Main prog 
    30. proc    winProc uses ebx
    31.     locals
    32.         sat SECURITY_ATTRIBUTES
    33.         startInfo STARTUPINFO
    34.         processInfo PROCESS_INFORMATION
    35.         bytesRead db ?
    36.         buffer db (BUF_SIZE+100) dup (?)
    37.     endl
    38.     xor ebx,ebx
    39.     mov [sat.nLength],sizeof.SECURITY_ATTRIBUTES
    40.     mov [sat.lpSecurityDescriptor],ebx
    41.     mov [sat.bInheritHandle],TRUE
    42.     lea eax,[sat]
    43.     invoke CreatePipe,hReadPipe,hWritePipe,eax,ebx
    44.     .if eax=0
    45.         invoke MessageBox,ebx,errPipe,capt,MB_ICONERROR + MB_OK
    46.     .else
    47.         mov [startInfo.cb], sizeof.STARTUPINFO
    48.         lea eax,[startInfo]
    49.         invoke GetStartupInfo,eax
    50.         mov eax,[hWritePipe]
    51.         mov [startInfo.hStdOutput],eax
    52.         mov [startInfo.hStdError],eax
    53.         mov [startInfo.dwFlags], STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES
    54.         mov [startInfo.wShowWindow],SW_HIDE
    55.         invoke CreateProcess,ebx,comLine,ebx,ebx,TRUE,ebx,ebx,ebx,addr startInfo,addr processInfo
    56.         .if eax=0
    57.             invoke MessageBox,ebx,errProcess,capt,MB_ICONERROR + MB_OK
    58.         .else
    59.             invoke CloseHandle,[hWritePipe]
    60.             invoke RtlZeroMemory,addr buffer,BUF_SIZE
    61. ; **** здесь затираются первые 3 байта! *****
    62.             invoke ReadFile,[hReadPipe],addr buffer,(BUF_SIZE-1),addr bytesRead,ebx
    63.             invoke CloseHandle,[hReadPipe]
    64.             invoke CloseHandle,[processInfo.hProcess]
    65.             invoke CloseHandle,[processInfo.hThread]
    66.         .endif
    67.     .endif
    68.     ret
    69. endp
    70. .end start
    Смотрел через Olly, ставил бряк перед ReadFile, где в стек записывается адрес буфера, потом в данных переходил по адресу буфера и после вызова ReadFile там первые 3 байта нули, а с остальными все в порядке. Пробовал размещать буфер не в стеке - результат тот же самый. В чем может быть проблема?
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    а ты уверен что в передоваемом буфере в начале не 3 нуля?
     
  3. Mikola

    Mikola New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2007
    Сообщения:
    9
    Уверен. Ведь эти данные - результат выполнения внешней программы (comLine - "help /?"). Вместо help'а пробовал другие программы, выводящие инфу в консоль - результат тот же: все данные правильные, кроме первых трех байт.
     
  4. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Элементарно, Ватсон!
    Поскольку bytesRead затребована как байтовая, а на самом деле это двойное слово, то как раз 3 байта следующей за ней переменной и затираются... dd надо написать
     
  5. Mikola

    Mikola New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2007
    Сообщения:
    9
    Действительно... Все заработало, спасибо огромное! А то я уже замучался ошибку искать.