Помогите разобраться с проблемой получения данных из пайпа: после ReadFile почему-то первые 3 байта по адресу, куда должны записаться данные, нули. Причем дальше все ок. Вот компилируемый кусок, который неправильно работает: Код (Text): format PE GUI 4.0 include 'win32axp.inc' BUF_SIZE = 1024 struct SECURITY_ATTRIBUTES nLength dd ? lpSecurityDescriptor dd ? bInheritHandle dd ? ends .data clName db "clName",0 capt db "Pipes",0 comLine db "help /?",0 errPipe db "Error while creating pipe!",0 errProcess db "Error while creating process!",0 hReadPipe dd ? hWritePipe dd ? .code start: call winProc invoke ExitProcess, ebx ; ############# ;Main prog proc winProc uses ebx locals sat SECURITY_ATTRIBUTES startInfo STARTUPINFO processInfo PROCESS_INFORMATION bytesRead db ? buffer db (BUF_SIZE+100) dup (?) endl xor ebx,ebx mov [sat.nLength],sizeof.SECURITY_ATTRIBUTES mov [sat.lpSecurityDescriptor],ebx mov [sat.bInheritHandle],TRUE lea eax,[sat] invoke CreatePipe,hReadPipe,hWritePipe,eax,ebx .if eax=0 invoke MessageBox,ebx,errPipe,capt,MB_ICONERROR + MB_OK .else mov [startInfo.cb], sizeof.STARTUPINFO lea eax,[startInfo] invoke GetStartupInfo,eax mov eax,[hWritePipe] mov [startInfo.hStdOutput],eax mov [startInfo.hStdError],eax mov [startInfo.dwFlags], STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES mov [startInfo.wShowWindow],SW_HIDE invoke CreateProcess,ebx,comLine,ebx,ebx,TRUE,ebx,ebx,ebx,addr startInfo,addr processInfo .if eax=0 invoke MessageBox,ebx,errProcess,capt,MB_ICONERROR + MB_OK .else invoke CloseHandle,[hWritePipe] invoke RtlZeroMemory,addr buffer,BUF_SIZE ; **** здесь затираются первые 3 байта! ***** invoke ReadFile,[hReadPipe],addr buffer,(BUF_SIZE-1),addr bytesRead,ebx invoke CloseHandle,[hReadPipe] invoke CloseHandle,[processInfo.hProcess] invoke CloseHandle,[processInfo.hThread] .endif .endif ret endp .end start Смотрел через Olly, ставил бряк перед ReadFile, где в стек записывается адрес буфера, потом в данных переходил по адресу буфера и после вызова ReadFile там первые 3 байта нули, а с остальными все в порядке. Пробовал размещать буфер не в стеке - результат тот же самый. В чем может быть проблема?
Уверен. Ведь эти данные - результат выполнения внешней программы (comLine - "help /?"). Вместо help'а пробовал другие программы, выводящие инфу в консоль - результат тот же: все данные правильные, кроме первых трех байт.
Элементарно, Ватсон! Поскольку bytesRead затребована как байтовая, а на самом деле это двойное слово, то как раз 3 байта следующей за ней переменной и затираются... dd надо написать