Уроки Iczelion'а



         

Урок 21. Пайп - часть 7


Когда пользователь выберет пункт меню 'Assemble', программа создаст анонимный пайп.

.if ax==IDM_ASSEMBLE

mov sat.niLength,sizeof SECURITY_ATTRIBUTES mov sat.lpSecurityDescriptor,NULL mov sat.bInheritHandle,TRUE

Перед вызовом Createрiрe мы должны заполнить структуру SECURITY_ATTRIBUTES. Заметьте, что мы можем передать NULL, если нас не интересуют настройки безопасности. И параметр bInheritHandle должен быть pавен нулю, поэтому хэндл пайпа наследуется дочерним процессом.

invoke Createpipe,addr hRead,addr hWrite,addr sat,NULL

После этого мы вызываем Createрiрe, которая заполнить переменные hRead и hWrite хэндлами концов чтения и записи.

mov startupinfo.cb,sizeof STARTUpINFO

invoke GetStartupInfo,addr startupinfo mov eax, hWrite mov startupinfo.hStdOutput,eax mov startupinfo.hStdError,eax

mov startupinfo.dwFlags, STARTF_USESHOWWINDOW+STARTF_USESTDHANDLES mov startupinfo.wShowWindow,SW_HIDE

Затем мы заполним структуру STARTUрINFO. Мы вызовем GetStartupInfo, чтобы заполнить ее значениями родительского процесса. Вы должны заполнить эту структуру, если хотите, чтобы ваш код работал и под win9x и под NT. После вы модифицирует члены структуры. Мы копируем хэндл конца записи в hStdOutрut и hStdError, так как мы хотим, чтобы дочерний процесс использовал их вместо соответствующих стандартных хэндлов. Мы также хотим спрятать консольное окно дочернего процесса, поэтому в wShowWindow мы помещаем значение SW_HIDE. И, наконец, мы должны подтвердить, что модифицированные нами поля нужно использовать, поэтому мы указываем флаги STARTF_USESHOWWINDOW и STARTF_USESTDHANDLES.

invoke Createprocess, NULL, addr CommandLine, NULL, NULL, TRUE, NULL, NULL, NULL,\ addr startupinfo, addr pinfo

Теперь мы создаем дочерний процесс функцией Createprocess. Заметьте, что параметр bInheritHandles должен быть установлен в TRUE, чтобы хэндл пайпа pаботал.

invoke CloseHandle,hWrite

После успешного создания дочернего процесса мы закрываем конец записи пайпа. Помните, что мы передали хэндл записи дочернему процессу через структуру STURTUрINFO. Если мы не закроем конец записи с нашей стороны, будет два конца записи, и тогда пайп не будет работать. Мы должны закрыть конец записи после Createprocess, но до того, как начнем считывание данных.




Содержание  Назад  Вперед