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

 

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

;       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

 

 




Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: