Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

гос / sswlect / Лекції / sswlect

.pdf
Скачиваний:
12
Добавлен:
16.02.2016
Размер:
1.44 Mб
Скачать

invoke dwtoa,ecx,ebx invoke lstrlen,ebx

mov byte ptr [ebx+eax],":" lea ebx,[ebx+eax+1]

movzx ecx,DateTime.wSecond invoke dwtoa,ecx,ebx

invoke lstrlen,ebx

mov dword ptr [ebx+eax],0D0Ah

invoke WriteFile,hPipe,edi, LENGTHOF OutputBuffer,\ ADDR nSendReciveBytes, NULL

.else

invoke WriteFile,hPipe, $CTA0("Bad command\n"), 14,\ ADDR nSendReciveBytes, NULL

.endif

.endw

invoke WriteFile,hPipe,$CTA0("exit\n"), 6,\ ADDR nSendReciveBytes, NULL

invoke CloseHandle, hPipe ret

Main endp end start

; Файл PipeClient.Asm

.386

.model flat, stdcall option casemap :none include ..\interface.inc

.code

start: invoke Main

invoke ExitProcess,0

191

Main proc

invoke AllocConsole invoke ClearScreen

invoke StdOut, $CTA0("Connection . . . ") invoke CreateFile, ADDR szPipeName,\

GENERIC_READ OR GENERIC_WRITE,\ 0, NULL, OPEN_EXISTING, 0, NULL

.if eax==INVALID_HANDLE_VALUE

invoke StdOut, $CTA0("Cannot create pipe") ret

.else

mov hPipe,eax

.endif

invoke locate,11,0

invoke StdOut, $CTA0("successful") invoke locate,0,2

lea esi,InputBuffer lea edi,OutputBuffer

.while (TRUE) mov ebx,edi

invoke StdOut,$CTA0("\nCommand$ ") invoke StdIn,edi,LENGTHOF OutputBuffer mov al,0Dh

mov ecx,LENGTHOF OutputBuffer push edi

repne scasb

mov byte ptr [edi+1],0h sub edi,ebx

lea ebx,[edi+2] pop edi

invoke WriteFile,hPipe, edi, ebx,\

ADDR nSendReciveBytes, NULL invoke ReadFile,hPipe,esi,\

192

LENGTHOF InputBuffer,\

ADDR nSendReciveBytes, NULL

invoke StdOut, esi

.break .if dword ptr [esi]==74697865h

.endw

invoke CloseHandle, hPipe ret

Main endp end start

Серед декількох можливих стратегій організації обслуговування множинних реалізацій каналу найбільш простою у програмуванні й розповсюдженою є багато потокова модель, яку демонструє наступний приклад.

Приклад 13 Консольний додаток MultiPipeServer.exe серверного процесу створює пул із трьох потоків. Кожний з потоків пула створює одну з реалізацій іменованого каналу для передачі повідомлень у синхронному режимі й переходить у режим очікування підключення клієнта. Після підключення клієнта, потік читає передані їм по каналі повідомлення й виводить на консоль процесу доти поки не одержить по каналі рядок, що починається з «exit».

Первинний потік серверного процесу, створюючи пул із трьох потоків, зберігає отримані ідентифікатори потоків пула в масиві, що потім використає для очікування завершення кожного з потоків пула за допомогою функції

WaitForMultipleObjects. Одержавши код повернення WaitForMultipleObjects

первинний потік визначає який з потоків пула завершився й відразу створює замість нього новий, розміщаючи його ідентифікатор на вакантне місце в масиві.

Консольний додаток MultiPipeClient.exe клієнтського процесу відкриває реалізацію каналу, і використовує отриманий ідентифікатор для передачі повідомлень, що вводяться користувачем з клавіатури. При уведенні рядка, шо починається з «exit» клієнт після його передачі в канал завершує свою роботу.

;Файл interface.inc

193

include windows.inc include kernel32.inc include masm32.inc include user32.inc

include C:\MASM32\MACROS\strings.mac

includelib kernel32.lib

