The MASM Forum

Microsoft 64 bit MASM => Mikl__'s ml64 examples => Topic started by: Mikl__ on August 18, 2022, 11:29:24 AM

Title: Interprocess communication
Post by: Mikl__ on August 18, 2022, 11:29:24 AM
Interprocess communication (IPC)
The Windows operating system provides mechanisms for facilitating communications and data sharing between applications. Collectively, the activities enabled by these mechanisms are called interprocess communications (IPC). Some forms of IPC facilitate the division of labor among several specialized processes. Other forms of IPC facilitate the division of labor among computers on a network.

Typically, applications can use IPC categorized as clients or servers. A client is an application or a process that requests a service from some other application or process. A server is an application or a process that responds to a client request. Many applications act as both a client and a server, depending on the situation.

The following IPC mechanisms are supported by Windows:There are show several ways to transfer data between two applications in this thread. Text string, 128x128 pictures and media data are sent.
The pictures and the wav file are in an attachment in the Images (https://wasm.in/attachments/images-zip.7573/) folder.
Place the sender-application with the index "s" and the reciever-application with the index "r" side by side. There are total IPC mechanisms: 19/are written: 12 now.

01. WM_COPYDATA
The following example demonstrates how to send information between two applications using the WM_COPYDATA message.
The sending application displays a dialog box to the user which requests certain information. The application packages the information into a private data structure, includes a pointer to the structure in the COPYDATASTRUCT structure, and sends the information to the receiving application using the WM_COPYDATA message.

01s.asm (Server); GUI #
include win64a.inc

ID_TXT equ 100
ID_SEND_TXT equ 101
ID_SEND_ICO equ 102
ID_SEND_WAV equ 103
IDC_DIALOG equ 200
IDC_ICON1 equ 500
IDC_IMG1 equ 104

.code
WinMain proc ;dummy:qword
enter 30h,0
mov r9d,256
mov [rbp-10h],r9
and     qword ptr [rbp-8],LR_DEFAULTCOLOR
invoke LoadImageA,IMAGE_BASE,IDC_ICON1,IMAGE_ICON;,0,0,LR_DEFAULTCOLOR
mov r9d,offset DialogProc
mov [rbp-10h],rax
invoke DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP
invoke RtlExitUserProcess,NULL
WinMain endp

DialogProc proc hWnddlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
local buffer:qword
local cdata:COPYDATASTRUCT
local FSize:dword
local hFile:dword
local p:qword
local szReadWrite:qword ;number of bytes actually read or write
local hResource:qword
local pResource:qword

mov hWnddlg,rcx
mov lParam,r9

cmp edx,WM_CLOSE
je wmCLOSE
cmp edx,WM_COMMAND
je wmCOMMAND
cmp edx,WM_INITDIALOG
        jne wmBYE
wmINITDIALOG:invoke GetDlgItem,,IDC_IMG1
invoke SendMessageA,eax,STM_SETIMAGE,IMAGE_ICON,lParam
jmp wmBYE
wmSEND_TXT:invoke GlobalAlloc,GPTR,256
mov buffer,rax
        mov cdata.lpData,rax
invoke  GetDlgItemTextA,hWnddlg,ID_TXT,eax,256
        or      eax,eax
        jz      wmBYE
        ; fill structure COPYDATASTRUCT
        mov     cdata.dwData,CF_TEXT
        inc     eax
        mov     cdata.cbData,eax
jmp @f
wmSEND_ICO:mov     cdata.dwData,CF_BITMAP
mov edx,p1
invoke FindResource,0,,RT_ICON; find the resource
mov hResource,rax
invoke  SizeofResource,0,eax ; get its size
mov     cdata.cbData,eax
mov FSize,eax
invoke LoadResource,0,hResource ; load the resource
invoke LockResource,eax;pResource
mov cdata.lpData,rax
mov p,rax
;-------------------------------------------------
        mov ecx,256
and qword ptr[rsp+30h],LR_DEFAULTCOLOR;LR_DEFAULTCOLOR=0
mov [rsp+20h],rcx
mov [rsp+28h],rcx
mov edx,FSize
invoke  CreateIconFromResourceEx,p,,TRUE,30000h;270376,TRUE,30000h
mov [rsp+20h],rax
invoke  SendDlgItemMessageA,hWnddlg,IDC_IMG1,STM_SETIMAGE,IMAGE_ICON
xor p1,11b
;--------------------------------------------------
jmp @f
wmSEND_WAV:mov ecx,offset wav_file
invoke CreateFile,,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,\
        FILE_ATTRIBUTE_ARCHIVE,0
        mov hFile,eax
        invoke GetFileSize,eax,0
mov FSize,eax
        mov     cdata.dwData,CF_WAVE
        mov     cdata.cbData,eax
invoke GlobalAlloc,GPTR,eax
        mov cdata.lpData,rax
lea r9d,szReadWrite
and qword ptr[rsp+20h],0
        invoke ReadFile,hFile,eax,FSize
        invoke CloseHandle,hFile
@@:mov edx,offset szWin
        invoke  FindWindowA,NULL
        or      eax,eax
        jz      wmBYE
lea r9d,cdata
mov qword ptr[rsp+20h],SMTO_ABORTIFHUNG
mov qword ptr[rsp+28h],500
and qword ptr[rsp+30h],0
invoke  SendMessageTimeoutA,eax,WM_COPYDATA,hWnddlg
jmp wmBYE
wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + ID_SEND_TXT
        je      wmSEND_TXT
        cmp r8d,BN_CLICKED shl 16 + ID_SEND_ICO
        je      wmSEND_ICO
cmp r8d,BN_CLICKED shl 16 + ID_SEND_WAV
        je      wmSEND_WAV
cmp     r8d,BN_CLICKED shl 16 + IDCANCEL
        jne     wmBYE
wmCLOSE:invoke EndDialog,,0
wmBYE: xor eax,eax
leave
retn
DialogProc endp
;---------------------------------------
.data
szWin db 'WM_COPYDATA Reciever',0
wav_file db '..\Images\03.wav',0
p1 dd 1
end

01s.rc#include "resource.h"
#define ID_TXT 100
#define ID_SEND_TXT 101
#define ID_SEND_ICO 102
#define ID_SEND_WAV 103
#define IDC_IMG1 104

#define IDC_DIALOG 200
#define IDC_ICON1 500

IDC_ICON1 ICON "..\\Images\\icon1.ico"
IDC_ICON2 ICON "..\\Images\\icon2.ico"

IDC_DIALOG DIALOGEX 0, 0, 212, 154
STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "WM_COPYDATA Sender"
{
CONTROL "",-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE,2,-1,207,24
CONTROL "",IDC_IMG1,STATIC,SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128
CONTROL "Write something and click 'Send Text'",ID_TXT,EDIT,ES_LEFT |
ES_AUTOHSCROLL|WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP,5,7,199,13
CONTROL "Send Text", ID_SEND_TXT, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 27, 60, 15
CONTROL "Send ICO", ID_SEND_ICO, BUTTON, BS_PUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 45, 60, 15
CONTROL "Send WAV", ID_SEND_WAV, BUTTON, BS_PUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 65, 60, 15
CONTROL "Exit",IDCANCEL,BUTTON,BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE |
WS_TABSTOP, 149, 85, 60, 15
}

01r.asm (Client); GUI #
include win64a.inc

IDC_DIALOG equ 200
ID_TXT equ 100
ID_ICON equ 102
IDC_ICON1 equ 500

.code
WinMain proc dummy:qword

        invoke  DialogBoxParam,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP,qword ptr(offset DialogProc),0
        invoke  RtlExitUserProcess,NULL
WinMain endp
DialogProc proc hWnddlg:qword,msg:qword,wParam:qword,lParam:qword
local p:qword
local FSize:dword
local lpwiocb:WAVEHDR
local hWaveOut:qword

mov hWnddlg,rcx
mov lParam,r9

cmp edx,WM_CLOSE
je wmCLOSE
cmp edx,WM_COPYDATA ; Пришло сообщение WM_COPYDATA?
je wmCOPYDATA
cmp edx,WM_COMMAND
je wmCOMMAND
        cmp edx,WM_INITDIALOG
jne wmBYE

wmINITDIALOG:;mov rcx,hWnd
; Найти окно получателя
        invoke  FindWindow,NULL,&szWin
        or      eax,eax
        jnz wmBYE
invoke MessageBox,hWnddlg,&Error1,&szAppName,MB_ICONEXCLAMATION or MB_YESNO
cmp eax,IDNO
jz      wmBYE     
invoke WinExec,&szService,SW_SHOW
jmp wmBYE
wmCOPYDATA:; Получить строку от первого приложения
; В lParam приходит указатель на структуру COPYDATASTRUCT
        mov eax,[r9+COPYDATASTRUCT.cbData]
or eax,eax; Размер данных нулевой?
        je      wmBYE; Да, пропускаем
mov FSize,eax
        mov rax,[r9+COPYDATASTRUCT.lpData]
mov p,rax
mov rax,[r9+COPYDATASTRUCT.dwData]
        cmp     eax,CF_TEXT; Это нужный тип данных?
        je COPYDATA_TEXT; Нет, пропускаем
cmp     eax,CF_WAVE; Это нужный тип данных?
        je COPYDATA_MUSIC; Нет, пропускаем
cmp     eax,CF_BITMAP; Это нужный тип данных?
        jne wmBYE
COPYDATA_ICON:; Создать HICON напрямую из памяти
invoke  CreateIconFromResourceEx,p,FSize,TRUE,30000h,256,256,LR_DEFAULTCOLOR
invoke  SendDlgItemMessage,hWnddlg,ID_ICON,STM_SETIMAGE,IMAGE_ICON,eax
jmp wmBYE
COPYDATA_MUSIC:mov r8,p
;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data) = 14h
        add r8d,14h
        invoke waveOutOpen,&hWaveOut,WAVE_MAPPER,,0,0,WAVE_ALLOWSYNC
; Подготавливаем заголовок для вывода
lea edi,lpwiocb
mov edx,edi
xor eax,eax
mov ecx,(sizeof WAVEHDR)/8
rep stosq

mov rax,p
;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data)+\
;(Type of format)+(Number of Channels)+(Sample Rate)+(Sample Rate*BitsPerSample*Channels/8)+\
;(BitsPerSample*Channels/8)+(Bits per sample)+("data" chunk header)+(Size of the data section)=2Ch
add rax,2Ch
mov [rdx].WAVEHDR.lpData,rax ;адрес блока данных
mov eax,FSize
sub eax,2Ch
mov [rdx].WAVEHDR.dwBufferLength,eax ;размер блока данных
invoke waveOutPrepareHeader,hWaveOut,,sizeof WAVEHDR
; Запускаем проигрывание блока
invoke waveOutWrite,hWaveOut,&lpwiocb,sizeof WAVEHDR
@@: test lpwiocb.dwFlags,WHDR_DONE
jz @b
invoke waveOutUnprepareHeader,hWaveOut,&lpwiocb,sizeof WAVEHDR
invoke waveOutClose,hWaveOut
jmp wmBYE
COPYDATA_TEXT:invoke SetDlgItemText,,ID_TXT,p
jmp wmBYE
wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + IDCANCEL
jne wmBYE
wmCLOSE:invoke EndDialog,,0
wmBYE: xor eax,eax
leave
retn
DialogProc endp
.data
szWin   db "Clipboard Sender",0
Error1   db "The server is not running.",10,"Run?",0
szAppName db "Clipboard Reciever",0
szService db "01s",0
end
01r.rc#include "resource.h"
#define IDC_DIALOG 200
#define ID_TXT 100
#define ID_ICON 102
#define ID_PROGRESS 106
#define ID_TXT1 107

IDC_DIALOG DIALOGEX 0,0,212,154
STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "WM_COPYDATA Reciever"

{
CONTROL "",-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 2,-3,207,24
CONTROL "", ID_TXT, STATIC, SS_LEFT | SS_NOPREFIX | WS_CHILD |
WS_VISIBLE | WS_BORDER | WS_TABSTOP, 5, 5, 199, 13
CONTROL "Exit", IDCANCEL, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 25, 60, 15
CONTROL "",ID_ICON, STATIC, SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128
}
Title: Re: Interprocess communication
Post by: Mikl__ on August 18, 2022, 11:51:58 AM
02. ClipBoard
The clipboard is a set of functions and messages that enable applications to transfer data. Because all applications have access to the clipboard, data can be easily transferred between applications or within an application.
02r.asm (Client); GUI #
include win64a.inc
IDC_DIALOG equ 200
ID_TXT equ 100
ID_ICON equ 102
IDC_ICON1 equ 500

.code
WinMain proc  dummy:qword

        invoke  DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP,qword ptr(offset DialogProc),0
        invoke  RtlExitUserProcess,NULL
WinMain endp
DialogProc proc hWnddlg:qword,msg:qword,wParam:qword,lParam:qword
local hGin:qword
local p:qword
local FSize:dword
local lpwiocb:WAVEHDR
local hWaveOut:qword

mov hWnddlg,rcx
mov lParam,r9

cmp edx,WM_CLOSE
je wmCLOSE
cmp edx,WM_CLIPBOARDUPDATE
je wmCLIPBOARDUPDATE
cmp edx,WM_COMMAND
je wmCOMMAND
        cmp edx,WM_INITDIALOG
jne wmBYE
wmINITDIALOG:invoke  FindWindowA,NULL,&szWin
        or      eax,eax
        jnz wmBYE
invoke MessageBoxA,hWnddlg,&Error1,&szAppName,MB_ICONEXCLAMATION or MB_YESNO
cmp eax,IDNO
jz      wmBYE     
invoke WinExec,&szService,SW_SHOW
jmp wmBYE
wmCLIPBOARDUPDATE:; В lParam приходит длина и тип данных
invoke OpenClipboard ;открываем буфер обмена
mov ecx,dword ptr lParam
invoke GetClipboardData;извлекаем текст из буфера обмена
mov hGin,rax
invoke GlobalLock,eax  ;блокируем память
mov p,rax
mov rax,lParam
shr rax,32
mov FSize,eax
cmp     dword ptr lParam,CF_WAVE; Это нужный тип данных?
        jz WAVE
cmp     dword ptr lParam,CF_DIB; Это нужный тип данных?
        jz DIB
cmp dword ptr lParam,CF_TEXT
jnz wmBYE
;---------------------------------------------------
; Получить строку от первого приложения
TXT: invoke  SetDlgItemTextA,hWnddlg,ID_TXT,p
jmp @0
DIB: mov edx,FSize
invoke  CreateIconFromResourceEx,p,,TRUE,30000h,256,256,LR_DEFAULTCOLOR
invoke  SendDlgItemMessageA,hWnddlg,ID_ICON,STM_SETIMAGE,IMAGE_ICON,eax
jmp @0
WAVE: mov r8,p
;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data) = 14h
        add r8d,14h
        invoke waveOutOpen,&hWaveOut,WAVE_MAPPER,,0,0,WAVE_ALLOWSYNC
; Подготавливаем заголовок для вывода
lea edi,lpwiocb
mov edx,edi
xor eax,eax
mov ecx,(sizeof WAVEHDR)/8
rep stosq
mov rax,p
;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data)+\
;(Type of format)+(Number of Channels)+(Sample Rate)+(Sample Rate*BitsPerSample*Channels/8)+\
;(BitsPerSample*Channels/8)+(Bits per sample)+("data" chunk header)+(Size of the data section)=2Ch
add rax,2Ch
mov [rdx].WAVEHDR.lpData,rax ;адрес блока данных
mov eax,FSize
sub eax,2Ch
mov [rdx].WAVEHDR.dwBufferLength,eax ;размер блока данных
invoke waveOutPrepareHeader,hWaveOut,,sizeof WAVEHDR
; Запускаем проигрывание блока
invoke waveOutWrite,hWaveOut,&lpwiocb,sizeof WAVEHDR
@@: test lpwiocb.dwFlags,WHDR_DONE
jz @b
invoke waveOutUnprepareHeader,hWaveOut,&lpwiocb,sizeof WAVEHDR
invoke waveOutClose,hWaveOut
@0: invoke GlobalLock,hGin
invoke CloseClipboard
jmp wmBYE
wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + IDCANCEL
jne wmBYE
wmCLOSE:invoke EndDialog,,0
wmBYE: xor eax,eax
leave
retn
DialogProc endp
.data
szWin db "Clipboard Sender",0
Error1 db "The server is not running.",10,"Run?",0
szAppName db "Clipboard Reciever",0
szService db "02s",0
end
02r.rc#include "resource.h"
#define IDC_DIALOG 200
#define ID_TXT 100
#define ID_ICON 102
#define ID_PROGRESS 106
#define ID_TXT1 107

IDC_DIALOG DIALOGEX 0,0,212,154
STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "Clipboard Reciever"

{
CONTROL "",-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 2,-3,207,24
CONTROL "", ID_TXT, STATIC, SS_LEFT | SS_NOPREFIX | WS_CHILD |
WS_VISIBLE | WS_BORDER | WS_TABSTOP, 5, 5, 199, 13
CONTROL "Exit", IDCANCEL, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 25, 60, 15
CONTROL "",ID_ICON, STATIC, SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128
}
02s.asm (Server); GUI #
include win64a.inc
ID_TXT equ 100
ID_SEND_TXT equ 101
ID_SEND_ICO equ 102
ID_SEND_WAV equ 103
IDC_DIALOG equ 200
IDC_ICON1 equ 500
IDC_IMG1 equ 104
WM_CLIPBOARDUPDATE  equ 31Dh

.code
WinMain proc dummy:qword

invoke LoadImageA,IMAGE_BASE,IDC_ICON1,IMAGE_ICON,256,256,LR_DEFAULTCOLOR
mov r9d,offset DialogProc
invoke DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP,,eax
invoke RtlExitUserProcess,NULL
WinMain endp

DialogProc proc hWnddlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
size_of_buffer equ 96
local hGout:qword
local p:qword
local FSize:dword
local hFile:dword
local szReadWrite:qword ;number of bytes actually read or write
local hResource:qword
local pResource:qword
local type0:qword

mov hWnddlg,rcx
mov lParam,r9

cmp edx,WM_CLOSE
je wmCLOSE
cmp edx,WM_COMMAND
je wmCOMMAND
cmp edx,WM_INITDIALOG
        jne wmBYE
wmINITDIALOG:invoke GetDlgItem,,IDC_IMG1
invoke SendMessageA,eax,STM_SETIMAGE,IMAGE_ICON,lParam
jmp wmBYE
wmSEND_TXT:invoke GlobalAlloc,GPTR,size_of_buffer;GHND or GMEM_DDESHARE
mov hGout,rax
invoke GlobalLock,eax
mov p,rax
invoke  GetDlgItemTextA,hWnddlg,ID_TXT,eax,size_of_buffer;255
        or      eax,eax
        jz      wmBYE
mov FSize,eax
add rax,p
and byte ptr[rax],0
mov rdx,CF_TEXT
jmp @f
;--------------------------------------------------
wmSEND_ICO:; Отправить изображение второму приложению
mov edx,p1
invoke FindResource,0,,RT_ICON; find the resource
mov hResource,rax
invoke  SizeofResource,0,eax ; get its size
mov FSize,eax
invoke GlobalAlloc,GPTR,eax; or GMEM_DDESHARE,eax
mov hGout,rax
invoke GlobalLock,eax
mov p,rax
mov edi,eax
invoke LoadResource,0,hResource ; load the resource
invoke LockResource,eax;pResource
mov esi,eax
mov ecx,FSize
rep movsb
;------------------------------------------------
mov edx,FSize
invoke  CreateIconFromResourceEx,p,,TRUE,30000h,256,256,LR_DEFAULTCOLOR
invoke  SendDlgItemMessageA,hWnddlg,IDC_IMG1,STM_SETIMAGE,IMAGE_ICON,eax
xor p1,11b
mov rdx,CF_DIB
jmp @f
;--------------------------------------------------
wmSEND_WAV:invoke CreateFile,&wav_file,GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,0
        mov hFile,eax
        invoke GetFileSize,eax,0
mov FSize,eax
invoke GlobalAlloc,GPTR,eax
mov hGout,rax
invoke GlobalLock,eax
mov p,rax
        invoke ReadFile,hFile,eax,FSize,&szReadWrite,0
        invoke CloseHandle,hFile
mov rdx,CF_WAVE
;--------------------------------------------------------
@@: mov eax,FSize
shl rax,32
or rax,rdx
mov type0,rax
invoke GlobalUnlock,hGout
invoke OpenClipboard,hWnddlg
or eax,eax
jz wmBYE
invoke EmptyClipboard
invoke SetClipboardData,type0,hGout
invoke CloseClipboard
; Найти окно получателя
        invoke  FindWindowA,NULL,&szWin
        or      eax,eax
        jz      wmBYE
; Отправить данные получателю
invoke  PostMessageA,eax,WM_CLIPBOARDUPDATE,hWnddlg,type0
jmp wmBYE
wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + ID_SEND_TXT
        je      wmSEND_TXT
        cmp r8d,BN_CLICKED shl 16 + ID_SEND_ICO
        je      wmSEND_ICO
cmp r8d,BN_CLICKED shl 16 + ID_SEND_WAV
        je      wmSEND_WAV
cmp     r8d,BN_CLICKED shl 16 + IDCANCEL
        jne     wmBYE
wmCLOSE:invoke EndDialog,,0
wmBYE: xor eax,eax
leave
retn
DialogProc endp
;---------------------------------------
.data
szWin db 'Clipboard Reciever',0
wav_file db '..\Images\03.wav',0
p1 dd 1
end
02s.rc#include "resource.h"
#define ID_TXT 100
#define ID_SEND_TXT 101
#define ID_SEND_ICO 102
#define ID_SEND_WAV 103
#define IDC_IMG1 104

#define IDC_DIALOG 200
#define IDC_ICON1 500

IDC_ICON1 ICON "..\\Images\\icon1.ico"
IDC_ICON2 ICON "..\\Images\\icon2.ico"

IDC_DIALOG DIALOGEX 0, 0, 212, 154
STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "Clipboard Sender"
{
CONTROL "",-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE,2,-1,207,24
CONTROL "",IDC_IMG1,STATIC,SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128
CONTROL "Write something and click 'Send Text'",ID_TXT,EDIT,ES_LEFT |
ES_AUTOHSCROLL|WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP,5,7,199,13
CONTROL "Send Text", ID_SEND_TXT, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 27, 60, 15
CONTROL "Send ICO", ID_SEND_ICO, BUTTON, BS_PUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 45, 60, 15
CONTROL "Send WAV", ID_SEND_WAV, BUTTON, BS_PUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 65, 60, 15
CONTROL "Exit",IDCANCEL,BUTTON,BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE |
WS_TABSTOP, 149, 85, 60, 15
}
Title: Re: Interprocess communication
Post by: Mikl__ on August 18, 2022, 12:02:37 PM
03. Memory Mapped File
Memory-mapped files can be shared across multiple processes. Processes can map to the same memory-mapped file by using a common name that is assigned by the process that created the file.
To work with a memory-mapped file, you must create a view of the entire memory-mapped file or a part of it. You can also create multiple views to the same part of the memory-mapped file, thereby creating concurrent memory. For two views to remain concurrent, they have to be created from the same memory-mapped file.
03r.asm (Client); GUI #
include win64a.inc
IDC_DIALOG equ 200
ID_TXT equ 100
ID_ICON equ 102
IDC_ICON1 equ 500

.code
WinMain proc dummy:qword

        invoke  DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP,qword ptr(offset DialogProc),0
        invoke  RtlExitUserProcess,NULL
WinMain endp
DialogProc proc hWnddlg:qword,msg:qword,wParam:qword,lParam:qword
local pMapping:qword
local hMapping:qword
local FSize:dword
local lpwiocb:WAVEHDR
local hWaveOut:qword

mov hWnddlg,rcx
mov lParam,r9

cmp edx,WM_CLOSE
je wmCLOSE
cmp edx,WM_USER+1
je wmUSER_1
cmp edx,WM_COMMAND
je wmCOMMAND
cmp edx,WM_INITDIALOG
        jne wmBYE
wmINITDIALOG:; Найти окно получателя
        invoke  FindWindowA,NULL,&szWin
        or      eax,eax
        jnz wmBYE
invoke MessageBoxA,hWnddlg,&Error1,&szAppName,MB_ICONEXCLAMATION or MB_YESNO
cmp eax,IDNO
jz      wmBYE     
invoke WinExec,&szService,SW_SHOW
jmp wmBYE
wmUSER_1:; Получить строку от первого приложения
invoke OpenFileMapping,FILE_MAP_READ,FALSE,&lpszName
mov hMapping,rax
invoke MapViewOfFile,eax,FILE_MAP_READ,0,0,0
mov pMapping,rax
;-------------------------------------------
mov rax,lParam
shr rax,8
mov FSize,eax
cmp byte ptr lParam,CF_DIB
je DIB
cmp byte ptr lParam,CF_WAVE
je WAVE
cmp byte ptr lParam,CF_TEXT
jne wmBYE
TEXT: invoke  SetDlgItemTextA,hWnddlg,ID_TXT,pMapping
        jmp @0
DIB: mov edx,FSize
invoke  CreateIconFromResourceEx,pMapping,,TRUE,30000h,256,256,LR_DEFAULTCOLOR
invoke  SendDlgItemMessageA,hWnddlg,ID_ICON,STM_SETIMAGE,IMAGE_ICON,eax
        jmp @0
WAVE: mov r8,pMapping
;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data) = 14h
        add r8d,14h
        invoke waveOutOpen,&hWaveOut,WAVE_MAPPER,,0,0,WAVE_ALLOWSYNC
; Подготавливаем заголовок для вывода
lea edx,lpwiocb
mov edi,edx
xor eax,eax
        mov ecx,(sizeof WAVEHDR)/8
rep stosq
mov rax,pMapping
;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data)+\
;(Type of format)+(Number of Channels)+(Sample Rate)+(Sample Rate*BitsPerSample*Channels/8)+\
;(BitsPerSample*Channels/8)+(Bits per sample)+("data" chunk header)+(Size of the data section)=2Ch
add rax,2Ch
mov [rdx].WAVEHDR.lpData,rax ;адрес блока данных
mov eax,FSize
sub eax,2Ch
mov [rdx].WAVEHDR.dwBufferLength,eax ;размер блока данных
invoke waveOutPrepareHeader,hWaveOut,,sizeof WAVEHDR
; Запускаем проигрывание блока
invoke waveOutWrite,hWaveOut,&lpwiocb,sizeof WAVEHDR
@@: cmp lpwiocb.dwFlags,WHDR_DONE or WHDR_PREPARED
jnz @b
invoke waveOutUnprepareHeader,hWaveOut,&lpwiocb,sizeof WAVEHDR
invoke waveOutClose,hWaveOut
@0: invoke UnmapViewOfFile,pMapping
        invoke CloseHandle,hMapping
jmp wmBYE
wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + IDCANCEL
jne wmBYE
wmCLOSE:invoke EndDialog,,0
wmBYE: xor eax,eax
leave
retn
DialogProc endp
;--------------------------------------------------------
.data
szWin   db "Memory-Mapped File Sender",0
Error1   db "The server is not running.",10,"Run?",0
szAppName db "Memory-Mapped File Reciever",0
szService db "03s",0
align 10h
lpszName db "Song_of_the_South",0
end
03r.rc#include "resource.h"
#define IDC_DIALOG 200
#define ID_TXT 100
#define ID_ICON 102
#define ID_PROGRESS 106
#define ID_TXT1 107

IDC_DIALOG DIALOGEX 0,0,212,154
STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "Memory-Mapped File Reciever"

{
CONTROL "",-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 2,-3,207,24
CONTROL "", ID_TXT, STATIC, SS_LEFT | SS_NOPREFIX | WS_CHILD |
WS_VISIBLE | WS_BORDER | WS_TABSTOP, 5, 5, 199, 13
CONTROL "Exit", IDCANCEL, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 25, 60, 15
CONTROL "",ID_ICON, STATIC, SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128
}
03s.asm (Server); GUI #
include win64a.inc
ID_TXT equ 100
ID_SEND_TXT equ 101
ID_SEND_ICO equ 102
ID_SEND_WAV equ 103
IDC_DIALOG equ 200
IDC_ICON1 equ 500
IDC_IMG1 equ 104

.code
WinMain proc dummy:qword

invoke LoadImageA,IMAGE_BASE,IDC_ICON1,IMAGE_ICON,256,256,LR_DEFAULTCOLOR
invoke DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP,qword ptr(offset DialogProc),eax
invoke RtlExitUserProcess,NULL
WinMain endp

DialogProc proc hWnddlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
size_of_buffer equ 96
local FSize:dword
local hResource:qword
local pResource:qword
local szReadWrite:qword
local type0:qword
local p:qword

mov hWnddlg,rcx
mov lParam,r9

cmp edx,WM_CLOSE
je wmCLOSE
cmp edx,WM_COMMAND
je wmCOMMAND
cmp edx,WM_INITDIALOG
        jne wmBYE
wmINITDIALOG:invoke GetDlgItem,,IDC_IMG1
invoke SendMessageA,eax,STM_SETIMAGE,IMAGE_ICON,lParam
jmp wmBYE
wmSEND_TXT:invoke GlobalAlloc,GPTR,size_of_buffer
        invoke GlobalLock,eax
mov p,rax
invoke  GetDlgItemTextA,hWnddlg,ID_TXT,eax,size_of_buffer;255
        or      eax,eax
        jz      wmBYE
        inc     eax
