Межпроцессное взаимодействие

Тема в разделе "WASM.ARTICLES", создана пользователем Mikl___, 24 апр 2022.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Код (C):
    1. int send (SOCKET sock, const char FAR* buf, int bufsize, int flags);
    Пример передачи данных серверу:
    Код (C):
    1. char szBuf[80];
    2. lstrcpy(szBuf, "Test string");
    3. send (srv_socket, szBuf, lstrlen(szBuf), 0);
    Параметры функции recv, предназначенной для приема данных, аналогичны параметрам функции send:
    Код (C):
    1. int recv (SOCKET sock, char FAR * buf, int bufsize, int flags);
    Функции recv и send возвращают количество, принятых и переданных байт данных. Приложение, которое принимает данные, вызывает функцию recv в цикле до тех пор, пока не будут приняты все переданные данные. На один вызов send может приходиться несколько вызовов функции recv.
    В случае ошибки функции send и recv возвращают значение SOCKET_ERROR. Для анализа причин возникновения ошибки используют функцию WSAGetLastError.
    Список кодов ошибок, которые возникают при вызове команды send:
    Код ошибкиhexОписание
    WSANOTINITIALISED276DПеред использованием функции необходимо вызвать функцию WSAStartup
    WSAENETDOWN2742Сбой в сети
    WSAEACCES271DУказанный адрес является широковещательным (broadcast), однако перед вызовом функции не был установлен соответствующий флаг
    WSAEINTR2714Работа функции была отменена при помощи функции WSACancelBlockingCall
    WSAEINPROGRESS2734Выполняется блокирующая функция интерфейса Windows Sockets
    WSAEFAULT271EПараметр buf указан неправильно (он не указывает на адресное пространство, принадлежащее приложению)
    WSAENETRESET2744Необходимо сбросить соединение
    WSAENOBUFS2747Возникла блокировка буфера
    WSAENOTCONN2749Сокет не подсоединен
    WSAENOTSOCK2736Указанный в параметре дескриптор не является сокетом
    WSAESHUTDOWN274AСокет был закрыт функцией shutdown
    WSAEWOULDBLOCK2733Сокет отмечен как неблокирующий, но запрошенная операция приведет к блокировке
    WSAEMSGSIZE2738Был использован сокет типа SOCK_DGRAM (предназначенный для передачи датаграмм). При этом размер пакета данных превышает максимально допустимый для данной реализации интерфейса Windows Sockets
    WSAEINVAL2726Сокет не был подключен функцией bind
    WSAECONNABORTED2745Сбой из-за слишком большой задержки или по другой причине
    WSAECONNRESET2746Сброс соединения удаленным узлом
    При выполнении функции recv могут возникать следующие ошибки:
    Код ошибкиhexОписание
    WSANOTINITIALISED276DПеред использованием функции необходимо вызвать функцию WSAStartup
    WSAENETDOWN2742Сбой в сети
    WSAENOTCONN2749Сокет не подсоединен
    WSAEINTR2714Работа функции была отменена при помощи функции WSACancelBlockingCall
    WSAEINPROGRESS2734Выполняется блокирующая функция интерфейса Windows Sockets
    WSAENOTSOCK2736Указанный в параметре дескриптор не является сокетом
    WSAESHUTDOWN274AСокет был закрыт функцией shutdown
    WSAEWOULDBLOCK2733Сокет отмечен как неблокирующий, но запрошенная операция приведет к блокировке
    WSAEMSGSIZE2738Размер пакета данных превышает размер буфера, в результате чего принятый пакет был обрезан
    WSAEINVAL2726Сокет не был подключен функцией bind
    WSAECONNABORTED2745Сбой из-за слишком большой задержки или по другой причине
    WSAECONNRESET2746Сброс соединения удаленным узлом
    Передача и прием данных в цикле может привести к блокировке работы приложения. Если это неприемлемо, следует воспользоваться асинхронным расширением интерфейса Windows Sockets.
    Приложение демонстрирует асинхронный прием данных.
    После установки канала связи оно вызывает функцию WSAAsyncSelect, указывая в качестве последнего параметра комбинацию констант FD_READ и FD_CLOSE. Функция главного окна приложения получает сообщение WSA_NETEVENT в тот момент времени, когда чтение данных не вызовет блокировки приложения:
    Код (C):
    1. #define WSA_NETEVENT (WM_USER + 2)
    2. rc = WSAAsyncSelect (srv_socket, hWnd, WSA_NETEVENT, FD_READ | FD_CLOSE);
    При необходимости выполнения асинхронной посылки данных нужно указать функцию WSAAsyncSelect и параметр FD_WRITE.
    Если функция WSAAsyncSelect выполнилась успешно ― возвращается нулевое значение, при ошибке ― значение SOCKET_ERROR.
    В зависимости от значения последнего параметра могут возникать разные коды ошибки, которые можно получить при помощи функции WSAGetLastError. Следующие ошибки могут возникнуть при любом значении параметра:
    Код ошибкиhexОписание
    WSANOTINITIALISED276DПеред использованием функции необходимо вызвать функцию WSAStartup
    WSAENETDOWN2742Сбой в сети
    WSAEINVAL2726Сокет не был подключен функцией bind
    WSAEINPROGRESS2734Выполняется блокирующая функция интерфейса Windows Sockets
    Дополнительный код ошибки можно получить из параметра lParam при помощи макрокоманды WSAGETSELECTERROR.
    При использовании параметра FD_CONNECT возможно появление следующих ошибок:
    Код ошибкиhexОписание
    WSAEADDRINUSE2740Указанный адрес уже используется
    WSAEADDRNOTAVAIL2741Указанный адрес не доступен
    WSAEAFNOSUPPORT273FДля данного сокета нельзя использовать указанное семейство адресов
    WSAECONNREFUSED274DПопытка установления канала связи была отвергнута
    WSAEDESTADDRREQ2737Необходимо указать адрес получателя пакета
    WSAEFAULT271EНеправильно указан параметр namelen
    WSAEINVAL2726Сокет уже подключен к адресу
    WSAEISCONN2748Сокет уже подсоединен
    WSAEMFILE2728Больше нет доступных дескрипторов
    WSAENETUNREACH2743Из данного узла и в данное время невозможно получить доступ к сети
    WSAENOBUFS2747Нет места для размещения буфера
    WSAENOTCONN2749Сокет на подключен
    WSAENOTSOCK2736Указан дескриптор файла, а не сокета
    WSAETIMEDOUT274CПри попытке установления канала связи возникла задержка во времени
    Если используется параметр FD_CLOSE, может возникнуть одна из следующих ошибок:
    Код ошибкиhexОписание
    WSAENETDOWN2742Сбой в сети
    WSAECONNRESET2746Сброс соединения удаленным узлом
    WSAECONNABORTED2745Сбой из-за слишком большой задержки или по другой причине
    В том случае, когда указаны параметры FD_READ, FD_WRITE, FD_OOB, или FD_ACCEPT, может возникнуть ошибка с кодом WSAENETDOWN.
    Обработчик сообщения WSA_NETEVENT должен выполнить анализ причины, по которой он был вызван, так как за один вызов функции WSAAsyncSelect можно задать несколько событий, вызывающих генерацию сообщения. Этот анализ проводится следующим образом:
    Код (C):
    1. void WndProc_OnWSANetEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    2. {
    3.   char szTemp[256];
    4.   int rc;
    5.  
    6.   // Если на сокете выполняется передача данных,
    7.   // прием и отображение этих данных в виде текстовой строки
    8.   if(WSAGETSELECTEVENT(lParam) == FD_READ )
    9.   {
    10.     rc = recv ((SOCKET)wParam, szTemp, 256, 0);
    11.     if(rc)
    12.     {
    13.       szTemp[rc] = '\0';
    14.       MessageBox(NULL, szTemp, "Reсeived data", MB_OK);
    15.     }
    16.     return;
    17.   }
    18.  
    19.   // Если соединение завершено -- вывод сообщения
    20.   else if(WSAGETSELECTEVENT(lParam) == FD_CLOSE )
    21.   {
    22.     MessageBox(NULL, "Connection closed", "Server", MB_OK);
    23.   }
    24. }
    Параметр wParam содержит дескриптор сокета, на котором выполняется передача данных, параметр lParam ― код события, которое произошло в сети.

    12.jpg
    Текст приложения-сервера (12s.asm)
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. ID_TXT equ 100
    4. ID_SEND_TXT equ 101
    5. ID_SEND_ICO equ 102
    6. ID_SEND_WAV equ 103
    7. IDC_DIALOG equ 200
    8. IDC_ICON1 equ 500
    9. IDC_IMG1 equ 104
    10. WINSOCK_VERSION equ 504
    11. SD_RECEIVE equ 0
    12. SD_SEND equ 1
    13. SD_BOTH equ 2
    14. WSADATA struct
    15.   wVersion dw ?;
    16.   wHighVersion dw ?
    17.   szDescription db (WSADESCRIPTION_LEN + 1) dup(?)
    18.   szSystemStatus db (WSASYS_STATUS_LEN + 1) dup(?)
    19.   iMaxSockets dw ?
    20.   iMaxUdpDg dw ?
    21.   lpVendorInfo dq ?
    22. WSADATA ends
    23. S_UN_B STRUCT
    24.   s_b1 BYTE ?
    25.   s_b2 BYTE ?
    26.   s_b3 BYTE ?
    27.   s_b4 BYTE ?
    28. S_UN_B ENDS
    29. S_UN_W STRUCT
    30.   s_w1 WORD ?
    31.   s_w2 WORD ?
    32. S_UN_W ENDS
    33. ADDRESS_UNION UNION
    34.    S_un_b S_UN_B <>
    35.    S_un_w S_UN_W <>
    36.    S_addr DWORD ?
    37. ADDRESS_UNION ENDS
    38. in_addr STRUCT
    39.   S_un ADDRESS_UNION <>
    40. in_addr ENDS
    41. SOCKADDR_IN STRUCT
    42.   sin_family    dw ?;is the same as af parameter in socket call. You must use AF_INET here.
    43.   sin_port      dw ?;is the port that the socket will use to communicate with the remote socket.
    44. ;This value depends on the higher level protocol that you want to use. If you want to connect to
    45. ;the remote socket for HTTP, use port 80 (decimal). However, note that the port value MUST be in
    46. ;network byte order that is big Endian. So you cannot use the port value per se but you must call
    47. ;htons to convert the value to network byte order first. This is one of the most common error the
    48. ;newcomers to winsock programming encounter.
    49.   sin_addr      in_addr <>;is the IP address of the remote host. Again, you must convert the
    50. ;IP address to network byte order before using it
    51.   sin_zero      BYTE 8 dup(?);is reserved. Don't mess with it
    52. SOCKADDR_IN ends
    53. .code
    54. WinMain proc
    55. enter 30h,0
    56. mov r9d,256;cx
    57. mov [rbp-10h],r9
    58. mov qword ptr [rbp-8],LR_DEFAULTCOLOR
    59. invoke LoadImage,IMAGE_BASE,IDC_ICON1,IMAGE_ICON;,256,256,LR_DEFAULTCOLOR
    60. mov r9d,offset DialogProc
    61. mov qword ptr[rbp-10h],rax;30h-10h=+20h
    62. invoke DialogBoxParam,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP
    63. invoke RtlExitUserProcess,NULL
    64. WinMain endp
    65. DialogProc proc hWnddlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    66. local hFile:qword
    67. local cbWritten:dword
    68. local hResource:qword
    69. local pResource:qword
    70. local wsa:WSADATA
    71. local port:qword
    72. local FSize:qword
    73. mov hWnddlg,rcx
    74. mov lParam,r9
    75.        cmp edx,WM_INITDIALOG
    76.         je wmINITDIALOG
    77.        cmp edx,WM_CLOSE
    78.        je wmCLOSE
    79.        cmp edx,WM_COMMAND
    80.        je wmCOMMAND
    81.        cmp edx,WM_DESTROY
    82.        je wmDESTROY
    83.        xor eax,eax
    84.        jmp exit0
    85. wmDESTROY:invoke WSACleanup
    86. jmp wmBYE
    87. wmSEND_WAV:mov port,12345
    88.        mov type0,WM_USER+3
    89.         mov ecx,offset wav_file
    90.        xor r9d,r9d
    91.        mov qword ptr[rsp+30h],r9
    92.        mov qword ptr[rsp+28h],FILE_ATTRIBUTE_ARCHIVE
    93.        mov qword ptr[rsp+20h],OPEN_EXISTING
    94.        invoke CreateFile,,GENERIC_READ or GENERIC_WRITE,\
    95.        FILE_SHARE_READ or FILE_SHARE_WRITE
    96.         mov hFile,rax
    97.         invoke GetFileSize,eax,0
    98.        mov FSize,rax
    99.        invoke GlobalAlloc,GPTR,eax
    100.         mov p,rax
    101.        lea r9d,cbWritten
    102.        and qword ptr[rsp+20h],0
    103.         invoke ReadFile,hFile,eax,FSize
    104.         invoke CloseHandle,hFile
    105.        jmp @f
    106. wmSEND_ICO:mov port,12344
    107.        mov type0,WM_USER+2
    108.         mov edx,p1
    109.        invoke FindResource,0,,RT_ICON; find the resource
    110.        mov hResource,rax
    111.        invoke  SizeofResource,0,eax ; get its size
    112.        mov FSize,rax
    113.        invoke LoadResource,0,hResource ; load the resource
    114.        invoke LockResource,eax;pResource
    115.        mov p,rax
    116.        and qword ptr[rsp+30h],LR_DEFAULTCOLOR;LR_DEFAULTCOLOR=0
    117.        mov qword ptr[rsp+20h],256
    118.        mov qword ptr[rsp+28h],256
    119.        invoke  CreateIconFromResourceEx,eax,FSize,TRUE,30000h;270376,TRUE,30000h
    120.        mov [rsp+20h],rax
    121.        invoke  SendDlgItemMessage,hWnddlg,IDC_IMG1,STM_SETIMAGE,IMAGE_ICON
    122.        xor p1,11b
    123.        jmp @f
    124. wmSEND_TXT:mov port,12343
    125. mov type0,WM_USER+1
    126. invoke GlobalAlloc,GPTR,256
    127.         mov p,rax
    128. invoke GetDlgItemText,hWnddlg,ID_TXT,eax,256
    129. inc eax
    130. mov FSize,rax
    131. @@: mov edx,offset szWin
    132.         invoke  FindWindow,NULL
    133.         or      eax,eax
    134.         jz      wmBYE
    135. ; Отправить данные получателю
    136.        invoke PostMessage,eax,type0,hWnddlg,FSize
    137.        invoke SendData,p,FSize,port
    138.        jmp wmBYE
    139. wmINITDIALOG:invoke GetDlgItem,,IDC_IMG1
    140.        invoke SendMessage,eax,STM_SETIMAGE,IMAGE_ICON,lParam
    141. ; активировать библиотеку сокетов
    142.        lea edx,wsa
    143.        invoke WSAStartup,WINSOCK_VERSION
    144. ;An error occured if eax != null, because there's no return value for this api, if there's return,
    145. ;there's an error
    146.        jmp wmBYE
    147. wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + ID_SEND_TXT
    148.         je      wmSEND_TXT
    149.         cmp r8d,BN_CLICKED shl 16 + ID_SEND_WAV
    150.         je      wmSEND_WAV
    151.         cmp r8d,BN_CLICKED shl 16 + ID_SEND_ICO
    152.         je      wmSEND_ICO
    153.        cmp     r8d,BN_CLICKED shl 16 + IDCANCEL
    154.         jne     wmBYE
    155. wmCLOSE:invoke EndDialog,,0
    156. wmBYE: mov eax,TRUE
    157. exit0: leave
    158.        retn
    159. DialogProc endp
    160. SendData proc buf:qword,len:qword,port:qword
    161. local sock:QWORD
    162. local saddr:SOCKADDR_IN;sizeof(saddr)) =10h
    163. local bytesSent:dword
    164. mov buf,rcx
    165. mov len,rdx
    166. mov port,r8
    167. ; создать сокет
    168. invoke socket,AF_INET, SOCK_STREAM, IPPROTO_TCP
    169. mov sock,rax
    170. cmp eax,INVALID_SOCKET
    171. jz exit0;if (sock != INVALID_SOCKET)
    172. mov saddr.sin_family,AF_INET
    173. invoke htonl,INADDR_LOOPBACK
    174. mov saddr.sin_addr.S_un.S_addr,eax
    175. invoke htons,port;12345
    176. mov saddr.sin_port,ax
    177. ;After the socket is created, you have two choices: wait for an incoming connection or connect
    178. ;to a remote socket. If you want to wait for incoming connection, you must call listen to listen
    179. ;for an incoming connection and call accept to establish connection with the remote socket. If you
    180. ;want to connect to a remote socket, you must call connect
    181. mov r8d,sizeof saddr;the size of SOCKADDR_IN structure
    182. lea edx,saddr;a pointer to a SOCKADDR_IN structure
    183. invoke connect,sock;socket descriptor of the local socket. You can pass the socket
    184. ;descriptor returned by socket call as this parameter
    185. or eax,eax
    186. jnz @0;if (connect (sock,(struct sockaddr*)&saddr,sizeof (saddr)) == 0)
    187. @@: cmp len,0 ;       while (size)
    188. jz @0
    189. ;use send to send data on a stream socket and sendto to send data on a datagram socket. I'll
    190. ;examine send here since many popular protocols such as HTTP and FTP use stream sockets.
    191. ; запрос пришел - посылаем информацию
    192. invoke send,sock,buf,len, 0
    193. ;Parameters
    194. ; #1 socket == socket descriptor
    195. ; #2 buffer == address of the data that you want to send. The data need not be NULL-terminated
    196. ;since its size is specified in len parameter.
    197. ; #3 len == the size of data to send
    198. ; #4 flags == flags specifying the behavior of the function. There are two flags you can use:
    199. ; MSG_DONTROUTE : specifies that the data should not be subject to routing. Notice
    200. ;the word "should". Some windows socket implementation may ignore this flag.
    201. ; MSG_OOB : specifies that the data is out-of-band data.
    202. ;Normally we don't use any of these two flags, flags parameter should be 0 in this case.
    203. ;If the call is unsuccessful, the value SOCKET_ERROR is returned in eax.
    204. ;If it's successful, the actual number of bytes sent is returned in eax. Note that this number
    205. ;may not be equal to len parameter.
    206. or eax,eax
    207. jz @0;if (bytesSent <= 0)          break;
    208. sub len,rax;     size -= (uint32_t)bytesSent;
    209.         add buf,rax;    data = (uint8_t*)data + bytesSent;
    210. jmp @b
    211. ; закрыть связь
    212. @0:     invoke shutdown,sock,SD_BOTH
    213. ; закрыть сокет
    214. invoke closesocket,sock
    215. exit0: leave
    216. ret
    217. SendData endp
    218. ;---------------------------------------
    219. .data
    220. szWin db 'Socket Reciever',0
    221. wav_file db '..\Images\03.wav',0
    222. p dq ?
    223. p1 dd 1
    224. type0 dq ?
    225. end
    rc-файл (12s.rc)
    Код (C):
    1. #include "resource.h"
    2. #define ID_TXT 100
    3. #define ID_SEND_TXT 101
    4. #define ID_SEND_ICO 102
    5. #define ID_SEND_WAV 103
    6. #define IDC_IMG1 104
    7. #define IDC_DIALOG 200
    8. #define IDC_ICON1 500
    9. IDC_ICON1 ICON "..\\Images\\icon1.ico"
    10. IDC_ICON2 ICON "..\\Images\\icon2.ico"
    11. IDC_DIALOG DIALOG 0, 0, 212, 140
    12. STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
    13. WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
    14. CAPTION "Socket Sender"
    15. BEGIN
    16.     CONTROL "",-1,"BUTTON",BS_GROUPBOX, 2, -1, 207, 24
    17.     CONTROL "",IDC_IMG1,"Static",WS_CHILDWINDOW | WS_VISIBLE | SS_ICON,5,23,128,128
    18.     CONTROL "Write something and click 'Send Text'",ID_TXT,"EDIT",WS_BORDER | WS_TABSTOP |
    19.  ES_AUTOHSCROLL,5,7,199,13
    20.     DEFPUSHBUTTON "Send Text",ID_SEND_TXT,149,27,60,15
    21.     PUSHBUTTON   "Send ICO", ID_SEND_ICO,149,45,60,15
    22.     PUSHBUTTON   "Send WAV", ID_SEND_WAV,149,65,60,15
    23.     PUSHBUTTON   "Exit",     IDCANCEL,   149,85,60,15
    24. END
    Текст приложения-клиента (12r.asm)
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. IDC_DIALOG equ 200
    4. IDC_OUTPUT equ 100
    5. ID_ICON equ 102
    6. IDC_ICON1 equ 500
    7. WINSOCK_VERSION equ 504
    8. SD_RECEIVE equ 0
    9. SD_SEND equ 1
    10. SD_BOTH equ 2
    11. WSADATA struct
    12.   wVersion dw ?;
    13.   wHighVersion dw ?
    14.   szDescription db (WSADESCRIPTION_LEN + 1) dup(?)
    15.   szSystemStatus db (WSASYS_STATUS_LEN + 1) dup(?)
    16.   iMaxSockets dw ?
    17.   iMaxUdpDg dw ?
    18.   lpVendorInfo dq ?
    19. WSADATA ends
    20. S_UN_B STRUCT
    21.   s_b1 BYTE ?
    22.   s_b2 BYTE ?
    23.   s_b3 BYTE ?
    24.   s_b4 BYTE ?
    25. S_UN_B ENDS
    26. S_UN_W STRUCT
    27.   s_w1 WORD ?
    28.   s_w2 WORD ?
    29. S_UN_W ENDS
    30. ADDRESS_UNION UNION
    31.    S_un_b S_UN_B <>
    32.    S_un_w S_UN_W <>
    33.    S_addr DWORD ?
    34. ADDRESS_UNION ENDS
    35. in_addr STRUCT
    36.   S_un ADDRESS_UNION <>
    37. in_addr ENDS
    38. SOCKADDR_IN STRUCT
    39.   sin_family    WORD      ?
    40.   sin_port      WORD      ?
    41.   sin_addr      in_addr <>
    42.   sin_zero      BYTE 8 dup (?)
    43. SOCKADDR_IN ends
    44. .code
    45. WinMain proc
    46. enter 30h,0
    47. mov r9d,offset DialogProc
    48. and qword ptr[rbp-10h],0
    49.         invoke  DialogBoxParam,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP
    50.         invoke  RtlExitUserProcess,NULL
    51. WinMain endp
    52. DialogProc proc hWnddlg:qword,msg:qword,wParam:qword,lParam:qword
    53. local wsa:WSADATA
    54. local clientSocket:qword
    55. local saddr:SOCKADDR_IN;sizeof(saddr)=10h
    56. local addrSize:dword
    57. local buffer[1024]:byte
    58. local lpwiocb:WAVEHDR
    59. local hWaveOut:qword
    60. mov hWnddlg,rcx
    61. mov lParam,r9
    62.         cmp edx,WM_INITDIALOG
    63. je wmINITDIALOG
    64. cmp edx,WM_CLOSE
    65. je wmCLOSE
    66. cmp edx,WM_COMMAND
    67. je wmCOMMAND
    68. cmp edx,WM_DESTROY
    69. je wmDESTROY
    70. cmp edx,WM_USER+1
    71. je wmUSER_1
    72. cmp edx,WM_USER+2
    73. je wmUSER_2
    74. cmp edx,WM_USER+3
    75. je wmUSER_3
    76. xor eax,eax
    77. jmp exit0
    78. wmDESTROY:cmp serverSocket,INVALID_SOCKET
    79. jz wmBYE
    80. invoke shutdown,serverSocket,SD_BOTH
    81. invoke closesocket,serverSocket
    82. or serverSocket,INVALID_SOCKET
    83. jmp wmBYE
    84. wmUSER_1:cmp serverSocket,INVALID_SOCKET
    85. jz @f
    86. invoke shutdown,serverSocket,SD_BOTH
    87. invoke closesocket,serverSocket
    88. ; Create a stream socket for internet use
    89. ; создать сокет
    90. @@: invoke socket,AF_INET,SOCK_STREAM,IPPROTO_TCP
    91. mov serverSocket,rax
    92. cmp eax,INVALID_SOCKET
    93. jz break
    94. ; подключить сокет
    95.         mov saddr.sin_family,AF_INET
    96. invoke htonl,INADDR_LOOPBACK
    97. mov saddr.sin_addr.S_un.S_addr,eax
    98. invoke htons,12343; convert port number into network byte order first
    99. mov saddr.sin_port,ax; адрес порта
    100. mov r8d,sizeof saddr
    101. lea edx,saddr
    102. invoke bind,serverSocket
    103. or eax,eax;if (bind (serverSocket, (struct sockaddr*)&saddr, sizeof(saddr)) == 0)
    104.         jnz break
    105. ; перевести сокет в состояние "слушать"
    106. invoke listen,serverSocket,256
    107. or eax,eax
    108. jnz break;if (listen (serverSocket, 256) == 0)
    109. ; ждем запроса от клиента
    110. mov addrSize,sizeof saddr
    111. lea edx,saddr
    112. lea r8d,addrSize
    113. invoke accept,serverSocket
    114. mov clientSocket,rax
    115. cmp eax,INVALID_SOCKET
    116. jz break;if (clientSocket == INVALID_SOCKET) break;
    117. ; запрос пришел - посылаем информацию
    118. @@: lea edx,buffer
    119. invoke recv,clientSocket,,1024,0
    120. ;recv is for use with a stream socket
    121. ;Parameters:
    122. ; #1 socket == socket descriptor
    123. ; #2 buffer == address of the memory block to store the incoming data.
    124. ; #3 len == the size of the memory block
    125. ; #4 flags == flags specifying the behavior of the function. There are two flags you can use:
    126. ; MSG_PEEK Peek at the incoming data. The data is copied into the buffer but is not
    127. ;removed from the input queue.
    128. ; MSG_OOB Process out-of-band data. This flag is usually used when FD_OOB notification
    129. ;is received. If the call is successful, it returns the number of bytes read from the socket. If it
    130. ;is unsuccessful, the value SOCKET_ERROR is returned. If the return value is 0, the remote socket
    131. ;has been closed
    132.         or eax,eax
    133. jnz @b;if (len <= 0)    break
    134. ; выводим строку символов
    135. lea r8d,buffer
    136. invoke  SetDlgItemText,hWnddlg,IDC_OUTPUT
    137. jmp @0
    138. wmUSER_2:;mov rax,lParam
    139. mov FSize,r9;ax
    140. cmp serverSocket,INVALID_SOCKET
    141. jz @f
    142. invoke shutdown,serverSocket,SD_BOTH
    143. invoke closesocket,serverSocket
    144. @@: invoke socket,AF_INET,SOCK_STREAM,IPPROTO_TCP; Create a stream socket for internet use
    145. mov serverSocket,rax
    146. cmp serverSocket,INVALID_SOCKET
    147. jz break
    148. mov saddr.sin_family,AF_INET
    149. invoke htonl,INADDR_LOOPBACK
    150. mov saddr.sin_addr.S_un.S_addr,eax
    151. invoke htons,12344; convert port number into network byte order first
    152. mov saddr.sin_port,ax
    153. mov r8d,sizeof saddr
    154. lea edx,saddr
    155. invoke bind,serverSocket
    156. or eax,eax;if (bind (serverSocket, (struct sockaddr*)&saddr, sizeof(saddr)) == 0)
    157. jnz break
    158. invoke listen,serverSocket,256
    159. or eax,eax
    160. jnz break;if (listen (serverSocket, 256) == 0)
    161. mov addrSize,sizeof saddr
    162. lea edx,saddr
    163. lea r8d,addrSize
    164. invoke accept,serverSocket
    165. mov clientSocket,rax
    166. cmp eax,INVALID_SOCKET
    167. jz break;if (clientSocket == INVALID_SOCKET) break;
    168. invoke GlobalAlloc,GPTR,FSize
    169. mov p,rax
    170. mov edi,eax
    171. @@: lea edx,buffer
    172. invoke recv,clientSocket,,1024,0
    173. or eax,eax
    174. jz @f
    175. lea esi,buffer
    176. mov ecx,eax;1024
    177. rep movsb
    178. jmp @b;if (len <= 0)    break;
    179. @@: invoke  CreateIconFromResourceEx,p,FSize,TRUE,30000h,256,256,LR_DEFAULTCOLOR
    180. invoke  SendDlgItemMessage,hWnddlg,ID_ICON,STM_SETIMAGE,IMAGE_ICON,eax
    181. jmp @1
    182. wmUSER_3:;mov rax,lParam
    183. mov FSize,r9;ax
    184. cmp serverSocket,INVALID_SOCKET
    185. jz @f
    186. invoke shutdown,serverSocket,SD_BOTH
    187. invoke closesocket,serverSocket
    188. @@: invoke socket,AF_INET,SOCK_STREAM,IPPROTO_TCP; Create a stream socket for internet use
    189. mov serverSocket,rax
    190. cmp eax,INVALID_SOCKET
    191. jz break
    192.         mov saddr.sin_family,AF_INET
    193. invoke htonl,INADDR_LOOPBACK
    194. mov saddr.sin_addr.S_un.S_addr,eax
    195. invoke htons,12345; convert port number into network byte order first
    196. mov saddr.sin_port,ax
    197. mov r8d,sizeof saddr
    198. lea edx,saddr
    199. invoke bind,serverSocket
    200. or eax,eax;if (bind (serverSocket, (struct sockaddr*)&saddr, sizeof(saddr)) == 0)
    201. jnz break
    202. invoke listen,serverSocket,256
    203. or eax,eax
    204. jnz break;if (listen (serverSocket, 256) == 0)
    205. mov addrSize,sizeof saddr
    206. lea edx,saddr
    207. lea r8d,addrSize
    208. invoke accept,serverSocket
    209. mov clientSocket,rax
    210. cmp eax,INVALID_SOCKET
    211. jz break;if (clientSocket == INVALID_SOCKET) break;
    212. invoke GlobalAlloc,GPTR,FSize
    213. mov p,rax
    214. mov edi,eax
    215. @@: lea edx,buffer
    216. invoke recv,clientSocket,,1024,0
    217. or eax,eax
    218. jz @f
    219. lea esi,buffer
    220. mov ecx,eax;1024
    221. rep movsb
    222. jmp @b;if (len <= 0)    break;
    223. @@: mov r8,p
    224. ;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data) = 14h
    225.         add r8d,14h
    226.         invoke waveOutOpen,&hWaveOut,WAVE_MAPPER,,0,0,WAVE_ALLOWSYNC
    227. ; Подготавливаем заголовок для вывода
    228. lea edx,lpwiocb
    229. mov edi,edx
    230. xor eax,eax
    231. mov ecx,(sizeof WAVEHDR)/8
    232. rep stosq
    233. mov rax,p
    234. ;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data)+\
    235. ;(Type of format)+(Number of Channels)+(Sample Rate)+(Sample Rate*BitsPerSample*Channels/8)+\
    236. ;(BitsPerSample*Channels/8)+(Bits per sample)+(“data” chunk header)+(Size of the data section)=2Ch
    237. add rax,2Ch
    238. mov [rdx].WAVEHDR.lpData,rax ;адрес блока данных
    239. mov rax,FSize
    240. sub eax,2Ch
    241. mov [rdx].WAVEHDR.dwBufferLength,eax ;размер блока данных
    242. invoke waveOutPrepareHeader,hWaveOut,,sizeof WAVEHDR
    243. ; Запускаем проигрывание блока
    244. invoke waveOutWrite,hWaveOut,&lpwiocb,sizeof WAVEHDR
    245. @@: test lpwiocb.dwFlags,WHDR_DONE
    246. jz @b
    247. invoke waveOutUnprepareHeader,hWaveOut,&lpwiocb,sizeof WAVEHDR
    248. invoke waveOutClose,hWaveOut
    249. ;----------------------------------------------------------
    250. @1: invoke GlobalFree,p
    251. ; закрыть связь
    252. @0: invoke shutdown,clientSocket,SD_BOTH
    253. ; закрыть сокет
    254. invoke closesocket,clientSocket
    255. ;This function closes a socket. Every resource of the socket will be released
    256. break: cmp serverSocket,INVALID_SOCKET;if (serverSocket != INVALID_SOCKET)
    257. jz wmBYE
    258. invoke shutdown,serverSocket,SD_BOTH
    259. invoke closesocket,serverSocket
    260. mov serverSocket,INVALID_SOCKET
    261. jmp wmBYE
    262. wmINITDIALOG:;mov hWnd,rcx
    263. ; Найти окно отправителя
    264. mov edx,offset szWin
    265.         invoke  FindWindow,NULL
    266.         or      eax,eax
    267.         jnz wmBYE
    268. mov edx,offset Error1
    269. mov r8d,offset szAppName
    270. invoke MessageBox,hWnddlg,,,MB_ICONEXCLAMATION or MB_YESNO
    271. cmp eax,IDNO
    272. jz      wmBYE
    273. mov ecx,offset szService
    274. invoke WinExec,,SW_SHOW
    275. ;активировать библиотеку сокетов
    276. lea edx,wsa
    277. invoke WSAStartup,WINSOCK_VERSION
    278. jmp wmBYE
    279. ;--------------------------------------------------
    280. wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + IDCANCEL
    281. jne wmBYE
    282. wmCLOSE:invoke EndDialog,,0
    283. wmBYE: mov eax,TRUE
    284. exit0: leave
    285. retn
    286. DialogProc endp
    287. ;-----------------------------------------------------------------------
    288. .data
    289. szWin db "Socket Sender",0
    290. Error1 db "The server is not running.",10,"Run?",0
    291. szAppName db "Socket Reciever",0
    292. szService db "12s",0
    293. serverSocket dq INVALID_SOCKET
    294. ;threadHandleTxt dq ?
    295. ;threadHandleIco dq ?
    296. ;threadHandleWav dq ?
    297. ;threadId dd ?
    298. ;hWnd dq ?
    299. FSize dq ?
    300. p dq ?
    301. end
    rc-файл (08r.rc)
    Код (C):
    1. #include "resource.h"
    2. #define IDC_DIALOG 200
    3. #define IDC_OUTPUT 100
    4. #define ID_ICON 102
    5. IDC_DIALOG DIALOG 0,0,212,140
    6. STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
    7. WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
    8. CAPTION "Socket Reciever"
    9. BEGIN
    10. CONTROL "",-1,"BUTTON",BS_GROUPBOX, 2, -1, 207, 24
    11. CONTROL "",IDC_OUTPUT,"STATIC",WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL,5,7,199,13
    12. DEFPUSHBUTTON  "Exit",IDCANCEL,149,27,60,15
    13.         CONTROL 1,ID_ICON,"STATIC",WS_CHILDWINDOW | SS_ICON,5,23,128,128
    14. END
    в аттаче ASM-/RC-/EXE-файлы

    Благодарности

    Огромное спасибо rmn за подсказки, замечания и предоставленную программу :yes3:
     

    Вложения:

    • 12_Socket.zip
      Размер файла:
      247,1 КБ
      Просмотров:
      177
    Последнее редактирование: 9 апр 2024
    Marylin нравится это.
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792

    09. Mutexes. Блин #2. Более удачный, хотя и не последний вариант

    Пока только текст, но выводится без ошибок, вариант с передачей картинок и WAV-файлов будет позже (хотя есть вероятность, что механизм мьютексов не предназначен для такого интенсивного обмена сообщениями, но буду пробовать :) )...

    09.jpg
     

    Вложения:

    • 09_Mutex.zip
      Размер файла:
      245,2 КБ
      Просмотров:
      158
    Marylin нравится это.
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792

    09. Mutexes. Блин #3. Передача картинок (неудачная реализация)

    Для эксперимента были созданы иконки размером 16×16, 32×32, 64×64, 128×128, 256×256
    16x16.jpg
    Результат передачи текстовой строки и иконки 16×16
    32x32.jpg
    Результат передачи иконки 32×32
    64x64.jpg
    Результат передачи иконки 64×64
    128x128.jpg
    Результат передачи иконки 128×128
    256x256.jpg
    Результат передачи иконки 256×256​
    Передача идет полубайтами+задержки для синхронизации. Картинка передана без искажений. Передача иконки 256×256 заняла примерно 42 минуты (2513036/60000 = 41,88393(3)). Видно, что нужно менять алгоритм и увеличивать скорость передачи.
    Size of
    Resource
    (bytes)
    mSecBytes/mSec
    текстовая строка
    37​
    702​
    0,05270655
    иконка 16×16
    1128​
    20639​
    0,05465381
    иконка 32×32
    4264​
    81776​
    0,05214244
    иконка 64×64
    16936​
    323546​
    0,05234495
    иконка 128×128
    67624​
    543882​
    0,12433579
    иконка 256×256
    270376​
    25130360,10758939
    в аттаче ASM-/RC-/ICO-/EXE-файлы
     

    Вложения:

    • 09 Mutex.zip
      Размер файла:
      1.014 КБ
      Просмотров:
      134
    Marylin и who_know777 нравится это.
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    14. Удаленный вызов процедур (Remote Procedure Call, RPC)
    Огромное спасибо HoShiMin и f13nd за помощь оказанную при написании программы!
    RPC технологии ― достаточно старые технологии. Наиболее яркие представители технологий RPC, это ― CORBA и DCOM. Главная идея RPC в том, чтобы сделать вызов удаленных систем похожим на вызов функций внутри программы. Вся механика удаленных вызовов прячется от программиста. Обычные вызовы функций внутри процессов обрабатывались на вызывающей стороне в Proxy, а на стороне системы, выполняющей функцию, в Dispatcher. Наблюдается своеобразный ренессанс RPC, наиболее яркие представители которого: Google ProtoBuf, Thrift, Avro. Теперь программист явным образом создает сервис (Service) или клиента (Client), вызывающего сервис. Сервис ― набор операций (Operation), каждая из которых на входе принимает запрос (Request) и выдает ответ (Response). Клиент явным образом посылает (Sent) запрос, сервис явным образом получает (Receive) его и отвечает (Sent), высылая ответ. Клиент получает (Receive) ответ и на этом вызов завершался.
    В процессе RPC выполняются следующие шаги:
    1. Клиент, заглушка клиента и один экземпляр времени выполнения RPC выполняются на клиентском компьютере.
    2. Клиент запускает процесс-заглушку клиента, передавая параметры обычным способом. Клиентская заглушка хранится в собственном адресном пространстве клиента. Он также просит локальную среду выполнения RPC отправить обратно на заглушку сервера.
    3. На этом этапе RPC доступен для пользователя путем выполнения обычной локальной процедурной калибровки. RPC Runtime управляет передачей сообщений между сетью через клиент и сервер. Он также выполняет работу по повторной передаче, подтверждению, маршрутизации и шифрованию.
    4. После завершения серверной процедуры он возвращается к заглушке сервера, которая упаковывает (маршаллы) возвращаемые значения в сообщение. Затем заглушка сервера отправляет сообщение обратно на транспортный уровень.
    5. На этом этапе транспортный уровень отправляет сообщение с результатом клиентскому транспортному уровню, который возвращает сообщение клиентской заглушке.
    6. На этом этапе клиентская заглушка демаршаллизирует (распаковывает) возвращаемые параметры в результирующем пакете, и процесс выполнения возвращается вызывающей стороне.
    Характеристики RPC
    • Вызываемая процедура находится в другом процессе, который находится на другом компьютере.
    • Процессы не разделяют адресное пространство.
    • Параметры передаются только по значениям.
    • RPC выполняется в среде серверного процесса.
    • Он не предлагает доступ к среде вызывающей процедуры.
    RpcStringBindingCompose
    Функция RpcStringBindingCompose создает дескриптор привязки строки.
    Код (C):
    1. RPC_STATUS RpcStringBindingCompose(
    2.   RPC_CSTR ObjUuid,
    3.   RPC_CSTR ProtSeq,
    4.   RPC_CSTR NetworkAddr,
    5.   RPC_CSTR Endpoint,
    6.   RPC_CSTR Options,
    7.   RPC_CSTR *StringBinding
    8. );
    Параметры
    • ObjUuid ― Указатель на строковое представление UUID объекта, заканчивающееся нулем.
    • ProtSeq ― Указатель на строковое представление последовательности протокола, заканчивающееся нулем.
    • NetworkAddr ― Указатель на строковое представление сетевого адреса, заканчивающееся нулем. Формат сетевого адреса связан с последовательностью протокола.
    • endpoint ― Указатель на строковое представление endpoint, заканчивающееся нулем. Формат и содержимое endpoint связаны с последовательностью протокола. Например, endpoint, связан с последовательностью протокола ncacn_np, представляет собой имя канала в формате \pipe\pipename.
    • Options ― Указатель на строковое представление параметров сети, заканчивающееся нулем. Строка параметра связана с последовательностью протокола.
    • StringBinding — возвращает указатель на строковое представление дескриптора привязки, заканчивающееся нулем.
      Укажите значение NULL, чтобы RpcStringBindingCompose не возвращал параметр StringBinding. В этом случае приложение не вызывает RpcStringFree.
    Возвращаемые значения
    ЗначениеhexОписание
    RPC_S_OK
    0​
    Успешный вызов функции
    RPC_S_INVALID_STRING_UUID6A9недопустимое строковое представление UUID
    RpcBindingFromStringBinding
    Функция RpcBindingFromStringBinding возвращает дескриптор привязки из строкового представления дескриптора привязки.
    Код (C):
    1. RPC_STATUS RpcBindingFromStringBinding(
    2.   RPC_CSTR           StringBinding,
    3.   RPC_BINDING_HANDLE *Binding
    4. );
    Параметры
    • StringBinding ― Указатель на строковое представление дескриптора привязки.
    • Binding ― возвращает указатель на дескриптор привязки сервера.
    Возвращаемые значения
    ЗначениеhexОписание
    RPC_S_OK
    0​
    Успешный вызов функции
    RPC_S_INVALID_ARG
    57​
    Аргумент недействителен
    RPC_S_INVALID_STRING_BINDING6A4Привязка строки недействительна
    RPC_S_PROTSEQ_NOT_SUPPORTED6A7Последовательность протоколов не поддерживается на этом хосте
    RPC_S_INVALID_RPC_PROTSEQ6A8Последовательность протокола недействительна.
    RPC_S_INVALID_ENDPOINT_FORMAT6AAНедопустимый формат endpoint.
    RPC_S_INVALID_NET_ADDR6ABНедействительный сетевой адрес.
    RPC_S_STRING_TOO_LONG6CFСлишком длинная строка.
    RPC_S_INVALID_NAF_ID6E3Недопустимый идентификатор семейства сетевых адресов.
    Функция RpcStringFree освобождает строку символов, выделенную библиотекой времени выполнения RPC.
    Код (C):
    1. RPC_STATUS RpcStringFree(
    2.   RPC_CSTR *String
    3. );
    Параметры
    • String ― Указатель на указатель на строку символов, которую нужно освободить.
    Возвращаемые значения
    ЗначениеhexОписание
    RPC_S_OK
    0​
    Успешный вызов функции.
    Примечание
    Приложение отвечает за однократный вызов RpcStringFree для каждой строки символов, выделенной и возвращенной вызовами других процедур библиотеки времени выполнения RPC.
    NdrClientCall2
    Функция NdrClientCall2 точка входа на стороне клиента для заглушки режима /Oicf.
    Код (C):
    1. CLIENT_CALL_RETURN RPC_VAR_ENTRY NdrClientCall2(
    2.   [in] PMIDL_STUB_DESC pStubDescriptor,
    3.   [in] PFORMAT_STRING  pFormat,
    4.        ...
    5. );
    Параметры
    • [in] pStubDescriptor ― Указатель на сгенерированную MIDL структуру MIDL_STUB_DESC, которая содержит информацию об описании удаленного интерфейса.
    • [in] pFormat ― Указатель на строку формата процедуры, сгенерированную MIDL, которая описывает метод и параметры.
      ...
      Указатель на стек вызовов на стороне клиента.
    Возвращаемые значения
    Возвращаемое значение удаленного вызова. Максимальный размер возвращаемого значения эквивалентен размеру регистра системы. MIDL переключается на заглушку режима /Os, если размер возвращаемого значения больше размера регистра. В зависимости от определения метода эта функция может вызвать исключение в случае сбоя сети или сервера.
    Примечания
    Функция NdrClientCall2 используется всеми клиентскими заглушками режима /Oicf. Функция NdrClientCall2 передает все [in] данные на удаленный сервер и после получения ответного пакета возвращает значение [out] клиентскому приложению.
    NdrServerCall2
    Функция NdrServerCall2 не предназначена для непосредственного вызова из приложения.
    Код (C):
    1. void NdrServerCall2(
    2.   PRPC_MESSAGE pRpcMsg
    3. );
    Параметры
    • pRpcMsg ― зарезервировано.
    RpcServerUseProtseqEp
    Функция RpcServerUseProtseqEp указывает библиотеке времени выполнения RPC использовать указанную последовательность протоколов в сочетании с указанной конечной точкой для получения удаленных вызовов процедур.
    Код (C):
    1. RPC_STATUS RpcServerUseProtseqEp(
    2.   RPC_CSTR     Protseq,
    3.   unsigned int MaxCalls,
    4.   RPC_CSTR     Endpoint,
    5.   void         *SecurityDescriptor
    6. );
    Параметры
    • Protseq ― указатель на строковый идентификатор последовательности протокола для регистрации в библиотеке времени выполнения RPC.
    • MaxCalls ― длина очереди очереди для последовательности протокола ncacn_ip_tcp. Все другие последовательности протоколов игнорируют этот параметр. Используйте RPC_C_PROTSEQ_MAX_REQS_DEFAULT, чтобы указать значение по умолчанию.
    • Endpoint ― указатель на информацию об адресе конечной точки, используемую при создании привязки для последовательности протоколов, указанной в параметре Protseq.
    • SecurityDescriptor ― указатель на необязательный параметр, предоставленный для подсистемы безопасности. Используется только для последовательностей протоколов ncacn_np и ncalrpc. Все другие последовательности протоколов игнорируют этот параметр. Использование дескриптора безопасности на конечной точке для обеспечения безопасности сервера не рекомендуется. Этот параметр отсутствует в спецификации DCE для этого API.
    Возвращаемые значения
    ЗначениеhexОписание
    RPC_S_OK
    0​
    Успешный вызов функции
    RPC_S_PROTSEQ_NOT_SUPPORTED
    6A7​
    Последовательность протоколов не поддерживается на этом хосте
    RPC_S_INVALID_RPC_PROTSEQ
    6A8​
    Последовательность протокола недействительна.
    RPC_S_INVALID_ENDPOINT_FORMAT
    6AA​
    Недопустимый формат endpoint.
    RPC_S_OUT_OF_MEMORYC0000017Системе не хватает памяти.
    RPC_S_DUPLICATE_ENDPOINT
    6CC​
    endpoint является дубликатом
    RPC_S_INVALID_SECURITY_DESC
    53A​
    Недопустимый дескриптор безопасности.
    Примечания
    Серверное приложение вызывает RpcServerUseProtseqEp для регистрации одной последовательности протокола в библиотеке времени выполнения RPC. При каждой регистрации последовательности протоколов RpcServerUseProtseqEp включает указанную информацию об адресе конечной точки.
    Чтобы получать запросы на удаленный вызов процедур, сервер должен зарегистрировать хотя бы одну последовательность протоколов в библиотеке времени выполнения RPC. Серверное приложение может вызывать эту процедуру несколько раз, чтобы зарегистрировать дополнительные последовательности протоколов и конечные точки. Для каждой последовательности протокола, зарегистрированной сервером, библиотека времени выполнения RPC создает одну или несколько конечных точек, через которые сервер получает запросы удаленного вызова процедур. Библиотека времени выполнения RPC создает разные конечные точки для каждой последовательности протоколов. Однако каждый интерфейс в процессе доступен через любую конечную точку.
    Для MaxCalls значение, предоставляемое приложением, является лишь подсказкой. Это значение может быть переопределено средой выполнения RPC или поставщиком сокетов Windows. Например, в Windows XP или Windows 2000 Professional значение ограничено 5. Значения больше 5 игнорируются и вместо них используется 5. В Windows Server 2003 и Windows 2000 Server это значение будет учитываться.
    Приложения должны быть осторожны, чтобы передавать разумные значения в MaxCalls. Большие значения для Server, Advanced Server или Datacenter Server могут привести к использованию большого объема памяти невыгружаемого пула. Использование слишком малого значения также нежелательно, так как это может привести к тому, что пакеты TCP SYN будут встречены протоколом TCP RST с сервера, если очередь ожидания будет исчерпана. Разработчик приложения должен сбалансировать объем памяти и требования к масштабируемости при определении правильного значения для MaxCalls.
    Если компьютер настроен на использование выборочной привязки, успешный возврат не гарантирует, что сервер создал конечные точки для всех сетевых интерфейсов, присутствующих на компьютере. Среда выполнения RPC может не прослушивать некоторые сетевые интерфейсы в зависимости от настроек выборочной привязки. Кроме того, если интерфейс еще не получил IP-адрес с помощью DHCP, сервер RPC не прослушивает сетевой интерфейс, пока ему не будет назначен DHCP-адрес. Успешный возврат означает, что сервер прослушивает по крайней мере один сетевой интерфейс; полный список дескрипторов привязки, через которые могут быть получены удаленные вызовы процедур, можно получить с помощью вызова функции
    RpcServerInqBindings.
    RpcServerRegisterIf
    Функция RpcServerRegisterIf регистрирует интерфейс в библиотеке времени выполнения RPC.
    Код (C):
    1. RPC_STATUS RpcServerRegisterIf(
    2.   RPC_IF_HANDLE IfSpec,
    3.   UUID          *MgrTypeUuid,
    4.   RPC_MGR_EPV   *MgrEpv
    5. );
    Параметры
    • IfSpec ― генерируемая MIDL структура, указывающая интерфейс для регистрации.
    • MgrTypeUuid ― Указатель на UUID типа для связи с параметром MgrEpv. Указание нулевого значения параметра (или нулевого UUID) регистрирует IfSpec с нулевым UUID.
    • MgrEpv ― Вектор точек входа (EPV) подпрограмм менеджера. Чтобы использовать EPV по умолчанию, сгенерированный MIDL, укажите нулевое значение.
    Возвращаемое значение
    Возвращает RPC_S_OK в случае успеха.
    Примечания
    Сервер может зарегистрировать неограниченное количество интерфейсов в библиотеке времени выполнения RPC. Регистрация делает интерфейс доступным для клиентов, используя дескриптор привязки к серверу. Чтобы зарегистрировать интерфейс, код серверного приложения вызывает RpcServerRegisterIf. Для каждой реализации интерфейса, которую предлагает сервер, он должен зарегистрировать отдельный EPV менеджера.
    При вызове RpcServerRegisterIf сервер предоставляет следующую информацию:
    Спецификация интерфейса. Спецификация интерфейса — это структура данных, которую генерирует компилятор MIDL. Сервер указывает интерфейс с помощью параметра IfSpec.
    UUID типа менеджера и EPV менеджера ― UUID типа менеджера и EPV менеджера определяют, какая подпрограмма менеджера выполняется, когда сервер получает запрос удаленного вызова процедуры от клиента. Сервер указывает UUID и EPV типа менеджера, используя параметры MgrTypeUuid и MgrEpv. Обратите внимание, что при указании UUID типа менеджера, отличного от nil, сервер должен также вызывать функцию RpcObjectSetType для регистрации объектов этого отличного от nil типа. Если вашему серверному приложению необходимо зарегистрировать интерфейс автоматического прослушивания или использовать функцию обратного вызова для аутентификации, используйте RpcServerRegisterIfEx.
    RpcServerListen
    Функция RpcServerListen сигнализирует библиотеке времени выполнения RPC прослушивать удаленные вызовы процедур. Эта функция не повлияет на интерфейсы автоматического прослушивания; используйте RpcServerRegisterIfEx , если вам нужна эта функциональность.
    Код (C):
    1. RPC_STATUS RpcServerListen(
    2.   unsigned int MinimumCallThreads,
    3.   unsigned int MaxCalls,
    4.   unsigned int DontWait
    5. );
    Параметры
    • MinimumCallThreads ― подсказка для среды выполнения RPC, указывающая минимальное количество потоков вызовов, которые должны быть созданы и поддерживаться на данном сервере. Это значение является лишь подсказкой и интерпретируется по-разному в разных версиях Windows. В Windows XP это значение представляет собой количество ранее созданных потоков в каждом пуле потоков, которые создает среда выполнения RPC. Приложение должно указать один для этого параметра и отложить принятие решений о создании потока во время выполнения RPC.
    • MaxCalls ― рекомендуемое максимальное количество одновременных удаленных вызовов процедур, которые может выполнить сервер. Чтобы обеспечить эффективную производительность, библиотеки времени выполнения RPC интерпретируют параметр MaxCalls как предлагаемый предел, а не как абсолютную верхнюю границу. Используйте RPC_C_LISTEN_MAX_CALLS_DEFAULT , чтобы указать значение по умолчанию.
    • DontWait ― флаг, управляющий возвратом от RpcServerListen. Ненулевое значение указывает, что RpcServerListen должен вернуться сразу после завершения обработки функции. Нулевое значение указывает, что RpcServerListen не должен возвращаться до тех пор, пока не будет вызвана функция RpcMgmtStopServerListening и не будут завершены все удаленные вызовы.
    Возвращаемые значения
    ЗначениеhexОписание
    RPC_S_OK
    0​
    Успешный вызов функции
    RPC_S_ALREADY_LISTENING6B1Сервер уже в режиме прослушивания.
    RPC_S_NO_PROTSEQS_REGISTERED6B2Протокольные последовательности не зарегистрированы.
    RPC_S_MAX_CALLS_TOO_SMALL6CEМаксимальное значение вызовов слишком мало.
    RpcServerUnregisterIf
    Функция RpcServerUnregisterIf удаляет интерфейс из реестра библиотеки времени выполнения RPC.
    Код (C):
    1. RPC_STATUS RpcServerUnregisterIf(
    2.   RPC_IF_HANDLE IfSpec,
    3.   UUID          *MgrTypeUuid,
    4.   unsigned int  WaitForCallsToComplete
    5. );
    Параметры
    • IfSpec ― Интерфейс для удаления из реестра. Укажите нулевое значение, чтобы удалить все интерфейсы, ранее зарегистрированные со значением UUID типа, указанным в параметре MgrTypeUuid.
    • MgrTypeUuid ― указатель на тип UUID вектора точки входа менеджера (EPV), который необходимо удалить из реестра. Значение MgrTypeUuid должно быть тем же значением, которое было предоставлено при вызове функции RpcServerRegisterIf, RpcServerRegisterIf2 или функции RpcServerRegisterIfEx. Укажите нулевое значение, чтобы удалить интерфейс, указанный в параметре IfSpec, для всех ранее зарегистрированных UUID типов из реестра. Укажите нулевой UUID, чтобы удалить EPV менеджера по умолчанию, сгенерированный MIDL, из реестра. В этом случае все EPV менеджера, зарегистрированные с UUID отличного от nil типа, остаются зарегистрированными.
    • WaitForCallsToComplete ― флаг, указывающий, следует ли немедленно удалить интерфейс из реестра или дождаться завершения всех текущих вызовов. Укажите нулевое значение, чтобы игнорировать текущие вызовы и немедленно удалить интерфейс из реестра. Укажите любое ненулевое значение для ожидания завершения всех активных вызовов.
    Возвращаемые значения
    ЗначениеhexОписание
    RPC_S_OK
    0​
    Успешный вызов функции
    RPC_S_UNKNOWN_MGR_TYPE6B4Тип менеджера неизвестен.
    RPC_S_UNKNOWN_IF6B5Интерфейс неизвестен.
     

    Вложения:

    Marylin нравится это.
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792

    Атрибут ncalrpc

    Ключевое слово ncalrpc определяет локальную межпроцессную связь как семейство протоколов для endpoint. Это ключевое слово является одним из допустимых имен семейств протоколов, которые должны использоваться с атрибутом endpoint.
    Код (C):
    1. endpoint("ncalrpc:[port-name]")

    Параметры

    port-name
    Символьная строка, задающая порт связи (приложение, служба или экземпляр службы), который клиент использует для выполнения межпроцессных вызовов к серверу. Строка может содержать до 53 символов и не должна содержать символы обратной косой черты (\). Имя компьютера не должно использоваться с ключевым словом ncalrpc .
    Синтаксис строки локального межпроцессного порта, как и все строки портов, определяется реализацией транспорта и не зависит от спецификации IDL. Компилятор MIDL выполняет ограниченную проверку синтаксиса, но не гарантирует правильность спецификации endpoint. Некоторые классы ошибок могут сообщаться во время выполнения, а не во время компиляции.

    Атрибут endpoint

    Атрибут [endpoint] указывает известный порт или порты (endpoint связи), на которых серверы интерфейса прослушивают вызовы.
    Код (C):
    1. endpoint("protocol-sequence:[endpoint-port]" [ , ...] )

    Параметры

    последовательность протоколов
    Задает символьную строку, представляющую допустимое сочетание протокола RPC (например, ncacn), транспортного протокола (например, tcp) и сетевого протокола (например, ip).

    Список допустимых последовательностей протоколов

    Microsoft RPC поддерживает следующие последовательности протоколов.
    КонстантаЗначениеОписание
    ncacn_nb_tcpПротокол TCP, ориентированный на подключение NetBIOSТолько клиент: MS-DOS, клиент Windows 3.x и сервер: Windows Server 2003, Windows XP, Windows 2000, Windows NT
    ncacn_nb_ipxОриентированные на подключение NetBIOS через интернет-пакет Exchange (IPX)Только клиент: MS-DOS, клиент Windows 3.x и сервер: Windows Server 2003, Windows XP, Windows 2000, Windows NT
    ncacn_nb_nbОриентированный на подключение пользовательский интерфейс NetBIOS (NetBEUI)Только клиент: MS-DOS, Windows 3.x Client and Server: Windows Server 2003, Windows XP, Windows 2000, Windows NT, Windows Me, Windows 98, Windows 95
    ncacn_ip_tcpПротокол TCP/IP, ориентированный на подключениеТолько клиент: MS-DOS, Windows 3.x и клиент и сервер Apple Macintosh: Windows Server 2003, Windows XP, Windows 2000, Windows NT, Windows Me, Windows 98, Windows 95
    ncacn_npИменованные каналы, ориентированные на подключениеТолько клиент: MS-DOS, Windows 3.x, Windows 95 Client and Server: Windows Server 2003, Windows XP, Windows 2000, Windows NT
    ncacn_spxExchange пакетов, ориентированных на подключение (SPX)Только клиент: MS-DOS, Windows 3.x Client and Server: Windows Server 2003, Windows XP, Windows 2000, Windows NT, Windows Me, Windows 98, Windows 95
    ncacn_dnet_nspТранспорт DECnet, ориентированный на подключениеТолько клиент: MS-DOS, Windows 3.x
    ncacn_at_dspПоставщик служб DSP AppleTalk, ориентированный на подключениеКлиент: Apple Macintosh Server: Windows Server 2003, Windows XP, Windows 2000, Windows NT
    ncacn_vns_sppТранспорт масштабируемой параллельной обработки с ориентацией на подключение (SPP)Только клиент: MS-DOS, клиент Windows 3.x и сервер: Windows Server 2003, Windows XP, Windows 2000, Windows NT
    ncadg_ip_udpDatagram (без подключения) User Datagram Protocol/Internet Protocol (UDP/IP)Только клиент: MS-DOS, клиент Windows 3.x и сервер: Windows Server 2003, Windows XP, Windows 2000, Windows NT
    ncadg_ipxDatagram (без подключения) IPXТолько клиент: MS-DOS, клиент Windows 3.x и сервер: Windows Server 2003, Windows XP, Windows 2000, Windows NT
    ncadg_mqДатаграмма (без подключения) через сервер очереди сообщений Майкрософт (MSMQ)Только клиент: Windows Me/98/95 Client and Server: Windows Server 2003, Windows XP, Windows 2000, Windows NT Server 4.0 с пакетом обновления 3 (SP3) и более поздних версий
    ncacn_httpПротокол TCP/IP, ориентированный на подключение, с помощью Microsoft Internet Information Server в качестве прокси-сервера HTTPТолько клиент: Windows Me/98/95 Client and Server: Windows Server 2003, Windows XP, Windows 2000
    ncalrpcВызов локальной процедурыКлиент и сервер: Windows Server 2003, Windows XP, Windows 2000, Windows NT, Windows Me, Windows 98, Windows 95
    порт endpoint
    Указывает строку, представляющую назначение endpoint для указанного семейства протоколов. Синтаксис строки порта зависит от каждой последовательности протоколов.
    Атрибут [endpoint] указывает семейство транспорта, такое как протокол, ориентированный на подключение TCP/IP, протокол, ориентированный на подключение NetBIOS, или протокол, ориентированный на подключение с именованным каналом. Использование атрибута [endpoint] согласуется с другими методами добавления endpoint и не предоставляет дополнительные или специальные службы для endpoint; он просто предоставляет ярлык для вызова API.
    14.jpg
    Передача текста, картинок и музыки между приложениями практически мгновенная! :)
    Текст приложения-сервера 14r.asm
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. IDC_DIALOG    equ 200
    4. IDC_TXT        equ 100
    5. ID_ICON        equ 102
    6. IDC_ICON1    equ 500
    7. RPC_S_OK    equ 0
    8. RPC_C_LISTEN_MAX_CALLS_DEFAULT equ 1234
    9. RPC_VERSION  struc
    10.     MajorVersion dw ?
    11.     MinorLinker  dw ?
    12. RPC_VERSION  ends
    13. RPC_SERVER_INTERFACE struct
    14.     Len        dd ?
    15.     InterfaceId    GUID <>
    16.     a        RPC_VERSION <>
    17.     TransferSyntax    GUID <>
    18.     b        RPC_VERSION <>
    19.             dd ?
    20.     DispatchTable    dq ?
    21.     RpcProtseqEndpointCount  dd ?,?
    22.     RpcProtseqEndpoint dq ?
    23.     DefaultManagerEpv dq ?
    24.     InterpreterInfo dq ?
    25.     Flags        dd ?,?
    26. RPC_SERVER_INTERFACE ends
    27. .code
    28. WinMain proc
    29.         enter    30h,0
    30.         mov    r9d,offset DialogProc
    31.         and    qword ptr[rbp-10h],0
    32.         invoke  DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP
    33.         invoke  RtlExitUserProcess,NULL
    34. WinMain endp
    35. DialogProc proc hWnddlg:qword,msg:qword,wParam:qword,lParam:qword
    36.        mov    hWnddlg,rcx
    37.        mov    lParam,r9
    38.         cmp    edx,WM_INITDIALOG
    39.         je     wmINITDIALOG
    40.         cmp    edx,WM_CLOSE
    41.         je    wmCLOSE
    42.         cmp    edx,WM_COMMAND
    43.         je    wmCOMMAND
    44.         cmp    edx,WM_DESTROY
    45.         je    wmDESTROY
    46.        xor    eax,eax
    47.         jmp    exit0
    48. wmDESTROY:
    49.     jmp    wmBYE
    50. wmINITDIALOG:mov hWnd,rcx
    51.        invoke    GetProcessHeap
    52.        mov     hHeap,rax
    53. ; Найти окно отправителя
    54.         mov    edx,offset szWin
    55.         invoke  FindWindowA,NULL
    56.         or      eax,eax
    57.         jnz    wmBYE
    58.        mov    edx,offset Error1
    59.        mov    r8d,offset szAppName
    60.     invoke    MessageBoxA,hWnddlg,,,MB_ICONEXCLAMATION or MB_YESNO
    61.     cmp    eax,IDNO
    62.     jz      wmBYE
    63.     mov    ecx,offset szService
    64.     invoke    WinExec,,SW_SHOW
    65. ;start Rpc Server And Listen---------------------------------
    66.     mov    r8d,offset endpoint
    67.     mov    ecx,offset protocol
    68.     invoke    RpcServerUseProtseqEpA,,RPC_C_LISTEN_MAX_CALLS_DEFAULT,,0
    69.     or    eax,eax;cmp    eax,RPC_S_OK
    70.     jz    @f
    71.     mov    edx,offset Format
    72.     jmp    @0
    73. @@:    mov    ecx,offset RPC_SampleInterface_v1_0_s_ifspec
    74.     invoke    RpcServerRegisterIf,,0,0
    75.     or    eax,eax;cmp    eax,RPC_S_OK
    76.     jz    @f
    77.     mov    edx,offset aUnableToRegist
    78.     jmp    @0
    79. ; Start to listen for remote procedure
    80. ; calls for all registered interfaces.
    81. ; This call will not return until
    82. ; RpcMgmtStopServerListening is called.
    83. @@:    invoke    RpcServerListen,1,\;Recommended minimum number of threads.
    84.     RPC_C_LISTEN_MAX_CALLS_DEFAULT,\;Recommended maximum number of threads
    85.     TRUE
    86.     or    eax,eax;cmp    eax,RPC_S_OK
    87.     jz    wmBYE
    88.     mov    edx,offset aUnableToStartL
    89.     mov    r8d,offset szAppName
    90.     invoke    MessageBoxA,hWnddlg,,,MB_ICONEXCLAMATION or MB_OK
    91.     mov    ecx,offset RPC_SampleInterface_v1_0_s_ifspec
    92.     invoke    RpcServerUnregisterIf,,0,0
    93.     or    eax,eax;cmp    eax,RPC_S_OK
    94.     jz    wmBYE
    95.     mov    edx,offset aUnableToUnregi
    96. @0:    mov    r8d,offset szAppName
    97.     invoke    MessageBoxA,hWnddlg,,,MB_ICONEXCLAMATION or MB_OK
    98.     jmp    wmBYE
    99. ;--------------------------------------------------
    100. wmCOMMAND:cmp    r8d,BN_CLICKED shl 16 + IDCANCEL
    101.     jne    wmBYE
    102. wmCLOSE:invoke    EndDialog,,0
    103. wmBYE:    mov    eax,TRUE
    104. exit0:    leave
    105.     retn
    106. DialogProc endp
    107. j_NdrServerCall2 proc
    108.     jmp    NdrServerCall2
    109. j_NdrServerCall2 endp
    110. ; Memory allocation function for RPC.
    111. ; The runtime uses these two functions for allocating/deallocating
    112. ; enough memory to pass the string to the server.
    113. MIDL_user_allocate proc len:qword
    114.     mov    r8d,ecx
    115.     invoke    RtlAllocateHeap,hHeap,0
    116.     leave
    117.     retn
    118. MIDL_user_allocate endp
    119. MIDL_user_free proc lpMem:qword
    120.     mov    r8d,ecx
    121.     invoke    HeapFree,hHeap,0
    122.     leave
    123.     retn
    124. MIDL_user_free endp
    125. RPC_SampleInterface_sampleFunc proc handle_t:qword,size_:dword,buffer:qword
    126. local    hWaveOut:qword
    127. local    lpwiocb:WAVEHDR
    128.     mov    buffer,r8
    129.     mov    size_,edx
    130.     mov    handle_t,rcx
    131.     cmp    byte ptr[r8],CF_TEXT
    132.     jne    @f
    133.     and    byte ptr[r8+rdx],0
    134.     inc    r8
    135.     invoke    SetDlgItemTextA,hWnd,IDC_TXT;,buffer
    136.     jmp    @0
    137. ;------------------------------------------------------------------
    138. @@:    cmp    byte ptr[r8],CF_BITMAP
    139.     jne    @f
    140.     lea    ecx,[r8+1]
    141.     invoke  CreateIconFromResourceEx,,,TRUE,30000h,256,256,LR_DEFAULTCOLOR
    142.     invoke  SendDlgItemMessageA,hWnd,ID_ICON,STM_SETIMAGE,IMAGE_ICON,eax
    143.     jmp    @0
    144. ;------------------------------------------------------------------
    145. @@:    mov    r8,buffer
    146. ;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data) = 14h
    147.         add    r8d,14h
    148.         invoke    waveOutOpen,&hWaveOut,WAVE_MAPPER,,0,0,WAVE_ALLOWSYNC
    149. ; Подготавливаем заголовок для вывода
    150.     lea    edi,lpwiocb
    151.     mov    edx,edi
    152.     xor    eax,eax
    153.     mov    ecx,(sizeof WAVEHDR)/8
    154.     rep    stosq
    155.     mov    rax,buffer
    156. ;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data)+\
    157. ;(Type of format)+(Number of Channels)+(Sample Rate)+(Sample Rate*BitsPerSample*Channels/8)+\
    158. ;(BitsPerSample*Channels/8)+(Bits per sample)+(“data” chunk header)+(Size of the data section)=2Ch
    159.     add    rax,2Ch
    160.     mov    [rdx].WAVEHDR.lpData,rax ;адрес блока данных
    161.     mov    eax,size_
    162.     sub    eax,2Ch
    163.     mov    [rdx].WAVEHDR.dwBufferLength,eax ;размер блока данных
    164.     invoke    waveOutPrepareHeader,hWaveOut,,sizeof WAVEHDR
    165. ; Запускаем проигрывание блока
    166.     invoke    waveOutWrite,hWaveOut,&lpwiocb,sizeof WAVEHDR
    167. @@:    test    lpwiocb.dwFlags,WHDR_DONE
    168.     jz    @b
    169.     invoke    waveOutUnprepareHeader,hWaveOut,&lpwiocb,sizeof WAVEHDR
    170.     invoke    waveOutClose,hWaveOut
    171. @0:    leave
    172.     retn
    173. RPC_SampleInterface_sampleFunc endp
    174. ;-----------------------------------------------------------------------
    175. .data
    176. szWin        db "Remote Procedure Call Sender",0
    177. Error1        db "The server is not running.",10,"Run?",0
    178. szAppName    db "Remote Procedure Call Reciever",0
    179. szService    db "14s",0
    180. protocol    db "ncalrpc",0
    181. endpoint    db "{46E785FC-BCCC-46B8-B161-D6C90D391670}",0; // Unique user-defined endpoint ID in a free form
    182. Format        db "Unable to setup protocol sequence",0
    183. aUnableToRegist    db "Unable to register the interface",0
    184. aUnableToStartL db "Unable to start listening",0
    185. aUnableToUnregi db "Unable to unregister the interface",0
    186. hWnd        dq ?
    187. hHeap        dq ?
    188. ;
    189. RPC_SampleInterface_v1_0_s_ifspec label RPC_SERVER_INTERFACE
    190.     dd sizeof RPC_SERVER_INTERFACE;Length
    191.     GUID <8A4A7813h,0ADAAh,49BCh,{99h,6Ah,4Dh,47h,71h,5Fh,0CAh,40h}>
    192.     RPC_VERSION <1,0>          ;RPC_VERSION  MajorVersion: u16, MinorVersion: u16 +14
    193.     GUID <8A885D04h,1CEBh,11C9h,{9Fh,0E8h,8,0,2Bh,10h,48h,60h}>               ;+20
    194.     RPC_VERSION <2,0>          ;RPC_VERSION  MajorVersion: u16, MinorVersion: u16 +28
    195.     dd 0                                                 ;+2C
    196.     dq RPC_SampleInterface_v1_0_DispatchTable;DispatchTable: *mut RPC_DISPATCH_TABLE +30
    197.     dd 0,0 ;RpcProtseqEndpointCount: u32                 +38
    198.     dq 0   ;RpcProtseqEndpoint: *mut RPC_PROTSEQ_ENDPOINT +3C
    199.     dq 0   ;DefaultManagerEpv: *mut c_void               +44
    200.     dq RPC_SampleInterface_ServerInfo;InterpreterInfo: *const c_void +4C
    201.     dd 4000000h  ;Flags: u32
    202. RPC_SampleInterface_v1_0_DispatchTable:
    203.     dq 1
    204.     dq RPC_SampleInterface_table
    205.     dq 0
    206. RPC_SampleInterface_table:
    207.     dq j_NdrServerCall2
    208.     dq 0
    209. ;---------------------------------------------
    210. RPC_SampleInterface_ServerInfo:
    211.         dq RPC_SampleInterface_StubDesc
    212.         dq RPC_SampleInterface_ServerRoutineTable
    213.         dq RPC_SampleInterface__MIDL_ProcFormatString
    214.         dq RPC_SampleInterface_FormatStringOffsetTable
    215.         dq 0
    216.         dq 0
    217.         dq 0
    218.         dq 0
    219. RPC_SampleInterface_StubDesc:
    220.         dq RPC_SampleInterface_v1_0_s_ifspec
    221.         dq MIDL_user_allocate
    222.         dq MIDL_user_free
    223.         dq 0        
    224.         dq 0        
    225.         dq 0        
    226.         dq 0        
    227.         dq 0        
    228.         dq RPC_SampleInterface__MIDL_TypeFormatString
    229.         dd 1
    230.         dd 50002h
    231.         dq 0
    232.         dd 8010274h
    233.         dq 0
    234.         dq 0
    235.         dq 0
    236.         dd 0
    237.         dq 1
    238.         dq 0
    239.         dq 0
    240.         dq 0
    241. ;------------------------------------------
    242. RPC_SampleInterface_ServerRoutineTable dq RPC_SampleInterface_sampleFunc
    243. RPC_SampleInterface__MIDL_ProcFormatString:
    244.     db 0,48h
    245.     dd 0
    246.     dw 0
    247.     dw 18h
    248.     db 32h,0
    249.     dw 0
    250.     dw 8
    251.     dw 0
    252.     db 42h,2,0Ah,5
    253.     dw 0
    254.     dw 1
    255.     dw 0
    256.     dw 0
    257.     dw 48h
    258.     dw 8
    259.     db 8,0
    260.     dw 10Bh
    261.     dw 10h
    262.     dw 6
    263.     db 0
    264. RPC_SampleInterface_FormatStringOffsetTable:
    265.     dd 0
    266. RPC_SampleInterface__MIDL_TypeFormatString:
    267.     dw 0
    268.     db 11h,0
    269.     dw 2
    270.     db 1Bh,0
    271.     dw 1
    272.     db 29h,0
    273.     dw 8
    274.     dw 1
    275.     db 2,5Bh,0
    276. end
    ресурсы (14r.rc)
    Код (C):
    1. #include "resource.h"
    2. #define IDC_DIALOG    200
    3. #define IDC_TXT        100
    4. #define ID_ICON        102
    5. IDC_DIALOG DIALOG 0,0,212,140
    6. STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
    7. WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
    8. CAPTION "Remote Procedure Call Reciever"
    9. BEGIN
    10.     CONTROL    "",-1,"BUTTON",BS_GROUPBOX, 2, -1, 207, 24
    11.     CONTROL    "",IDC_TXT,"STATIC",WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL,5,7,199,13
    12.     DEFPUSHBUTTON  "Exit",IDCANCEL,149,27,60,15
    13.         CONTROL    1,ID_ICON,"STATIC",WS_CHILDWINDOW | SS_ICON,5,23,128,128
    14. END
    Текст приложения-клиента (14s.asm)
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. ID_TXT        equ 100
    4. ID_SEND_TXT    equ 101
    5. ID_SEND_ICO    equ 102
    6. ID_SEND_WAV    equ 103
    7. IDC_DIALOG    equ 200
    8. IDC_ICON1    equ 500
    9. IDC_IMG1     equ 104
    10. RPC_S_OK    equ 0
    11. RPC_C_LISTEN_MAX_CALLS_DEFAULT equ 1234
    12. RPC_VERSION  struc
    13.     MajorVersion dw ?
    14.     MinorLinker  dw ?
    15. RPC_VERSION  ends
    16. RPC_CLIENT_INTERFACE struct
    17.     Len        dd ?
    18.     InterfaceId    GUID <>
    19.     a        RPC_VERSION <>
    20.     TransferSyntax    GUID <>
    21.     b        RPC_VERSION <>
    22.             dd ?
    23.     DispatchTable    dq ?
    24.     RpcProtseqEndpointCount  dd ?,?
    25.     RpcProtseqEndpoint dq ?
    26.     DefaultManagerEpv dq ?
    27.     InterpreterInfo dq ?
    28.     Flags        dd ?,?
    29. RPC_CLIENT_INTERFACE ends
    30. .code
    31. WinMain proc
    32.     enter    30h,0
    33.     mov    r9d,256;cx
    34.     mov    [rbp-10h],r9
    35.     mov    qword ptr [rbp-8],LR_DEFAULTCOLOR
    36.     invoke    LoadImageA,IMAGE_BASE,IDC_ICON1,IMAGE_ICON;,256,256,LR_DEFAULTCOLOR
    37.     mov    r9d,offset DialogProc
    38.     mov    qword ptr[rbp-10h],rax;30h-10h=+20h
    39.     invoke    DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP
    40.     invoke    RtlExitUserProcess,NULL
    41. WinMain endp
    42. DialogProc proc hWnddlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    43. local    hResource:qword
    44. local    pResource:qword
    45. local    FSize:qword
    46. local    hFile:dword
    47. local    szReadWrite:qword    ;number of bytes actually read or write
    48. local    stringBinding:qword
    49.     mov    hWnddlg,rcx
    50.     mov    lParam,r9
    51.     cmp    edx,WM_INITDIALOG
    52.         je    wmINITDIALOG
    53.     cmp    edx,WM_CLOSE
    54.     je    wmCLOSE
    55.     cmp    edx,WM_COMMAND
    56.     je    wmCOMMAND
    57.     cmp    edx,WM_DESTROY
    58.     je    wmDESTROY
    59.     xor    eax,eax
    60.     jmp    exit0
    61. wmDESTROY:
    62.     jmp    wmBYE
    63. wmSEND_WAV:mov    ecx,offset wav_file
    64.     invoke    CreateFile,,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,\
    65.         FILE_ATTRIBUTE_ARCHIVE,0
    66.         mov    hFile,eax
    67.         invoke    GetFileSize,eax,0
    68.     mov    FSize,rax
    69.     invoke    GlobalAlloc,GPTR,eax
    70.     mov    p,rax
    71.     lea    r9d,szReadWrite
    72.     and    qword ptr[rsp+20h],0
    73.         invoke    ReadFile,hFile,eax,FSize
    74.         invoke    CloseHandle,hFile
    75.     invoke    RPC_SampleInterface_sampleFunc,bindingHandle,FSize,p
    76.     jmp    wmBYE
    77. wmSEND_ICO:mov    edx,p1
    78.     invoke    FindResource,0,,RT_ICON; find the resource
    79.     mov    hResource,rax
    80.     invoke  SizeofResource,0,eax        ; get its size
    81.     mov    FSize,rax
    82.     inc    eax
    83.     invoke    GlobalAlloc,GPTR,eax
    84.     mov    p,rax
    85.     mov    edi,eax
    86.     invoke    LoadResource,0,hResource    ; load the resource
    87.     invoke    LockResource,eax;pResource
    88.     mov    esi,eax
    89.     mov    byte ptr[rdi],CF_BITMAP
    90.     inc    edi
    91.     mov    rcx,FSize
    92.     rep    movsb
    93.     mov    rdx,FSize
    94.     inc    edx
    95.     invoke    RPC_SampleInterface_sampleFunc,bindingHandle,,p
    96.     mov    ecx,256
    97.     and    qword ptr[rsp+30h],LR_DEFAULTCOLOR;LR_DEFAULTCOLOR=0
    98.     mov    [rsp+20h],rcx
    99.     mov    [rsp+28h],rcx
    100.     mov    rcx,p
    101.     inc    ecx
    102.     invoke  CreateIconFromResourceEx,,FSize,TRUE,30000h;270376,TRUE,30000h
    103.     mov    [rsp+20h],rax
    104.     invoke  SendDlgItemMessageA,hWnd,IDC_IMG1,STM_SETIMAGE,IMAGE_ICON
    105.     xor    p1,11b
    106.     jmp    wmBYE
    107. wmSEND_TXT:invoke GlobalAlloc,GPTR,256
    108.     mov    p,rax
    109.     mov    byte ptr[rax],CF_TEXT
    110.     inc    eax
    111.     invoke  GetDlgItemTextA,hWnddlg,ID_TXT,eax,256
    112.     inc    eax
    113.     invoke    RPC_SampleInterface_sampleFunc,bindingHandle,eax,p
    114.     jmp    wmBYE
    115. wmINITDIALOG:mov hWnd,rcx
    116.         invoke    GetProcessHeap
    117.     mov     hHeap,rax
    118.     invoke    GetDlgItem,hWnddlg,IDC_IMG1
    119.     invoke    SendMessageA,eax,STM_SETIMAGE,IMAGE_ICON,lParam
    120. ;setup Rpc-----------------------------
    121.     lea    ecx,stringBinding
    122.     mov    [rsp+28h],rcx
    123.     movr    qword ptr[rsp+20h],security
    124.     mov    r9d,offset endpoint
    125.     mov    edx,offset protocol
    126.     invoke    RpcStringBindingComposeA,0,,0
    127.     or    eax,eax;eax=RPC_S_OK?
    128.     jne    wmBYE
    129.     mov    edx,offset bindingHandle
    130.     invoke    RpcBindingFromStringBindingA,stringBinding
    131.         invoke    RpcStringFreeW,&stringBinding
    132.     or    eax,eax;eax=RPC_S_OK?
    133.     jne    wmBYE
    134. ;----------------------------------------------------
    135.     cmp    bindingHandle,0
    136.     jnz    wmBYE
    137.     mov    r8d,offset szWin
    138.     mov    ecx,offset Error
    139.     invoke    MessageBoxA,hWnd,,,MB_OK
    140.     jmp    wmBYE
    141. wmCOMMAND:cmp    r8d,BN_CLICKED shl 16 + ID_SEND_TXT
    142.         je      wmSEND_TXT
    143.         cmp    r8d,BN_CLICKED shl 16 + ID_SEND_WAV
    144.         je      wmSEND_WAV
    145.         cmp    r8d,BN_CLICKED shl 16 + ID_SEND_ICO
    146.     je      wmSEND_ICO
    147.     cmp     r8d,BN_CLICKED shl 16 + IDCANCEL
    148.         jne     wmBYE
    149. wmCLOSE:invoke    EndDialog,,0
    150.     mov    ecx,offset bindingHandle
    151.     invoke    RpcBindingFree
    152. wmBYE:    mov    eax,TRUE
    153. exit0:    leave
    154.     retn
    155. DialogProc endp
    156. RPC_SampleInterface_sampleFunc proc bindingHandle:qword,bufferLength:dword,buffer:qword
    157.         mov    [rsp+20h],r8;buffer
    158.         mov    r9d,edx;bufferLength
    159.         mov    r8,rcx;bindingHandle
    160.         lea    rdx, RPC_SampleInterface__MIDL_ProcFormatString
    161.         lea    rcx,RPC_SampleInterface_StubDesc ; pStubDescriptor
    162.         invoke    NdrClientCall2
    163.         leave
    164.         retn
    165. RPC_SampleInterface_sampleFunc endp
    166. MIDL_user_allocate proc len:qword
    167.     mov    r8d,ecx
    168.     invoke    RtlAllocateHeap,hHeap,0
    169.     leave
    170.     ret
    171. MIDL_user_allocate endp
    172. MIDL_user_free proc lpMem:qword
    173.     mov    r8d,ecx
    174.     invoke    HeapFree,hHeap,0
    175.     leave
    176.     ret
    177. MIDL_user_free endp
    178. ;---------------------------------------
    179. .data
    180. szWin        db 'Remote Procedure Call Reciever',0
    181. Error        db "Unable to setup an RPC connection, exiting...",0
    182. bindingHandle    dq ?
    183. hWnd        dq ?
    184. protocol    db "ncalrpc",0
    185. endpoint    db "{46E785FC-BCCC-46B8-B161-D6C90D391670}",0; // Unique user-defined endpoint ID in a free form
    186. security    db "Security=impersonation static false",0
    187. p    dq ?
    188. p1      dd 1
    189. RPC_SampleInterface__MIDL_ProcFormatString:
    190.     db 0
    191.     db 48h    ; H
    192.     dd 0
    193.     dw 0
    194.     dw 18h
    195.     db 32h,    0
    196.     dw 0
    197.     dw 8
    198.     dw 0
    199.     db 42h,2,10,5
    200.     dw 0
    201.     dw 1
    202.     dw 0
    203.     dw 0
    204.     dw 48h
    205.     dw 8
    206.     db 8, 0
    207.     dw 10Bh
    208.     dw 10h
    209.     dw 6
    210.     db 0
    211. RPC_SampleInterface_StubDesc:
    212.     dq RPC_SampleInterface___RpcClientInterface; RpcInterfaceInformation
    213.     dq MIDL_user_allocate;    pfnAllocate
    214.     dq MIDL_user_free; pfnFree
    215.     dq RPC_SampleInterface__MIDL_AutoBindHandle; IMPLICIT_HANDLE_INFO.pAutoHandle
    216.     dq 0            ; apfnNdrRundownRoutines
    217.     dq 0            ; aGenericBindingRoutinePairs
    218.     dq 0            ; apfnExprEval
    219.     dq 0            ; aXmitQuintuple
    220.     dq RPC_SampleInterface__MIDL_TypeFormatString; pFormatTypes
    221.     dd 1            ; fCheckBounds
    222.     dd 50002h        ; Version
    223.     dq 0            ; pMallocFreeStruct
    224.     dd 8010274h        ; MIDLVersion
    225.     db 4 dup(0)
    226.     dq 0            ; CommFaultOffsets
    227.     dq 0            ; aUserMarshalQuadruple
    228.     dq 0            ; NotifyRoutineTable
    229.     dq 1            ; mFlags
    230.     dq 0            ; CsRoutineTables
    231.     dq 0            ; ProxyServerInfo
    232.     dq 0            ; pExprInfo
    233. RPC_SampleInterface___RpcClientInterface label RPC_CLIENT_INTERFACE
    234.     dd sizeof RPC_CLIENT_INTERFACE;Length struct;+0
    235.     GUID <8A4A7813h,0ADAAh,49BCh,{99h,6Ah,4Dh,47h,71h,5Fh,0CAh,40h}>
    236.     RPC_VERSION <1,0>
    237.     GUID <8A885D04h,1CEBh,11C9h,{9Fh,0E8h,8,0,2Bh,10h,48h,60h}>
    238.     RPC_VERSION <2,0>
    239.     dd 0;+2C
    240.     dq 0;  PRPC_DISPATCH_TABLE   DispatchTable;+30h
    241.     dd 0,0;  unsigned int          RpcProtseqEndpointCount;+38h
    242.     dq 0;  PRPC_PROTSEQ_ENDPOINT RpcProtseqEndpoint;+40h
    243.     dq 0;  ULONG_PTR             Reserved;+48h
    244.     dq 0;  void const            *InterpreterInfo;+50h
    245.     dq 0;+58h
    246.     dd 0;unsigned int          Flags;+5Ch
    247. RPC_SampleInterface__MIDL_AutoBindHandle dq 0,0
    248. RPC_SampleInterface__MIDL_TypeFormatString:
    249.     dw 0
    250.     db 11h,0
    251.     dw 2
    252.     db 1Bh,0
    253.     dw 1
    254.     db 29h,0
    255.     dw 8
    256.     dw 1
    257.     db 2,5Bh,0
    258. ;-------------------------------
    259. hHeap    dq ?
    260. wav_file db '..\Images\03.wav',0
    261. end
    ресурсы (14s.rc)
    Код (C):
    1. #include "resource.h"
    2. #define ID_TXT        100
    3. #define ID_SEND_TXT    101
    4. #define ID_SEND_ICO    102
    5. #define ID_SEND_WAV    103
    6. #define IDC_IMG1     104
    7. #define IDC_DIALOG    200
    8. #define IDC_ICON1    500
    9. IDC_ICON1 ICON "..\\Images\\icon1.ico"
    10. IDC_ICON2 ICON "..\\Images\\icon2.ico"
    11. IDC_DIALOG DIALOG 0, 0, 212, 140
    12. STYLE 0x0004  | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
    13. WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
    14. CAPTION "Remote Procedure Call Sender"
    15. BEGIN
    16.     CONTROL "",-1,"BUTTON",BS_GROUPBOX, 2, -1, 207, 24
    17.     CONTROL "",IDC_IMG1,"Static",WS_CHILDWINDOW | WS_VISIBLE | SS_ICON,5,23,128,128
    18.     CONTROL "Write something and click 'Send Text'",ID_TXT,"EDIT",WS_BORDER|WS_TABSTOP|ES_AUTOHSCROLL,5,7,199,13
    19.     DEFPUSHBUTTON   "Send Text",ID_SEND_TXT,149,27,60,15
    20.     PUSHBUTTON      "Send ICO", ID_SEND_ICO,149,45,60,15
    21.     PUSHBUTTON      "Send WAV", ID_SEND_WAV,149,65,60,15
    22.     PUSHBUTTON      "Exit",     IDCANCEL,   149,85,60,15
    23. END
    в аттаче ASM-/RC-/EXE-файлы
     
    Marylin нравится это.
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    15. DLL
    06.jpg
    Текст приложения-сервера (15s.asm)
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. includelib IPC.lib
    4. ExeToDll PROTO :qword,:dword,:dword
    5. DllToExe PROTO :qword,:dword,:dword
    6. ID_TXT equ 100
    7. ID_SEND_TXT equ 101
    8. ID_SEND_ICO equ 102
    9. ID_SEND_WAV equ 103
    10. IDC_DIALOG equ 200
    11. IDC_ICON1 equ 500
    12. IDC_IMG1 equ 104
    13. .code
    14. WinMain proc ;dummy:qword
    15. enter 30h,0
    16. mov r9d,256
    17. mov [rbp-10h],r9
    18. and     qword ptr [rbp-8],LR_DEFAULTCOLOR
    19. invoke LoadImageA,IMAGE_BASE,IDC_ICON1,IMAGE_ICON;,0,0,LR_DEFAULTCOLOR
    20. mov r9d,offset DialogProc
    21. mov [rbp-10h],rax
    22. invoke DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP
    23. invoke RtlExitUserProcess,NULL
    24. WinMain endp
    25. DialogProc proc hWnddlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    26. local buffer:qword
    27. local cdata:COPYDATASTRUCT
    28. local FSize:dword
    29. local hFile:dword
    30. local p:qword
    31. local szReadWrite:qword ;number of bytes actually read or write
    32. local hResource:qword
    33. local pResource:qword
    34. local temp:qword
    35. mov hWnddlg,rcx
    36. mov lParam,r9
    37. cmp edx,WM_CLOSE
    38. je wmCLOSE
    39. cmp edx,WM_COMMAND
    40. je wmCOMMAND
    41. cmp edx,WM_INITDIALOG
    42.         jne wmBYE
    43. wmINITDIALOG:invoke GetDlgItem,,IDC_IMG1
    44. invoke SendMessageA,eax,STM_SETIMAGE,IMAGE_ICON,lParam
    45. jmp wmBYE
    46. wmSEND_TXT:invoke GlobalAlloc,GPTR,256
    47. mov buffer,rax
    48. invoke  GetDlgItemTextA,hWnddlg,ID_TXT,eax,256
    49.         or      eax,eax
    50.         jz      wmBYE
    51.         inc     eax
    52.         mov FSize,eax
    53.         invoke ExeToDll,buffer,eax,CF_TEXT
    54. ; Найти окно получателя
    55. mov edx,offset szWin
    56.         invoke  FindWindowA,NULL
    57.         or      eax,eax
    58.         jz      wmBYE
    59. ; Отправить данные получателю
    60. mov r9d,FSize
    61. shl r9,8
    62. or r9,CF_TEXT
    63. mov qword ptr[rsp+20h],SMTO_ABORTIFHUNG
    64. mov qword ptr[rsp+28h],5000
    65. and qword ptr[rsp+30h],0
    66. invoke  SendMessageTimeoutA,eax,WM_USER+1,hWnddlg
    67. jmp wmBYE
    68. wmSEND_ICO:mov edx,p1
    69. invoke FindResource,0,,RT_ICON; find the resource
    70. mov hResource,rax
    71. invoke  SizeofResource,0,eax ; get its size
    72. mov FSize,eax
    73. invoke LoadResource,0,hResource ; load the resource
    74. invoke LockResource,eax;pResource
    75. mov p,rax
    76. ;-------------------------------------------------
    77.         mov ecx,256
    78. and qword ptr[rsp+30h],LR_DEFAULTCOLOR;LR_DEFAULTCOLOR=0
    79. mov [rsp+20h],rcx
    80. mov [rsp+28h],rcx
    81. mov edx,FSize
    82. invoke  CreateIconFromResourceEx,p,,TRUE,30000h;270376,TRUE,30000h
    83. mov [rsp+20h],rax
    84. invoke  SendDlgItemMessageA,hWnddlg,IDC_IMG1,STM_SETIMAGE,IMAGE_ICON
    85. xor p1,11b
    86. mov edx,FSize
    87. invoke ExeToDll,p,,CF_BITMAP
    88. ; Найти окно получателя
    89. mov edx,offset szWin
    90.         invoke  FindWindowA,NULL
    91.         or      eax,eax
    92.         jz      wmBYE
    93. ; Отправить данные получателю
    94. mov r9d,FSize
    95. shl r9,8
    96. or r9,CF_BITMAP
    97. mov qword ptr[rsp+20h],SMTO_ABORTIFHUNG
    98. mov qword ptr[rsp+28h],5000
    99. and qword ptr[rsp+30h],0
    100. invoke  SendMessageTimeoutA,eax,WM_USER+1,hWnddlg
    101. jmp wmBYE
    102. wmSEND_WAV:mov ecx,offset wav_file
    103. invoke CreateFile,,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,\
    104.         FILE_ATTRIBUTE_ARCHIVE,0
    105.         mov hFile,eax
    106.         invoke GetFileSize,eax,0
    107. mov FSize,eax
    108.         invoke GlobalAlloc,GPTR,eax
    109. mov p,rax
    110.         lea r9d,szReadWrite
    111. and qword ptr[rsp+20h],0
    112.         invoke ReadFile,hFile,eax,FSize
    113.         invoke CloseHandle,hFile
    114. mov edx,FSize
    115. invoke ExeToDll,p,,CF_WAVE
    116. ; Найти окно получателя
    117. mov edx,offset szWin
    118.         invoke  FindWindowA,NULL
    119.         or      eax,eax
    120.         jz      wmBYE
    121. ; Отправить данные получателю
    122. mov r9d,FSize
    123. shl r9,8
    124. or r9,CF_WAVE
    125. mov qword ptr[rsp+20h],SMTO_ABORTIFHUNG
    126. mov qword ptr[rsp+28h],500
    127. and qword ptr[rsp+30h],0
    128. invoke  SendMessageTimeoutA,eax,WM_USER+1,hWnddlg
    129.         jmp wmBYE
    130. wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + ID_SEND_TXT
    131.         je      wmSEND_TXT
    132.         cmp r8d,BN_CLICKED shl 16 + ID_SEND_ICO
    133.         je      wmSEND_ICO
    134. cmp r8d,BN_CLICKED shl 16 + ID_SEND_WAV
    135.         je      wmSEND_WAV
    136. cmp     r8d,BN_CLICKED shl 16 + IDCANCEL
    137.         jne     wmBYE
    138. wmCLOSE:invoke EndDialog,,0
    139. wmBYE: xor eax,eax
    140. leave
    141. retn
    142. DialogProc endp
    143. ;---------------------------------------
    144. .data
    145. szWin db 'DLL Reciever',0
    146. wav_file db '..\Images\03.wav',0
    147. p1 dd 1
    148. end
    ресурсы (15s.rc)
    Код (C):
    1.  
    2. #include "resource.h"
    3. #define ID_TXT 100
    4. #define ID_SEND_TXT 101
    5. #define ID_SEND_ICO 102
    6. #define ID_SEND_WAV 103
    7. #define IDC_IMG1 104
    8. #define IDC_DIALOG 200
    9. #define IDC_ICON1 500
    10. IDC_ICON1 ICON "..\\Images\\icon1.ico"
    11. IDC_ICON2 ICON "..\\Images\\icon2.ico"
    12. IDC_DIALOG DIALOGEX 200, 0, 212, 154
    13. STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
    14. WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
    15. CAPTION "DLL Sender"
    16. {
    17. CONTROL "",-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE,2,-1,207,24
    18. CONTROL "",IDC_IMG1,STATIC,SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128
    19. CONTROL "Write something and click 'Send Text'",ID_TXT,EDIT,ES_LEFT |
    20. ES_AUTOHSCROLL|WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP,5,7,199,13
    21. CONTROL "Send Text", ID_SEND_TXT, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |
    22. WS_VISIBLE | WS_TABSTOP, 149, 27, 60, 15
    23. CONTROL "Send ICO", ID_SEND_ICO, BUTTON, BS_PUSHBUTTON | WS_CHILD |
    24. WS_VISIBLE | WS_TABSTOP, 149, 45, 60, 15
    25. CONTROL "Send WAV", ID_SEND_WAV, BUTTON, BS_PUSHBUTTON | WS_CHILD |
    26. WS_VISIBLE | WS_TABSTOP, 149, 65, 60, 15
    27. CONTROL "Exit",IDCANCEL,BUTTON,BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE |
    28. WS_TABSTOP, 149, 85, 60, 15
    29. }
    Текст приложения-клиента (15r.asm)
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. includelib IPC.lib
    4. ExeToDll PROTO :qword,:dword,:dword
    5. DllToExe PROTO :qword,:dword,:dword
    6. IDC_DIALOG equ 200
    7. ID_TXT equ 100
    8. ID_ICON equ 102
    9. IDC_ICON1 equ 500
    10. .code
    11. WinMain proc dummy:qword
    12.         invoke  DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP,qword ptr(offset DialogProc),0
    13.         invoke  RtlExitUserProcess,NULL
    14. WinMain endp
    15. DialogProc proc hWnddlg:qword,msg:qword,wParam:qword,lParam:qword
    16. local p:qword
    17. local FSize:dword
    18. local lpwiocb:WAVEHDR
    19. local hWaveOut:qword
    20. mov hWnddlg,rcx
    21. mov lParam,r9
    22. cmp edx,WM_CLOSE
    23. je wmCLOSE
    24. cmp edx,WM_USER+1
    25. je wmUSER_1
    26. cmp edx,WM_COMMAND
    27. je wmCOMMAND
    28.         cmp edx,WM_INITDIALOG
    29. jne wmBYE
    30. wmINITDIALOG:;mov rcx,hWnd
    31. ; Найти окно получателя
    32.         invoke  FindWindowA,0,&szWin
    33.         or      eax,eax
    34.         jnz wmBYE
    35. invoke MessageBoxA,hWnddlg,&Error1,&szAppName,MB_ICONEXCLAMATION or MB_YESNO
    36. cmp eax,IDNO
    37. jz      wmBYE
    38. invoke WinExec,&szService,SW_SHOW
    39. jmp wmBYE
    40. wmUSER_1:cmp r9b,CF_TEXT
    41. je COPY_TEXT
    42. cmp     r9b,CF_BITMAP; Это нужный тип данных?
    43. je COPY_ICON
    44.         cmp     r9b,CF_WAVE
    45.         jne wmBYE
    46. shr r9,8
    47. mov FSize,r9d
    48. invoke DllToExe
    49. mov p,rax
    50. mov r8,p
    51. ;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data) = 14h
    52.         add r8d,14h
    53.         invoke waveOutOpen,&hWaveOut,WAVE_MAPPER,,0,0,WAVE_ALLOWSYNC
    54. ; Подготавливаем заголовок для вывода
    55. lea edi,lpwiocb
    56. mov edx,edi
    57. xor eax,eax
    58. mov ecx,(sizeof WAVEHDR)/8
    59. rep stosq
    60. mov rax,p
    61. ;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data)+\
    62. ;(Type of format)+(Number of Channels)+(Sample Rate)+(Sample Rate*BitsPerSample*Channels/8)+\
    63. ;(BitsPerSample*Channels/8)+(Bits per sample)+(“data” chunk header)+(Size of the data section)=2Ch
    64. add rax,2Ch
    65. mov [rdx].WAVEHDR.lpData,rax ;адрес блока данных
    66. mov eax,FSize
    67. sub eax,2Ch
    68. mov [rdx].WAVEHDR.dwBufferLength,eax ;размер блока данных
    69. invoke waveOutPrepareHeader,hWaveOut,,sizeof WAVEHDR
    70. ; Запускаем проигрывание блока
    71. invoke waveOutWrite,hWaveOut,&lpwiocb,sizeof WAVEHDR
    72. @@: test lpwiocb.dwFlags,WHDR_DONE
    73. jz @b
    74. invoke waveOutUnprepareHeader,hWaveOut,&lpwiocb,sizeof WAVEHDR
    75. invoke waveOutClose,hWaveOut
    76. jmp wmBYE
    77. COPY_TEXT:invoke DllToExe
    78. invoke SetDlgItemTextA,hWnddlg,ID_TXT,eax
    79. jmp wmBYE
    80. COPY_ICON:shr r9,8
    81. mov FSize,r9d
    82. invoke DllToExe
    83. ; Создать HICON напрямую из памяти
    84. invoke  CreateIconFromResourceEx,eax,FSize,TRUE,30000h,256,256,LR_DEFAULTCOLOR
    85. invoke  SendDlgItemMessageA,hWnddlg,ID_ICON,STM_SETIMAGE,IMAGE_ICON,eax
    86. jmp wmBYE
    87. wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + IDCANCEL
    88. jne wmBYE
    89. wmCLOSE:invoke EndDialog,,0
    90. wmBYE: xor eax,eax
    91. leave
    92. retn
    93. DialogProc endp
    94. .data
    95. szWin   db "DLL Sender",0
    96. Error1   db "The server is not running.",10,"Run?",0
    97. szAppName db "DLL Reciever",0
    98. szService db "15s",0
    99. ClassName db 'DLGCLASS',0
    100. end
    ресурсы приложения-клиента (15r.rc)
    Код (C):
    1. #include "resource.h"
    2. #define IDC_DIALOG 200
    3. #define ID_TXT 100
    4. #define ID_ICON 102
    5. #define ID_PROGRESS 106
    6. #define ID_TXT1 107
    7. IDC_DIALOG DIALOGEX 0,0,212,154
    8. STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
    9. WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
    10. CAPTION "DLL Reciever"
    11. {
    12. CONTROL "",-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 2,-3,207,24
    13. CONTROL "", ID_TXT, STATIC, SS_LEFT | SS_NOPREFIX | WS_CHILD |
    14. WS_VISIBLE | WS_BORDER | WS_TABSTOP, 5, 5, 199, 13
    15. CONTROL "Exit", IDCANCEL, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |
    16. WS_VISIBLE | WS_TABSTOP, 149, 25, 60, 15
    17. CONTROL "",ID_ICON, STATIC, SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128
    18. }
    Текст IPC.dll
    Код (ASM):
    1. ; DLL #
    2. include win64a.inc
    3. .code
    4. .code
    5. DllMain proc hInstDLL:QWORD, reason:QWORD, unused:QWORD
    6. mov eax,TRUE
    7. leave
    8. ret
    9. DllMain Endp
    10. DllToExe proc
    11. lea rax,bufferDLL
    12. ret
    13. DllToExe endp
    14. ExeToDll proc buffer:qword,FSize:dword,type0:dword
    15. mov buffer,rcx
    16. mov FSize,edx
    17. lea rdi,bufferDLL
    18. mov ecx,FSize
    19. mov rsi,buffer
    20. rep movsb
    21. leave
    22. ret
    23. ExeToDll endp
    24. .data?
    25. bufferDLL db 8000000 dup(?)
    26. end
    Текст IPC.def
    Код (Text):
    1. LIBRARY IPC
    2. EXPORTS ExeToDll
    3. EXPORTS DllToExe
    в аттаче ASM-/RC-/EXE-/DLL-/DEF-/LIB-файлы

    Использованы материалы:

    1. CyberManiac IPC
    2. mort[MATRiX] Взаимодействие между процессами
    3. mort[MATRiX] Синхронизация
    4. manhunter Обмен данными между процессами с помощью WM_COPYDATA
    5. manhunter Как сделать ProgressBar с надписью
    6. Алекс Jenter IPC: основы межпроцессного взаимодействия (Обзор технологий)
    7. Александр Фролов, Григорий Фролов Операционная система MS Windows 3.1 для программиста. Дополнительные главы.
    8. Александр Фролов, Григорий Фролов Программирование для Windows NT. Часть 1
    9. Александр Фролов, Григорий Фролов Программирование для Windows NT. Часть 2
     

    Вложения:

    • 15 DLL.zip
      Размер файла:
      244,7 КБ
      Просмотров:
      176
    Marylin нравится это.
  7. mantissa

    mantissa Мембер Команда форума

    Публикаций:
    0
    Регистрация:
    9 сен 2022
    Сообщения:
    155
    Клиент серверное приложение для мгновенного обмена сообщениями
    Написал простое клиент-серверное приложение на winsock2, в репозитории client и server, server работает в консоли, может обслуживать сразу нескольких клиентов синхронно через select, client отправляет сообщение серверу, а сервер броадкастит его всем подключенным клиентам. В README есть туду лист, со временем буду дополнять
    https://github.com/babasuck/sendsock/ (ветка dev)
    upload_2023-10-20_16-46-1.png
     
    alex_dz и Mikl___ нравится это.
  8. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    449
    У вас есть работа с памятью - malloc/free
    но нигде нету проверки на OOM
     
  9. mantissa

    mantissa Мембер Команда форума

    Публикаций:
    0
    Регистрация:
    9 сен 2022
    Сообщения:
    155
    редко когда ее делаю, сейчас памяти так много, что об этом думать лишний раз не приходится, тем более выделяется мало
    --- Сообщение объединено, 21 окт 2023 ---
    Хотя там для строки выделяется произвольного размера, добавлю все таки, спасибо
     
  10. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    449
    Да. память счас дешевле некуда
    32 Гигабайта 50$
    жаль еще нету планок по 64/128 ГБ
    --- Сообщение объединено, 21 окт 2023 ---
    Хотя пишут на серверах уже есть планки по 512 ГБ !!?? и даже по ТЕРАБАЙТУ??
    https://www.tomshardware.com/news/samsung-talks-1tb-ddr5-modules-ddr5-7200
     
    Последнее редактирование: 21 окт 2023
  11. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    185
    Возникла такая проблема,не получается создать пайп-сервер,компилю код сервера и запускаю,а клиент запускаю под отладчиком,так вот после вызова функции CreateFileA сервер прекращает свою работу.
    код на FASM
    сервер:
    Код (ASM):
    1. format PE console
    2.  
    3. include 'win32axp.inc'
    4.  
    5. section '.text' code readable executable
    6.  
    7. invoke CreateNamedPipeA,namedpip,PIPE_ACCESS_DUPLEX,PIPE_TYPE_BYTE OR PIPE_WAIT,PIPE_UNLIMITED_INSTANCES,512,512,0,0
    8. mov [desc],eax
    9. invoke ConnectNamedPipe,eax,0
    10. invoke ReadFile,desc,namedpip,10,info,0
    11. invoke ExitProcess,0
    12.  
    13. section '.data' data readable writeable
    14. namedpip db '\\.\pipe\channel',0
    15. desc rd 0
    16. buffer rb 10
    17. info rd 0
    18.  
    19. section '.idata' import data readable writeable
    20. library kernel32,'kernel32.dll',\
    21.         msvcrt,'msvcrt.dll',\
    22.         user32,'user32.dll'
    23. import kernel32,\
    24.        ReadConsoleA,'ReadConsoleA',\
    25.        WriteConsoleA,'WriteConsoleA',\
    26.        GetStdHandle,'GetStdHandle',\
    27.        ExitProcess,'ExitProcess',\
    28.        Sleep,'Sleep',\
    29.        CreateFileA,'CreateFileA',\
    30.        WriteFile,'WriteFile',\
    31.        ReadFile,'ReadFile',\
    32.        SetFilePointer,'SetFilePointer',\
    33.        CreateNamedPipeA,'CreateNamedPipeA',\
    34.        ConnectNamedPipe,'ConnectNamedPipe'
    35. import user32,\
    36.        MessageBoxA,'MessageBoxA'
    клиент
    Код (ASM):
    1. format PE console
    2. include 'win32axp.inc'
    3. section '.text' code readable executable
    4.  
    5. invoke CreateFileA,namedpip,GENERIC_WRITE OR  GENERIC_READ,0,0, OPEN_EXISTING,0,0
    6. mov [desc],eax
    7. invoke SetNamedPipeHandleState,desc,addr state,0,0
    8. invoke WriteFile,desc,namedpip,10,dat,0
    9. invoke ExitProcess,0
    10. section '.data' data readable writeable
    11. state rd PIPE_TYPE_BYTE
    12. desc rd 1
    13. namedpip db '\\.\pipe\channel',0
    14. dat dd 0
    15. section '.idata' import data readable writeable
    16. library kernel32,'kernel32.dll',\
    17.         msvcrt,'msvcrt.dll',\
    18.         user32,'user32.dll'
    19. import kernel32,\
    20.        ReadConsoleA,'ReadConsoleA',\
    21.        WriteConsoleA,'WriteConsoleA',\
    22.        GetStdHandle,'GetStdHandle',\
    23.        ExitProcess,'ExitProcess',\
    24.        Sleep,'Sleep',\
    25.        CreateFileA,'CreateFileA',\
    26.        WriteFile,'WriteFile',\
    27.        SetFilePointer,'SetFilePointer',\
    28.        CreateNamedPipeA,'CreateNamedPipeA',\
    29.        ConnectNamedPipe,'ConnectNamedPipe',\
    30.        SetNamedPipeHandleState,'SetNamedPipeHandleState',\
    31.        WaitNamedPipeA,'WaitNamedPipeA'
    32. import user32,\
    33.        MessageBoxA,'MessageBoxA'
    сервер успешно создается,а данные прочесть не удаётся
     
  12. MaKsIm

    MaKsIm Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    94
    Так у вас обе программы просто один раз пишут (клиент) и читают (сервер) в пайп. На сервере нету цикла для постоянного чтения данных из пайпа. Клиент просто записывает данные и умирает. В обоих программах даже нету корректного освобождения объектов. Запускайте обе в отладчике и смотрите результат. Как минимум один раз данные должны быть переданы.
     
  13. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    Квадратные скобки.
     
  14. MaKsIm

    MaKsIm Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    94
    Тогда и тут тоже
    Код (ASM):
    1. invoke WriteFile,desc,namedpip,10,dat,0