;-----------------------------------
; Pipe.asm
;-----------------------------------
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
sa SECURITY_ATTRIBUTES <>;
stinfo STARTUPINFO <>;
pinfo PROCESS_INFORMATION <>;
hPipeOutputRead DWORD 0
hPipeOutputWrite DWORD 0
btest BOOL 0
bytesRead DWORD 0
dwNumberOfBytes DWORD 0
buffer db 256 dup(0)
data db "Hello World from pipe",0
CreatePipeError db "Error during pipe creation",0
CreateProcError db "Error during process creation",0
AppName db "Message",0
CommandLine db "console.exe",0
.code
start:
mov sa.nLength, SIZEOF SECURITY_ATTRIBUTES
mov sa.bInheritHandle, TRUE;Дозвіл на наслідування дескрипторів
mov sa.lpSecurityDescriptor, NULL
;Створюємо канал для стандартного пере направлення виводу консольної
;програми
invoke CreatePipe,addr hPipeOutputRead, addr hPipeOutputWrite,\
addr sa, NULL
.if eax==NULL
invoke MessageBox, 0, addr CreatePipeError, \
addr AppName, MB_ICONERROR + MB_OK
.else
;Встановлюємо нові параметри структури stinfo, котра;відповідає за властивості створеного дочірнього процесу
mov stinfo.cb, sizeof stinfo
|
|
mov stinfo.dwFlags,\
STARTF_USESHOWWINDOW + STARTF_USESTDHANDLES
mov stinfo.wShowWindow, SW_HIDE;Приховати вікно консолі
mov eax,hPipeOutputWrite
mov stinfo.hStdOutput,eax; Робить дескриптор каналу
;стандартним дескриптором виводу
invoke CreateProcess, NULL, addr CommandLine, \
NULL, NULL, TRUE, NULL, NULL, NULL, addr stinfo,addr pinfo
.if eax==NULL
invoke MessageBox,0,addr CreateProcError,\
addr AppName,MB_ICONERROR+MB_OK
.else
invoke CloseHandle,hPipeOutputWrite
.while TRUE
invoke RtlZeroMemory, addr buffer, 256;
;Обнулить буфер
invoke ReadFile,hPipeOutputRead, \
addr buffer,255,addr bytesRead,NULL
.if eax==NULL
.break
.endif
invoke MessageBox, 0, addr buffer, \
addr AppName, MB_OK
.endw
.endif
.endif
invoke CloseHandle, hPipeOutputRead
invoke ExitProcess,NULL
end start
Результат виконання програми:
Вивід консольної програми console.exe
E:\masm32\Work\IPC\Pipe>Console.exe
Laboratory work for KSN students
Перенаправлений у канал вивід консольної програми
Опис програми:
В програмі створюється анонімний канал за допомогою функції CreatePipe, Для того, щоб дати змогу дочірньому процесу наслідувати дескриптор каналу встановлюються нові параметри структури SECURITY_ATTRIBUTES. Для того, щоб приховати саме консольне вікно та пере направити вивід у канал встановлюються нові параметри структури STARTUP_INFO. Після створення процесу, тобто коли канал уже буде записаний консольним виводом необхідно закрити дескриптор на запис у канал (тому що анонімний канал одно направлений – тільки один із дескрипторів може бути активним). За допомогою функції ReadFile зчитується інформація з каналу і виводиться у вікно повідомлення. Якщо кількість зчитаних даних більша 256, то створиться інше вікно повідомлення поки канал не буде прочитано до кінця.
|
|
Додаток 10
Створення консольної програми з використанням MASM32
;-----------------------------------
; Console.asm
;-----------------------------------
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\kernel32.lib
.data
ConsoleTitle db "Hello Win32!",0
MsgBoxText db "Laboratory work for KSN students",0
.code
start:
invoke SetConsoleTitle, ADDR ConsoleTitle
invoke StdOut,ADDR MsgBoxText
;invoke Sleep, 1000; Може використовуватись для
;затримки появи консольного вікна
invoke ExitProcess,NULL
end start
Для трансляції і компонування програми console.asm потрібно використати наступні параметри:
ml.exe /c /coff /Cp console.asm
Link.exe /SUBSYSTEM:CONSOLE /LIBPATH:d:\masm32\lib console.obj