mov FSize,eax
;созддание файла
invoke CreateFile,&szMapName0,GENERIC_READ or GENERIC_WRITE,0,0,OPEN_ALWAYS,0,0
mov hFile,rax
invoke WriteFile,eax,p,FSize,&szReadWrite,0
invoke Func,hFile,0
mov edx,CF_TEXT
jmp @0
wmSEND_ICO:mov edx,p1
invoke FindResource,0,,RT_ICON; find the resource
mov hResource,rax
invoke  SizeofResource,0,eax ; get its size
mov     FSize,eax
; shl eax,8
; mov edx,CF_DIB
;        mov type0,rax
invoke LoadResource,0,hResource ; load the resource
invoke LockResource,eax
mov esi,eax
;созддание в памяти объекта "проекция файла" и
;отображение проекции файла на адресное пространство процесса
invoke Func,INVALID_HANDLE_VALUE,FSize
;-----------------------------------------------------------------
mov ecx,FSize
mov edi,eax;rdi,pMapping
rep movsb
;--------------------------------------------------
mov edx,FSize
invoke  CreateIconFromResourceEx,pMapping,,TRUE,30000h,256,256,LR_DEFAULTCOLOR
invoke  SendDlgItemMessageA,hWnddlg,IDC_IMG1,STM_SETIMAGE,IMAGE_ICON,eax
xor p1,11b
mov edx,CF_DIB
jmp @0
;-------------------------------------------------------
wmSEND_WAV:invoke CreateFile,&wav_file,GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ \
or FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,0
        mov hFile,rax
        invoke GetFileSize,eax,0
mov FSize,eax
invoke Func,hFile,0
mov edx,CF_WAVE
;-------------------------------------------------------
@0: mov eax,FSize
shl eax,8
or eax,edx
mov type0,rax
; Найти окно получателя
mov edx,offset szWin
        invoke  FindWindowA,NULL
        or      eax,eax
        jz      wmBYE
; Отправить данные получателю
        invoke  SendMessageTimeoutA,eax,WM_USER+1,hWnddlg,type0,SMTO_ABORTIFHUNG,5000,0
invoke UnmapViewOfFile,pMapping
invoke CloseHandle,hMapping
invoke CloseHandle,hFile
cmp byte ptr type0,CF_TEXT
jnz     wmBYE
mov ecx,offset szMapName0
invoke DeleteFile
jmp wmBYE
wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + ID_SEND_TXT
        je      wmSEND_TXT
        cmp r8d,BN_CLICKED shl 16 + ID_SEND_ICO
        je      wmSEND_ICO
cmp r8d,BN_CLICKED shl 16 + ID_SEND_WAV
        je      wmSEND_WAV
cmp     r8d,BN_CLICKED shl 16 + IDCANCEL
        jne     wmBYE
wmCLOSE:invoke EndDialog,,0
wmBYE: xor eax,eax
leave
retn
DialogProc endp
;----------------------------------------
Func proc hFile:qword,FSize:qword
mov FSize,rdx
;созддание в памяти объекта "проекция файла"
movr qword ptr[rsp+28h],szMapName
mov [rsp+20h],rdx
        invoke CreateFileMapping,,0,PAGE_READWRITE,0
mov hMapping,rax
;отображение проекции файла на адресное пространство процесса
mov rax,FSize
mov [rsp+20h],rax
invoke MapViewOfFile,hMapping,FILE_MAP_ALL_ACCESS,0,0
mov pMapping,rax
leave
ret
Func endp
;---------------------------------------
szWin      db 'Memory-Mapped File Reciever',0
wav_file   db '..\Images\03.wav',0
szMapName  db "Song_of_the_South",0
szMapName0 db "15.txt",0
p1 dd 1
hMapping dq ?
pMapping dq ?
hFile dq ?
end
03s.rc#include "resource.h"
#define ID_TXT 100
#define ID_SEND_TXT 101
#define ID_SEND_ICO 102
#define ID_SEND_WAV 103
#define IDC_IMG1 104

#define IDC_DIALOG 200
#define IDC_ICON1 500

IDC_ICON1 ICON "..\\Images\\icon1.ico"
IDC_ICON2 ICON "..\\Images\\icon2.ico"

IDC_DIALOG DIALOGEX 0, 0, 212, 154
STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "Memory-Mapped File Sender"
{
CONTROL "",-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE,2,-1,207,24
CONTROL "",IDC_IMG1,STATIC,SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128
CONTROL "Write something and click 'Send Text'",ID_TXT,EDIT,ES_LEFT |
ES_AUTOHSCROLL|WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP,5,7,199,13
CONTROL "Send Text", ID_SEND_TXT, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 27, 60, 15
CONTROL "Send ICO", ID_SEND_ICO, BUTTON, BS_PUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 45, 60, 15
CONTROL "Send WAV", ID_SEND_WAV, BUTTON, BS_PUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 65, 60, 15
CONTROL "Exit",IDCANCEL,BUTTON,BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE |
WS_TABSTOP, 149, 85, 60, 15
}
Title: Re: Interprocess communication
Post by: Mikl__ on August 18, 2022, 12:09:14 PM
04. Paging File

Memory Mapped File and Paging File: fast communication mechanisms between processes, provide an efficient way to use the contents of a file in virtual memory or by accessing shared memory. In these IPCs, the file data is treated as part of the process's address space, so that the process can easily access the address of the content. Any other process that has access to shared memory must implement synchronization to reduce the risk of data corruption. File mapping is performed on the same system/machine and is not available to network processes.
04r.asm (Client); GUI #
include win64a.inc
IDC_DIALOG equ 200
IMAGE_BASE equ 400000h
ID_TXT equ 100
ID_ICON equ 102
IDC_ICON1 equ 500

.code
WinMain proc dummy:qword

invoke  DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP,qword ptr(offset DialogProc),0
        invoke  RtlExitUserProcess,NULL
WinMain endp
DialogProc proc hWnddlg:qword,msg:qword,wParam:qword,lParam:qword
local pMapping:qword
local hMapping:qword
local FSize:dword
local lpwiocb:WAVEHDR
local hWaveOut:qword
local type0:byte

mov hWnddlg,rcx
mov lParam,r9

cmp edx,WM_CLOSE
je wmCLOSE
cmp edx,WM_USER+1
je wmUSER_1
cmp edx,WM_COMMAND
je wmCOMMAND
        cmp edx,WM_INITDIALOG
        jne wmBYE
wmINITDIALOG:; Найти окно отправителя
        invoke  FindWindowA,NULL,&szWin
        or      eax,eax
        jnz wmBYE
invoke MessageBoxA,hWnddlg,&Error1,&szAppName,MB_ICONEXCLAMATION or MB_YESNO
cmp eax,IDNO
jz      wmBYE     
invoke WinExec,&szService,SW_SHOW
jmp wmBYE
wmUSER_1:mov rcx,lParam
mov type0,cl
shr ecx,8
mov FSize,ecx
@@: mov r8d,offset lpszName
invoke OpenFileMapping,FILE_MAP_ALL_ACCESS,FALSE
mov hMapping,rax
mov ecx,eax
mov eax,FSize;lParam
mov [rsp+20h],rax
invoke MapViewOfFile,,FILE_MAP_ALL_ACCESS,0,0
mov pMapping,rax
cmp type0,CF_TEXT
je TXT
cmp type0,CF_DIB
je DIB
WAVE: mov r8,pMapping
        add r8d,14h
        invoke waveOutOpen,&hWaveOut,WAVE_MAPPER,,0,0,WAVE_ALLOWSYNC
; Подготавливаем заголовок для вывода
lea edx,lpwiocb
mov edi,edx
xor eax,eax
mov ecx,(sizeof WAVEHDR)/8
rep stosq

mov rax,pMapping
add rax,2Ch

mov [rdx].WAVEHDR.lpData,rax ;адрес блока данных
mov eax,FSize;[rcx+4]
sub eax,2Ch
mov [rdx].WAVEHDR.dwBufferLength,eax ;размер блока данных
invoke waveOutPrepareHeader,hWaveOut,,sizeof WAVEHDR
; Запускаем проигрывание блока
invoke waveOutWrite,hWaveOut,&lpwiocb,sizeof WAVEHDR
@@: cmp lpwiocb.dwFlags,WHDR_DONE or WHDR_PREPARED
jnz @b
invoke waveOutUnprepareHeader,hWaveOut,&lpwiocb,sizeof WAVEHDR
invoke waveOutClose,hWaveOut
jmp @f
TXT: invoke  SetDlgItemTextA,hWnddlg,ID_TXT,pMapping
jmp @f
DIB: and qword ptr[rsp+30h],LR_DEFAULTCOLOR;LR_DEFAULTCOLOR=0
mov qword ptr[rsp+20h],256
mov qword ptr[rsp+28h],256
mov edx,FSize
invoke  CreateIconFromResourceEx,pMapping,,TRUE,30000h
invoke  SendDlgItemMessageA,hWnddlg,ID_ICON,STM_SETIMAGE,IMAGE_ICON,eax
@@: invoke UnmapViewOfFile,pMapping
        invoke CloseHandle,hMapping
jmp wmBYE
wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + IDCANCEL
jne wmBYE
wmCLOSE:invoke EndDialog,,0
wmBYE: xor eax,eax
leave
retn
DialogProc endp
.data
lpszName  db "Song_of_the_South",0
Error1   db "The server is not running.",10,"Run?",0
szService db "04s",0
szWin   db "Paging File Sender",0
szAppName db "Paging File Reciever",0
end
04r.rc#include "resource.h"
#define IDC_DIALOG 200
#define ID_TXT 100
#define ID_ICON 102
#define ID_PROGRESS 106
#define ID_TXT1 107

IDC_DIALOG DIALOGEX 0,0,212,154
STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "Paging File Reciever"

{
CONTROL "",-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 2,-3,207,24
CONTROL "", ID_TXT, STATIC, SS_LEFT | SS_NOPREFIX | WS_CHILD |
WS_VISIBLE | WS_BORDER | WS_TABSTOP, 5, 5, 199, 13
CONTROL "Exit", IDCANCEL, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 25, 60, 15
CONTROL "",ID_ICON, STATIC, SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128
}
04s.asm (Server); GUI #
include win64a.inc
ID_TXT equ 100
ID_SEND_TXT equ 101
ID_SEND_ICO equ 102
ID_SEND_WAV equ 103
IDC_DIALOG equ 200
IDC_ICON1 equ 500
IDC_IMG1 equ 104

.code
WinMain proc dummy:qword

invoke LoadImageA,IMAGE_BASE,IDC_ICON1,IMAGE_ICON,256,256,LR_DEFAULTCOLOR

mov r9d,offset DialogProc
invoke DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP,,eax
invoke RtlExitUserProcess,NULL
WinMain endp

DialogProc proc hWnddlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
size_of_buffer equ 96
local buffer[size_of_buffer]:BYTE
local hFile:dword
local FSize:dword
local hMapping:qword
local pMapping:qword
local hResource:qword
local pResource:qword
local szReadWrite:qword
local type0:qword

        mov hWnddlg,rcx
mov lParam,r9

cmp edx,WM_CLOSE
je wmCLOSE
cmp edx,WM_COMMAND
je wmCOMMAND
        cmp edx,WM_INITDIALOG
        jne wmBYE
wmINITDIALOG:invoke GetDlgItem,,IDC_IMG1
invoke SendMessageA,eax,STM_SETIMAGE,IMAGE_ICON,lParam
jmp wmBYE
wmSEND_TXT:lea r8d,buffer
invoke  GetDlgItemTextA,,ID_TXT,,size_of_buffer;255
        or      eax,eax
        jz      wmBYE
        inc     eax
mov FSize,eax
;созддание в памяти объекта "проекция файла"
; sub esp,30h
movr qword ptr[rsp+28h],szMapName
mov eax,FSize
mov [rsp+20h],rax
or rcx,INVALID_HANDLE_VALUE
        invoke CreateFileMapping,,0,PAGE_READWRITE,0
mov hMapping,rax
;отображение проекции файла на адресное пространство процесса
mov ecx,eax
mov eax,FSize
mov [rsp+20h],rax
invoke MapViewOfFile,,FILE_MAP_ALL_ACCESS,0,0
mov pMapping,rax
mov ecx,FSize
mov edi,eax
lea esi,buffer
rep movsb
mov eax,FSize
shl rax,8
or rax,CF_TEXT
mov type0,rax
;--------------------------------------------------
jmp @f
wmSEND_ICO:;sub esp,30h
mov edx,p1
invoke FindResource,0,,RT_ICON; find the resource
mov hResource,rax
invoke  SizeofResource,0,eax ; get its size
mov     FSize,eax
invoke LoadResource,0,hResource ; load the resource
invoke LockResource,eax
mov esi,eax
;созддание в памяти объекта "проекция файла"
movr qword ptr[rsp+28h],szMapName
mov eax,FSize
mov [rsp+20h],rax
or rcx,INVALID_HANDLE_VALUE
        invoke CreateFileMapping,,0,PAGE_READWRITE,0
mov hMapping,rax
;отображение проекции файла на адресное пространство процесса
mov ecx,eax
mov eax,FSize
mov [rsp+20h],rax
invoke MapViewOfFile,,FILE_MAP_ALL_ACCESS,0,0
mov pMapping,rax
mov ecx,FSize
mov edi,eax;rdi,pMapping
rep movsb
;--------------------------------------------------
        mov ecx,256
and qword ptr[rsp+30h],LR_DEFAULTCOLOR;LR_DEFAULTCOLOR=0
mov [rsp+20h],rcx
mov [rsp+28h],rcx
mov edx,FSize
invoke  CreateIconFromResourceEx,pMapping,,TRUE,30000h;270376,TRUE,30000h
mov [rsp+20h],rax
invoke  SendDlgItemMessageA,hWnddlg,IDC_IMG1,STM_SETIMAGE,IMAGE_ICON
xor p1,11b
        mov eax,FSize
shl rax,8
or rax,CF_DIB
mov type0,rax
;-------------------------------------------------------
jmp @f
wmSEND_WAV:;sub esp,40h
mov ecx,offset wav_file
xor r9d,r9d
mov qword ptr[rsp+30h],r9
mov qword ptr[rsp+28h],FILE_ATTRIBUTE_ARCHIVE
mov qword ptr[rsp+20h],OPEN_EXISTING
invoke CreateFile,,GENERIC_READ or GENERIC_WRITE,\
FILE_SHARE_READ or FILE_SHARE_WRITE
        mov hFile,eax
        invoke GetFileSize,eax,0
mov FSize,eax
;созддание в памяти объекта "проекция файла"
movr qword ptr[rsp+28h],szMapName
mov eax,FSize
mov [rsp+20h],rax
or rcx,INVALID_HANDLE_VALUE
        invoke CreateFileMapping,,0,PAGE_READWRITE,0
mov hMapping,rax
;отображение проекции файла на адресное пространство процесса
invoke MapViewOfFile,eax,FILE_MAP_ALL_ACCESS,0,0,FSize
mov pMapping,rax
;-------------------------------------------------
and qword ptr[rsp+20h],0
lea r9,szReadWrite
invoke ReadFile,hFile,pMapping,FSize
mov eax,FSize
shl rax,8
or rax,CF_WAVE
mov type0,rax
@@:; Найти окно получателя
        invoke  FindWindowA,NULL,&szWin
        or      eax,eax
        jz      wmBYE
; Отправить данные получателю
mov qword ptr[rsp+20h],SMTO_ABORTIFHUNG
mov qword ptr[rsp+28h],5000
and qword ptr[rsp+30h],0
        invoke  SendMessageTimeoutA,eax,WM_USER+1,hWnddlg,type0
invoke UnmapViewOfFile,pMapping
invoke CloseHandle,hMapping
jmp wmBYE
wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + ID_SEND_TXT
        je      wmSEND_TXT
        cmp r8d,BN_CLICKED shl 16 + ID_SEND_ICO
        je      wmSEND_ICO
cmp r8d,BN_CLICKED shl 16 + ID_SEND_WAV
        je      wmSEND_WAV
cmp     r8d,BN_CLICKED shl 16 + IDCANCEL
        jne     wmBYE
wmCLOSE:invoke EndDialog,,0
wmBYE: xor eax,eax
leave
retn
DialogProc endp
;---------------------------------------
.data
szWin     db 'Paging File Reciever',0
wav_file  db '..\Images\03.wav',0
szMapName db "Song_of_the_South",0
p1   dd 1
end
04s.rc#include "resource.h"
#define ID_TXT 100
#define ID_SEND_TXT 101
#define ID_SEND_ICO 102
#define ID_SEND_WAV 103
#define IDC_IMG1 104

#define IDC_DIALOG 200
#define IDC_ICON1 500

IDC_ICON1 ICON "..\\Images\\icon1.ico"
IDC_ICON2 ICON "..\\Images\\icon2.ico"

IDC_DIALOG DIALOGEX 0, 0, 212, 154
STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "Paging File Sender"
{
CONTROL "",-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE,2,-1,207,24
CONTROL "",IDC_IMG1,STATIC,SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128
CONTROL "Write something and click 'Send Text'",ID_TXT,EDIT,ES_LEFT |
ES_AUTOHSCROLL|WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP,5,7,199,13
CONTROL "Send Text", ID_SEND_TXT, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 27, 60, 15
CONTROL "Send ICO", ID_SEND_ICO, BUTTON, BS_PUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 45, 60, 15
CONTROL "Send WAV", ID_SEND_WAV, BUTTON, BS_PUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 65, 60, 15
CONTROL "Exit",IDCANCEL,BUTTON,BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE |
WS_TABSTOP, 149, 85, 60, 15
}
Title: Re: Interprocess communication
Post by: Mikl__ on August 18, 2022, 12:16:06 PM
05. Mail Slots
A mailslot is a mechanism for one-way interprocess communications (IPC). Applications can store messages in a mailslot. The owner of the mailslot can retrieve messages that are stored there. These messages are typically sent over a network to either a specified computer or to all computers in a specified domain.
05r.asm (Client); GUI #
include win64a.inc
WM_CLIPBOARDUPDATE equ 31Dh
IDC_DIALOG equ 200
ID_TXT equ 100
ID_ICON equ 102
IDC_ICON1 equ 500
TXT equ 10
ICO equ 11
WAV equ 12
.code
WinMain proc dummy:qword

mov r9d,offset DialogProc
        invoke  DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP,,0
        invoke  RtlExitUserProcess,NULL
WinMain endp
DialogProc proc hWnddlg:qword,msg:qword,wParam:qword,lParam:qword
local cbRead:DWORD;Количество байт данных, принятых через канал
local cbMessages:DWORD;Размер сообщения в байтах
local cbMsgNumber:DWORD;Количество сообщений в канале Mailslot
local p:QWORD
local lpwiocb:WAVEHDR
local hWaveOut:qword
local FSize:qword

mov hWnddlg,rcx
mov lParam,r9

cmp edx,WM_CLOSE
je wmCLOSE
cmp edx,WM_USER+1
je wmUSER_1
cmp edx,WM_COMMAND
je wmCOMMAND
        cmp edx,WM_INITDIALOG
jne wmBYE
wmINITDIALOG:; Найти окно отправителя
        invoke  FindWindowA,NULL,&szWin
        or      eax,eax
        jnz @f
invoke MessageBoxA,hWnddlg,&Error1,&szAppName,MB_ICONEXCLAMATION or MB_YESNO
cmp eax,IDNO
jz      @f     
invoke WinExec,&szService,SW_SHOW
; Создаем канал Mailslot, имеющий имя lpszMailslotName
@@: mov ecx,offset lpszMailslotName
invoke CreateMailslot,,0,MAILSLOT_WAIT_FOREVER, NULL
mov hMailslot,rax
jmp wmBYE
wmUSER_1:mov rax,lParam
mov type0,al
shr rax,8
mov FSize,rax
; Определяем состояние канала Mailslot
lea r8d,cbMessages
lea r9d,cbMsgNumber
xor edx,edx
mov [rsp+20h],rdx
invoke GetMailslotInfo,hMailslot
; Выполняем задержку на  500 миллисекунд
invoke Sleep,500
; Если в канале есть Mailslot сообщения, читаем первое из них и выводим на экран
cmp cbMsgNumber,0
jz wmBYE
invoke GlobalAlloc,GMEM_FIXED,FSize
mov p,rax
invoke ReadFile,hMailslot,p,FSize,&cbRead,0
cmp type0,CF_TEXT
je TEXT
        cmp type0,CF_DIB
je DIB
WAVE: mov r8,p
;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data) = 14h
        add r8d,14h
        invoke waveOutOpen,&hWaveOut,WAVE_MAPPER,,0,0,WAVE_ALLOWSYNC
; Подготавливаем заголовок для вывода
lea edx,lpwiocb
mov edi,edx
xor eax,eax
mov ecx,(sizeof WAVEHDR)/8
rep stosq

mov rax,p
;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data)+\
;(Type of format)+(Number of Channels)+(Sample Rate)+(Sample Rate*BitsPerSample*Channels/8)+\
;(BitsPerSample*Channels/8)+(Bits per sample)+("data" chunk header)+(Size of the data section)=2Ch
add rax,2Ch
mov [rdx].WAVEHDR.lpData,rax ;адрес блока данных
mov rax,FSize
sub eax,2Ch
mov [rdx].WAVEHDR.dwBufferLength,eax ;размер блока данных

invoke waveOutPrepareHeader,hWaveOut,,sizeof WAVEHDR
; Запускаем проигрывание блока
invoke waveOutWrite,hWaveOut,&lpwiocb,sizeof WAVEHDR
@@: test lpwiocb.dwFlags,WHDR_DONE
jz @b
invoke waveOutUnprepareHeader,hWaveOut,&lpwiocb,sizeof WAVEHDR
invoke waveOutClose,hWaveOut
jmp @0
TEXT: invoke  SetDlgItemTextA,hWnddlg,ID_TXT,p
jmp @0
DIB:    and qword ptr[rsp+30h],LR_DEFAULTCOLOR;LR_DEFAULTCOLOR=0
mov qword ptr[rsp+20h],256
mov qword ptr[rsp+28h],256
invoke  CreateIconFromResourceEx,p,FSize,TRUE,30000h
invoke  SendDlgItemMessageA,hWnddlg,ID_ICON,STM_SETIMAGE,IMAGE_ICON,eax
@0: invoke GlobalFree,p
jmp wmBYE
wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + IDCANCEL
jne wmBYE
wmCLOSE:;Перед завершением приложения закрываем идентификатор канала Mailslot
invoke CloseHandle,hMailslot
invoke EndDialog,hWnddlg,0
wmBYE: xor eax,eax
leave
retn
DialogProc endp
.data
lpszMailslotName db "\\.\mailslot\brer_Rabbit",0;Имя создаваемого канала Mailslot
hMailslot dq ?;Идентификатор канала Mailslot
type0 db ?
szWin db "Mailslot Sender",0
Error1 db "The server is not running.",10,"Run?",0
szAppName db "Mailslot Reciever",0
szService db "05s",0
end
05r.rc#include "resource.h"
#define IDC_DIALOG 200
#define ID_TXT 100
#define ID_ICON 102
#define ID_PROGRESS 106
#define ID_TXT1 107

IDC_DIALOG DIALOGEX 0,0,212,154
STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "Mailslot Reciever"

{
CONTROL "",-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 2,-3,207,24
CONTROL "", ID_TXT, STATIC, SS_LEFT | SS_NOPREFIX | WS_CHILD |
WS_VISIBLE | WS_BORDER | WS_TABSTOP, 5, 5, 199, 13
CONTROL "Exit", IDCANCEL, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 25, 60, 15
CONTROL "",ID_ICON, STATIC, SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128
}
05s.asm (Server); GUI #
include win64a.inc
WM_CLIPBOARDUPDATE equ 31Dh
ID_TXT equ 100
ID_SEND_TXT equ 101
ID_SEND_ICO equ 102
ID_SEND_WAV equ 103
IDC_DIALOG equ 200
IDC_ICON1 equ 500
IDC_IMG1 equ 104
.code
WinMain proc dummy:qword

mov r9d,256
mov [rsp+20h],r9
mov qword ptr [rsp+28],LR_DEFAULTCOLOR
invoke LoadImageA,IMAGE_BASE,IDC_ICON1,IMAGE_ICON;,256,256,LR_DEFAULTCOLOR

mov r9d,offset DialogProc
mov qword ptr[rsp+20h],rax
invoke DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP
invoke RtlExitUserProcess,NULL
WinMain endp

DialogProc proc hWnddlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
local cbWritten:dword;Количество байт, переданных через канал
local FSize:dword;
local p:qword
local hMailslot:qword; Идентификатор канала Mailslot
local hResource:qword
local hFile:dword
local szReadWrite:qword ;number of bytes actually read or write
local lpwiocb:WAVEHDR
local hWaveOut:qword
local type0:qword

mov hWnddlg,rcx
mov lParam,r9

cmp edx,WM_CLOSE
je wmCLOSE
cmp edx,WM_COMMAND
je wmCOMMAND
cmp edx,WM_INITDIALOG
        jne wmBYE
wmINITDIALOG:invoke GetDlgItem,,IDC_IMG1
invoke SendMessageA,eax,STM_SETIMAGE,IMAGE_ICON,lParam
jmp wmBYE
wmSEND_TXT:invoke GlobalAlloc,GPTR,256
        mov p,rax;Буфер для передачи данных через канал
invoke  GetDlgItemTextA,hWnddlg,ID_TXT,eax,256
        or      eax,eax
        jz      wmBYE
        inc     eax
mov FSize,eax
shl rax,8
or rax,CF_TEXT
mov type0,rax
jmp @f
wmSEND_ICO:mov edx,p1
invoke FindResource,0,,RT_ICON; find the resource
mov hResource,rax
invoke  SizeofResource,0,eax ; get its size
mov FSize,eax
shl rax,8
or rax,CF_DIB
mov type0,rax
invoke LoadResource,0,hResource ; load the resource
invoke LockResource,eax;pResource
mov p,rax
;-------------------------------------------------
and qword ptr[rsp+30h],LR_DEFAULTCOLOR;LR_DEFAULTCOLOR=0
mov qword ptr[rsp+20h],256
mov qword ptr[rsp+28h],256
mov edx,FSize
invoke  CreateIconFromResourceEx,p,,TRUE,30000h;270376,TRUE,30000h
invoke  SendDlgItemMessageA,hWnddlg,IDC_IMG1,STM_SETIMAGE,IMAGE_ICON,eax
xor p1,11b
jmp @f
wmSEND_WAV:;sub esp,40h
mov ecx,offset wav_file
xor r9d,r9d
mov qword ptr[rsp+30h],r9
mov qword ptr[rsp+28h],FILE_ATTRIBUTE_ARCHIVE
mov qword ptr[rsp+20h],OPEN_EXISTING
invoke CreateFile,,GENERIC_READ or GENERIC_WRITE,\
FILE_SHARE_READ or FILE_SHARE_WRITE
        mov hFile,eax
        invoke GetFileSize,eax,0
mov FSize,eax
invoke GlobalAlloc,GPTR,eax
        mov p,rax
mov eax,FSize
shl rax,8
or rax,CF_WAVE
mov type0,rax
lea r9d,cbWritten
and qword ptr[rsp+20h],0
        invoke ReadFile,hFile,p,FSize
        invoke CloseHandle,hFile
@@:; Создаем канал с процессом MSLOTS
mov ecx,offset szMailslotName
xor r9d,r9d
mov qword ptr[rsp+20h],OPEN_EXISTING
mov [rsp+28h],r9
mov [rsp+30h],r9
invoke CreateFile,,GENERIC_WRITE,FILE_SHARE_READ
mov hMailslot,rax

lea r9d,cbWritten
and qword ptr[rsp+20h],0
        invoke WriteFile,hMailslot,p,FSize
; Найти окно получателя
mov edx,offset szWin
        invoke  FindWindowA,NULL
        or      eax,eax
        jz      wmBYE
; Отправить данные получателю
invoke PostMessageA,eax,WM_USER+1,hWnddlg,type0
;Закрываем идентификатор канала
invoke CloseHandle,hMailslot
jmp wmBYE
wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + ID_SEND_TXT
        je      wmSEND_TXT
        cmp r8d,BN_CLICKED shl 16 + ID_SEND_ICO
        je      wmSEND_ICO
cmp r8d,BN_CLICKED shl 16 + ID_SEND_WAV
        je      wmSEND_WAV
cmp     r8d,BN_CLICKED shl 16 + IDCANCEL
        jne     wmBYE
wmCLOSE:invoke EndDialog,,0
wmBYE: xor eax,eax
leave
retn
DialogProc endp
;---------------------------------------
szWin db 'Mailslot Reciever',0
szMailslotName db "\\.\mailslot\brer_Rabbit",0; Имя создаваемого канала
wav_file db '..\Images\03.wav',0
p1 dd 1
end
05s.rc#include "resource.h"
#define ID_TXT 100
#define ID_SEND_TXT 101
#define ID_SEND_ICO 102
#define ID_SEND_WAV 103
#define IDC_IMG1 104

#define IDC_DIALOG 200
#define IDC_ICON1 500

IDC_ICON1 ICON "..\\Images\\icon1.ico"
IDC_ICON2 ICON "..\\Images\\icon2.ico"

IDC_DIALOG DIALOGEX 0, 0, 212, 154
STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "Mailslot Sender"
{
CONTROL "",-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE,2,-1,207,24
CONTROL "",IDC_IMG1,STATIC,SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128
CONTROL "Write something and click 'Send Text'",ID_TXT,EDIT,ES_LEFT |
ES_AUTOHSCROLL|WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP,5,7,199,13
CONTROL "Send Text", ID_SEND_TXT, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 27, 60, 15
CONTROL "Send ICO", ID_SEND_ICO, BUTTON, BS_PUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 45, 60, 15
CONTROL "Send WAV", ID_SEND_WAV, BUTTON, BS_PUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 65, 60, 15
CONTROL "Exit",IDCANCEL,BUTTON,BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE |
WS_TABSTOP, 149, 85, 60, 15
}
Title: Re: Interprocess communication
Post by: Mikl__ on August 18, 2022, 12:24:05 PM
06. Named Pipes
A pipe is a section of shared memory that processes use for communication. The process that creates a pipe is the pipe server. A process that connects to a pipe is a pipe client. One process writes information to the pipe, then the other process reads the information from the pipe.
06r.asm (Client); GUI #
include win64a.inc
WM_CLIPBOARDUPDATE equ 31Dh
IDC_DIALOG equ 200
ID_TXT equ 100
ID_ICON equ 102
IDC_ICON1 equ 500
.code
WinMain proc dummy:qword