includelib masm32.lib

includelib user32.lib

Main PROTO

 

.data

 

pszPipeName

db "\\.\Pipe\MultiThreadsServerNamedPipe",0

;Файл MultiPipeServer.Inc

include ..\interface.inc

 

.data?

 

ThreadHandleArray

HANDLE 3 dup (?)

ThreadIDArray

DWORD 3 dup (?)

;Файл MultiPipeServer.Asm

.386

.model flat, stdcall option casemap :none

include MultiPipeServer.inc

.code

start: invoke Main

invoke ExitProcess,0 Main proc

invoke ClearScreen xor esi,esi

.while esi<3

lea edi,NamedPipeThread

invoke CreateThread,0,0,edi,0,0,ADDR ThreadIDArray[esi*4]

194

.if eax!=0

mov ThreadHandleArray[esi*4],eax inc esi

.else

ret

.endif

.endw

.while (TRUE)

invoke WaitForMultipleObjects,3,ADDR ThreadHandleArray,FALSE,INFINITE sub eax,WAIT_OBJECT_0

mov ebx,eax

invoke CreateThread,0,0,edi,0,0,ADDR ThreadIDArray[ebx*4]

.if eax!=0

mov ThreadHandleArray[ebx*4],eax

.endif

invoke Sleep,3000

.endw ret

Main endp

NamedPipeThread proc

LOCAL hNamedPipe:HANDLE

LOCAL InputBuffer[512]:BYTE

LOCAL OutputBuffer[512]:BYTE

LOCAL NumberOfBytesRead:DWORD

invoke CreateNamedPipe,ADDR pszPipeName,\ PIPE_ACCESS_INBOUND,\ PIPE_TYPE_MESSAGE OR PIPE_WAIT,\ PIPE_UNLIMITED_INSTANCES,\

LENGTHOF InputBuffer,LENGTHOF OutputBuffer,0,0

.if eax==INVALID_HANDLE_VALUE

invoke StdOut,$CTA0("Cannot create pipe")

195

.endif

mov hNamedPipe,eax

invoke ConnectNamedPipe,hNamedPipe,NULL

.if eax==0

invoke StdOut,$CTA0("ConnectNamedPipe Error") invoke CloseHandle,hNamedPipe

invoke ExitThread,-1

.endif

.while (TRUE)

invoke ReadFile,hNamedPipe,Addr InputBuffer,LENGTHOF InputBuffer,\ ADDR NumberOfBytesRead, NULL

invoke StdOut,Addr InputBuffer

or dword ptr InputBuffer,20202020h

.break .if dword ptr InputBuffer==74697865h

.endw

invoke ExitThread,0 ret

NamedPipeThread endp end start

;Файл MultiPipeClient.Inc

include ..\interface.inc

;Файл MultiPipeClient.Asm

.386

.model flat, stdcall

option casemap:none

include MultiPipeClient.Inc

.code

start:

196

invoke Main

invoke ExitProcess,0 Main proc

LOCAL hNamedPipe:HANDLE

LOCAL OutputBuffer[512]:BYTE

LOCAL NumberOfBytesWrite:DWORD invoke ClearScreen

invoke CreateFile, ADDR pszPipeName,\ GENERIC_WRITE,\

0, NULL, OPEN_EXISTING, 0, NULL

.if eax==INVALID_HANDLE_VALUE invoke GetLastError

invoke StdOut, $CTA0("Cannot open pipe") ret

.else

mov hNamedPipe,eax

.endif

lea edi,OutputBuffer

.while (TRUE)

invoke StdOut,$CTA0("$ ")

invoke StdIn,edi,LENGTHOF OutputBuffer invoke lstrlen,edi

lea ebx,[eax+1]

invoke WriteFile,hNamedPipe, edi,\

ebx, ADDR NumberOfBytesWrite,NULL or dword ptr [edi],20202020h

.break .if dword ptr [edi]==74697865h

invoke RtlFillMemory,edi,LENGTHOF OutputBuffer,0

.endw

invoke CloseHandle, hNamedPipe ret

