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