mov r9d,offset DialogProc
and qword ptr[rsp+20h],0
        invoke  DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP
        invoke  RtlExitUserProcess,NULL
WinMain endp
DialogProc proc hWnddlg:qword,msg:qword,wParam:qword,lParam:qword
local cbRead:DWORD;Количество байт данных, принятых через канал
local p:qword;Буфер для передачи данных через канал
local lpwiocb:WAVEHDR
local hWaveOut:qword
local FSize:qword
local type0:byte

mov hWnddlg,rcx
mov lParam,r9

cmp edx,WM_CLOSE
je wmCLOSE
cmp edx,WM_USER+1
je wmUSER_1
cmp edx,WM_COMMAND
je wmCOMMAND
        cmp edx,WM_INITDIALOG
jne wmBYE
wmINITDIALOG:; Найти окно получателя
        invoke  FindWindowA,NULL,&szWin
        or      eax,eax
        jnz wmBYE
invoke MessageBoxA,hWnddlg,&Error1,&szAppName,MB_ICONEXCLAMATION or MB_YESNO
cmp eax,IDNO
jz      wmBYE     
invoke WinExec,&szService,SW_SHOW
        jmp wmBYE
wmUSER_1:; Получить строку от первого приложения
mov rax,lParam
mov type0,al
shr rax,8
mov FSize,rax
invoke GlobalAlloc,GMEM_FIXED,eax
mov p,rax
mov ecx,offset lpszPipeName
invoke CreateNamedPipe,,PIPE_ACCESS_INBOUND,PIPE_TYPE_BYTE,1,0,FSize,0,0
mov hNamedPipe,rax
invoke ConnectNamedPipe,eax,NULL
lea r9d,cbRead
and qword ptr[rsp+20h],0
invoke ReadFile,hNamedPipe,p,FSize
;----------------------------------------------------
cmp type0,CF_TEXT
je TEXT
cmp type0,CF_DIB
je DIB
WAVE: mov r8,p

        add r8d,14h
        lea ecx,hWaveOut
        xor r9,r9
mov [rsp+20h],r9
mov qword ptr[rsp+28h],WAVE_ALLOWSYNC
        or edx,WAVE_MAPPER
        invoke waveOutOpen
; Подготавливаем заголовок для вывода
lea edx,lpwiocb
mov edi,edx
xor eax,eax
mov ecx,(sizeof WAVEHDR)/8
rep stosq

mov rax,p
add rax,2Ch

mov [rdx].WAVEHDR.lpData,rax ;адрес блока данных
mov rax,FSize
sub eax,2Ch
mov [rdx].WAVEHDR.dwBufferLength,eax ;размер блока данных

invoke waveOutPrepareHeader,hWaveOut,,sizeof WAVEHDR
; Запускаем проигрывание блока
lea edx,lpwiocb
mov rcx,hWaveOut
mov r8d,sizeof WAVEHDR
invoke waveOutWrite
@@: test lpwiocb.dwFlags,WHDR_DONE
jz @b
lea edx,lpwiocb
invoke waveOutUnprepareHeader,hWaveOut,,sizeof WAVEHDR
invoke waveOutClose,hWaveOut
jmp @0
;------------------------------------------------------------
TEXT: invoke  SetDlgItemTextA,hWnddlg,ID_TXT,p
jmp @0
;----------------------------------------------------
DIB: and qword ptr[rsp+30h],LR_DEFAULTCOLOR;LR_DEFAULTCOLOR=0
mov qword ptr[rsp+20h],256
mov qword ptr[rsp+28h],256
invoke  CreateIconFromResourceEx,p,FSize,TRUE,30000h
invoke  SendDlgItemMessageA,hWnddlg,ID_ICON,STM_SETIMAGE,IMAGE_ICON,eax
;-----------------------------------------------------------
@0:     invoke GlobalFree,p
invoke DisconnectNamedPipe,hNamedPipe
invoke CloseHandle,hNamedPipe
jmp wmBYE
wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + IDCANCEL
jne wmBYE
wmCLOSE:invoke EndDialog,,0
wmBYE: xor eax,eax
leave
retn
DialogProc endp
;--------------------------------------------------
.data
lpszPipeName db "\\.\pipe\Song_of_the_South",0;Имя создаваемого пайпа
hNamedPipe dq ?;Идентификатор пайпа
szWin db "Pipe Sender",0
Error1 db "The server is not running.",10,"Run?",0
szAppName db "Pipe Reciever",0
szService db "06s",0
end
06r.rc#include "resource.h"
#define IDC_DIALOG 200
#define ID_TXT 100
#define ID_ICON 102
#define ID_PROGRESS 106
#define ID_TXT1 107

IDC_DIALOG DIALOGEX 0,0,212,154
STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "Pipe Reciever"

{
CONTROL "",-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 2,-3,207,24
CONTROL "", ID_TXT, STATIC, SS_LEFT | SS_NOPREFIX | WS_CHILD |
WS_VISIBLE | WS_BORDER | WS_TABSTOP, 5, 5, 199, 13
CONTROL "Exit", IDCANCEL, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 25, 60, 15
CONTROL "",ID_ICON, STATIC, SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128
}
06s.asm (Server); GUI #
include win64a.inc
WM_CLIPBOARDUPDATE equ 31Dh
ID_TXT equ 100
ID_SEND_TXT equ 101
ID_SEND_ICO equ 102
ID_SEND_WAV equ 103
IDC_DIALOG equ 200
IDC_ICON1 equ 500
IDC_IMG1 equ 104
.code
WinMain proc dummy:qword

mov r9d,256
mov [rsp+20h],r9
mov qword ptr [rsp+28],LR_DEFAULTCOLOR
invoke LoadImageA,IMAGE_BASE,IDC_ICON1,IMAGE_ICON
mov r9d,offset DialogProc
mov qword ptr[rsp+20h],rax
invoke DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP
invoke RtlExitUserProcess,NULL
WinMain endp

DialogProc proc hWnddlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
size_of_buffer equ 256
local cbWritten:dword;Количество байт, переданных через канал
local FSize:dword;
local hNamePipe:qword; Идентификатор канала Mailslot
local hFile:dword
local p:qword
local hResource:qword
local type0:qword

mov hWnddlg,rcx
mov lParam,r9

cmp edx,WM_CLOSE
je wmCLOSE
cmp edx,WM_COMMAND
je wmCOMMAND
cmp edx,WM_INITDIALOG
        jne wmBYE
wmINITDIALOG:invoke GetDlgItem,,IDC_IMG1
invoke SendMessageA,eax,STM_SETIMAGE,IMAGE_ICON,lParam
jmp wmBYE
wmSEND_TXT:invoke GlobalAlloc,GPTR,size_of_buffer
        mov p,rax;Буфер для передачи данных через канал
invoke  GetDlgItemTextA,hWnddlg,ID_TXT,eax,size_of_buffer;255
        or      eax,eax
        jz      wmBYE
        inc     eax
mov FSize,eax
shl rax,8
or rax,CF_TEXT
mov type0,rax
jmp @f
wmSEND_ICO:mov edx,p1
invoke FindResource,0,,RT_ICON; find the resource
mov hResource,rax
invoke  SizeofResource,0,eax ; get its size
mov FSize,eax
shl rax,8
or rax,CF_DIB
mov type0,rax
invoke LoadResource,0,hResource ; load the resource
invoke LockResource,eax;pResource
mov p,rax
;-------------------------------------------------
and qword ptr[rsp+30h],LR_DEFAULTCOLOR
mov qword ptr[rsp+20h],256
mov qword ptr[rsp+28h],256
mov edx,FSize
invoke  CreateIconFromResourceEx,p,,TRUE,30000h
invoke  SendDlgItemMessageA,hWnddlg,IDC_IMG1,STM_SETIMAGE,IMAGE_ICON,eax
xor p1,11b
jmp @f
wmSEND_WAV:mov ecx,offset wav_file
xor r9d,r9d
mov qword ptr[rsp+30h],r9
mov qword ptr[rsp+28h],FILE_ATTRIBUTE_ARCHIVE
mov qword ptr[rsp+20h],OPEN_EXISTING
invoke CreateFile,,GENERIC_READ or GENERIC_WRITE,\
FILE_SHARE_READ or FILE_SHARE_WRITE
        mov hFile,eax
        invoke GetFileSize,eax,0
mov FSize,eax
invoke GlobalAlloc,GPTR,eax
        mov p,rax
lea r9d,cbWritten
and qword ptr[rsp+20h],0
        invoke ReadFile,hFile,eax,FSize
        invoke CloseHandle,hFile
mov eax,FSize
shl rax,8
or rax,CF_WAVE
mov type0,rax
@@:; Найти окно получателя
mov edx,offset szWin
        invoke  FindWindowA,NULL
        or      eax,eax
        jz      wmBYE
        ; Отправить данные получателю
mov qword ptr[rsp+20h],SMTO_ABORTIFHUNG
mov qword ptr[rsp+28h],250
and qword ptr[rsp+30h],0
        invoke  SendMessageTimeoutA,eax,WM_USER+1,hWnddlg,type0
; Создаем пайп
mov ecx,offset szPipeName
xor r9d,r9d
mov qword ptr[rsp+20h],OPEN_EXISTING
mov [rsp+28h],r9
mov [rsp+30h],r9
invoke CreateFile,,GENERIC_WRITE,FILE_SHARE_READ
mov hNamePipe,rax
mov rdx,p
lea r9d,cbWritten
and qword ptr[rsp+20h],0
        invoke WriteFile,eax,,FSize
;Закрываем идентификатор канала
invoke CloseHandle,hNamePipe
jmp wmBYE
wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + ID_SEND_TXT
        je      wmSEND_TXT
        cmp r8d,BN_CLICKED shl 16 + ID_SEND_ICO
        je      wmSEND_ICO
        cmp r8d,BN_CLICKED shl 16 + ID_SEND_WAV
        je      wmSEND_WAV
cmp     r8d,BN_CLICKED shl 16 + IDCANCEL
        jne     wmBYE
wmCLOSE:invoke EndDialog,,0
wmBYE: xor eax,eax
leave
retn
DialogProc endp
;---------------------------------------
.data
szWin db 'Pipe Reciever',0
szPipeName db "\\.\pipe\Song_of_the_South",0; Имя создаваемого пайпа
p1 dd 1
wav_file db '..\Images\03.wav',0
end
06s.rc#include "resource.h"
#define ID_TXT 100
#define ID_SEND_TXT 101
#define ID_SEND_ICO 102
#define ID_SEND_WAV 103
#define IDC_IMG1 104

#define IDC_DIALOG 200
#define IDC_ICON1 500

IDC_ICON1 ICON "..\\Images\\icon1.ico"
IDC_ICON2 ICON "..\\Images\\icon2.ico"

IDC_DIALOG DIALOGEX 0, 0, 212, 154
STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "Pipe Sender"
{
CONTROL "",-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE,2,-1,207,24
CONTROL "",IDC_IMG1,STATIC,SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128
CONTROL "Write something and click 'Send Text'",ID_TXT,EDIT,ES_LEFT |
ES_AUTOHSCROLL|WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP,5,7,199,13
CONTROL "Send Text", ID_SEND_TXT, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 27, 60, 15
CONTROL "Send ICO", ID_SEND_ICO, BUTTON, BS_PUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 45, 60, 15
CONTROL "Send WAV", ID_SEND_WAV, BUTTON, BS_PUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 65, 60, 15
CONTROL "Exit",IDCANCEL,BUTTON,BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE |
WS_TABSTOP, 149, 85, 60, 15
}
Title: Re: Interprocess communication
Post by: Mikl__ on August 18, 2022, 12:31:04 PM
07. Dynamic Data Exchange
The dynamic data exchange for applications used the Dynamic Data Exchange Management Library (DDEML)
Dynamic Data Exchange is a protocol that contains a set of guidelines and rules for sending data between processes. A process uses the SendMessage function with a WM_DDE_INITIATE or WM_DDE_ACK message sent in response to a WM_DDE_INITIATE message. Shared memory is used for data exchange.
07r.asm; GUI #
include win64a.inc
IDC_DIALOG equ 200
ID_TXT equ 100
ID_ICON equ 102
IDC_ICON1 equ 500
WM_USER_INITIATE equ WM_USER + 1
.code
WinMain proc dummy:qword

mov r9d,offset DialogProc
and qword ptr[rsp+20h],0
        invoke  DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP
        invoke  RtlExitUserProcess,NULL
WinMain endp
DialogProc proc hWnddlg:qword,msg:qword,wParam:qword,lParam:qword
local p:qword
local lpwiocb:WAVEHDR
local hWaveOut:qword
local dwResult:dword

mov hWnddlg,rcx
mov lParam,r9

cmp edx,WM_CLOSE
je wmCLOSE
        cmp edx,WM_USER+2
je wmUSER_2
cmp edx,WM_COMMAND
je wmCOMMAND
cmp edx,WM_USER_INITIATE
je wmUSER_INITIATE
        cmp edx,WM_INITDIALOG
jne wmBYE
wmINITDIALOG:; Выполняем инициализацию
xor esi,esi
mov ecx,offset idInst
mov edx,offset DDEServerCallback
invoke DdeInitializeA,,,APPCMD_CLIENTONLY or APPCLASS_STANDARD,0
or eax,eax
jnz Error
; После успешной инициализации получаем идентификаторы строк для сервиса, раздела и элемента данных
invoke SendMessageA,hWnddlg,WM_USER_INITIATE,0,0
mov eax,TRUE
jmp exit0
wmUSER_2:mov rdx,lParam
mov bFmt,dl;CF_BITMAP
shr edx,8
mov FSize,edx
invoke GlobalAlloc,GMEM_FIXED;,FSize;lParam
mov p,rax
; Запускаем транзакцию чтения данных
mov rax,hConv
mov esi,4
or eax,eax
jz Error
mov r8,rax
movzx eax,bFmt
mov [rsp+20h],rax
mov qword ptr[rsp+28h],XTYP_REQUEST
mov qword ptr[rsp+30h],TIMEOUT_ASYNC;5000
lea eax,dwResult
mov [rsp+38h],rax
invoke DdeClientTransaction,0,0,,hszItem
; Получаем строку от сервера
mov esi,5
or eax,eax;if(hData != NULL)
jz Error
mov r8d,FSize
invoke DdeGetData,eax,p,,0
mov esi,6
or eax,eax
jz Error
cmp bFmt,CF_BITMAP
jnz @f
mov edx,FSize
invoke  CreateIconFromResourceEx,p,,TRUE,30000h,256,256,LR_DEFAULTCOLOR
invoke  SendDlgItemMessageA,hWnddlg,ID_ICON,STM_SETIMAGE,IMAGE_ICON,eax
jmp @0
@@:     cmp bFmt,CF_TEXT
jnz @f
invoke  SetDlgItemTextA,hWnddlg,ID_TXT,p
jmp @0
;-----------------------------------------------------------
@@: mov r8,p
;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data) = 14h
        add r8d,14h
        invoke waveOutOpen,&hWaveOut,WAVE_MAPPER,,0,0,WAVE_ALLOWSYNC
; Подготавливаем заголовок для вывода
lea edx,lpwiocb
mov edi,edx
xor eax,eax
mov ecx,(sizeof WAVEHDR)/8
rep stosq

mov rax,p
add rax,2Ch
;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data)+\
;(Type of format)+(Number of Channels)+(Sample Rate)+(Sample Rate*BitsPerSample*Channels/8)+\
;(BitsPerSample*Channels/8)+(Bits per sample)+("data" chunk header)+(Size of the data section)=2Ch
mov [rdx].WAVEHDR.lpData,rax ;адрес блока данных
mov eax,FSize
sub eax,2Ch
mov [rdx].WAVEHDR.dwBufferLength,eax ;размер блока данных
invoke waveOutPrepareHeader,hWaveOut,,sizeof WAVEHDR
; Запускаем проигрывание блока
invoke waveOutWrite,hWaveOut,&lpwiocb,sizeof WAVEHDR
@@: test lpwiocb.dwFlags,WHDR_DONE
jz @b
invoke waveOutUnprepareHeader,hWaveOut,&lpwiocb,sizeof WAVEHDR
invoke waveOutClose,hWaveOut
;------------------------------------------------------------
@0: invoke GlobalFree,p
jmp wmBYE
wmUSER_INITIATE:; Инициализация DDEML и создание канала связи
invoke DDEClientOpen
or eax,eax
jnz wmBYE
mov edx,offset Error1
mov r8d,offset szAppName
invoke MessageBoxA,hWnddlg,,,MB_ICONEXCLAMATION or MB_YESNO
cmp eax,IDNO
jz      wmBYE     
mov ecx,offset szService
invoke WinExec,,SW_SHOW
cmp eax,32
mov esi,2
jb Error
; После удачного запуска повторяем попытку инициализации DDEML и создания канала связи
invoke DDEClientOpen
jmp wmBYE
Error:: mov r8d,offset szAppName
invoke MessageBoxA,hWnddlg,ErrorMsg[rsi*8],,MB_ICONEXCLAMATION
jmp aExit
wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + IDCANCEL
jne wmBYE
wmCLOSE:; Завершаем работу с DDEML. Закрываем канал связи
cmp hConv,0
jz @f
invoke DdeDisconnect,hConv
@@:; Освобождаем идентификаторы строк
invoke DdeFreeStringHandle,idInst,hszService
invoke DdeFreeStringHandle,idInst,hszTopic
invoke DdeFreeStringHandle,idInst,hszItem
aExit: invoke EndDialog,hWnddlg,0
wmBYE: xor eax,eax
exit0: leave
retn
DialogProc endp

DDEServerCallback proc wType:qword,wFmt:qword,hConv:qword,hsz1:qword,hsz2:qword,hData:qword,dwData1:qword,dwData2:qword
xor eax,eax
wmBYE: leave
retn
DDEServerCallback endp
DDEClientOpen proc
local dummy:qword
; При успешной инициализации создаем идентификаторы строк для сервиса,
; раздела и элемента данных
mov edx,offset szService
invoke DdeCreateStringHandleA,idInst,,CP_WINANSI
mov hszService,rax
mov edx,offset szTopic
invoke DdeCreateStringHandleA,idInst,,CP_WINANSI
mov hszTopic,rax
mov edx,offset szItem
invoke DdeCreateStringHandleA,idInst,,CP_WINANSI
mov hszItem,rax
; Устанавливаем канал связи
invoke DdeConnect,idInst, hszService, hszTopic,0
mov hConv,rax
; Возвращаем идентификатор созданного канала связи
leave
ret
DDEClientOpen endp
;-----------------------------------
.data
szAppName db "DDEML Client",0
szService db "07s",0
szTopic db "Brer Rabbit",0
szItem db "DDEData",0
ErrorMsg dq Error0,Error1,Error2,Error3,Error4,Error5,Error6
Error0 db "Could not initialize client!",0
Error1 db "The server is not running.",10,"Run?",0
Error2 db "Unable to start the server",0
Error3 db "The server isn't responding",0
Error4 db "hConv = 0",0
Error5 db "hData = 0",0
Error6 db "lParam = 0",0
; Идентификатор приложения для DDEML
hConv dq 0
idInst dq 0
hszService dq ?
hszTopic dq ?
hszItem dq ?
bFmt db ?
FSize dd ?
end
07r.rc#include "resource.h"
#define IDC_DIALOG 200
#define ID_TXT 100
#define ID_ICON 102
#define ID_PROGRESS 106
#define ID_TXT1 107

IDC_DIALOG DIALOGEX 0,0,212,154
STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "DDE Reciever"

{
CONTROL "",-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 2,-3,207,24
CONTROL "", ID_TXT, STATIC, SS_LEFT | SS_NOPREFIX | WS_CHILD |
WS_VISIBLE | WS_BORDER | WS_TABSTOP, 5, 5, 199, 13
CONTROL "Exit", IDCANCEL, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 25, 60, 15
CONTROL "",ID_ICON, STATIC, SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128
}
07s.asm (Server); GUI #
include win64a.inc
ID_TXT equ 100
ID_SEND_TXT equ 101
ID_SEND_ICO equ 102
ID_SEND_WAV equ 103
IDC_DIALOG equ 200
IDC_ICON1 equ 500
IDC_IMG1 equ 104
WM_USER_INITIATE equ WM_USER + 1
.code
WinMain proc dummy:qword

invoke LoadImageA,IMAGE_BASE,IDC_ICON1,IMAGE_ICON,256,256,LR_DEFAULTCOLOR
mov r9d,offset DialogProc
invoke DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP,,eax
invoke RtlExitUserProcess,NULL
WinMain endp

DialogProc proc hWnddlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
local hFile:dword
local cbWritten:dword
local hResource:qword
local pResource:qword

mov hWnddlg,rcx
mov lParam,r9

cmp edx,WM_CLOSE
je wmCLOSE
cmp edx,WM_COMMAND
je wmCOMMAND
cmp edx,WM_USER_INITIATE
je wmUSER_INITIATE
cmp edx,WM_INITDIALOG
        jne wmBYE
wmINITDIALOG:invoke GetDlgItem,,IDC_IMG1
invoke SendMessageA,eax,STM_SETIMAGE,IMAGE_ICON,lParam
; Выполняем инициализацию
mov ecx,offset idInst
mov edx,offset DDEServerCallback
invoke DdeInitializeA,,,APPCLASS_STANDARD,0
or eax,eax
jz @f
mov edx,offset Error0
mov edx,offset szAppName
invoke MessageBoxA,hWnddlg,,,MB_ICONEXCLAMATION or MB_OK
jmp wmCLOSE
; После успешной инициализации получаем идентификаторы строк для сервиса, раздела и элемента данных
@@:     invoke SendMessageA,hWnddlg,WM_USER_INITIATE,0,0
mov eax,TRUE
jmp exit0
wmUSER_INITIATE:
mov edx,offset szService
invoke DdeCreateStringHandleA,idInst,,CP_WINANSI
mov hszService,rax
mov edx,offset szTopic
invoke DdeCreateStringHandleA,idInst,,CP_WINANSI
mov hszTopic,rax
mov edx,offset szItem
invoke DdeCreateStringHandleA,idInst,,CP_WINANSI
mov hszItem,rax
; Регистрируем сервис
invoke DdeNameService,idInst,hszService,NULL,DNS_REGISTER
jmp wmBYE
wmSEND_ICO:mov edx,p1
invoke FindResource,0,,RT_ICON; find the resource
mov hResource,rax
invoke  SizeofResource,0,eax ; get its size
mov FSize,rax
shl rax,8
or rax,CF_BITMAP
mov type0,rax
invoke LoadResource,0,hResource ; load the resource
invoke LockResource,eax;pResource
mov p,rax
        mov ecx,eax
and qword ptr[rsp+30h],LR_DEFAULTCOLOR;LR_DEFAULTCOLOR=0
mov qword ptr[rsp+20h],256
mov qword ptr[rsp+28h],256
invoke  CreateIconFromResourceEx,,FSize,TRUE,30000h;270376,TRUE,30000h
mov [rsp+20h],rax
invoke  SendDlgItemMessageA,hWnddlg,IDC_IMG1,STM_SETIMAGE,IMAGE_ICON
xor p1,11b
jmp @f
wmSEND_WAV:mov ecx,offset wav_file
xor r9d,r9d
mov qword ptr[rsp+30h],r9
mov qword ptr[rsp+28h],FILE_ATTRIBUTE_ARCHIVE
mov qword ptr[rsp+20h],OPEN_EXISTING
invoke CreateFile,,GENERIC_READ or GENERIC_WRITE,\
FILE_SHARE_READ or FILE_SHARE_WRITE
        mov hFile,eax
        invoke GetFileSize,eax,0
mov FSize,rax
invoke GlobalAlloc,GPTR,eax
        mov p,rax
lea r9d,cbWritten
and qword ptr[rsp+20h],0
        invoke ReadFile,hFile,eax,FSize
        invoke CloseHandle,hFile
mov rax,FSize
shl rax,8
or rax,CF_WAVE
mov type0,rax
jmp @f
wmSEND_TXT:invoke GlobalAlloc,GPTR,256
        mov p,rax
invoke GetDlgItemTextA,hWnddlg,ID_TXT,eax,256
inc eax
mov FSize,rax
shl rax,8
or rax,CF_TEXT
mov type0,rax
; Найти окно получателя
@@: mov edx,offset szWin
        invoke  FindWindowA,NULL
        or      eax,eax
        jz      wmBYE
        ; Отправить данные получателю
        invoke  PostMessageA,eax,WM_USER+2,hWnddlg,type0
jmp wmBYE
wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + ID_SEND_WAV
        je      wmSEND_WAV
        cmp r8d,BN_CLICKED shl 16 + ID_SEND_TXT
        je      wmSEND_TXT
        cmp r8d,BN_CLICKED shl 16 + ID_SEND_ICO
        je      wmSEND_ICO
cmp     r8d,BN_CLICKED shl 16 + IDCANCEL
        jne     wmBYE
wmCLOSE::;Завершение работы канала связи
cmp hConvApp,NULL
jnz @f
invoke DdeDisconnect,hConvApp
@@:; Сервис больше не доступен
invoke DdeNameService,idInst,hszService,NULL,DNS_UNREGISTER
; Освобождение идентификаторов строк
invoke DdeFreeStringHandle,idInst, hszService
invoke DdeFreeStringHandle,idInst, hszTopic
invoke DdeFreeStringHandle,idInst, hszItem
invoke EndDialog,hWnddlg,0
wmBYE: xor eax,eax
exit0: leave
retn
DialogProc endp

DDEServerCallback proc wType:qword,wFmt:qword,hConv:qword,hsz1:qword,hsz2:qword,hData:qword,dwData1:qword,dwData2:qword

mov hConv,r8
mov hsz1,r9

cmp ecx,XTYP_CONNECT
je      xtypCONNECT
cmp ecx,XTYP_REQUEST
je xtypREQUEST
cmp ecx,XTYP_EXECUTE
je xtypEXECUTE
cmp ecx,XTYP_ERROR
je xtypERROR
cmp ecx,XTYP_DISCONNECT
je xtypDISCONNECT
cmp ecx,XTYP_CONNECT_CONFIRM
je xtypCONNECT_CONFIRM
xor eax,eax
jmp wmBYE
xtypCONNECT:;Создание канала передачи данных
; Если сервис поддерживается, возвращаем признак успешного создания канала
mov rax,hsz2
cmp rax,hszService
jne xtypEXECUTE
mov eax,TRUE
jmp wmBYE
xtypDISCONNECT:; Завершение работы канала
and hConvApp,NULL
xtypERROR:; Ошибка
; Запрос на выполнение команды, отрабатывается вхолостую
xtypEXECUTE: xor eax,eax
jmp wmBYE
xtypREQUEST:; Создаем идентификатор данных
        cmp edx,CF_TEXT
jz @f
cmp edx,CF_BITMAP
jz @f
cmp edx,CF_WAVE
jnz wmBYE
@@: xor r9d,r9d
mov rax,hszItem
mov [rsp+20h],rax
mov [rsp+28h],rdx
mov [rsp+30h],r9
invoke DdeCreateDataHandle,idInst,p,FSize
; В случае успеха возвращаем созданный идентификатор или ноль
mov hData,rax
jmp wmBYE
;  Подтверждение создания канала
xtypCONNECT_CONFIRM:
mov hConvApp,r8
@@: xor eax,eax
wmBYE: leave
retn
DDEServerCallback endp
;---------------------------------------
szWin db 'DDE Reciever',0
wav_file db '..\Images\03.wav',0
Error0 db "Could not initialize server!",0
; Идентификатор приложения, полученный после регистрации в библиотеке DDEML
idInst dq 0
hszService dq 0
hszTopic dq 0
hszItem dq 0
; Идентификатор канала
hConvApp dq 0
; Буфер для приема данных
p dq ?
szService db "07s",0
szTopic db "Brer Rabbit",0
szItem db "DDEData",0
szAppName db "DDEML Server",0
FSize dq ?
type0 dq ?
p1 dd 1
end
07s.rc#include "resource.h"
#define ID_TXT 100
#define ID_SEND_TXT 101
#define ID_SEND_ICO 102
#define ID_SEND_WAV 103
#define IDC_IMG1 104

#define IDC_DIALOG 200
#define IDC_ICON1 500

IDC_ICON1 ICON "..\\Images\\icon1.ico"
IDC_ICON2 ICON "..\\Images\\icon2.ico"

IDC_DIALOG DIALOGEX 0, 0, 212, 154
STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "DDE Sender"
{
CONTROL "",-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE,2,-1,207,24
CONTROL "",IDC_IMG1,STATIC,SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128
CONTROL "Write something and click 'Send Text'",ID_TXT,EDIT,ES_LEFT |
ES_AUTOHSCROLL|WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP,5,7,199,13
CONTROL "Send Text", ID_SEND_TXT, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 27, 60, 15
CONTROL "Send ICO", ID_SEND_ICO, BUTTON, BS_PUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 45, 60, 15
CONTROL "Send WAV", ID_SEND_WAV, BUTTON, BS_PUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 65, 60, 15
CONTROL "Exit",IDCANCEL,BUTTON,BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE |
WS_TABSTOP, 149, 85, 60, 15
}
Title: Re: Interprocess communication
Post by: Mikl__ on August 18, 2022, 12:40:09 PM
Interprocess Synchronization

Multiple processes can have handles to the same event, mutex, semaphore, or timer object, so these objects can be used to accomplish interprocess synchronization. The process that creates an object can use the handle returned by the creation function (CreateEvent, CreateMutex, CreateSemaphore, or CreateWaitableTimer). Other processes can open a handle to the object by using its name, or through inheritance or duplication.
08. Event Pipes