Main endp end start

197

198

A

access token, 82

Application Programming Interface, 22 auto-reset event, 152

B

BSOD (Blue Screen Of Death), 90

C

C RTL, 33

C RunTime Library, 33

Client/Server Runtime SubSystem, 22 COFF- (Common Object File Format), 20 comctl32.dll, 23

comdlg32.dll, 23 Configuration Manager, 18 Console User Interface, 20 CONTEXT, 84

critical section, 129 csrss.exe, 22, 31, 93

D

dbghelp.dll, 90, 97

DLL (Dynamic Link Libraries), 22

Dynamic-Link Libraries, 20

E

EFI (Extensible Firmware Interface), 41 Environment subsystems, 16

event object, 152 Executive subsystem, 17

F

File System Cache Manager, 19 file-mapping object, 157

G

gdi32.dll, 20, 23 GPT-схема, 41

Іменний покажчик

Graphic User Interface, 20

H

HAL, 12, 19, 21, 22, 42

Hardware Abstraction Layer, 19

I

I/O Manager, 18 IAT, 27, 109 imagehlp.dll, 90, 97

InterProcess Communication, 157

IPC, 157, 158, 166, 168, 169, 176

ISO-9660, 41

J

Joliet, 41

K

kernel, 19

kernel32.dll, 22, 28, 30, 44, 90

M

manual-reset events, 152 MBR-схема, 41

Mutex, 136, 137, 138, 139, 141, 142, 143, 145, 151 abandoned, 143

N

Native API, 30, 31, 33, 34, 90, 98, 99, 102, 108, 109, 110, 111, 120, 158

non signaled state, 135

ntdll.dll, 23, 31, 33, 99, 100, 108, 109 ntoskrnl.exe, 31, 33, 83, 100

O

Object Manager, 17

P

PE- (Portable Executable), 20

199

PID, 82, 91, 92, 93, 94, 95, 102, 105, 107, 120 pipes, 166, 168, 176

Plug-and-Play Manager, 18

Process Manager, 18

Process Status Application Programming Interface, 97

PSAPI, 97, 98, 120

psapi.dll, 90, 97

R

Relocate Virtual Address, 27

RVA, 27

S

SDT, 32, 33 section object, 157 security context, 82

Security Reference Monitor, 18 Semaphore, 146, 147, 149, 150 semaphores, 146

Service, 16

Service Descriptor Table, 32 signaled state, 135

SMP, 22

Snapshot, 90

SST, 32, 33

STDCALL, 23, 47, 110 stream-based, 166 System Processes, 15 System Service Table, 32

T

thread, 83

ToolHelp32, 90, 93, 97, 120

U

UNC, 177, 178, 179, 182

Unicode, 13, 107

Universal Disk Format, 41

Universal Naming Convention, 177 user32.dll, 20, 23, 44

V

Virtual Memory Manager, 18

W

Wait-функції, 135, 148

Win API, 22

Win Debug API, 120

Windows

NT 3.1, 14

NT 3.5, 14

NT 3.51, 14

NT 4.0.1381, 14

NT 5.0.2195, 14

NT 5.1.2600, 14

NT 5.2.3790, 14

NT 6.0.6000, 14

NT 6.0.6001, 14

NT 6.1.7600, 14

Windows USER GDI, 19

А

Анонімні канали, 168

Б

багатозадачністть, що витісняє, 87

базовий пріоритет потоку, 88

базові класи пріоритету, 88 ABOVE_NORMAL_PRIORITY_CLASS, 88 BELOW_NORMAL_PRIORITY_CLASS, 88 HIGH_PRIORITY_CLASS, 88 IDLE_PRIORITY_CLASS, 88 NORMAL_PRIORITY_CLASS, 88 REALTIME_PRIORITY_CLASS, 88

батьківський процес, 82

В

Виконавча система, 17

віртуальний адресний простір, 22, 34, 36, 82, 158

Г

Гарантована доставка, 167

головний потік, 83

Д

динамічні рівні пріоритетів, 87

200