Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodychka-lab_OS.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.35 Mб
Скачать

Додаток 9 Текст програми створення анонімного каналу

;-----------------------------------

; 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, то створиться інше вікно повідомлення поки канал не буде прочитано до кінця.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]