One of the tasks creates an event object by calling the CreateEvent function to do so. The event has a name that is available to all tasks in active processes. During creation or later, this task sets the event to its initial state (signaled or nonsignaled).
By calling the WaitForSingleObject or WaitForMultipleObjects functions, the task waits for the moment when the event goes into the signaled state.
Another task, owned by the same or a different process, obtains an event handle by its name using the OpenEvent function. Next, using the SetEvent, ResetEvent, or PulseEvent functions, the application changes the state of the event.
After a nonsignaled/unchecked event is raised, the first task goes into a waiting state until the second task prepares data for it. Once this happens, the second task flags and then resets the event, which causes the first task to complete its wait.
After displaying the prepared data, the first task again enters the waiting state until the second task prepares the data and flags the event. With the help of an event object, two tasks synchronize their work.
08r.asm (Client); GUI #
include win64a.inc
EVENT_DATA_COUNT = 16
EventPipeObjectStruct struct
hEventDataHigh1 dq EVENT_DATA_COUNT dup(?)
hEventDataLow1 dq EVENT_DATA_COUNT dup(?)
hEventDataHigh2 dq EVENT_DATA_COUNT dup(?)
hEventDataLow2 dq EVENT_DATA_COUNT dup(?)
hEventAck dq ?
EventPipeObjectStruct ends

IDC_DIALOG equ 200
ID_TXT equ 100
ID_ICON equ 102
ID_PROGRESS equ 106
ID_TXT1 equ 107
IDC_ICON1 equ 500
.code
WinMain proc
enter 30h,0
mov r9d,offset DialogProc
and qword ptr[rbp-10h],0
        invoke  DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP
        invoke  RtlExitUserProcess,NULL
WinMain endp
DialogProc proc hWnddlg:qword,msg:qword,wParam:qword,lParam:qword

mov hWnddlg,rcx
mov lParam,r9

        cmp edx,WM_INITDIALOG
jne wmBYE
wmINITDIALOG:mov hWnd,rcx
        mov edx,GWL_STYLE
invoke GetWindowLongPtrA
    or eax,WS_THICKFRAME OR WS_MINIMIZEBOX OR WS_MAXIMIZEBOX
mov edx,GWL_STYLE
invoke SetWindowLongPtrA,hWnddlg,,rax
mov r8d,offset WndProc
mov edx,GWL_WNDPROC
invoke SetWindowLongPtrA,hWnddlg
; Найти окно получателя
mov edx,offset szWin
        invoke  FindWindowA,NULL
        or      eax,eax
        jnz @f;wmBYE
mov edx,offset Error1
mov r8d,offset szAppName
invoke MessageBoxA,hWnddlg,,,MB_ICONEXCLAMATION or MB_YESNO
cmp eax,IDNO
jz      @f;wmBYE     
mov ecx,offset szService
invoke WinExec,,SW_SHOW
; create "high" data event handles
xor edi,edi;for(DWORD i = 0; i < ; i++)
; set current event name
@@: invoke sprintf,&szEventName,&Format1,edi
; open existing object
invoke OpenEvent,EVENT_ALL_ACCESS,0,&szEventName
mov EventPipeObject.hEventDataHigh1[rdi*8],rax
or eax,eax
jz wmBYE
invoke sprintf,&szEventName,&Format2,edi
; open existing object
invoke OpenEvent,EVENT_ALL_ACCESS,0,&szEventName
mov EventPipeObject.hEventDataLow1[rdi*8],rax
; check for errors
or eax,eax;if(EventPipeObject.hEventDataLow[i] == NULL)
jz wmBYE
invoke sprintf,&szEventName,&Format3,edi
; open existing object
invoke OpenEvent,EVENT_ALL_ACCESS,0,&szEventName
mov EventPipeObject.hEventDataHigh2[rdi*8],rax
or eax,eax
jz wmBYE
invoke sprintf,&szEventName,&Format4,edi
; open existing object
invoke OpenEvent,EVENT_ALL_ACCESS,0,&szEventName
mov EventPipeObject.hEventDataLow2[rdi*8],rax
; check for errors
or eax,eax;if(EventPipeObject.hEventDataLow[i] == NULL)
jz wmBYE
inc edi
cmp edi,EVENT_DATA_COUNT
jb @b
; create acknowledgement event
invoke OpenEvent,EVENT_ALL_ACCESS,0,&Format5
mov EventPipeObject.hEventAck,rax
;--------------------------------------------------
; Шрифт текста
pushaddr szFont
push FIXED_PITCH+FF_DONTCARE
push PROOF_QUALITY
push CLIP_DEFAULT_PRECIS
push OUT_RASTER_PRECIS
push ANSI_CHARSET
push FALSE
push FALSE
push FALSE
push FW_BOLD
sub esp,20h
        invoke  CreateFont,32,12,0,0               
        mov     hFont,rax

        invoke  GetDlgItem,hWnddlg,ID_PROGRESS
        mov     hProgress,rax
; Установить наш собственный обработчик
mov r8d,offset ProgressWindowProc
        invoke  SetWindowLongPtrA,hProgress,GWL_WNDPROC
        ; Сохранить хэндл предыдущего обработчика
        mov     OldProc,rax
wmBYE: xor eax,eax
leave
retn
DialogProc endp
WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
local text:dword
local ps:PAINTSTRUCT               
local hDC:dword
local rcClient:RECT

mov hWnd,rcx
mov lParam,r9

cmp edx,WM_CLOSE
je wmCLOSE
cmp edx,WM_COMMAND
je wmCOMMAND
cmp edx,WM_USER+1
je wmUSER_1
cmp edx,WM_USER+2
je wmUSER_2
cmp edx,WM_USER+3
je wmUSER_3
leave
jmp NtdllDialogWndProc_
;-----------------------------------------------------
wmUSER_1:mov rax,lParam
mov DataLength,rax
inc eax
invoke GlobalAlloc,GPTR,eax
mov p_Text,rax
invoke EventPipeRecieve,eax
and byte ptr[rdi],0
        invoke  SetDlgItemTextA,hWnd,ID_TXT,p_Text
invoke GlobalFree,p_Text
jmp wmBYE
wmUSER_2:and percent,0
        xor ecx,ecx   ;<-- lpThreadAttributes
mov [rsp+20h],rcx  ;<-- dwCreationFlags
movr qword ptr[rsp+28h],hThread2 ;<-- lpThreadId
mov r8d,offset TimerFuncProgress;<-- lpStartAddress
invoke CreateThread,,0,,16; <-- lpParameter
invoke CloseHandle,eax;hThread2
;------------------------------------------------------
mov rax,lParam
mov DataLength,rax
invoke GlobalAlloc,GPTR,eax
mov r8d,offset TimerFuncICO
jmp @f
wmUSER_3:and percent,0
        xor ecx,ecx
mov [rsp+20h],rcx
movr qword ptr[rsp+28h],hThread2;4
mov r8d,offset TimerFuncProgress
invoke CreateThread,,0,,101
invoke CloseHandle,eax;hThread4
;-----------------------------------------------
mov rax,lParam
mov DataLength,rax
invoke GlobalAlloc,GPTR,eax
mov r8d,offset TimerFuncWAV
@@: xor ecx,ecx
mov [rsp+20h],rcx
movr qword ptr[rsp+28h],hThread2;5
invoke CreateThread,,0,,eax
invoke CloseHandle,eax;hThread5
jmp wmBYE
wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + IDCANCEL
jne wmBYE
wmCLOSE:invoke EndDialog,,0
; Закрываем идентификаторы объектов-событий 
xor edi,edi
@@: invoke CloseHandle,EventPipeObject.hEventDataHigh1[rdi*8]
inc edi
cmp edi,4*EVENT_DATA_COUNT+1
jb @b
wmBYE:  mov eax,TRUE
exit0: leave
ret
WndProc endp

TimerFuncICO proc p:qword
mov p,rcx

invoke EventPipeRecieve
; Создать HICON напрямую из памяти
and qword ptr[rsp+30h],LR_DEFAULTCOLOR;LR_DEFAULTCOLOR=0
mov qword ptr[rsp+20h],256
mov qword ptr[rsp+28h],256
invoke  CreateIconFromResourceEx,p,DataLength,TRUE,30000h
mov [rsp+20h],rax
invoke  SendDlgItemMessageA,hWnd,ID_ICON,STM_SETIMAGE,IMAGE_ICON
invoke GlobalFree,p
exit2: leave
ret
TimerFuncICO endp

TimerFuncWAV proc p:qword
local lpwiocb:WAVEHDR
local hWaveOut:qword
mov p,rcx

invoke EventPipeRecieve
WAVE: mov r8,p
;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data) = 14h
        add r8d,14h
        lea ecx,hWaveOut
        xor r9,r9
mov [rsp+20h],r9
mov qword ptr[rsp+28h],WAVE_ALLOWSYNC
        or edx,WAVE_MAPPER
        invoke waveOutOpen
; Подготавливаем заголовок для вывода
lea edx,lpwiocb
mov edi,edx
xor eax,eax
mov ecx,(sizeof WAVEHDR)/8
rep stosq

mov rax,p
mov ecx,eax
;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data)+\
;(Type of format)+(Number of Channels)+(Sample Rate)+(Sample Rate*BitsPerSample*Channels/8)+\
;(BitsPerSample*Channels/8)+(Bits per sample)+("data" chunk header)+(Size of the data section)=2Ch
add eax,2Ch

mov [rdx].WAVEHDR.lpData,rax ;адрес блока данных
mov eax,[rcx+4];размер блока данных
sub eax,2Ch
mov [rdx].WAVEHDR.dwBufferLength,eax ;размер блока данных

invoke waveOutPrepareHeader,hWaveOut,,sizeof WAVEHDR
; Запускаем проигрывание блока
lea edx,lpwiocb
mov rcx,hWaveOut
mov r8d,sizeof WAVEHDR
invoke waveOutWrite
@@: test lpwiocb.dwFlags,WHDR_DONE
jz @b
lea edx,lpwiocb
invoke waveOutUnprepareHeader,hWaveOut,,sizeof WAVEHDR
invoke waveOutClose,hWaveOut
@1: invoke GlobalFree,p
exit2: leave
ret
TimerFuncWAV endp
TimerFuncProgress proc lParam:qword
mov lParam,rcx
; Сформировать строку для отрисовки
@@: mov r8d,percent
mov edx,offset szText
mov ecx,offset buff
        invoke  wsprintfA
; Назначить строку свойством ProgressBar
mov r8d,offset buff
mov edx,offset szProp
        invoke  SetPropA,hProgress
; Назначить значение процента свойством ProgressBar
mov r8d,percent
mov edx,offset szPerc
        invoke  SetPropA,hProgress
; Перерисовать содержимое окна
        invoke  InvalidateRect,hProgress,0,FALSE
        inc     percent
        cmp     percent,101
        je exit0
invoke Sleep,lParam
jmp @b
exit0: leave
ret
TimerFuncProgress endp
EventPipeRecieve proc p:qword
local dwEventDataLowValue:byte
local begin:dword
local buffer[20]:byte

mov edi,ecx
add rcx,DataLength
mov EndDataLength,ecx
invoke GetTickCount
mov begin,eax
lea r8d,buffer
and byte ptr[r8],0
invoke  SetDlgItemTextA,hWnd,ID_TXT1
@@: lea edx,EventPipeObject.hEventDataLow1
invoke WaitForMultipleObjects,EVENT_DATA_COUNT,,0,2
mov dwEventDataLowValue,al;eax
cmp eax,EVENT_DATA_COUNT;if(dwEventDataLowValue >= EVENT_DATA_COUNT)
jnb exit1
; wait for "high" data value
lea edx,EventPipeObject.hEventDataHigh1
invoke WaitForMultipleObjects,EVENT_DATA_COUNT,,0,0
; calculate byte value from high/low value
shl al,4;dwEventDataHighValue * 16
add al,dwEventDataLowValue
; store byte value
stosb
lea edx,EventPipeObject.hEventDataLow2
invoke WaitForMultipleObjects,EVENT_DATA_COUNT,,0,2
mov dwEventDataLowValue,al;eax
cmp eax,EVENT_DATA_COUNT;if(dwEventDataLowValue >= EVENT_DATA_COUNT)
jnb exit1
; wait for "high" data value
lea edx,EventPipeObject.hEventDataHigh2
invoke WaitForMultipleObjects,EVENT_DATA_COUNT,,0,0
; calculate byte value from high/low value
shl al,4;dwEventDataHighValue * 16
add al,dwEventDataLowValue
; store byte value
stosb
; set acknowledgement event
invoke SetEvent,EventPipeObject.hEventAck
;------------------------------------------------------------------
; increase ptr
exit1: cmp edi,EndDataLength
jb @b;for(DWORD i = 0; i < EndDataLength; i++)
invoke GetTickCount
sub eax,begin
mov r8d,eax
mov edx,offset fmt
lea ecx,buffer
        invoke  wsprintfA
lea r8d,buffer
invoke  SetDlgItemTextA,hWnd,ID_TXT1
leave
ret
EventPipeRecieve endp
ProgressWindowProc proc hEdit:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
local text:dword
local ps:PAINTSTRUCT               
local hDC:dword
local rcClient:RECT

mov hEdit,rcx
mov uMsg,rdx
mov wParam,r8
mov lParam,r9

cmp edx,WM_PAINT
je wmPAINT
mov [rsp+20h],r9;lParam
mov r9,wParam
mov r8,uMsg
mov rdx,hEdit
        invoke  CallWindowProcA,OldProc
jmp wmBYE
wmPAINT:; Размеры окна
        lea     edx,rcClient
        invoke  GetClientRect,hEdit;,edi
        ; Получить текст из свойств
mov edx,offset szProp
        invoke  GetPropA,hEdit;hProgress
        mov     text,eax
; Начать рисование
        lea     edx,ps
        invoke  BeginPaint,hEdit;hProgress
        mov     hDC,eax
; Шрифт
        invoke  SelectObject,hDC,hFont
        invoke  SetBkMode,hDC,TRANSPARENT
; Отрисовать общий фон
        invoke  GetSysColorBrush,COLOR_WINDOW
        lea     edx,rcClient
        invoke  FillRect,hDC,,eax
; Текст для отрисовки есть?
        cmp     text,0
        je      @f
        invoke  GetSysColor,COLOR_WINDOWTEXT
        invoke  SetTextColor,hDC,eax
mov edx,offset buff
mov qword ptr[rsp+20h],DT_NOPREFIX or DT_SINGLELINE or DT_VCENTER or DT_CENTER
        lea     r9d,rcClient
        invoke  DrawTextA,hDC,,-1               
@@:; Вычислить размеры области для заливки
mov edx,offset szPerc
        invoke  GetPropA,hEdit;hProgress
        mov     ecx,eax
        lea     r9d,rcClient
        mov     eax,[r9].RECT.right
        sub     eax,[r9].RECT.left
        mul     ecx
        xor     edx,edx
        mov     ecx,100
        div     ecx
; Позиция выполненного прогресса
        add     eax,[r9].RECT.left
; Наложить выполненный прогресс
mov ecx,[r9].RECT.left
mov edx,[r9].RECT.top
mov r9d,[r9].RECT.bottom
        invoke  CreateRectRgn,,,eax
        invoke  SelectClipRgn,hDC,eax
        invoke  GetSysColorBrush,COLOR_HIGHLIGHT
lea     edx,rcClient
        invoke  FillRect,hDC,,eax
; Текст для отрисовки есть?
        cmp     text,0
        je      @f
        invoke  GetSysColor,COLOR_HIGHLIGHTTEXT
        invoke  SetTextColor,hDC,eax
mov qword ptr[rsp+20h],DT_NOPREFIX or DT_SINGLELINE or DT_VCENTER or DT_CENTER
mov edx,offset buff
        lea     r9d,rcClient
        invoke  DrawTextA,hDC,,-1
@@: lea     edx,ps
        invoke  EndPaint,hDC
xor eax,eax
wmBYE: leave
retn
ProgressWindowProc endp
;-----------------------------------------------------------------------
.data
hWnd dq ?
Format1 db "Song_of_the_South_H1%X",0
Format2 db "Song_of_the_South_L1%X",0
Format3 db "Song_of_the_South_H2%X",0
Format4 db "Song_of_the_South_L2%X",0
Format5 db "Song_of_the_South_A",0
p_Text dq ?
p_ICO dq ?
p_WAV dq ?
szWin db "EventPipe Sender",0
Error1 db "The server is not running.",10,"Run?",0
szAppName db "EventPipe Reciever",0
szService db "08s",0
hThread2 dq ?
szEventName db 32 dup(?)
buff db 100 dup(?)
szText  db '%u%% completed',0
fmt db 'Transmitting %u mSec',0
percent dd 0
hProgress dq ?
hFont dq ?
szProp db 'text',0
szPerc db 'percent',0
szFont db "Verdana",0
OldProc dq ?
align 16
EventPipeObject EventPipeObjectStruct <>
DataLength dq ?
EndDataLength dd ?
end
08r.rc#include "resource.h"
#define IDC_DIALOG 200
#define ID_TXT 100
#define ID_ICON 102
#define ID_PROGRESS 106
#define ID_TXT1 107

IDC_DIALOG DIALOGEX 0,0,212,154
STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "EventPipe Reciever"

{
CONTROL "",-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 2,-3,207,24
CONTROL "", ID_TXT, STATIC, SS_LEFT | SS_NOPREFIX | WS_CHILD |
WS_VISIBLE | WS_BORDER | WS_TABSTOP, 5, 5, 199, 13
CONTROL "", ID_PROGRESS, STATIC, WS_CHILD | WS_VISIBLE | WS_DISABLED |
WS_BORDER, 2, 22, 146, 19
CONTROL "Exit", IDCANCEL, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 25, 60, 15
CONTROL "",ID_ICON, STATIC, SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128
CONTROL "",ID_TXT1, STATIC, SS_LEFT | SS_NOPREFIX | WS_CHILD |
WS_VISIBLE | WS_BORDER | WS_TABSTOP, 155, 45, 50, 18
}
Title: Re: Interprocess communication
Post by: Mikl__ on August 18, 2022, 12:46:45 PM
08s.asm (Server); GUI #
include win64a.inc
ID_TXT equ 100
ID_SEND_TXT equ 101
ID_SEND_ICO equ 102
ID_SEND_WAV equ 103
IDC_DIALOG equ 200
IDC_ICON1 equ 500
IDC_IMG1 equ 104
EVENT_DATA_COUNT = 16
size_of_buffer = 96
time_interval    = 10
EventPipeObjectStruct struct
hEventDataHigh1 dq EVENT_DATA_COUNT dup(?)
hEventDataLow1 dq EVENT_DATA_COUNT dup(?)
hEventDataHigh2 dq EVENT_DATA_COUNT dup(?)
hEventDataLow2 dq EVENT_DATA_COUNT dup(?)
hEventAck dq ?
EventPipeObjectStruct ends
.code
WinMain proc
enter 30h,0
mov r9d,256;cx
mov [rbp-10h],r9
mov qword ptr [rbp-8],LR_DEFAULTCOLOR
invoke LoadImage,IMAGE_BASE,IDC_ICON1,IMAGE_ICON;,256,256,LR_DEFAULTCOLOR
mov r9d,offset DialogProc
mov qword ptr[rbp-10h],rax;30h-10h=+20h
invoke DialogBoxParam,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP
invoke RtlExitUserProcess,NULL
WinMain endp

DialogProc proc hWnddlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
local hFile:qword
local szEventName[32]:byte
local szReadWrite:qword ;number of bytes actually read or write
local hResource:qword
local pResource:qword

mov hWnddlg,rcx
mov lParam,r9

cmp edx,WM_INITDIALOG
je wmINITDIALOG
cmp edx,WM_CLOSE
je wmCLOSE
cmp edx,WM_COMMAND
je wmCOMMAND

xor eax,eax
jmp exit0
wmINITDIALOG:invoke GetDlgItem,,IDC_IMG1
invoke SendMessage,eax,STM_SETIMAGE,IMAGE_ICON,lParam
xor edi,edi;for(DWORD i = 0; i < 16; i++)
@@:; set current event name
invoke sprintf,&szEventName,&Format1,edi
; create new object
invoke CreateEvent,0,0,0,&szEventName
mov EventPipeObject.hEventDataHigh1[rdi*8],rax
; check for errors
or eax,eax;if(EventPipeObject.hEventDataHigh[i] == NULL)
jz wmBYE;exit0;
; create "low" data event handles
; set current event name
invoke sprintf,&szEventName,&Format2,edi
; create new object
invoke CreateEvent,0,0,0,&szEventName
mov EventPipeObject.hEventDataLow1[rdi*8],rax
; check for errors
or eax,eax;if(EventPipeObject.hEventDataLow[i] == NULL)
jz wmBYE;exit0
invoke sprintf,&szEventName,&Format3,edi
; create new object
invoke CreateEvent,0,0,0,&szEventName
mov EventPipeObject.hEventDataHigh2[rdi*8],rax
; check for errors
or eax,eax;if(EventPipeObject.hEventDataHigh[i] == NULL)
jz wmBYE;exit0;
; create "low" data event handles
; set current event name
invoke sprintf,&szEventName,&Format4,edi
; create new object
invoke CreateEvent,0,0,0,&szEventName
mov EventPipeObject.hEventDataLow2[rdi*8],rax
; check for errors
or eax,eax;if(EventPipeObject.hEventDataLow[i] == NULL)
jz wmBYE;exit0
inc edi
cmp edi,EVENT_DATA_COUNT
jb @b
; create acknowledgement event
; create new object
invoke CreateEvent,0,0,0,&Format5
mov EventPipeObject.hEventAck,rax
jmp wmBYE
wmSEND_TXT:invoke GlobalAlloc,GPTR,size_of_buffer
mov p,rax
invoke  GetDlgItemText,hWnddlg,ID_TXT,eax,size_of_buffer
        or      eax,eax
        jz      wmBYE
test eax,1
jz @f
inc eax
@@: mov dwLength,eax
mov edx,offset szWin
        invoke  FindWindow,NULL
        or      eax,eax
        jz      wmBYE
mov edx,WM_USER+1
jmp @0
;-----------------------------------------------------------
wmSEND_ICO:; Отправить изображение второму приложению
        mov edx,p1
invoke FindResource,0,,RT_ICON; find the resource
mov hResource,rax
invoke  SizeofResource,0,eax ; get its size
mov dwLength,eax
invoke LoadResource,0,hResource ; load the resource
invoke LockResource,eax;pResource
mov p,rax
;-------------------------------------------------
and qword ptr[rsp+30h],LR_DEFAULTCOLOR;LR_DEFAULTCOLOR=0
mov qword ptr[rsp+20h],256
mov qword ptr[rsp+28h],256
mov edx,dwLength
invoke  CreateIconFromResourceEx,eax,,TRUE,30000h;270376,TRUE,30000h
mov [rsp+20h],rax
invoke  SendDlgItemMessage,hWnddlg,IDC_IMG1,STM_SETIMAGE,IMAGE_ICON
xor p1,11b
; Отправить данные получателю
mov edx,offset szWin
        invoke  FindWindow,NULL
        or      eax,eax
        jz      wmBYE
; Отправить данные получателю
mov edx,WM_USER+2
jmp @0
;-----------------------------------------------------------------------
wmSEND_WAV:mov ecx,offset wav_file
invoke CreateFile,,GENERIC_READ,0,0,OPEN_EXISTING,\
        FILE_ATTRIBUTE_ARCHIVE,0
        mov hFile,rax
        invoke GetFileSize,eax,0
mov dwLength,eax
invoke GlobalAlloc,GPTR,eax
invoke GlobalLock,eax
mov p,rax
lea r9d,szReadWrite
mov r8d,dwLength
        invoke ReadFile,hFile,eax,,,0
        invoke CloseHandle,hFile
;-------------------------------------------------------
; Найти окно получателя
mov edx,offset szWin
        invoke  FindWindow,NULL
        or      eax,eax
        jz      wmBYE
; Отправить данные получателю
mov edx,WM_USER+3
;------------------------------------------------
@0:; Отправить данные получателю
mov r9d,dwLength
invoke PostMessage,eax,,hWnddlg
or eax,eax
jz wmBYE;if(EventPipeObject.hEventAck == NULL)
; ---------------------------------------------------------------------------
; send block data
mov rsi,p
xor edi,edi
@@: movzx eax,byte ptr[rdi+rsi]
;set "high" data event
shr al, 4
invoke SetEvent,EventPipeObject.hEventDataHigh1[rax*8]
test eax, eax
jz wmBYE
; set "low" data event
movzx eax,byte ptr[rdi+rsi]
and al,0Fh
invoke SetEvent,EventPipeObject.hEventDataLow1[rax*8]
test eax, eax
jz wmBYE
movzx eax,byte ptr[rdi+rsi+1]
;set "high" data event
shr al, 4
invoke SetEvent,EventPipeObject.hEventDataHigh2[rax*8]
test eax, eax
jz wmBYE
; set "low" data event
movzx eax,byte ptr[rdi+rsi+1]
and al,0Fh
invoke SetEvent,EventPipeObject.hEventDataLow2[rax*8]
test eax, eax
jz wmBYE
; wait for acknowledgement
invoke WaitForSingleObject,EventPipeObject.hEventAck,INFINITE
test eax, eax
jnz wmBYE
add edi,2
cmp edi,dwLength
jb @b
jmp wmBYE
wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + ID_SEND_ICO
        je      wmSEND_ICO
cmp r8d,BN_CLICKED shl 16 + ID_SEND_TXT
        je      wmSEND_TXT
cmp r8d,BN_CLICKED shl 16 + ID_SEND_WAV
        je      wmSEND_WAV
cmp     r8d,BN_CLICKED shl 16 + IDCANCEL
        jne     wmBYE
wmCLOSE:invoke EndDialog,,0
; Закрываем идентификаторы объектов-событий 
xor edi,edi
@@: invoke CloseHandle,EventPipeObject.hEventDataHigh1[rdi*8]
inc edi
cmp edi,4*EVENT_DATA_COUNT+1
jb @b
wmBYE: mov eax,TRUE
exit0: leave
retn
DialogProc endp
;------------------------------------------------------------
Format1 db "Song_of_the_South_H1%X",0
Format2 db "Song_of_the_South_L1%X",0
Format3 db "Song_of_the_South_H2%X",0
Format4 db "Song_of_the_South_L2%X",0
Format5 db "Song_of_the_South_A",0
p1 dd 1
wav_file db '..\Images\03.wav',0
align 16
EventPipeObject EventPipeObjectStruct <>
szWin db 'EventPipe Reciever',0
p dq ?
dwLength dd ?
end
08s.rc#include "resource.h"
#define ID_TXT 100
#define ID_SEND_TXT 101
#define ID_SEND_ICO 102
#define ID_SEND_WAV 103
#define IDC_IMG1 104

#define IDC_DIALOG 200
#define IDC_ICON1 500

IDC_ICON1 ICON "..\\Images\\icon1.ico"
IDC_ICON2 ICON "..\\Images\\icon2.ico"

IDC_DIALOG DIALOGEX 0, 0, 212, 154
STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "EventPipe Sender"
{
CONTROL "",-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE,2,-1,207,24
CONTROL "",IDC_IMG1,STATIC,SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128
CONTROL "Write something and click 'Send Text'",ID_TXT,EDIT,ES_LEFT |
ES_AUTOHSCROLL|WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP,5,7,199,13
CONTROL "Send Text", ID_SEND_TXT, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 27, 60, 15
CONTROL "Send ICO", ID_SEND_ICO, BUTTON, BS_PUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 45, 60, 15
CONTROL "Send WAV", ID_SEND_WAV, BUTTON, BS_PUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 65, 60, 15
CONTROL "Exit",IDCANCEL,BUTTON,BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE |
WS_TABSTOP, 149, 85, 60, 15
}
Title: Re: Interprocess communication
Post by: Mikl__ on August 18, 2022, 12:53:17 PM
10. Semaphores
10r.asm (Client); GUI #
include win64a.inc
SEMAPHORE_DATA_COUNT = 16
;time_interval = 10
SemaphoreObjectStruct struct
hSemaphoreDataHigh dq SEMAPHORE_DATA_COUNT dup(?)
hSemaphoreDataLow dq SEMAPHORE_DATA_COUNT dup(?)
hSemaphoreAck dq ?
SemaphoreObjectStruct ends

IDC_DIALOG equ 200
ID_TXT equ 100
ID_ICON equ 102
ID_PROGRESS equ 106
ID_TXT1 equ 107
IDC_ICON1 equ 500
.code
WinMain proc
enter 30h,0
mov r9d,offset DialogProc
and qword ptr[rbp-10h],0
        invoke  DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP
        invoke  RtlExitUserProcess,NULL
WinMain endp
DialogProc proc hWnddlg:qword,msg:qword,wParam:qword,lParam:qword

mov hWnddlg,rcx
mov lParam,r9

        cmp edx,WM_INITDIALOG
jne wmBYE
wmINITDIALOG:mov hWnd,rcx
        mov edx,GWL_STYLE
invoke GetWindowLongPtrA
    or eax,WS_THICKFRAME OR WS_MINIMIZEBOX OR WS_MAXIMIZEBOX
mov edx,GWL_STYLE
invoke SetWindowLongPtrA,hWnddlg,,rax
mov r8d,offset WndProc
mov edx,GWL_WNDPROC
invoke SetWindowLongPtrA,hWnddlg
; Найти окно получателя
mov edx,offset szWin
        invoke  FindWindowA,NULL
        or      eax,eax
        jnz @f;wmBYE
mov edx,offset Error1
mov r8d,offset szAppName
invoke MessageBoxA,hWnddlg,,,MB_ICONEXCLAMATION or MB_YESNO
cmp eax,IDNO
jz      @f;wmBYE     
mov ecx,offset szService
invoke WinExec,,SW_SHOW
; create "high" data event handles
xor edi,edi;for(DWORD i = 0; i < ; i++)
; set current event name
@@: invoke sprintf,&szSemaphoreName,&Format1,edi
; open existing object
invoke OpenSemaphore,SEMAPHORE_ALL_ACCESS,0,&szSemaphoreName
mov SemaphoreObject.hSemaphoreDataHigh[rdi*8],rax
or eax,eax
jz wmBYE
invoke sprintf,&szSemaphoreName,&Format2,edi
; open existing object
invoke OpenSemaphore,SEMAPHORE_ALL_ACCESS,0,&szSemaphoreName
mov SemaphoreObject.hSemaphoreDataLow[rdi*8],rax
; check for errors
or eax,eax;if(SemaphoreObject.hSemaphoreDataLow[i] == NULL)
jz wmBYE
inc edi
cmp edi,SEMAPHORE_DATA_COUNT
jb @b
; create acknowledgement event
invoke OpenSemaphore,SEMAPHORE_ALL_ACCESS,0,&Format3
mov SemaphoreObject.hSemaphoreAck,rax
;--------------------------------------------------
; Шрифт текста
pushaddr szFont
push FIXED_PITCH+FF_DONTCARE
push PROOF_QUALITY
push CLIP_DEFAULT_PRECIS
push OUT_RASTER_PRECIS
push ANSI_CHARSET
push FALSE
push FALSE
push FALSE
push FW_BOLD
sub esp,20h
        invoke  CreateFont,32,12,0,0               
        mov     hFont,rax

        invoke  GetDlgItem,hWnddlg,ID_PROGRESS
        mov     hProgress,rax
; Установить наш собственный обработчик
mov r8d,offset ProgressWindowProc
        invoke  SetWindowLongPtrA,hProgress,GWL_WNDPROC
        ; Сохранить хэндл предыдущего обработчика
        mov     OldProc,rax
wmBYE: xor eax,eax
leave
retn
DialogProc endp
WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
local text:dword
local ps:PAINTSTRUCT               
local hDC:dword
local rcClient:RECT

mov hWnd,rcx
mov lParam,r9

cmp edx,WM_CLOSE
je wmCLOSE
cmp edx,WM_COMMAND
je wmCOMMAND
cmp edx,WM_USER+1
je wmUSER_1
cmp edx,WM_USER+2
je wmUSER_2
cmp edx,WM_USER+3
je wmUSER_3
leave
jmp NtdllDialogWndProc_
;-----------------------------------------------------
wmUSER_1:mov rax,lParam
mov DataLength,rax
inc eax
invoke GlobalAlloc,GPTR,eax
mov p_Text,rax
invoke SemaphoreRecieve,eax
and byte ptr[rdi],0
        invoke  SetDlgItemTextA,hWnd,ID_TXT,p_Text
invoke GlobalFree,p_Text
jmp wmBYE
wmUSER_2:and percent,0
        xor ecx,ecx
mov [rsp+20h],rcx
movr qword ptr[rsp+28h],hThread2
mov r8d,offset TimerFuncProgress
invoke CreateThread,,0,,22
invoke CloseHandle,eax
;------------------------------------------------------
mov rax,lParam
mov DataLength,rax
invoke GlobalAlloc,GPTR,eax
mov r8d,offset TimerFuncICO
; xor ecx,ecx
; mov [rsp+20h],rcx
; movr qword ptr[rsp+28h],hThread2
; invoke CreateThread,,0,,eax
; invoke CloseHandle,eax
jmp @f;wmBYE
wmUSER_3:and percent,0
        xor ecx,ecx
mov [rsp+20h],rcx
movr qword ptr[rsp+28h],hThread2
mov r8d,offset TimerFuncProgress
invoke CreateThread,,0,,139
invoke CloseHandle,eax
;-----------------------------------------------
mov rax,lParam
mov DataLength,rax
invoke GlobalAlloc,GPTR,eax
mov r8d,offset TimerFuncWAV
@@: xor ecx,ecx
mov [rsp+20h],rcx
movr qword ptr[rsp+28h],hThread2
invoke CreateThread,,0,,eax
invoke CloseHandle,eax
jmp wmBYE
wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + IDCANCEL
jne wmBYE
wmCLOSE:invoke EndDialog,,0
; Закрываем идентификаторы объектов-событий 
xor edi,edi
@@: invoke CloseHandle,SemaphoreObject.hSemaphoreDataHigh[rdi*8]
inc edi
cmp edi,2*SEMAPHORE_DATA_COUNT+1
jb @b
wmBYE:  mov eax,TRUE
exit0: leave
ret
WndProc endp

TimerFuncICO proc p:qword
mov p,rcx

invoke SemaphoreRecieve
; Создать HICON напрямую из памяти
and qword ptr[rsp+30h],LR_DEFAULTCOLOR;LR_DEFAULTCOLOR=0
mov qword ptr[rsp+20h],256
mov qword ptr[rsp+28h],256
invoke  CreateIconFromResourceEx,p,DataLength,TRUE,30000h
mov [rsp+20h],rax
invoke  SendDlgItemMessageA,hWnd,ID_ICON,STM_SETIMAGE,IMAGE_ICON
invoke GlobalFree,p
exit2: leave
ret
TimerFuncICO endp

TimerFuncWAV proc p:qword
local lpwiocb:WAVEHDR
local hWaveOut:qword
mov p,rcx

invoke SemaphoreRecieve
WAVE: mov r8,p
;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data) = 14h
        add r8d,14h
        lea ecx,hWaveOut
        xor r9,r9
mov [rsp+20h],r9
mov qword ptr[rsp+28h],WAVE_ALLOWSYNC
        or edx,WAVE_MAPPER
        invoke waveOutOpen
; Подготавливаем заголовок для вывода
lea edx,lpwiocb
mov edi,edx
xor eax,eax
mov ecx,(sizeof WAVEHDR)/8
rep stosq

mov rax,p
mov ecx,eax
;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data)+\
;(Type of format)+(Number of Channels)+(Sample Rate)+(Sample Rate*BitsPerSample*Channels/8)+\
;(BitsPerSample*Channels/8)+(Bits per sample)+("data" chunk header)+(Size of the data section)=2Ch
add eax,2Ch

mov [rdx].WAVEHDR.lpData,rax ;адрес блока данных
mov eax,[rcx+4];размер блока данных
sub eax,2Ch
mov [rdx].WAVEHDR.dwBufferLength,eax ;размер блока данных

invoke waveOutPrepareHeader,hWaveOut,,sizeof WAVEHDR
; Запускаем проигрывание блока
lea edx,lpwiocb
mov rcx,hWaveOut
mov r8d,sizeof WAVEHDR
invoke waveOutWrite
@@: test lpwiocb.dwFlags,WHDR_DONE
jz @b
lea edx,lpwiocb
invoke waveOutUnprepareHeader,hWaveOut,,sizeof WAVEHDR
invoke waveOutClose,hWaveOut
@1: invoke GlobalFree,p
exit2: leave
ret
TimerFuncWAV endp
TimerFuncProgress proc lParam:qword
mov lParam,rcx
; Сформировать строку для отрисовки
@@: mov r8d,percent
mov edx,offset szText
mov ecx,offset buff
        invoke  wsprintfA
; Назначить строку свойством ProgressBar
mov r8d,offset buff
mov edx,offset szProp
        invoke  SetPropA,hProgress
; Назначить значение процента свойством ProgressBar
mov r8d,percent
mov edx,offset szPerc
        invoke  SetPropA,hProgress
; Перерисовать содержимое окна
        invoke  InvalidateRect,hProgress,0,FALSE
        inc     percent
        cmp     percent,101
        je exit0
invoke Sleep,lParam
jmp @b
exit0: leave
ret
TimerFuncProgress endp
SemaphoreRecieve proc p:qword
local dwSemaphoreDataLowValue:byte
local begin:dword
local buffer[20]:byte

mov edi,ecx
add rcx,DataLength
mov EndDataLength,ecx

        invoke GetTickCount
mov begin,eax
lea r8d,buffer
and byte ptr[r8],0
invoke  SetDlgItemTextA,hWnd,ID_TXT1

@@: lea edx,SemaphoreObject.hSemaphoreDataLow
invoke WaitForMultipleObjects,SEMAPHORE_DATA_COUNT,,0,2
cmp eax,SEMAPHORE_DATA_COUNT;if(dwSemaphoreDataLowValue >= SEMAPHORE_DATA_COUNT)
jnb exit1
; wait for "high" data value
mov dwSemaphoreDataLowValue,al
lea edx,SemaphoreObject.hSemaphoreDataHigh
invoke WaitForMultipleObjects,SEMAPHORE_DATA_COUNT,,0,0
; calculate byte value from high/low value
shl al,4;dwSemaphoreDataHighValue * 16
add al,dwSemaphoreDataLowValue
; store byte value
stosb
; set acknowledgement event
invoke ReleaseSemaphore,SemaphoreObject.hSemaphoreAck,1,0
;------------------------------------------------------------------
; increase ptr
exit1: cmp edi,EndDataLength
jb @b
        invoke GetTickCount
sub eax,begin
mov r8d,eax
mov edx,offset fmt
lea ecx,buffer
        invoke  wsprintfA
lea r8d,buffer
invoke  SetDlgItemTextA,hWnd,ID_TXT1
leave
ret
SemaphoreRecieve endp
ProgressWindowProc proc hEdit:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
local text:dword
local ps:PAINTSTRUCT               
local hDC:dword
local rcClient:RECT

mov hEdit,rcx
mov uMsg,rdx
mov wParam,r8
mov lParam,r9

cmp edx,WM_PAINT
je wmPAINT
mov [rsp+20h],r9;lParam
mov r9,wParam
mov r8,uMsg
mov rdx,hEdit
        invoke  CallWindowProcA,OldProc
jmp wmBYE
wmPAINT:; Размеры окна
        lea     edx,rcClient
        invoke  GetClientRect,hEdit;,edi
        ; Получить текст из свойств
mov edx,offset szProp
        invoke  GetPropA,hEdit;hProgress
        mov     text,eax
; Начать рисование
        lea     edx,ps
        invoke  BeginPaint,hEdit;hProgress
        mov     hDC,eax
; Шрифт
        invoke  SelectObject,hDC,hFont
        invoke  SetBkMode,hDC,TRANSPARENT
; Отрисовать общий фон
        invoke  GetSysColorBrush,COLOR_WINDOW
        lea     edx,rcClient
        invoke  FillRect,hDC,,eax
; Текст для отрисовки есть?
        cmp     text,0
        je      @f
        invoke  GetSysColor,COLOR_WINDOWTEXT
        invoke  SetTextColor,hDC,eax
mov edx,offset buff
mov qword ptr[rsp+20h],DT_NOPREFIX or DT_SINGLELINE or DT_VCENTER or DT_CENTER
        lea     r9d,rcClient
        invoke  DrawTextA,hDC,,-1               
@@:; Вычислить размеры области для заливки
mov edx,offset szPerc
        invoke  GetPropA,hEdit;hProgress
        mov     ecx,eax
        lea     r9d,rcClient
        mov     eax,[r9].RECT.right
        sub     eax,[r9].RECT.left
        mul     ecx
        xor     edx,edx
        mov     ecx,100
        div     ecx
; Позиция выполненного прогресса
        add     eax,[r9].RECT.left
; Наложить выполненный прогресс
mov ecx,[r9].RECT.left
mov edx,[r9].RECT.top
mov r9d,[r9].RECT.bottom
        invoke  CreateRectRgn,,,eax
        invoke  SelectClipRgn,hDC,eax
        invoke  GetSysColorBrush,COLOR_HIGHLIGHT
lea     edx,rcClient
        invoke  FillRect,hDC,,eax
; Текст для отрисовки есть?
        cmp     text,0
        je      @f
        invoke  GetSysColor,COLOR_HIGHLIGHTTEXT
        invoke  SetTextColor,hDC,eax
mov qword ptr[rsp+20h],DT_NOPREFIX or DT_SINGLELINE or DT_VCENTER or DT_CENTER
mov edx,offset buff
        lea     r9d,rcClient
        invoke  DrawTextA,hDC,,-1
@@: lea     edx,ps
        invoke  EndPaint,hDC
xor eax,eax
wmBYE: leave
retn
ProgressWindowProc endp
;-----------------------------------------------------------------------
.data
hWnd dq ?
Format1 db "Song_of_the_South_H%u",0
Format2 db "Song_of_the_South_L%u",0
Format3 db "Song_of_the_South_A",0
p_Text dq ?
p_ICO dq ?
p_WAV dq ?
szWin db "Semaphore Sender",0
Error1 db "The server is not running.",10,"Run?",0
szAppName db "Semaphore Reciever",0
szService db "10s",0
hThread2 dq ?
fmt db '%u',0
szSemaphoreName db 32 dup(?)
buff db 100 dup(?)
szText  db '%u%% completed',0
percent dd 0
hProgress dq ?
hFont dq ?
szProp db 'text',0
szPerc db 'percent',0
szFont db "Verdana",0
OldProc dq ?
align 16
SemaphoreObject SemaphoreObjectStruct <>
DataLength dq ?
EndDataLength dd ?
end
10r.rc#include "resource.h"
#define IDC_DIALOG 200
#define ID_TXT 100
#define ID_ICON 102
#define ID_PROGRESS 106
#define ID_TXT1 107

IDC_DIALOG DIALOGEX 0,0,212,154
STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "Semaphore Reciever"

{
CONTROL "",-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 2,-3,207,24
CONTROL "", ID_TXT, STATIC, SS_LEFT | SS_NOPREFIX | WS_CHILD |
WS_VISIBLE | WS_BORDER | WS_TABSTOP, 5, 5, 199, 13
CONTROL "", ID_PROGRESS, STATIC, WS_CHILD | WS_VISIBLE | WS_DISABLED |
WS_BORDER, 2, 22, 146, 19
CONTROL "Exit", IDCANCEL, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 25, 60, 15
CONTROL "",ID_ICON, STATIC, SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128
CONTROL "",ID_TXT1, STATIC, SS_LEFT | SS_NOPREFIX | WS_CHILD |
WS_VISIBLE | WS_BORDER | WS_TABSTOP, 149, 45, 60, 13
}
10s.asm (Server); GUI #
include win64a.inc
ID_TXT equ 100
ID_SEND_TXT equ 101
ID_SEND_ICO equ 102
ID_SEND_WAV equ 103
IDC_DIALOG equ 200
IDC_ICON1 equ 500
IDC_IMG1 equ 104
SEMAPHORE_DATA_COUNT = 16
size_of_buffer = 96
time_interval    = 10
SemaphoreObjectStruct struct
hSemaphoreDataHigh dq SEMAPHORE_DATA_COUNT dup(?)
hSemaphoreDataLow dq SEMAPHORE_DATA_COUNT dup(?)
hSemaphoreAck dq ?
SemaphoreObjectStruct ends
.code
WinMain proc
enter 30h,0
mov r9d,256;cx
mov [rbp-10h],r9
mov qword ptr [rbp-8],LR_DEFAULTCOLOR
invoke LoadImageA,IMAGE_BASE,IDC_ICON1,IMAGE_ICON;,256,256,LR_DEFAULTCOLOR
mov r9d,offset DialogProc
mov qword ptr[rbp-10h],rax;30h-10h=+20h
invoke DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP
invoke RtlExitUserProcess,NULL
WinMain endp

DialogProc proc hWnddlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
local hFile:qword
local szSemaphoreName[32]:byte
local szReadWrite:qword ;number of bytes actually read or write
local hResource:qword
local pResource:qword

mov hWnddlg,rcx
mov lParam,r9

cmp edx,WM_INITDIALOG
je wmINITDIALOG
cmp edx,WM_CLOSE
je wmCLOSE
cmp edx,WM_COMMAND
je wmCOMMAND

xor eax,eax
jmp exit0
wmINITDIALOG:invoke GetDlgItem,,IDC_IMG1
invoke SendMessageA,eax,STM_SETIMAGE,IMAGE_ICON,lParam
xor edi,edi;for(DWORD i = 0; i < 16; i++)
@@:; set current Semaphore name
invoke sprintf,&szSemaphoreName,&Format1,edi
; create new object
invoke CreateSemaphore,0,0,1,&szSemaphoreName
mov SemaphoreObject.hSemaphoreDataHigh[rdi*8],rax
; check for errors
or eax,eax;if(SemaphoreObject.hSemaphoreDataHigh[i] == NULL)
jz wmBYE;exit0;
; create "low" data Semaphore handles
; set current Semaphore name
invoke sprintf,&szSemaphoreName,&Format2,edi
; create new object
invoke CreateSemaphore,0,0,1,&szSemaphoreName
mov SemaphoreObject.hSemaphoreDataLow[rdi*8],rax
; check for errors
or eax,eax;if(SemaphoreObject.hSemaphoreDataLow[i] == NULL)
jz wmBYE;exit0
inc edi
cmp edi,SEMAPHORE_DATA_COUNT
jb @b
; create acknowledgement Semaphore
; create new object
invoke CreateSemaphore,0,0,1,&Format3
mov SemaphoreObject.hSemaphoreAck,rax
jmp wmBYE
wmSEND_TXT:invoke GlobalAlloc,GPTR,size_of_buffer
mov p,rax
invoke  GetDlgItemTextA,hWnddlg,ID_TXT,eax,size_of_buffer
        or      eax,eax
        jz      wmBYE
mov dwLength,eax
mov edx,offset szWin
        invoke  FindWindowA,NULL
        or      eax,eax
        jz      wmBYE
mov edx,WM_USER+1
jmp @0
;-----------------------------------------------------------
wmSEND_ICO:; Отправить изображение второму приложению
        mov edx,p1
invoke FindResource,0,,RT_ICON; find the resource
mov hResource,rax
invoke  SizeofResource,0,eax ; get its size
mov dwLength,eax
invoke LoadResource,0,hResource ; load the resource
invoke LockResource,eax;pResource
mov p,rax
;-------------------------------------------------
and qword ptr[rsp+30h],LR_DEFAULTCOLOR;LR_DEFAULTCOLOR=0
mov qword ptr[rsp+20h],256
mov qword ptr[rsp+28h],256
mov edx,dwLength
invoke  CreateIconFromResourceEx,eax,,TRUE,30000h;270376,TRUE,30000h
mov [rsp+20h],rax
invoke  SendDlgItemMessageA,hWnddlg,IDC_IMG1,STM_SETIMAGE,IMAGE_ICON
xor p1,11b
; Отправить данные получателю
mov edx,offset szWin
        invoke  FindWindowA,NULL
        or      eax,eax
        jz      wmBYE
; Отправить данные получателю
mov edx,WM_USER+2
jmp @0
;-----------------------------------------------------------------------
wmSEND_WAV:mov ecx,offset wav_file
invoke CreateFile,,GENERIC_READ,0,0,OPEN_EXISTING,\
        FILE_ATTRIBUTE_ARCHIVE,0
        mov hFile,rax
        invoke GetFileSize,eax,0
mov dwLength,eax
invoke GlobalAlloc,GPTR,eax
invoke GlobalLock,eax
mov p,rax
lea r9d,szReadWrite
mov r8d,dwLength
        invoke ReadFile,hFile,eax,,,0
        invoke CloseHandle,hFile
;-------------------------------------------------------
; Найти окно получателя
mov edx,offset szWin
        invoke  FindWindowA,NULL
        or      eax,eax
        jz      wmBYE
; Отправить данные получателю
mov edx,WM_USER+3
;------------------------------------------------
@0:; Отправить данные получателю
mov r9d,dwLength
invoke PostMessageA,eax,,hWnddlg
or eax,eax
jz wmBYE;if(SemaphoreObject.hSemaphoreAck == NULL)
; ---------------------------------------------------------------------------
; send block data
mov rsi,p
xor edi,edi
@@: movzx eax,byte ptr[rdi+rsi]
;set "high" data Semaphore
shr al, 4
invoke ReleaseSemaphore,SemaphoreObject.hSemaphoreDataHigh[rax*8],1,0
test eax, eax
jz wmBYE
; set "low" data Semaphore
movzx eax,byte ptr[rdi+rsi]
and al,0Fh
invoke ReleaseSemaphore,SemaphoreObject.hSemaphoreDataLow[rax*8],1,0
test eax, eax
jz wmBYE
; wait for acknowledgement
invoke WaitForSingleObject,SemaphoreObject.hSemaphoreAck,INFINITE
test eax, eax
jnz wmBYE
inc edi
cmp edi,dwLength
jb @b
jmp wmBYE
wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + ID_SEND_ICO
        je      wmSEND_ICO
cmp r8d,BN_CLICKED shl 16 + ID_SEND_TXT
        je      wmSEND_TXT
cmp r8d,BN_CLICKED shl 16 + ID_SEND_WAV
        je      wmSEND_WAV
cmp     r8d,BN_CLICKED shl 16 + IDCANCEL
        jne     wmBYE
wmCLOSE:invoke EndDialog,,0
; Закрываем идентификаторы объектов-событий 
xor edi,edi
@@: invoke CloseHandle,SemaphoreObject.hSemaphoreDataHigh[rdi*8]
inc edi
cmp edi,2*SEMAPHORE_DATA_COUNT+1
jb @b
wmBYE: mov eax,TRUE
exit0: leave
retn
DialogProc endp
;------------------------------------------------------------
Format1 db "Song_of_the_South_H%u",0
Format2 db "Song_of_the_South_L%u",0
Format3 db "Song_of_the_South_A",0
p1 dd 1
wav_file db '..\Images\03.wav',0
align 16
SemaphoreObject SemaphoreObjectStruct <>
szWin db 'Semaphore Reciever',0
p dq ?
dwLength dd ?
end
10s.rc#include "resource.h"
#define ID_TXT 100
#define ID_SEND_TXT 101
#define ID_SEND_ICO 102
#define ID_SEND_WAV 103
#define IDC_IMG1 104

#define IDC_DIALOG 200
#define IDC_ICON1 500

IDC_ICON1 ICON "..\\Images\\icon1.ico"
IDC_ICON2 ICON "..\\Images\\icon2.ico"

IDC_DIALOG DIALOGEX 0, 0, 212, 154
STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "Semaphore Sender"
{
CONTROL "",-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE,2,-1,207,24
CONTROL "",IDC_IMG1,STATIC,SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128
CONTROL "Write something and click 'Send Text'",ID_TXT,EDIT,ES_LEFT |
ES_AUTOHSCROLL|WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP,5,7,199,13
CONTROL "Send Text", ID_SEND_TXT, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 27, 60, 15
CONTROL "Send ICO", ID_SEND_ICO, BUTTON, BS_PUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 45, 60, 15
CONTROL "Send WAV", ID_SEND_WAV, BUTTON, BS_PUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 65, 60, 15
CONTROL "Exit",IDCANCEL,BUTTON,BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE |
WS_TABSTOP, 149, 85, 60, 15
}
Title: Re: Interprocess communication
Post by: Mikl__ on August 18, 2022, 01:01:50 PM
12. WinSockets
12r.asm (Client); GUI #
include win64a.inc
IDC_DIALOG equ 200
IDC_OUTPUT equ 100
ID_ICON equ 102
IDC_ICON1 equ 500

WINSOCK_VERSION equ 504
SD_RECEIVE equ 0
SD_SEND equ 1
SD_BOTH equ 2

WSADATA struct
  wVersion dw ?;
  wHighVersion dw ?
  szDescription db (WSADESCRIPTION_LEN + 1) dup(?)
  szSystemStatus db (WSASYS_STATUS_LEN + 1) dup(?)
  iMaxSockets dw ?
  iMaxUdpDg dw ?
  lpVendorInfo dq ?
WSADATA ends

S_UN_B STRUCT
  s_b1 BYTE ?
  s_b2 BYTE ?
  s_b3 BYTE ?
  s_b4 BYTE ?
S_UN_B ENDS

S_UN_W STRUCT
  s_w1 WORD ?
  s_w2 WORD ?
S_UN_W ENDS

ADDRESS_UNION UNION
   S_un_b S_UN_B <>
   S_un_w S_UN_W <>
   S_addr DWORD ?
ADDRESS_UNION ENDS

in_addr STRUCT
  S_un ADDRESS_UNION <>
in_addr ENDS

SOCKADDR_IN STRUCT
  sin_family    WORD      ?
  sin_port      WORD      ?
  sin_addr      in_addr <>
  sin_zero      BYTE 8 dup (?)
SOCKADDR_IN ends
.code
WinMain proc
enter 30h,0
mov r9d,offset DialogProc
and qword ptr[rbp-10h],0
        invoke  DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP
        invoke  RtlExitUserProcess,NULL
WinMain endp
DialogProc proc hWnddlg:qword,msg:qword,wParam:qword,lParam:qword
local wsa:WSADATA
local clientSocket:qword
local saddr:SOCKADDR_IN;sizeof(saddr)=10h
local addrSize:dword
local buffer[1024]:byte
local lpwiocb:WAVEHDR
local hWaveOut:qword

mov hWnddlg,rcx
mov lParam,r9

        cmp edx,WM_INITDIALOG
je wmINITDIALOG
cmp edx,WM_CLOSE
je wmCLOSE
cmp edx,WM_COMMAND
je wmCOMMAND
cmp edx,WM_DESTROY
je wmDESTROY
cmp edx,WM_USER+1
je wmUSER_1
cmp edx,WM_USER+2
je wmUSER_2
cmp edx,WM_USER+3
je wmUSER_3
xor eax,eax
jmp exit0

wmDESTROY:cmp serverSocket,INVALID_SOCKET
jz wmBYE
invoke shutdown,serverSocket,SD_BOTH
invoke closesocket,serverSocket
or serverSocket,INVALID_SOCKET
jmp wmBYE
wmUSER_1:cmp serverSocket,INVALID_SOCKET
jz @f
invoke shutdown,serverSocket,SD_BOTH
invoke closesocket,serverSocket
; Create a stream socket for internet use
; создать сокет
@@: invoke socket,AF_INET,SOCK_STREAM,IPPROTO_TCP
mov serverSocket,rax
cmp eax,INVALID_SOCKET
jz break
; подключить сокет
        mov saddr.sin_family,AF_INET
invoke htonl,INADDR_LOOPBACK
mov saddr.sin_addr.S_un.S_addr,eax
invoke htons,12343; convert port number into network byte order first
mov saddr.sin_port,ax; адрес порта
mov r8d,sizeof saddr
lea edx,saddr
invoke bind,serverSocket
or eax,eax;if (bind (serverSocket, (struct sockaddr*)&saddr, sizeof(saddr)) == 0)
        jnz break
; перевести сокет в состояние "слушать"
invoke listen,serverSocket,256
or eax,eax
jnz break;if (listen (serverSocket, 256) == 0)
; ждем запроса от клиента
mov addrSize,sizeof saddr
lea edx,saddr
lea r8d,addrSize
invoke accept,serverSocket
mov clientSocket,rax
cmp eax,INVALID_SOCKET
jz break;if (clientSocket == INVALID_SOCKET) break;
; запрос пришел - посылаем информацию
@@: lea edx,buffer
invoke recv,clientSocket,,1024,0
;recv is for use with a stream socket
;Parameters:
; #1 socket == socket descriptor
; #2 buffer == address of the memory block to store the incoming data.
; #3 len == the size of the memory block
; #4 flags == flags specifying the behavior of the function. There are two flags you can use:
; MSG_PEEK Peek at the incoming data. The data is copied into the buffer but is not
;removed from the input queue.
; MSG_OOB Process out-of-band data. This flag is usually used when FD_OOB notification
;is received. If the call is successful, it returns the number of bytes read from the socket. If it
;is unsuccessful, the value SOCKET_ERROR is returned. If the return value is 0, the remote socket
;has been closed
        or eax,eax
jnz @b;if (len <= 0)    break
; выводим строку символов
lea r8d,buffer
invoke  SetDlgItemTextA,hWnddlg,IDC_OUTPUT
jmp @0
wmUSER_2:;mov rax,lParam
mov FSize,r9;ax
cmp serverSocket,INVALID_SOCKET
jz @f
invoke shutdown,serverSocket,SD_BOTH
invoke closesocket,serverSocket
@@: invoke socket,AF_INET,SOCK_STREAM,IPPROTO_TCP; Create a stream socket for internet use
mov serverSocket,rax
cmp serverSocket,INVALID_SOCKET
jz break
mov saddr.sin_family,AF_INET
invoke htonl,INADDR_LOOPBACK
mov saddr.sin_addr.S_un.S_addr,eax
invoke htons,12344; convert port number into network byte order first
mov saddr.sin_port,ax
mov r8d,sizeof saddr
lea edx,saddr
invoke bind,serverSocket
or eax,eax;if (bind (serverSocket, (struct sockaddr*)&saddr, sizeof(saddr)) == 0)
jnz break
invoke listen,serverSocket,256
or eax,eax
jnz break;if (listen (serverSocket, 256) == 0)
mov addrSize,sizeof saddr
lea edx,saddr
lea r8d,addrSize
invoke accept,serverSocket
mov clientSocket,rax
cmp eax,INVALID_SOCKET
jz break;if (clientSocket == INVALID_SOCKET) break;
invoke GlobalAlloc,GPTR,FSize
mov p,rax
mov edi,eax
@@: lea edx,buffer
invoke recv,clientSocket,,1024,0
or eax,eax
jz @f
lea esi,buffer
mov ecx,eax;1024
rep movsb
jmp @b;if (len <= 0)    break;
@@: invoke  CreateIconFromResourceEx,p,FSize,TRUE,30000h,256,256,LR_DEFAULTCOLOR
invoke  SendDlgItemMessageA,hWnddlg,ID_ICON,STM_SETIMAGE,IMAGE_ICON,eax
jmp @1
wmUSER_3:;mov rax,lParam
mov FSize,r9;ax
cmp serverSocket,INVALID_SOCKET
jz @f
invoke shutdown,serverSocket,SD_BOTH
invoke closesocket,serverSocket
@@: invoke socket,AF_INET,SOCK_STREAM,IPPROTO_TCP; Create a stream socket for internet use
mov serverSocket,rax
cmp eax,INVALID_SOCKET
jz break
        mov saddr.sin_family,AF_INET
invoke htonl,INADDR_LOOPBACK
mov saddr.sin_addr.S_un.S_addr,eax
invoke htons,12345; convert port number into network byte order first
mov saddr.sin_port,ax
mov r8d,sizeof saddr
lea edx,saddr
invoke bind,serverSocket
or eax,eax;if (bind (serverSocket, (struct sockaddr*)&saddr, sizeof(saddr)) == 0)
jnz break
invoke listen,serverSocket,256
or eax,eax
jnz break;if (listen (serverSocket, 256) == 0)
mov addrSize,sizeof saddr
lea edx,saddr
lea r8d,addrSize
invoke accept,serverSocket
mov clientSocket,rax
cmp eax,INVALID_SOCKET
jz break;if (clientSocket == INVALID_SOCKET) break;
invoke GlobalAlloc,GPTR,FSize
mov p,rax
mov edi,eax
@@: lea edx,buffer
invoke recv,clientSocket,,1024,0
or eax,eax
jz @f
lea esi,buffer
mov ecx,eax;1024
rep movsb
jmp @b;if (len <= 0)    break;
@@: mov r8,p
;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data) = 14h
        add r8d,14h
        invoke waveOutOpen,&hWaveOut,WAVE_MAPPER,,0,0,WAVE_ALLOWSYNC
; Подготавливаем заголовок для вывода
lea edx,lpwiocb
mov edi,edx
xor eax,eax
mov ecx,(sizeof WAVEHDR)/8
rep stosq

mov rax,p
;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data)+\
;(Type of format)+(Number of Channels)+(Sample Rate)+(Sample Rate*BitsPerSample*Channels/8)+\
;(BitsPerSample*Channels/8)+(Bits per sample)+("data" chunk header)+(Size of the data section)=2Ch
add rax,2Ch
mov [rdx].WAVEHDR.lpData,rax ;адрес блока данных
mov rax,FSize
sub eax,2Ch
mov [rdx].WAVEHDR.dwBufferLength,eax ;размер блока данных

invoke waveOutPrepareHeader,hWaveOut,,sizeof WAVEHDR
; Запускаем проигрывание блока
invoke waveOutWrite,hWaveOut,&lpwiocb,sizeof WAVEHDR
@@: test lpwiocb.dwFlags,WHDR_DONE
jz @b
invoke waveOutUnprepareHeader,hWaveOut,&lpwiocb,sizeof WAVEHDR
invoke waveOutClose,hWaveOut
;----------------------------------------------------------
@1: invoke GlobalFree,p
; закрыть связь
@0: invoke shutdown,clientSocket,SD_BOTH
; закрыть сокет
invoke closesocket,clientSocket
;This function closes a socket. Every resource of the socket will be released
break: cmp serverSocket,INVALID_SOCKET;if (serverSocket != INVALID_SOCKET)
jz wmBYE
invoke shutdown,serverSocket,SD_BOTH
invoke closesocket,serverSocket
mov serverSocket,INVALID_SOCKET
jmp wmBYE
wmINITDIALOG:;mov hWnd,rcx
; Найти окно отправителя
mov edx,offset szWin
        invoke  FindWindowA,NULL
        or      eax,eax
        jnz wmBYE
mov edx,offset Error1
mov r8d,offset szAppName
invoke MessageBoxA,hWnddlg,,,MB_ICONEXCLAMATION or MB_YESNO
cmp eax,IDNO
jz      wmBYE
mov ecx,offset szService
invoke WinExec,,SW_SHOW
;активировать библиотеку сокетов
lea edx,wsa
invoke WSAStartup,WINSOCK_VERSION
jmp wmBYE
;--------------------------------------------------
wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + IDCANCEL
jne wmBYE
wmCLOSE:invoke EndDialog,,0
wmBYE: mov eax,TRUE
exit0: leave
retn
DialogProc endp
;-----------------------------------------------------------------------
.data
szWin db "Socket Sender",0
Error1 db "The server is not running.",10,"Run?",0
szAppName db "Socket Reciever",0
szService db "12s",0
serverSocket dq INVALID_SOCKET
;threadHandleTxt dq ?
;threadHandleIco dq ?
;threadHandleWav dq ?
;threadId dd ?
;hWnd dq ?
FSize dq ?
p dq ?
end
12r.rc#include "resource.h"
#define IDC_DIALOG 200
#define ID_TXT 100
#define ID_ICON 102
#define ID_PROGRESS 106
#define ID_TXT1 107

IDC_DIALOG DIALOGEX 0,0,212,154
STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "Socket Reciever"

{
CONTROL "",-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 2,-3,207,24
CONTROL "", ID_TXT, STATIC, SS_LEFT | SS_NOPREFIX | WS_CHILD |
WS_VISIBLE | WS_BORDER | WS_TABSTOP, 5, 5, 199, 13
CONTROL "Exit", IDCANCEL, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 25, 60, 15
CONTROL "",ID_ICON, STATIC, SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128
}
12s.asm (Server); GUI #
include win64a.inc
ID_TXT equ 100
ID_SEND_TXT equ 101
ID_SEND_ICO equ 102
ID_SEND_WAV equ 103
IDC_DIALOG equ 200
IDC_ICON1 equ 500
IDC_IMG1 equ 104
WINSOCK_VERSION equ 504
SD_RECEIVE equ 0
SD_SEND equ 1
SD_BOTH equ 2

WSADATA struct
  wVersion dw ?;
  wHighVersion dw ?
  szDescription db (WSADESCRIPTION_LEN + 1) dup(?)
  szSystemStatus db (WSASYS_STATUS_LEN + 1) dup(?)
  iMaxSockets dw ?
  iMaxUdpDg dw ?
  lpVendorInfo dq ?
WSADATA ends

S_UN_B STRUCT
  s_b1 BYTE ?
  s_b2 BYTE ?
  s_b3 BYTE ?
  s_b4 BYTE ?
S_UN_B ENDS

S_UN_W STRUCT
  s_w1 WORD ?
  s_w2 WORD ?
S_UN_W ENDS

ADDRESS_UNION UNION
   S_un_b S_UN_B <>
   S_un_w S_UN_W <>
   S_addr DWORD ?
ADDRESS_UNION ENDS

in_addr STRUCT
  S_un ADDRESS_UNION <>
in_addr ENDS

SOCKADDR_IN STRUCT
  sin_family    dw ?;is the same as af parameter in socket call. You must use AF_INET here.
  sin_port      dw ?;is the port that the socket will use to communicate with the remote socket.
;This value depends on the higher level protocol that you want to use. If you want to connect to
;the remote socket for HTTP, use port 80 (decimal). However, note that the port value MUST be in
;network byte order that is big Endian. So you cannot use the port value per se but you must call
;htons to convert the value to network byte order first. This is one of the most common error the
;newcomers to winsock programming encounter.
  sin_addr      in_addr <>;is the IP address of the remote host. Again, you must convert the
;IP address to network byte order before using it
  sin_zero      BYTE 8 dup(?);is reserved. Don't mess with it
SOCKADDR_IN ends
.code
WinMain proc
enter 30h,0
mov r9d,256;cx
mov [rbp-10h],r9
mov qword ptr [rbp-8],LR_DEFAULTCOLOR
invoke LoadImageA,IMAGE_BASE,IDC_ICON1,IMAGE_ICON;,256,256,LR_DEFAULTCOLOR
mov r9d,offset DialogProc
mov qword ptr[rbp-10h],rax;30h-10h=+20h
invoke DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP
invoke RtlExitUserProcess,NULL
WinMain endp

DialogProc proc hWnddlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
local hFile:qword
local cbWritten:dword
local hResource:qword
local pResource:qword
local wsa:WSADATA
local port:qword
local FSize:qword

mov hWnddlg,rcx
mov lParam,r9

cmp edx,WM_INITDIALOG
        je wmINITDIALOG
cmp edx,WM_CLOSE
je wmCLOSE
cmp edx,WM_COMMAND
je wmCOMMAND
cmp edx,WM_DESTROY
je wmDESTROY
xor eax,eax
jmp exit0
wmDESTROY:invoke WSACleanup
jmp wmBYE
wmSEND_WAV:mov port,12345
mov type0,WM_USER+3
        mov ecx,offset wav_file
xor r9d,r9d
mov qword ptr[rsp+30h],r9
mov qword ptr[rsp+28h],FILE_ATTRIBUTE_ARCHIVE
mov qword ptr[rsp+20h],OPEN_EXISTING
invoke CreateFile,,GENERIC_READ or GENERIC_WRITE,\
FILE_SHARE_READ or FILE_SHARE_WRITE
        mov hFile,rax
        invoke GetFileSize,eax,0
mov FSize,rax
invoke GlobalAlloc,GPTR,eax
        mov p,rax
lea r9d,cbWritten
and qword ptr[rsp+20h],0
        invoke ReadFile,hFile,eax,FSize
        invoke CloseHandle,hFile
jmp @f
wmSEND_ICO:mov port,12344
mov type0,WM_USER+2
        mov edx,p1
invoke FindResource,0,,RT_ICON; find the resource
mov hResource,rax
invoke  SizeofResource,0,eax ; get its size
mov FSize,rax
invoke LoadResource,0,hResource ; load the resource
invoke LockResource,eax;pResource
mov p,rax
and qword ptr[rsp+30h],LR_DEFAULTCOLOR;LR_DEFAULTCOLOR=0
mov qword ptr[rsp+20h],256
mov qword ptr[rsp+28h],256
invoke  CreateIconFromResourceEx,eax,FSize,TRUE,30000h;270376,TRUE,30000h
mov [rsp+20h],rax
invoke  SendDlgItemMessageA,hWnddlg,IDC_IMG1,STM_SETIMAGE,IMAGE_ICON
xor p1,11b
jmp @f
wmSEND_TXT:mov port,12343
mov type0,WM_USER+1
invoke GlobalAlloc,GPTR,256
        mov p,rax
invoke GetDlgItemTextA,hWnddlg,ID_TXT,eax,256
inc eax
mov FSize,rax

@@: mov edx,offset szWin
        invoke  FindWindowA,NULL
        or      eax,eax
        jz      wmBYE
; Отправить данные получателю
invoke PostMessageA,eax,type0,hWnddlg,FSize
invoke SendData,p,FSize,port
jmp wmBYE
wmINITDIALOG:invoke GetDlgItem,,IDC_IMG1
invoke SendMessageA,eax,STM_SETIMAGE,IMAGE_ICON,lParam
; активировать библиотеку сокетов
lea edx,wsa
invoke WSAStartup,WINSOCK_VERSION
;An error occured if eax != null, because there's no return value for this api, if there's return,
;there's an error
jmp wmBYE
wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + ID_SEND_TXT
        je      wmSEND_TXT
        cmp r8d,BN_CLICKED shl 16 + ID_SEND_WAV
        je      wmSEND_WAV
        cmp r8d,BN_CLICKED shl 16 + ID_SEND_ICO
        je      wmSEND_ICO
cmp     r8d,BN_CLICKED shl 16 + IDCANCEL
        jne     wmBYE
wmCLOSE:invoke EndDialog,,0
wmBYE: mov eax,TRUE
exit0: leave
retn
DialogProc endp
SendData proc buf:qword,len:qword,port:qword
local sock:QWORD
local saddr:SOCKADDR_IN;sizeof(saddr)) =10h
local bytesSent:dword

mov buf,rcx
mov len,rdx
mov port,r8
; создать сокет
invoke socket,AF_INET, SOCK_STREAM, IPPROTO_TCP
mov sock,rax
cmp eax,INVALID_SOCKET
jz exit0;if (sock != INVALID_SOCKET)

mov saddr.sin_family,AF_INET
invoke htonl,INADDR_LOOPBACK
mov saddr.sin_addr.S_un.S_addr,eax
invoke htons,port;12345
mov saddr.sin_port,ax
;After the socket is created, you have two choices: wait for an incoming connection or connect
;to a remote socket. If you want to wait for incoming connection, you must call listen to listen
;for an incoming connection and call accept to establish connection with the remote socket. If you
;want to connect to a remote socket, you must call connect
mov r8d,sizeof saddr;the size of SOCKADDR_IN structure
lea edx,saddr;a pointer to a SOCKADDR_IN structure
invoke connect,sock;socket descriptor of the local socket. You can pass the socket
;descriptor returned by socket call as this parameter
or eax,eax
jnz @0;if (connect (sock,(struct sockaddr*)&saddr,sizeof (saddr)) == 0)
@@: cmp len,0 ;       while (size)
jz @0
;use send to send data on a stream socket and sendto to send data on a datagram socket. I'll
;examine send here since many popular protocols such as HTTP and FTP use stream sockets.
; запрос пришел - посылаем информацию
invoke send,sock,buf,len, 0
;Parameters
; #1 socket == socket descriptor
; #2 buffer == address of the data that you want to send. The data need not be NULL-terminated
;since its size is specified in len parameter.
; #3 len == the size of data to send
; #4 flags == flags specifying the behavior of the function. There are two flags you can use:
; MSG_DONTROUTE : specifies that the data should not be subject to routing. Notice
;the word "should". Some windows socket implementation may ignore this flag.
; MSG_OOB : specifies that the data is out-of-band data.
;Normally we don't use any of these two flags, flags parameter should be 0 in this case.
;If the call is unsuccessful, the value SOCKET_ERROR is returned in eax.
;If it's successful, the actual number of bytes sent is returned in eax. Note that this number
;may not be equal to len parameter.
or eax,eax
jz @0;if (bytesSent <= 0)          break;
sub len,rax;     size -= (uint32_t)bytesSent;
        add buf,rax;    data = (uint8_t*)data + bytesSent;
jmp @b
; закрыть связь
@0:     invoke shutdown,sock,SD_BOTH
; закрыть сокет
invoke closesocket,sock
exit0: leave
ret
SendData endp
;---------------------------------------
.data
szWin db 'Socket Reciever',0
wav_file db '..\Images\03.wav',0
p dq ?
p1 dd 1
type0 dq ?
end
12s.rc#include "resource.h"
#define ID_TXT 100
#define ID_SEND_TXT 101
#define ID_SEND_ICO 102
#define ID_SEND_WAV 103
#define IDC_IMG1 104

#define IDC_DIALOG 200
#define IDC_ICON1 500

IDC_ICON1 ICON "..\\Images\\icon1.ico"
IDC_ICON2 ICON "..\\Images\\icon2.ico"

IDC_DIALOG DIALOGEX 0, 0, 212, 154
STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "Socket Sender"
{
CONTROL "",-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE,2,-1,207,24
CONTROL "",IDC_IMG1,STATIC,SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128
CONTROL "Write something and click 'Send Text'",ID_TXT,EDIT,ES_LEFT |
ES_AUTOHSCROLL|WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP,5,7,199,13
CONTROL "Send Text", ID_SEND_TXT, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 27, 60, 15
CONTROL "Send ICO", ID_SEND_ICO, BUTTON, BS_PUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 45, 60, 15
CONTROL "Send WAV", ID_SEND_WAV, BUTTON, BS_PUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 65, 60, 15
CONTROL "Exit",IDCANCEL,BUTTON,BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE |
WS_TABSTOP, 149, 85, 60, 15
}
Title: Re: Interprocess communication
Post by: Mikl__ on August 18, 2022, 03:51:46 PM
09. Mutex
So far, only text transfer, but it is displayed without errors, the version of programs with the transfer of pictures and WAV-files will be later (although it is likely that the mutex mechanism is not designed for such an intensive messaging, but I will try (https://wasm.in/styles/smiles_s/smile3.gif)).
09r.asm (Client); GUI #
include win64a.inc
MUTEX_DATA_COUNT = 16
MUTEX_ALL_ACCESS = 1F0001h
size_of_buffer = 96
IDC_DIALOG equ 200
ID_TXT equ 100
ID_ICON equ 102
ID_PROGRESS equ 106
ID_TXT1 equ 107
IDC_ICON1 equ 500
.code
WinMain proc
enter 30h,0
mov r9d,offset DialogProc
and qword ptr[rbp-10h],0
        invoke  DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP
        invoke  RtlExitUserProcess,NULL
WinMain endp
DialogProc proc hWnddlg:qword,msg:qword,wParam:qword,lParam:qword
local MutexName[256]:word

mov hWnddlg,rcx
mov lParam,r9

cmp edx,WM_INITDIALOG
jne wmBYE
wmINITDIALOG:mov hWnd,rcx
        mov edx,GWL_STYLE
invoke GetWindowLongPtrA
    or eax,WS_THICKFRAME OR WS_MINIMIZEBOX OR WS_MAXIMIZEBOX
mov edx,GWL_STYLE
invoke SetWindowLongPtrA,hWnddlg,,rax
mov r8d,offset WndProc
mov edx,GWL_WNDPROC
invoke SetWindowLongPtrA,hWnddlg
; Найти окно получателя
mov edx,offset szWin
        invoke  FindWindowA,NULL
        or      eax,eax
        jnz wmBYE
mov edx,offset Error1
mov r8d,offset szAppName
invoke MessageBoxA,hWnddlg,,,MB_ICONEXCLAMATION or MB_YESNO
cmp eax,IDNO
jz      wmBYE
mov ecx,offset szService
invoke WinExec,,SW_SHOW
;------------------------------------
xor edi,edi
@@: lea ecx,MutexName
mov edx,offset fmtH
invoke wsprintfA,,,edi
lea r8d,MutexName
invoke OpenMutex,MUTEX_ALL_ACCESS,FALSE
mov handlesH[rdi*8],rax

lea ecx,MutexName
mov edx,offset fmtL
invoke wsprintfA,,,edi
lea r8d,MutexName
invoke OpenMutex,MUTEX_ALL_ACCESS,FALSE
mov handlesL[rdi*8],rax
inc edi
cmp edi,MUTEX_DATA_COUNT
jb @b
mov r8d,offset Format5
invoke OpenEvent,EVENT_ALL_ACCESS,0
mov hEventAck,rax
mov r9d,offset EVENT_RECEIVER_READY
invoke CreateEvent,NULL, TRUE, FALSE
mov eventReceiverReady,rax
;-----------------------------------------------
; Шрифт текста
pushaddr szFont
push FIXED_PITCH+FF_DONTCARE
push PROOF_QUALITY
push CLIP_DEFAULT_PRECIS
push OUT_RASTER_PRECIS
push ANSI_CHARSET
push FALSE
push FALSE
push FALSE
push FW_BOLD
sub esp,20h
        invoke  CreateFont,32,12,0,0               
        mov     hFont,rax

        invoke  GetDlgItem,hWnddlg,ID_PROGRESS
        mov     hProgress,rax
; Установить наш собственный обработчик
mov r8d,offset ProgressWindowProc
        invoke  SetWindowLongPtrA,hProgress,GWL_WNDPROC
        ; Сохранить хэндл предыдущего обработчика
        mov     OldProc,rax
wmBYE: xor eax,eax
leave
retn
DialogProc endp
WndProc proc hWnd:qword,msg:qword,wParam:qword,lParam:qword
local SizeString:qword
local text:dword
local ps:PAINTSTRUCT               
local hDC:dword
local rcClient:RECT

mov hWnd,rcx
mov lParam,r9

        cmp edx,WM_CLOSE
je wmCLOSE
cmp edx,WM_COMMAND
je wmCOMMAND
cmp edx,WM_DESTROY
je wmDESTROY
cmp edx,WM_USER+1
je wmUSER_1
leave
jmp NtdllDialogWndProc_

wmUSER_1:mov SizeString,r9
        xor ecx,ecx
        and percent,ecx
mov [rsp+20h],rcx
movr qword ptr[rsp+28h],hThread2
mov r8d,offset TimerFuncProgress
invoke CreateThread,,0,,1
invoke CloseHandle,eax
movr qword ptr[rsp+28h],threadId
xor ecx,ecx
mov [rsp+20h],rcx
mov r8d,offset ReceiverThreadTxt
invoke CreateThread,,0,,SizeString
invoke CloseHandle,eax
jmp wmBYE
wmDESTROY:invoke CloseHandle,eventReceiverReady
xor edi,edi
@@: invoke CloseHandle,handlesH[rdi*8]
invoke CloseHandle,handlesL[rdi*8]
inc edi
cmp edi,MUTEX_DATA_COUNT
jb @b
jmp wmBYE
wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + IDCANCEL
jne wmBYE
wmCLOSE:invoke EndDialog,,0

wmBYE: mov eax,TRUE
exit0: leave
retn
WndProc endp

ReceiverThreadTxt proc SizeString:dword
local index:byte
local value:byte
local buffer[256]:byte
local begin:dword

lea edi,buffer
add ecx,edi
mov SizeString,ecx
and byte ptr[rdi],0
        invoke  SetDlgItemTextA,hWnd,ID_TXT,edi
invoke GetTickCount
mov begin,eax
        invoke  SetDlgItemTextA,hWnd,ID_TXT1,edi

invoke SetEvent,eventReceiverReady
@@: mov edx,offset handlesL
invoke WaitForMultipleObjects,MUTEX_DATA_COUNT,,FALSE,INFINITE
mov index,al
invoke ReleaseMutex,handlesL[rax*8]
        mov edx,offset handlesH
invoke WaitForMultipleObjects,MUTEX_DATA_COUNT,,FALSE,INFINITE
mov value,al
invoke ReleaseMutex,handlesH[rax*8]
mov al,value
shl al,4
or al,index
;----------------------------------------------
stosb
        invoke SetEvent,hEventAck
cmp edi,SizeString
jb @b
;--------------------------------------------------
lea r8d,buffer
        invoke  SetDlgItemTextA,hWnd,ID_TXT
invoke ResetEvent,eventReceiverReady
;--------------------------------------------------
        invoke GetTickCount
sub eax,begin
mov r8d,eax
mov edx,offset fmt
lea ecx,buffer
        invoke  wsprintfA
lea r8d,buffer
invoke  SetDlgItemTextA,hWnd,ID_TXT1
leave
xor eax,eax
ret
ReceiverThreadTxt endp

TimerFuncProgress proc lParam:qword
mov lParam,rcx
; Сформировать строку для отрисовки
@@: mov r8d,percent
mov edx,offset szText
mov ecx,offset buff
        invoke  wsprintfA
; Назначить строку свойством ProgressBar
mov r8d,offset buff
mov edx,offset szProp
        invoke  SetPropA,hProgress
; Назначить значение процента свойством ProgressBar
mov r8d,percent
mov edx,offset szPerc
        invoke  SetPropA,hProgress
; Перерисовать содержимое окна
        invoke  InvalidateRect,hProgress,0,FALSE
        inc     percent
        cmp     percent,101
        je exit0
invoke Sleep,lParam
jmp @b
exit0: leave
ret
TimerFuncProgress endp

ProgressWindowProc proc hEdit:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
local text:dword
local ps:PAINTSTRUCT               
local hDC:dword
local rcClient:RECT

mov hEdit,rcx
mov uMsg,rdx
mov wParam,r8
mov lParam,r9
cmp edx,WM_PAINT
je wmPAINT
mov [rsp+20h],r9;lParam
mov r9,wParam
mov r8,uMsg
mov rdx,hEdit
        invoke  CallWindowProcA,OldProc
jmp wmBYE
wmPAINT:; Размеры окна
        lea     edx,rcClient
        invoke  GetClientRect,hEdit;,edi
        ; Получить текст из свойств
mov edx,offset szProp
        invoke  GetPropA,hEdit;hProgress
        mov     text,eax
; Начать рисование
        lea     edx,ps
        invoke  BeginPaint,hEdit;hProgress
        mov     hDC,eax
; Шрифт
        invoke  SelectObject,hDC,hFont
        invoke  SetBkMode,hDC,TRANSPARENT
; Отрисовать общий фон
        invoke  GetSysColorBrush,COLOR_WINDOW
        lea     edx,rcClient
        invoke  FillRect,hDC,,eax
; Текст для отрисовки есть?
        cmp     text,0
        je      @f
        invoke  GetSysColor,COLOR_WINDOWTEXT
        invoke  SetTextColor,hDC,eax
mov edx,offset buff
mov qword ptr[rsp+20h],DT_NOPREFIX or DT_SINGLELINE or DT_VCENTER or DT_CENTER
        lea     r9d,rcClient
        invoke  DrawTextA,hDC,,-1               
@@:; Вычислить размеры области для заливки
mov edx,offset szPerc
        invoke  GetPropA,hEdit;hProgress
        mov     ecx,eax
        lea     r9d,rcClient
        mov     eax,[r9].RECT.right
        sub     eax,[r9].RECT.left
        mul     ecx
        xor     edx,edx
        mov     ecx,100
        div     ecx
; Позиция выполненного прогресса
        add     eax,[r9].RECT.left
; Наложить выполненный прогресс
mov ecx,[r9].RECT.left
mov edx,[r9].RECT.top
mov r9d,[r9].RECT.bottom
        invoke  CreateRectRgn,,,eax
        invoke  SelectClipRgn,hDC,eax
        invoke  GetSysColorBrush,COLOR_HIGHLIGHT
lea     edx,rcClient
        invoke  FillRect,hDC,,eax
; Текст для отрисовки есть?
        cmp     text,0
        je      @f
        invoke  GetSysColor,COLOR_HIGHLIGHTTEXT
        invoke  SetTextColor,hDC,eax
mov qword ptr[rsp+20h],DT_NOPREFIX or DT_SINGLELINE or DT_VCENTER or DT_CENTER
mov edx,offset buff
        lea     r9d,rcClient
        invoke  DrawTextA,hDC,,-1
@@: lea     edx,ps
        invoke  EndPaint,hDC
xor eax,eax
wmBYE: leave
ret
ProgressWindowProc endp
;-----------------------------------------------------------------------
.data
szWin db "Mutex Sender",0
Error1 db "The server is not running.",10,"Run?",0
szAppName db "Mutex Reciever",0
szService db "09s",0
hWnd dq ?
buff db 100 dup(?)
szText  db '%u%% completed',0
percent dd 0
hProgress dq ?
hFont dq ?
szProp db 'text',0
szPerc db 'percent',0
szFont db "Verdana",0
OldProc dq ?
hThread2 dq ?
align 10h
eventReceiverReady dq ?
threadHandle dq ?
threadId dd ?
handlesH dq 16 dup(?)
handlesL dq 16 dup(?)
hEventAck dq ?
fmtH db "MtxDataH:%u",0
fmtL db "MtxDataL:%u",0
Format5 db "Song_of_the_South_A",0
EVENT_RECEIVER_READY     db "EvReceiverReady",0
fmt db '%u',0
end
09r.rc#include "resource.h"
#define IDC_DIALOG 200
#define ID_TXT 100
#define ID_ICON 102
#define ID_PROGRESS 106
#define ID_TXT1 107

IDC_DIALOG DIALOGEX 0,0,212,154
STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "Mutex Reciever"

{
CONTROL "",-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 2,-3,207,24
CONTROL "", ID_TXT, STATIC, SS_LEFT | SS_NOPREFIX | WS_CHILD |
WS_VISIBLE | WS_BORDER | WS_TABSTOP, 5, 5, 199, 13
CONTROL "", ID_PROGRESS, STATIC, WS_CHILD | WS_VISIBLE | WS_DISABLED |
WS_BORDER, 2, 22, 146, 19
CONTROL "Exit", IDCANCEL, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 25, 60, 15
CONTROL "",ID_ICON, STATIC, SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128
CONTROL "",ID_TXT1, STATIC, SS_LEFT | SS_NOPREFIX | WS_CHILD |
WS_VISIBLE | WS_BORDER | WS_TABSTOP, 149, 45, 60, 13
}
09s.asm (Server); GUI #
include win64a.inc
ID_TXT equ 100
ID_SEND_TXT equ 101
ID_SEND_ICO equ 102
ID_SEND_WAV equ 103
IDC_IMG1 equ 104
IDC_DIALOG equ 200
IDC_ICON1 equ 500

MUTEX_DATA_COUNT = 16
size_of_buffer = 96
MUTEX_ALL_ACCESS equ 1F0001h

.code
WinMain proc
enter 30h,0
mov r9d,256;cx
mov [rbp-10h],r9
mov qword ptr [rbp-8],LR_DEFAULTCOLOR
invoke LoadImageA,IMAGE_BASE,IDC_ICON1,IMAGE_ICON;,256,256,LR_DEFAULTCOLOR
mov r9d,offset DialogProc
mov qword ptr[rbp-10h],rax;30h-10h=+20h
invoke DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP
invoke RtlExitUserProcess,NULL
WinMain endp

DialogProc proc hWnddlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
local MutexName[256]:word
local SizeString:dword
local hFile:qword
local szReadWrite:qword ;number of bytes actually read or write
local hResource:qword
local pResource:qword
local temp:qword

mov hWnddlg,rcx
mov lParam,r9

cmp edx,WM_INITDIALOG
je wmINITDIALOG
cmp edx,WM_CLOSE
je wmCLOSE
cmp edx,WM_COMMAND
je wmCOMMAND
cmp edx,WM_DESTROY
je wmDESTROY
xor eax,eax
jmp exit0
wmINITDIALOG:mov hWnd,rcx
invoke GetDlgItem,,IDC_IMG1
invoke SendMessageA,eax,STM_SETIMAGE,IMAGE_ICON,lParam
;Create Sync Objects
xor edi,edi
@@: lea ecx,MutexName
mov edx,offset fmtH
invoke wsprintfA,,,edi
lea r8d,MutexName
invoke CreateMutex,0,TRUE
mov mutexesH[rdi*8],rax

lea ecx,MutexName
mov edx,offset fmtL
invoke wsprintfA,,,edi
lea r8d,MutexName
invoke CreateMutex,0,TRUE
mov mutexesL[rdi*8],rax
inc edi
cmp edi,MUTEX_DATA_COUNT
jb @b

mov r9d,offset Format5
invoke CreateEvent,0,TRUE,FALSE
mov hEventAck,rax

mov r9d,offset EVENT_RECEIVER_READY
invoke CreateEvent,NULL,TRUE,FALSE
mov eventReceiverReady,rax
jmp wmBYE
wmSEND_TXT:lea r8d,MutexName
invoke GetDlgItemTextA,hWnd,ID_TXT,,256
inc eax
mov SizeString,eax
;-----------------------------------------------
mov edx,offset szWin
invoke  FindWindowA,NULL
invoke PostMessageA,eax,WM_USER+1,hWnddlg,SizeString
;Send Data--------------------------------------
invoke WaitForSingleObject,eventReceiverReady,500       
        lea esi,MutexName
mov eax,esi
add eax,SizeString
mov SizeString,eax
@@: movzx edi,byte ptr[rsi]
and edi,0Fh
invoke ReleaseMutex,mutexesL[rdi*8]
mov rax,mutexesL[rdi*8]
invoke Sleep,1
invoke WaitForSingleObject,mutexesL[rdi*8],INFINITE

movzx edi,byte ptr[rsi]

shr edi,4
invoke ReleaseMutex,mutexesH[rdi*8]
invoke Sleep,1
invoke WaitForSingleObject,mutexesH[rdi*8],INFINITE
        invoke WaitForSingleObject,hEventAck,INFINITE
        inc esi
cmp esi,SizeString;dec SizeString
jb @b
jmp wmBYE
wmSEND_ICO:
jmp wmBYE
wmSEND_WAV:
jmp wmBYE
wmDESTROY:;Close Sync Objects
invoke CloseHandle,eventReceiverReady

xor edi,edi
@@: invoke CloseHandle,mutexesH[rdi*8]
invoke CloseHandle,mutexesL[rdi*8]
inc edi
cmp edi,MUTEX_DATA_COUNT
jb @b
invoke CloseHandle,hEventAck
jmp wmBYE
; ---------------------------------------------------------------------------
wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + ID_SEND_TXT
        je      wmSEND_TXT
cmp     r8d,BN_CLICKED shl 16 + IDCANCEL
        jne     wmBYE
wmCLOSE:invoke EndDialog,,0
wmBYE: mov eax,TRUE
exit0: leave
retn
DialogProc endp
;---------------------------------------
.data
szWin db "Mutex Reciever",0
hWnd dq ?
EVENT_RECEIVER_READY db "EvReceiverReady",0
Format5 db "Song_of_the_South_A",0
fmtH db "MtxDataH:%u",0
fmtL db "MtxDataL:%u",0
p1 dd 2
wav_file db '..\Images\03.wav',0
align 10h
mutexesH dq 16 dup(?)
mutexesL dq 16 dup(?)
eventReceiverReady dq ?
hEventAck dq ?
p dq ?
end
09s.rc#include "resource.h"
#define ID_TXT 100
#define ID_SEND_TXT 101
#define ID_SEND_ICO 102
#define ID_SEND_WAV 103
#define IDC_IMG1 104

#define IDC_DIALOG 200
#define IDC_ICON1 500

IDC_ICON1 ICON "..\\Images\\icon1.ico"
IDC_ICON2 ICON "..\\Images\\icon2.ico"

IDC_DIALOG DIALOGEX 0, 0, 212, 154
STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "Mutex Sender"
{
CONTROL "",-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE,2,-1,207,24
CONTROL "",IDC_IMG1,STATIC,SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128
CONTROL "Write something and click 'Send Text'",ID_TXT,EDIT,ES_LEFT |
ES_AUTOHSCROLL|WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP,5,7,199,13
CONTROL "Send Text", ID_SEND_TXT, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 27, 60, 15
CONTROL "Send ICO", ID_SEND_ICO, BUTTON, BS_PUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP | WS_DISABLED, 149, 45, 60, 15
CONTROL "Send WAV", ID_SEND_WAV, BUTTON, BS_PUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP | WS_DISABLED, 149, 65, 60, 15
CONTROL "Exit",IDCANCEL,BUTTON,BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE |
WS_TABSTOP, 149, 85, 60, 15
}
Title: Re: Interprocess communication
Post by: jj2007 on August 18, 2022, 06:46:58 PM
Fantastic tutorial, Mikl :eusa_dance:

Next step would be to test which is the fastest (but I don't volunteer for that one, too much other stuff on my todo list). It might be shared DLLs :cool:

I tried googling "IPC" "shared DLL" "faster" "wm_copydata" and got only 5 results, with VB6 on top (see the last answer in that thread).
Title: Re: Interprocess communication
Post by: Mikl__ on August 18, 2022, 08:53:46 PM
Ciao, jj2007! Grazie mille per i complimenti! (https://wasm.in/styles/smiles_s/good3.gif)
Tutorial about interprocess communication is here (https://wasm.in/threads/mezhprocessnoe-vzaimodejstvie.34521/). To repeat these tutorials in masm32.com, I'm missing two things: to your question
QuoteNext step would be to test which is the fastest
I can answer which of the ways are the slowest, these are Interprocess Synchronization: Event Pipes, Mutexes and Semaphores. I even had to maden a progress bar to prevent the user from exiting the program before the data was transferred.
Title: Re: Interprocess communication
Post by: learn64bit on August 18, 2022, 11:45:08 PM
Thanks for share.

I'm reading the "12 WinSockets", I think I need "win64a.inc" and "ws2_32.inc", maybe mine is out dated, or should I download the "IPC.zip" (sorry, I don't know Russian)?
Title: Re: Interprocess communication
Post by: Mikl__ on August 19, 2022, 12:41:40 AM
Hi learn64bit!
These files are for you.
Title: Re: Interprocess communication
Post by: Greenhorn on August 19, 2022, 04:35:25 AM
Hi Mikl,

Quote from: Mikl__ on August 18, 2022, 08:53:46 PM
To repeat these tutorials in masm32.com, I'm missing two things:
  • poor knowledge of English
  • inability to build tables in msm32.com
Your english is very well (or at least your translator is doing a good job).

Regarding tables, you can create tables with BB Code (https://wiki.simplemachines.org/smf/Table).


КонстантаhexОписание формата данных
CF_TEXT1Текстовые данные в виде массив символов. Каждая строка завершается комбинацией символов "\r\n", весь массив закрыт нулем
CF_BITMAP2Битовое изображение в формате, который зависит от устройства отображения (Device Dependent Bitmap)

The Simple Machines Forum Software isn't capable to apply cell borders.
QuoteAlthough the tags are based on the html <table>, <tr> and <td> tags there is no further formatting possible.
Title: Re: Interprocess communication
Post by: learn64bit on August 19, 2022, 06:23:49 AM
Thanks.

Now I'm reading the "12r", and my "win64.inc" also out dated...
Can you upload that one?
Title: Re: Interprocess communication
Post by: Mikl__ on August 19, 2022, 09:04:15 AM
[Here was an unsuccessful attempt to build a table in BB-code. Deleted]

Hi Greenhorn!
Without highlighting cell borders and without the ability to merge cells vertically and horizontally, these tables are looking the worst (https://wasm.in/styles/smiles_s/negative.gif)
Title: Re: Interprocess communication
Post by: Greenhorn on August 19, 2022, 11:24:04 AM
Quote from: Mikl__ on August 19, 2022, 09:04:15 AM
[Here was an unsuccessful attempt to build a table in BB-code. Deleted]

Hi Greenhorn!
Without highlighting cell borders and without the ability to merge cells vertically and horizontally, these tables are looking the worst (https://wasm.in/styles/smiles_s/negative.gif)
Yes, I agree. Mostly I also prefer bordered cells.
Title: Re: Interprocess communication
Post by: Mikl__ on August 19, 2022, 12:14:48 PM
(https://wasm.in/styles/smiles_s/offtopic.gif)
Greenhorn,
I can't translate your motto
QuoteKole Feut un Nordenwind gift en krusen Büdel un en lütten Pint.
Is it correctly? (https://wasm.in/styles/smiles_s/smile3.gif)
QuoteKole flute on north wind brings a crisp pack and a small pint.
can't understand the meaning (https://wasm.in/styles/smiles_s/scratch_one-s_head.gif) This is a quote? Or this is a meaningless set of words?
Title: Re: Interprocess communication
Post by: Greenhorn on August 19, 2022, 03:13:26 PM
Quote from: Mikl__ on August 19, 2022, 12:14:48 PM
(https://wasm.in/styles/smiles_s/offtopic.gif)
Greenhorn,
I can't translate your motto
QuoteKole Feut un Nordenwind gift en krusen Büdel un en lütten Pint.
Is it correctly? (https://wasm.in/styles/smiles_s/smile3.gif)
QuoteKole flute on north wind brings a crisp pack and a small pint.
can't understand the meaning (https://wasm.in/styles/smiles_s/scratch_one-s_head.gif) This is a quote? Or this is a meaningless set of words?

This is "Plattdüütsch (https://ru.wikipedia.org/wiki/%D0%9D%D0%B8%D0%B6%D0%BD%D0%B5%D0%BD%D0%B5%D0%BC%D0%B5%D1%86%D0%BA%D0%B8%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA)" and is an old saying.
It means: "Cold feet and northern wind gives a frizzly bag and a little willy."
Title: Re: Interprocess communication
Post by: learn64bit on August 19, 2022, 04:09:35 PM
I guess a "WAVEHDR struct" should be in your "win64.inc", that's not exist in my outdated "win64.inc".
Title: Re: Interprocess communication
Post by: Mikl__ on August 19, 2022, 07:31:56 PM
Hi learn64bit!
That file is for you.

(https://wasm.in/styles/smiles_s/offtopic.gif)
Salut Greenhorn!
wollt ëmmer Lëtzebuerg gesinn...
Title: Re: Interprocess communication
Post by: learn64bit on August 20, 2022, 07:28:32 PM
Thank you, sir.

And now I'm reading "01 WM_COPYDATA\01s", I think I need another file for "COPYDATASTRUCT struct".
Title: Re: Interprocess communication
Post by: TimoVJL on August 20, 2022, 08:15:26 PM
struct info:

32-bit
COPYDATASTRUCT   12 0Ch bytes
dwData           +0h 4h
cbData           +4h 4h
lpData           +8h 4h

64-bit
COPYDATASTRUCT   24 18h bytes
dwData           +0h 8h
cbData           +8h 4h
lpData           +10h 8h
Title: Re: Interprocess communication
Post by: learn64bit on August 20, 2022, 09:46:22 PM
TimoVJL,

Thank you!
Title: Re: Interprocess communication
Post by: Mikl__ on August 20, 2022, 11:03:06 PM
Hi, Timo!
The struct is wrong, it's right like this
COPYDATASTRUCT struct
  dwData dq ?
  cbData dd ?,? ;<---
  lpData dq ?
COPYDATASTRUCT ends
Title: Re: Interprocess communication
Post by: TimoVJL on August 21, 2022, 01:58:19 AM
Quote from: Mikl__ on August 20, 2022, 11:03:06 PM
Hi, Timo!
The struct is wrong, it's right like this
COPYDATASTRUCT struct
  dwData dq ?
  cbData dd ?,? ;<---
  lpData dq ?
COPYDATASTRUCT ends

How struct info can be wrong ??? It just show offsets and sizes.
your version use filler, but STRUCT 8 also works ?
Title: Re: Interprocess communication
Post by: six_L on August 21, 2022, 12:34:32 PM
Hi,Mikl__
:thumbsup: :thumbsup: :thumbsup:
the wonderful tutorial for IPC
thanks you sharing.
Title: Re: Interprocess communication
Post by: Mikl__ on August 22, 2022, 08:44:43 AM
09. Mutex. Transfer pictures
I created icons of the size 16x16, 32x32, 64x64, 128x128, 256x256 pixels for the experiment
(https://wasm.in/attachments/16x16-jpg.7577/)
(https://wasm.in/attachments/32x32-jpg.7578/)
(https://wasm.in/attachments/64x64-jpg.7579/)
(https://wasm.in/attachments/128x128-jpg.7580/)
(https://wasm.in/attachments/256x256-jpg.7581/)
The transmission is in nibbles+delays for synchronization. The transfer of the 256x256 icon took approximately 42 minutes (2513036/60000=41.88393(3)). It can be seen it is necessary to change the algorithm and increase the transmission speed.

||Size of Resource (bytes)|mSeconds|Bytes/mSec
|text string|37|702|0.05270655
|icon 16х16|1128|20639|0.05465381
|icon 32х32|4264|81776|0.05214244
|icon 64х64|16936|323546|0.05234495
|icon 128х128|67624|543882|0.12433579
|icon 256х256|270376|2513036|0.10758939
Title: Re: Interprocess communication
Post by: jj2007 on August 22, 2022, 09:39:05 AM
That is incredibly slow, Mikl :sad:

For comparison, see my attached server/client pair; it uses WM_COPYDATA to transfer Windows.inc (977412 bytes) in less than a second.
Title: Re: Interprocess communication
Post by: Mikl__ on August 22, 2022, 10:36:00 AM
Ciao, jj2007! Grazie per l'esempio...
QuoteThat is incredibly slow
I know about it (https://wasm.in/styles/smiles_s/yes3.gif). I already answered your question
QuoteNext step would be to test which is the fastest
I can answer which of the ways are the slowest, these are Interprocess Synchronization: Event Pipes, Mutexes and Semaphores. I even had to maden a progress bar to prevent the user from exiting the program before the data was transferred. The rest of the methods are quite faster (several MBytes are transferred in several mSec). They are: WinSockets, Dynamic Data Exchange, Named Pipes, MailSlots, Memory Mapped File, Paging File, ClipBoard and WM_COPYDATA
Title: Re: Interprocess communication
Post by: Mikl__ on September 07, 2022, 09:12:41 AM
[deleted by me]
Title: Re: Interprocess communication
Post by: jj2007 on September 07, 2022, 09:59:41 AM
My dear friend Mikl,

If I had a 48 hours day, I might be able to help you - but 24 hours are not even enough for my own babies... sorry :thup:

We all adore what you are doing, but don't expect too much from us lazybones :cool:
Title: Re: Interprocess communication
Post by: Biterider on September 07, 2022, 04:23:14 PM
Hi Mikl_
I'm not sure if I understood this correctly, but as a text file you could use the well-known bible.txt (https://github.com/mxw/grmr/blob/master/src/finaltests/bible.txt). You could use any graphics file (.bmp, .png, etc.) as a binary file and reconstruct it on the receiving end and display it again (like you did before).

Biterider
Title: Re: Interprocess communication
Post by: six_L on September 08, 2022, 04:06:54 AM
Hi,Mikl_
you'v done the great work.
QuoteHi All!
Help me too... I would like to finish the tutorial. I still need bin-files and source files for interprocessor communication via:

    OLE/ActiveX/COM
    Distributed Component Object Model (DCOM)
    Remote Method Invocation (RMI)
    Common Object Request Broker Architecture (CORBA)
    Remote Procedure Call (RPC)
    Local Procedure Call (LPC)
    Microsoft Message Queue (MSMQ)

An example is enough for me to transfer a small text string from application to application. Pleeez!
Your codes about IPC is the first I'v seen. i can only learn.
Title: Re: Interprocess communication
Post by: Mikl__ on October 01, 2022, 11:01:29 AM
Remote Procedure Call (RPC)
(https://wasm.in/attachments/14-jpg.7594/)
Transferring text, pictures and music between apps is almost instantaneous! (https://wasm.in/styles/smiles_s/smile3.gif)
Server application text 14r.asm
; GUI #
include win64a.inc
IDC_DIALOG    equ 200
IDC_TXT          equ 100
ID_ICON          equ 102
IDC_ICON1      equ 500
RPC_S_OK       equ 0
RPC_C_LISTEN_MAX_CALLS_DEFAULT equ 1234
RPC_VERSION  struc
    MajorVersion dw ?
    MinorLinker  dw ?
RPC_VERSION  ends
RPC_SERVER_INTERFACE struct
    Len        dd ?
    InterfaceId          GUID <>
    a           RPC_VERSION <>
    TransferSyntax    GUID <>
    b           RPC_VERSION <>
            dd ?
    DispatchTable                   dq ?
    RpcProtseqEndpointCount  dd ?,?
    RpcProtseqEndpoint          dq ?
    DefaultManagerEpv           dq ?
    InterpreterInfo                 dq ?
    Flags                               dd ?,?
RPC_SERVER_INTERFACE ends

.code
WinMain proc
        enter    30h,0
        mov    r9d,offset DialogProc
        and    qword ptr[rbp-10h],0
        invoke  DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP
        invoke  RtlExitUserProcess,NULL
WinMain endp
DialogProc proc hWnddlg:qword,msg:qword,wParam:qword,lParam:qword
       mov    hWnddlg,rcx
       mov    lParam,r9

        cmp    edx,WM_INITDIALOG
        je     wmINITDIALOG
        cmp    edx,WM_CLOSE
        je    wmCLOSE
        cmp    edx,WM_COMMAND
        je    wmCOMMAND
        cmp    edx,WM_DESTROY
        je    wmDESTROY
       xor    eax,eax
        jmp    exit0
wmDESTROY:
    jmp    wmBYE
wmINITDIALOG:mov hWnd,rcx
       invoke    GetProcessHeap
       mov     hHeap,rax
; Найти окно отправителя
        mov    edx,offset szWin
        invoke  FindWindowA,NULL
        or      eax,eax
        jnz    wmBYE
       mov    edx,offset Error1
       mov    r8d,offset szAppName
    invoke    MessageBoxA,hWnddlg,,,MB_ICONEXCLAMATION or MB_YESNO
    cmp    eax,IDNO
    jz      wmBYE
    mov    ecx,offset szService
    invoke    WinExec,,SW_SHOW
;start Rpc Server And Listen---------------------------------
    mov    r8d,offset endpoint
    mov    ecx,offset protocol
    invoke    RpcServerUseProtseqEpA,,RPC_C_LISTEN_MAX_CALLS_DEFAULT,,0
    or    eax,eax;cmp    eax,RPC_S_OK
    jz    @f
    mov    edx,offset Format
    jmp    @0
@@:    mov    ecx,offset RPC_SampleInterface_v1_0_s_ifspec
    invoke    RpcServerRegisterIf,,0,0
    or    eax,eax;cmp    eax,RPC_S_OK
    jz    @f
    mov    edx,offset aUnableToRegist
    jmp    @0
; Start to listen for remote procedure
; calls for all registered interfaces.
; This call will not return until
; RpcMgmtStopServerListening is called.
@@:    invoke    RpcServerListen,1,\;Recommended minimum number of threads.
    RPC_C_LISTEN_MAX_CALLS_DEFAULT,\;Recommended maximum number of threads
    TRUE
    or    eax,eax;cmp    eax,RPC_S_OK
    jz    wmBYE
    mov    edx,offset aUnableToStartL
    mov    r8d,offset szAppName
    invoke    MessageBoxA,hWnddlg,,,MB_ICONEXCLAMATION or MB_OK
    mov    ecx,offset RPC_SampleInterface_v1_0_s_ifspec
    invoke    RpcServerUnregisterIf,,0,0
    or    eax,eax;cmp    eax,RPC_S_OK
    jz    wmBYE
    mov    edx,offset aUnableToUnregi
@0:    mov    r8d,offset szAppName
    invoke    MessageBoxA,hWnddlg,,,MB_ICONEXCLAMATION or MB_OK
    jmp    wmBYE
;--------------------------------------------------
wmCOMMAND:cmp    r8d,BN_CLICKED shl 16 + IDCANCEL
    jne    wmBYE
wmCLOSE:invoke    EndDialog,,0
wmBYE:    mov    eax,TRUE
exit0:    leave
    retn
DialogProc endp

j_NdrServerCall2 proc
    jmp    NdrServerCall2
j_NdrServerCall2 endp
; Memory allocation function for RPC.
; The runtime uses these two functions for allocating/deallocating
; enough memory to pass the string to the server.
MIDL_user_allocate proc len:qword
    mov    r8d,ecx
    invoke    RtlAllocateHeap,hHeap,0
    leave
    retn
MIDL_user_allocate endp
MIDL_user_free proc lpMem:qword
    mov    r8d,ecx
    invoke    HeapFree,hHeap,0
    leave
    retn
MIDL_user_free endp
RPC_SampleInterface_sampleFunc proc handle_t:qword,size_:dword,buffer:qword
local    hWaveOut:qword
local    lpwiocb:WAVEHDR

    mov    buffer,r8
    mov    size_,edx
    mov    handle_t,rcx
    cmp    byte ptr[r8],CF_TEXT
    jne    @f
    and    byte ptr[r8+rdx],0
    inc    r8
    invoke    SetDlgItemTextA,hWnd,IDC_TXT;,buffer
    jmp    @0
;------------------------------------------------------------------
@@:    cmp    byte ptr[r8],CF_BITMAP
    jne    @f
    lea    ecx,[r8+1]
    invoke  CreateIconFromResourceEx,,,TRUE,30000h,256,256,LR_DEFAULTCOLOR
    invoke  SendDlgItemMessageA,hWnd,ID_ICON,STM_SETIMAGE,IMAGE_ICON,eax
    jmp    @0
;------------------------------------------------------------------
@@:    mov    r8,buffer
;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data) = 14h
        add    r8d,14h
        invoke    waveOutOpen,&hWaveOut,WAVE_MAPPER,,0,0,WAVE_ALLOWSYNC
; Подготавливаем заголовок для вывода
    lea    edi,lpwiocb
    mov    edx,edi
    xor    eax,eax
    mov    ecx,(sizeof WAVEHDR)/8
    rep    stosq

    mov    rax,buffer
;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data)+\
;(Type of format)+(Number of Channels)+(Sample Rate)+(Sample Rate*BitsPerSample*Channels/8)+\
;(BitsPerSample*Channels/8)+(Bits per sample)+("data" chunk header)+(Size of the data section)=2Ch
    add    rax,2Ch
    mov    [rdx].WAVEHDR.lpData,rax ;адрес блока данных
    mov    eax,size_
    sub    eax,2Ch
    mov    [rdx].WAVEHDR.dwBufferLength,eax ;размер блока данных
    invoke    waveOutPrepareHeader,hWaveOut,,sizeof WAVEHDR
; Запускаем проигрывание блока
    invoke    waveOutWrite,hWaveOut,&lpwiocb,sizeof WAVEHDR
@@:    test    lpwiocb.dwFlags,WHDR_DONE
    jz    @b
    invoke    waveOutUnprepareHeader,hWaveOut,&lpwiocb,sizeof WAVEHDR
    invoke    waveOutClose,hWaveOut
@0:    leave
    retn
RPC_SampleInterface_sampleFunc endp
;-----------------------------------------------------------------------
.data
szWin        db "Remote Procedure Call Sender",0
Error1        db "The server is not running.",10,"Run?",0
szAppName    db "Remote Procedure Call Reciever",0
szService    db "14s",0
protocol    db "ncalrpc",0
endpoint    db "{46E785FC-BCCC-46B8-B161-D6C90D391670}",0; // Unique user-defined endpoint ID in a free form
Format        db "Unable to setup protocol sequence",0
aUnableToRegist    db "Unable to register the interface",0
aUnableToStartL db "Unable to start listening",0
aUnableToUnregi db "Unable to unregister the interface",0
hWnd        dq ?
hHeap        dq ?
;
RPC_SampleInterface_v1_0_s_ifspec label RPC_SERVER_INTERFACE
    dd sizeof RPC_SERVER_INTERFACE;Length
    GUID <8A4A7813h,0ADAAh,49BCh,{99h,6Ah,4Dh,47h,71h,5Fh,0CAh,40h}>
    RPC_VERSION <1,0>          ;RPC_VERSION  MajorVersion: u16, MinorVersion: u16 +14
    GUID <8A885D04h,1CEBh,11C9h,{9Fh,0E8h,8,0,2Bh,10h,48h,60h}>               ;+20
    RPC_VERSION <2,0>          ;RPC_VERSION  MajorVersion: u16, MinorVersion: u16 +28
    dd 0                                                 ;+2C
    dq RPC_SampleInterface_v1_0_DispatchTable;DispatchTable: *mut RPC_DISPATCH_TABLE +30
    dd 0,0 ;RpcProtseqEndpointCount: u32                 +38
    dq 0   ;RpcProtseqEndpoint: *mut RPC_PROTSEQ_ENDPOINT +3C
    dq 0   ;DefaultManagerEpv: *mut c_void               +44
    dq RPC_SampleInterface_ServerInfo;InterpreterInfo: *const c_void +4C
    dd 4000000h  ;Flags: u32
RPC_SampleInterface_v1_0_DispatchTable:
    dq 1
    dq RPC_SampleInterface_table
    dq 0
RPC_SampleInterface_table:
    dq j_NdrServerCall2
    dq 0
;---------------------------------------------
RPC_SampleInterface_ServerInfo:
        dq RPC_SampleInterface_StubDesc
        dq RPC_SampleInterface_ServerRoutineTable
        dq RPC_SampleInterface__MIDL_ProcFormatString
        dq RPC_SampleInterface_FormatStringOffsetTable
        dq 0
        dq 0
        dq 0
        dq 0
RPC_SampleInterface_StubDesc:
        dq RPC_SampleInterface_v1_0_s_ifspec
        dq MIDL_user_allocate   
        dq MIDL_user_free       
        dq 0                   
        dq 0                   
        dq 0                   
        dq 0                   
        dq 0                   
        dq RPC_SampleInterface__MIDL_TypeFormatString
        dd 1
        dd 50002h
        dq 0
        dd 8010274h
        dq 0
        dq 0
        dq 0
        dd 0
        dq 1
        dq 0
        dq 0
        dq 0
;------------------------------------------
RPC_SampleInterface_ServerRoutineTable dq RPC_SampleInterface_sampleFunc
RPC_SampleInterface__MIDL_ProcFormatString:
    db 0,48h
    dd 0
    dw 0
    dw 18h
    db 32h,0
    dw 0
    dw 8
    dw 0
    db 42h,2,0Ah,5
    dw 0
    dw 1
    dw 0
    dw 0
    dw 48h
    dw 8
    db 8,0
    dw 10Bh
    dw 10h
    dw 6
    db 0
RPC_SampleInterface_FormatStringOffsetTable:
    dd 0
RPC_SampleInterface__MIDL_TypeFormatString:
    dw 0
    db 11h,0
    dw 2
    db 1Bh,0
    dw 1
    db 29h,0
    dw 8
    dw 1
    db 2,5Bh,0
end
resources (14r.rc)#include "resource.h"
#define IDC_DIALOG    200
#define IDC_TXT        100
#define ID_ICON        102

IDC_DIALOG DIALOG 0,0,212,140
STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "Remote Procedure Call Reciever"
BEGIN
    CONTROL    "",-1,"BUTTON",BS_GROUPBOX, 2, -1, 207, 24
    CONTROL    "",IDC_TXT,"STATIC",WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL,5,7,199,13
    DEFPUSHBUTTON  "Exit",IDCANCEL,149,27,60,15
        CONTROL    1,ID_ICON,"STATIC",WS_CHILDWINDOW | SS_ICON,5,23,128,128
END
Application client text (14s.asm); GUI #
include win64a.inc
ID_TXT        equ 100
ID_SEND_TXT    equ 101
ID_SEND_ICO    equ 102
ID_SEND_WAV    equ 103
IDC_DIALOG    equ 200
IDC_ICON1    equ 500
IDC_IMG1     equ 104
RPC_S_OK    equ 0
RPC_C_LISTEN_MAX_CALLS_DEFAULT equ 1234

RPC_VERSION  struc
    MajorVersion dw ?
    MinorLinker  dw ?
RPC_VERSION  ends

RPC_CLIENT_INTERFACE struct
    Len        dd ?
    InterfaceId    GUID <>
    a        RPC_VERSION <>
    TransferSyntax    GUID <>
    b        RPC_VERSION <>
            dd ?
    DispatchTable    dq ?
    RpcProtseqEndpointCount  dd ?,?
    RpcProtseqEndpoint dq ?
    DefaultManagerEpv dq ?
    InterpreterInfo dq ?
    Flags        dd ?,?
RPC_CLIENT_INTERFACE ends
.code
WinMain proc
    enter    30h,0
    mov    r9d,256;cx
    mov    [rbp-10h],r9
    mov    qword ptr [rbp-8],LR_DEFAULTCOLOR
    invoke    LoadImageA,IMAGE_BASE,IDC_ICON1,IMAGE_ICON;,256,256,LR_DEFAULTCOLOR
    mov    r9d,offset DialogProc
    mov    qword ptr[rbp-10h],rax;30h-10h=+20h
    invoke    DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP
    invoke    RtlExitUserProcess,NULL
WinMain endp

DialogProc proc hWnddlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
local    hResource:qword
local    pResource:qword
local    FSize:qword
local    hFile:dword
local    szReadWrite:qword    ;number of bytes actually read or write
local    stringBinding:qword

    mov    hWnddlg,rcx
    mov    lParam,r9

    cmp    edx,WM_INITDIALOG
        je    wmINITDIALOG
    cmp    edx,WM_CLOSE
    je    wmCLOSE
    cmp    edx,WM_COMMAND
    je    wmCOMMAND
    cmp    edx,WM_DESTROY
    je    wmDESTROY
    xor    eax,eax
    jmp    exit0
wmDESTROY:
    jmp    wmBYE
wmSEND_WAV:mov    ecx,offset wav_file
    invoke    CreateFile,,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,\
        FILE_ATTRIBUTE_ARCHIVE,0
        mov    hFile,eax
        invoke    GetFileSize,eax,0
    mov    FSize,rax
    invoke    GlobalAlloc,GPTR,eax
    mov    p,rax
    lea    r9d,szReadWrite
    and    qword ptr[rsp+20h],0
        invoke    ReadFile,hFile,eax,FSize
        invoke    CloseHandle,hFile
    invoke    RPC_SampleInterface_sampleFunc,bindingHandle,FSize,p
    jmp    wmBYE
wmSEND_ICO:mov    edx,p1
    invoke    FindResource,0,,RT_ICON; find the resource
    mov    hResource,rax
    invoke  SizeofResource,0,eax        ; get its size
    mov    FSize,rax
    inc    eax
    invoke    GlobalAlloc,GPTR,eax
    mov    p,rax
    mov    edi,eax
    invoke    LoadResource,0,hResource    ; load the resource
    invoke    LockResource,eax;pResource
    mov    esi,eax
    mov    byte ptr[rdi],CF_BITMAP
    inc    edi
    mov    rcx,FSize
    rep    movsb
    mov    rdx,FSize
    inc    edx
    invoke    RPC_SampleInterface_sampleFunc,bindingHandle,,p
    mov    ecx,256
    and    qword ptr[rsp+30h],LR_DEFAULTCOLOR;LR_DEFAULTCOLOR=0
    mov    [rsp+20h],rcx
    mov    [rsp+28h],rcx
    mov    rcx,p
    inc    ecx
    invoke  CreateIconFromResourceEx,,FSize,TRUE,30000h;270376,TRUE,30000h
    mov    [rsp+20h],rax
    invoke  SendDlgItemMessageA,hWnd,IDC_IMG1,STM_SETIMAGE,IMAGE_ICON
    xor    p1,11b
    jmp    wmBYE
wmSEND_TXT:invoke GlobalAlloc,GPTR,256
    mov    p,rax
    mov    byte ptr[rax],CF_TEXT
    inc    eax
    invoke  GetDlgItemTextA,hWnddlg,ID_TXT,eax,256
    inc    eax
    invoke    RPC_SampleInterface_sampleFunc,bindingHandle,eax,p
    jmp    wmBYE
wmINITDIALOG:mov hWnd,rcx
        invoke    GetProcessHeap
    mov     hHeap,rax
    invoke    GetDlgItem,hWnddlg,IDC_IMG1
    invoke    SendMessageA,eax,STM_SETIMAGE,IMAGE_ICON,lParam
;setup Rpc-----------------------------
    lea    ecx,stringBinding
    mov    [rsp+28h],rcx
    movr    qword ptr[rsp+20h],security
    mov    r9d,offset endpoint
    mov    edx,offset protocol
    invoke    RpcStringBindingComposeA,0,,0
    or    eax,eax;eax=RPC_S_OK?
    jne    wmBYE
    mov    edx,offset bindingHandle
    invoke    RpcBindingFromStringBindingA,stringBinding
        invoke    RpcStringFreeW,&stringBinding
    or    eax,eax;eax=RPC_S_OK?
    jne    wmBYE
;----------------------------------------------------
    cmp    bindingHandle,0
    jnz    wmBYE
    mov    r8d,offset szWin
    mov    ecx,offset Error
    invoke    MessageBoxA,hWnd,,,MB_OK
    jmp    wmBYE
wmCOMMAND:cmp    r8d,BN_CLICKED shl 16 + ID_SEND_TXT
        je      wmSEND_TXT
        cmp    r8d,BN_CLICKED shl 16 + ID_SEND_WAV
        je      wmSEND_WAV
        cmp    r8d,BN_CLICKED shl 16 + ID_SEND_ICO
    je      wmSEND_ICO
    cmp     r8d,BN_CLICKED shl 16 + IDCANCEL
        jne     wmBYE
wmCLOSE:invoke    EndDialog,,0
    mov    ecx,offset bindingHandle
    invoke    RpcBindingFree
wmBYE:    mov    eax,TRUE
exit0:    leave
    retn
DialogProc endp
RPC_SampleInterface_sampleFunc proc bindingHandle:qword,bufferLength:dword,buffer:qword

        mov    [rsp+20h],r8;buffer
        mov    r9d,edx;bufferLength
        mov    r8,rcx;bindingHandle
        lea    rdx, RPC_SampleInterface__MIDL_ProcFormatString
        lea    rcx,RPC_SampleInterface_StubDesc ; pStubDescriptor
        invoke    NdrClientCall2
        leave
        retn
RPC_SampleInterface_sampleFunc endp

MIDL_user_allocate proc len:qword
    mov    r8d,ecx
    invoke    RtlAllocateHeap,hHeap,0
    leave
    ret
MIDL_user_allocate endp
MIDL_user_free proc lpMem:qword
    mov    r8d,ecx
    invoke    HeapFree,hHeap,0
    leave
    ret
MIDL_user_free endp
;---------------------------------------
.data
szWin        db 'Remote Procedure Call Reciever',0
Error        db "Unable to setup an RPC connection, exiting...",0
bindingHandle    dq ?
hWnd        dq ?
protocol    db "ncalrpc",0
endpoint    db "{46E785FC-BCCC-46B8-B161-D6C90D391670}",0; // Unique user-defined endpoint ID in a free form
security    db "Security=impersonation static false",0
p    dq ?
p1      dd 1
RPC_SampleInterface__MIDL_ProcFormatString:
    db 0
    db 48h    ; H
    dd 0
    dw 0
    dw 18h
    db 32h,    0
    dw 0
    dw 8
    dw 0
    db 42h,2,10,5
    dw 0
    dw 1
    dw 0
    dw 0
    dw 48h
    dw 8
    db 8, 0
    dw 10Bh
    dw 10h
    dw 6
    db 0
RPC_SampleInterface_StubDesc:
    dq RPC_SampleInterface___RpcClientInterface; RpcInterfaceInformation
    dq MIDL_user_allocate;    pfnAllocate
    dq MIDL_user_free; pfnFree
    dq RPC_SampleInterface__MIDL_AutoBindHandle; IMPLICIT_HANDLE_INFO.pAutoHandle
    dq 0            ; apfnNdrRundownRoutines
    dq 0            ; aGenericBindingRoutinePairs
    dq 0            ; apfnExprEval
    dq 0            ; aXmitQuintuple
    dq RPC_SampleInterface__MIDL_TypeFormatString; pFormatTypes
    dd 1            ; fCheckBounds
    dd 50002h        ; Version
    dq 0            ; pMallocFreeStruct
    dd 8010274h        ; MIDLVersion
    db 4 dup(0)
    dq 0            ; CommFaultOffsets
    dq 0            ; aUserMarshalQuadruple
    dq 0            ; NotifyRoutineTable
    dq 1            ; mFlags
    dq 0            ; CsRoutineTables
    dq 0            ; ProxyServerInfo
    dq 0            ; pExprInfo
RPC_SampleInterface___RpcClientInterface label RPC_CLIENT_INTERFACE
    dd sizeof RPC_CLIENT_INTERFACE;Length struct;+0
    GUID <8A4A7813h,0ADAAh,49BCh,{99h,6Ah,4Dh,47h,71h,5Fh,0CAh,40h}>
    RPC_VERSION <1,0>
    GUID <8A885D04h,1CEBh,11C9h,{9Fh,0E8h,8,0,2Bh,10h,48h,60h}>
    RPC_VERSION <2,0>
    dd 0;+2C
    dq 0;  PRPC_DISPATCH_TABLE   DispatchTable;+30h
    dd 0,0;  unsigned int          RpcProtseqEndpointCount;+38h
    dq 0;  PRPC_PROTSEQ_ENDPOINT RpcProtseqEndpoint;+40h
    dq 0;  ULONG_PTR             Reserved;+48h
    dq 0;  void const            *InterpreterInfo;+50h
    dq 0;+58h
    dd 0;unsigned int          Flags;+5Ch
RPC_SampleInterface__MIDL_AutoBindHandle dq 0,0
RPC_SampleInterface__MIDL_TypeFormatString:
    dw 0
    db 11h,0
    dw 2
    db 1Bh,0
    dw 1
    db 29h,0
    dw 8
    dw 1
    db 2,5Bh,0
;-------------------------------
hHeap    dq ?
wav_file db '..\Images\03.wav',0
end
resources (14s.rc)#include "resource.h"
#define ID_TXT       100
#define ID_SEND_TXT  101
#define ID_SEND_ICO  102
#define ID_SEND_WAV  103
#define IDC_IMG1     104

#define IDC_DIALOG   200
#define IDC_ICON1    500

IDC_ICON1 ICON "..\\Images\\icon1.ico"
IDC_ICON2 ICON "..\\Images\\icon2.ico"

IDC_DIALOG DIALOG 0, 0, 212, 140
STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "Remote Procedure Call Sender"
BEGIN
    CONTROL "",-1,"BUTTON",BS_GROUPBOX, 2, -1, 207, 24
    CONTROL "",IDC_IMG1,"Static",WS_CHILDWINDOW | WS_VISIBLE | SS_ICON,5,23,128,128
    CONTROL "Write something and click 'Send Text'",ID_TXT,"EDIT",WS_BORDER | WS_TABSTOP |  ES_AUTOHSCROLL,5,7,199,13
    DEFPUSHBUTTON   "Send Text",ID_SEND_TXT,149,27,60,15
    PUSHBUTTON      "Send ICO", ID_SEND_ICO,149,45,60,15
    PUSHBUTTON      "Send WAV", ID_SEND_WAV,149,65,60,15
    PUSHBUTTON      "Exit",     IDCANCEL,   149,85,60,15
END
in attachment ASM-/RC-/EXE-files
Title: Re: Interprocess communication
Post by: Mikl__ on October 03, 2022, 10:05:24 PM
Hi All!
Quote14.zip (246.48 kB - downloaded 4 times.)
Sluggish reaction, I spent a whole month on this example for Remote Procedure Call (https://wasm.in/styles/smiles_s/scratch_one-s_head.gif) Typical quantity of downloads 19-20. Most likely, interest in Interprocess communication is lost...
Title: Re: Interprocess communication
Post by: Greenhorn on October 03, 2022, 10:19:16 PM
Quote from: Mikl__ on October 03, 2022, 10:05:24 PM
Hi All!
Quote14.zip (246.48 kB - downloaded 4 times.)
Sluggish reaction, I spent a whole month on this example for Remote Procedure Call (https://wasm.in/styles/smiles_s/scratch_one-s_head.gif)

Hi Mikl,

I guess it's becausee the folks are overwhelmed by this example.

Absolutely great what you did on this tutorial.  :thumbsup:

Sample 14 works fine except the "Send WAV" gives an exception.
Title: Re: Interprocess communication
Post by: Biterider on October 03, 2022, 10:30:56 PM
Hi Mikl__
Quote from: Mikl__ on October 03, 2022, 10:05:24 PMSluggish reaction, I spent a whole month on this example for Remote Procedure Call... Most likely, interest in Interprocess communication is lost...
Absolutely not, RPC is technically a very important topic!

At this point I would like to thank you for all your efforts.  :thumbsup:


Biterider
Title: Re: Interprocess communication
Post by: jj2007 on October 03, 2022, 10:43:48 PM
Mikl,

You are doing a great job, a service for the community, and I am sorry that I don't have the time to follow your tutorials more thoroughly.

Thank you :thup:

Jochen
Title: Re: Interprocess communication
Post by: Mikl__ on October 03, 2022, 10:52:40 PM
Hi Biterider and Greenhorn!
Thanks for answers!
Greenhorn
where is the 03.wav file?
Remote Procedure Call
| |
| 14
| |
| + ---14r.exe
| +---14s.exe
|
Images
  |
  +--- 03.wav
Ciao jj2007!
Judging by the addresses on your dump, the crash happens somewhere inside the rpcrt4.dll While I can't tell what is causing the error, I need to trigger it on some other computer. Most likely that the error is due to the fact that the transferred pictures have a size of 270K and the wav file has a size of 1.6M
Title: Re: Interprocess communication
Post by: Greenhorn on October 03, 2022, 11:03:27 PM
Quote from: Mikl__ on October 03, 2022, 10:52:40 PM
Hi Biterider and Greenhorn!
Thanks for answers!
Greenhorn
where is the 03.wav file?
Remote Procedure Call
| |
| 14
| |
| + ---14r.exe
| +---14s.exe
|
Images
  |
  +--- 03.wav


It's missing.  :tongue:

My download folder is full of stuff. I have to search for the other parts of the tutorial ...
Title: Re: Interprocess communication
Post by: jj2007 on October 03, 2022, 11:05:11 PM
Copy any wav file to ..\Images\03.wav, and tut14 will work fine :thumbsup:
Title: Re: Interprocess communication
Post by: Greenhorn on October 03, 2022, 11:22:28 PM
Yes, now it works. But I have to run 14r.exe first so that it starts 14s.exe to get it working.  :eusa_dance:
Title: Re: Interprocess communication
Post by: Mikl__ on October 03, 2022, 11:24:12 PM
jj2007
Va bene! (https://wasm.in/styles/smiles_s/good3.gif)


Greenhorn
You can first run 14s.exe, and then 14r.exe, they only work in pairs.
Title: Re: Interprocess communication
Post by: Greenhorn on October 03, 2022, 11:31:29 PM
Quote from: Mikl__ on October 03, 2022, 11:24:12 PM
jj2007
Va bene! (https://wasm.in/styles/smiles_s/good3.gif)


Greenhorn
You can first run 14s.exe, and then 14r.exe, they only work in pairs.

If I do so I get an exception, no matter which "send" button I press.  :sad:
Title: Re: Interprocess communication
Post by: Mikl__ on October 03, 2022, 11:35:22 PM
QuoteIf I do so I get an exception, no matter which "send" button I press.
The more such messages I receive, the faster I will correct errors.
Title: Re: Interprocess communication
Post by: Greenhorn on October 03, 2022, 11:36:41 PM
I have to fix the 'Just In Time Debugger' issue, then I can tell you more.

But at the moment I'm cooking pears, beans and bacon ... (yummy)
Title: Re: Interprocess communication
Post by: Mikl__ on October 03, 2022, 11:43:16 PM
QuoteBut at the moment I'm cooking pears, beans and bacon ... (yummy)

I know (https://wasm.in/styles/smiles_s/yes3.gif)
(https://images.eatsmarter.com/sites/default/files/styles/576x432/public/bacon-green-bean-stew-with-pears-580516.jpg)

(https://images.eatsmarter.com/sites/default/files/styles/576x432/public/north-german-bean-stew-with-pears-and-bacon-564214.jpg)
Title: Re: Interprocess communication
Post by: TimoVJL on October 03, 2022, 11:56:18 PM
Quote from: Greenhorn on October 03, 2022, 11:22:28 PM
Yes, now it works. But I have to run 14r.exe first so that it starts 14s.exe to get it working.  :eusa_dance:
only this way apps works
Title: Re: Interprocess communication
Post by: Mikl__ on October 03, 2022, 11:58:46 PM
Thank you, Timo
Title: Re: Interprocess communication
Post by: Greenhorn on October 04, 2022, 02:20:42 AM
Quote from: TimoVJL on October 03, 2022, 11:56:18 PM
Quote from: Greenhorn on October 03, 2022, 11:22:28 PM
Yes, now it works. But I have to run 14r.exe first so that it starts 14s.exe to get it working.  :eusa_dance:
only this way apps works
Quote from: Mikl__ on October 03, 2022, 11:58:46 PM
Thank you, Timo

OK, got it. Thanks.


Quote from: Mikl__ on October 03, 2022, 11:43:16 PM
QuoteBut at the moment I'm cooking pears, beans and bacon ... (yummy)

I know (https://wasm.in/styles/smiles_s/yes3.gif)
Title: Re: Interprocess communication
Post by: Mikl__ on November 05, 2022, 11:38:08 AM
Hi All!
Does anyone have a working example of sending a text string for illustrating interprocess communication via OLE? Many thanks in advance! (https://wasm.in/styles/smiles_s/thank_you2.gif)
Title: Re: Interprocess communication
Post by: jj2007 on November 05, 2022, 11:52:32 AM
Do you mean OLE, RPC or DDE?

include \masm32\MasmBasic\MasmBasic.inc
  Init
  SendWordCommands ; prepare a DDE session; Word must be running
  .if eax
SendWordCommands '[FileNewDefault:InsertFile "\Masm32\include\Windows.inc"]'
SendWordCommands '[MsgBox "Cute"]'
  .else
MsgBox 0, "MS Word doesn't answer", "Sorry", MB_OK
  .endif
  SendWordCommands exit ; finish DDE session
EndOfCode
Title: Re: Interprocess communication
Post by: Mikl__ on November 05, 2022, 06:16:15 PM
Ciao jj!
Grazie mille per l'esempio!
I mean COM, not DDE
Title: Re: Interprocess communication
Post by: TimoVJL on November 05, 2022, 09:15:11 PM
Using COM for IPC
https://learn.microsoft.com/en-us/windows/win32/ipc/interprocess-communications#using-com-for-ipc
https://stackoverflow.com/questions/31096671/how-to-use-com-to-transfer-data-between-two-processes-for-ipc-inter-process-c
Title: Re: Interprocess communication
Post by: Mikl__ on November 06, 2022, 02:03:48 AM
Thank you Timo!
Title: Re: Interprocess communication
Post by: Mikl__ on December 06, 2022, 11:03:37 PM
DLL
An important feature of the use of dynamic libraries is the possibility of simultaneous use of one library by several modules. A dynamic library becomes an extension of the application that launched it, being loaded into the address space of the process. The data of one process is available from the dynamic library, and the data of the dynamic library is available to another process. When linking a dynamic library, the data segment is declared as a shared section. When you run an application that will load a dynamic link library, this area of memory will be shared by all applications.

(https://wasm.in/attachments/06-jpg.7675/)

Transferring text, pictures and music between apps is almost instantaneous!

Server application text (15s.asm); GUI #
include win64a.inc
includelib IPC.lib
ExeToDll PROTO :qword,:dword,:dword
DllToExe PROTO :qword,:dword,:dword
ID_TXT equ 100
ID_SEND_TXT equ 101
ID_SEND_ICO equ 102
ID_SEND_WAV equ 103
IDC_DIALOG equ 200
IDC_ICON1 equ 500
IDC_IMG1 equ 104
.code
WinMain proc ;dummy:qword
enter 30h,0
mov r9d,256
mov [rbp-10h],r9
and     qword ptr [rbp-8],LR_DEFAULTCOLOR
invoke LoadImageA,IMAGE_BASE,IDC_ICON1,IMAGE_ICON;,0,0,LR_DEFAULTCOLOR
mov r9d,offset DialogProc
mov [rbp-10h],rax
invoke DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP
invoke RtlExitUserProcess,NULL
WinMain endp
DialogProc proc hWnddlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
local buffer:qword
local cdata:COPYDATASTRUCT
local FSize:dword
local hFile:dword
local p:qword
local szReadWrite:qword ;number of bytes actually read or write
local hResource:qword
local pResource:qword
local temp:qword
mov hWnddlg,rcx
mov lParam,r9
cmp edx,WM_CLOSE
je wmCLOSE
cmp edx,WM_COMMAND
je wmCOMMAND
cmp edx,WM_INITDIALOG
        jne wmBYE
wmINITDIALOG:invoke GetDlgItem,,IDC_IMG1
invoke SendMessageA,eax,STM_SETIMAGE,IMAGE_ICON,lParam
jmp wmBYE
wmSEND_TXT:invoke GlobalAlloc,GPTR,256
mov buffer,rax
invoke  GetDlgItemTextA,hWnddlg,ID_TXT,eax,256
        or      eax,eax
        jz      wmBYE
        inc     eax
        mov FSize,eax
        invoke ExeToDll,buffer,eax,CF_TEXT
; Найти окно получателя
mov edx,offset szWin
        invoke  FindWindowA,NULL
        or      eax,eax
        jz      wmBYE
; Отправить данные получателю
mov r9d,FSize
shl r9,8
or r9,CF_TEXT
mov qword ptr[rsp+20h],SMTO_ABORTIFHUNG
mov qword ptr[rsp+28h],5000
and qword ptr[rsp+30h],0
invoke  SendMessageTimeoutA,eax,WM_USER+1,hWnddlg
jmp wmBYE
wmSEND_ICO:mov edx,p1
invoke FindResource,0,,RT_ICON; find the resource
mov hResource,rax
invoke  SizeofResource,0,eax ; get its size
mov FSize,eax
invoke LoadResource,0,hResource ; load the resource
invoke LockResource,eax;pResource
mov p,rax
;-------------------------------------------------
        mov ecx,256
and qword ptr[rsp+30h],LR_DEFAULTCOLOR;LR_DEFAULTCOLOR=0
mov [rsp+20h],rcx
mov [rsp+28h],rcx
mov edx,FSize
invoke  CreateIconFromResourceEx,p,,TRUE,30000h;270376,TRUE,30000h
mov [rsp+20h],rax
invoke  SendDlgItemMessageA,hWnddlg,IDC_IMG1,STM_SETIMAGE,IMAGE_ICON
xor p1,11b
mov edx,FSize
invoke ExeToDll,p,,CF_BITMAP
; Найти окно получателя
mov edx,offset szWin
        invoke  FindWindowA,NULL
        or      eax,eax
        jz      wmBYE
; Отправить данные получателю
mov r9d,FSize
shl r9,8
or r9,CF_BITMAP
mov qword ptr[rsp+20h],SMTO_ABORTIFHUNG
mov qword ptr[rsp+28h],5000
and qword ptr[rsp+30h],0
invoke  SendMessageTimeoutA,eax,WM_USER+1,hWnddlg
jmp wmBYE
wmSEND_WAV:mov ecx,offset wav_file
invoke CreateFile,,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,\
        FILE_ATTRIBUTE_ARCHIVE,0
        mov hFile,eax
        invoke GetFileSize,eax,0
mov FSize,eax
        invoke GlobalAlloc,GPTR,eax
mov p,rax
        lea r9d,szReadWrite
and qword ptr[rsp+20h],0
        invoke ReadFile,hFile,eax,FSize
        invoke CloseHandle,hFile
mov edx,FSize
invoke ExeToDll,p,,CF_WAVE
; Find recipient window
mov edx,offset szWin
        invoke  FindWindowA,NULL
        or      eax,eax
        jz      wmBYE
; Send data to recipient
mov r9d,FSize
shl r9,8
or r9,CF_WAVE
mov qword ptr[rsp+20h],SMTO_ABORTIFHUNG
mov qword ptr[rsp+28h],500
and qword ptr[rsp+30h],0
invoke  SendMessageTimeoutA,eax,WM_USER+1,hWnddlg
        jmp wmBYE
wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + ID_SEND_TXT
        je      wmSEND_TXT
        cmp r8d,BN_CLICKED shl 16 + ID_SEND_ICO
        je      wmSEND_ICO
cmp r8d,BN_CLICKED shl 16 + ID_SEND_WAV
        je      wmSEND_WAV
cmp     r8d,BN_CLICKED shl 16 + IDCANCEL
        jne     wmBYE
wmCLOSE:invoke EndDialog,,0
wmBYE: xor eax,eax
leave
retn
DialogProc endp
;---------------------------------------
.data
szWin db 'DLL Reciever',0
wav_file db '..\Images\03.wav',0
p1 dd 1
end
resources (15s.rc)#include "resource.h"
#define ID_TXT 100
#define ID_SEND_TXT 101
#define ID_SEND_ICO 102
#define ID_SEND_WAV 103
#define IDC_IMG1 104
#define IDC_DIALOG 200
#define IDC_ICON1 500
IDC_ICON1 ICON "..\\Images\\icon1.ico"
IDC_ICON2 ICON "..\\Images\\icon2.ico"
IDC_DIALOG DIALOGEX 200, 0, 212, 154
STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "DLL Sender"
{
CONTROL "",-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE,2,-1,207,24
CONTROL "",IDC_IMG1,STATIC,SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128
CONTROL "Write something and click 'Send Text'",ID_TXT,EDIT,ES_LEFT |
ES_AUTOHSCROLL|WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP,5,7,199,13
CONTROL "Send Text", ID_SEND_TXT, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 27, 60, 15
CONTROL "Send ICO", ID_SEND_ICO, BUTTON, BS_PUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 45, 60, 15
CONTROL "Send WAV", ID_SEND_WAV, BUTTON, BS_PUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 65, 60, 15
CONTROL "Exit",IDCANCEL,BUTTON,BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE |
WS_TABSTOP, 149, 85, 60, 15
}
Application client text (15r.asm); GUI #
include win64a.inc
includelib IPC.lib
ExeToDll PROTO :qword,:dword,:dword
DllToExe PROTO :qword,:dword,:dword
IDC_DIALOG equ 200
ID_TXT equ 100
ID_ICON equ 102
IDC_ICON1 equ 500
.code
WinMain proc dummy:qword
        invoke  DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP,qword ptr(offset DialogProc),0
        invoke  RtlExitUserProcess,NULL
WinMain endp
DialogProc proc hWnddlg:qword,msg:qword,wParam:qword,lParam:qword
local p:qword
local FSize:dword
local lpwiocb:WAVEHDR
local hWaveOut:qword
mov hWnddlg,rcx
mov lParam,r9
cmp edx,WM_CLOSE
je wmCLOSE
cmp edx,WM_USER+1
je wmUSER_1
cmp edx,WM_COMMAND
je wmCOMMAND
        cmp edx,WM_INITDIALOG
jne wmBYE
wmINITDIALOG:;mov rcx,hWnd
; Найти окно получателя
        invoke  FindWindowA,0,&szWin
        or      eax,eax
        jnz wmBYE
invoke MessageBoxA,hWnddlg,&Error1,&szAppName,MB_ICONEXCLAMATION or MB_YESNO
cmp eax,IDNO
jz      wmBYE
invoke WinExec,&szService,SW_SHOW
jmp wmBYE
wmUSER_1:cmp r9b,CF_TEXT
je COPY_TEXT
cmp     r9b,CF_BITMAP; Is this the correct data type?
je COPY_ICON
        cmp     r9b,CF_WAVE
        jne wmBYE
shr r9,8
mov FSize,r9d
invoke DllToExe
mov p,rax
mov r8,p
;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data) = 14h
        add r8d,14h
        invoke waveOutOpen,&hWaveOut,WAVE_MAPPER,,0,0,WAVE_ALLOWSYNC
; Preparing the header for output
lea edi,lpwiocb
mov edx,edi
xor eax,eax
mov ecx,(sizeof WAVEHDR)/8
rep stosq
mov rax,p
;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data)+\
;(Type of format)+(Number of Channels)+(Sample Rate)+(Sample Rate*BitsPerSample*Channels/8)+\
;(BitsPerSample*Channels/8)+(Bits per sample)+("data" chunk header)+(Size of the data section)=2Ch
add rax,2Ch
mov [rdx].WAVEHDR.lpData,rax ;data block address
mov eax,FSize
sub eax,2Ch
mov [rdx].WAVEHDR.dwBufferLength,eax ;data block size
invoke waveOutPrepareHeader,hWaveOut,,sizeof WAVEHDR
; Start playing the block
invoke waveOutWrite,hWaveOut,&lpwiocb,sizeof WAVEHDR
@@: test lpwiocb.dwFlags,WHDR_DONE
jz @b
invoke waveOutUnprepareHeader,hWaveOut,&lpwiocb,sizeof WAVEHDR
invoke waveOutClose,hWaveOut
jmp wmBYE
COPY_TEXT:invoke DllToExe
invoke SetDlgItemTextA,hWnddlg,ID_TXT,eax
jmp wmBYE
COPY_ICON:shr r9,8
mov FSize,r9d
invoke DllToExe
; Create HICON directly from memory
invoke  CreateIconFromResourceEx,eax,FSize,TRUE,30000h,256,256,LR_DEFAULTCOLOR
invoke  SendDlgItemMessageA,hWnddlg,ID_ICON,STM_SETIMAGE,IMAGE_ICON,eax
jmp wmBYE
wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + IDCANCEL
jne wmBYE
wmCLOSE:invoke EndDialog,,0
wmBYE: xor eax,eax
leave
retn
DialogProc endp
.data
szWin   db "DLL Sender",0
Error1   db "The server is not running.",10,"Run?",0
szAppName db "DLL Reciever",0
szService db "15s",0
ClassName db 'DLGCLASS',0
end
client application resources (15r.rc)#include "resource.h"
#define IDC_DIALOG 200
#define ID_TXT 100
#define ID_ICON 102
#define ID_PROGRESS 106
#define ID_TXT1 107
IDC_DIALOG DIALOGEX 0,0,212,154
STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "DLL Reciever"
{
CONTROL "",-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 2,-3,207,24
CONTROL "", ID_TXT, STATIC, SS_LEFT | SS_NOPREFIX | WS_CHILD |
WS_VISIBLE | WS_BORDER | WS_TABSTOP, 5, 5, 199, 13
CONTROL "Exit", IDCANCEL, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |
WS_VISIBLE | WS_TABSTOP, 149, 25, 60, 15
CONTROL "",ID_ICON, STATIC, SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128
}
IPC.dll text; DLL #
include win64a.inc
.code
DllMain proc hInstDLL:QWORD, reason:QWORD, unused:QWORD
     mov eax,TRUE
     leave
     ret
DllMain Endp
DllToExe proc
     lea rax,bufferDLL
     ret
DllToExe endp
ExeToDll proc buffer:qword,FSize:dword,type0:dword
     mov buffer,rcx
     mov FSize,edx
     lea rdi,bufferDLL
     mov ecx,FSize
     mov rsi,buffer
     rep movsb
     leave
     ret
ExeToDll endp
.data?
bufferDLL db 8000000 dup(?)
end
IPC.def textLIBRARY IPC
EXPORTS ExeToDll
EXPORTS DllToExe
in attachment ASM-/RC-/EXE-/DLL-/DEF-/LIB-files
Title: Re: Interprocess communication
Post by: Biterider on December 07, 2022, 01:05:58 AM
Absolutely amazing  :thumbsup:

Biterider
Title: Re: Interprocess communication
Post by: jj2007 on December 07, 2022, 01:14:25 AM
Quote from: Mikl__ on December 06, 2022, 11:03:37 PM
DLL
An important feature of the use of dynamic libraries is the possibility of simultaneous use of one library by several modules. A dynamic library becomes an extension of the application that launched it, being loaded into the address space of the process.

How are windows DLL actually shared? (https://stackoverflow.com/questions/41315835/how-are-windows-dll-actually-shared)
Quoteif the same page of let's say kernel32.dll is accessed by both process A and process B then the page will exist twice in physical memory. I am asking for the veracity of this last statement

I've never had a need for this, but it's an interesting question: Do the two processes access the same physical memory?
Title: Re: Interprocess communication
Post by: Mikl__ on December 07, 2022, 11:47:59 AM
Ciao, Johen!
I'm more interested in whether my program works fine or not?
Title: Re: Interprocess communication
Post by: jj2007 on December 07, 2022, 11:53:55 AM
Hi Mikl,

Of course it works fine :thumbsup:
Title: Re: Interprocess communication
Post by: Mikl__ on December 07, 2022, 11:57:24 AM
Quoteit works fine
Ne sono molto felice! (https://wasm.in/styles/smiles_s/boast.gif)
P.S. To All. Copy any wav file to ..\Images\03.wav (Grazie mille Jochen!)