По жизни я довольно часто слушаю музыку и, в частности, интернет-радио Last.fm (благо, в США оно бесплатное). Однако, постоянно сидеть за компьютером утомляет, и возникает желание послушать радио в другой комнате, развалившись в кресле.
В клиенте Last.fm встроена возможность вещания входящего потока для сторонних плееров,
но, по-умолчанию, плеер биндится на localhost, что не позволяет слушать его с другого компьютера.
Чтобы исправить это печальное недоразумение, мною была написана библиотека, которая позволяет указывать адрес, отличный от localhost. Исходный код приведен ниже.
Файл ресурсов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include "\masm32\include\resource.h" #define IDD_DLG1 1000 #define IDC_IPA1 1001 #define IDC_BTN1 1002 IDD_DLG1 DIALOGEX 6,6,107,41 CAPTION "Введите IP-адрес" FONT 8,"MS Sans Serif",0,0,0 STYLE WS_VISIBLE|WS_OVERLAPPEDWINDOW EXSTYLE WS_EX_TOOLWINDOW BEGIN CONTROL "",IDC_IPA1,"SysIPAddress32",WS_CHILD|WS_VISIBLE|WS_TABSTOP,8,3,90,13 CONTROL "OK",IDC_BTN1,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,26,24,54,13 END |
Основной файл
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
.486 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\macros\macros.asm include \masm32\macros\windows.asm include \masm32\macros\inject.asm uselib kernel32, user32, masm32, ws2_32, Comctl32 WndProc proto :DWORD,:DWORD,:DWORD,:DWORD .data edit dd 0 bind_ip dd 0 .data? ip dd ? .code MyBind: push ebp mov ebp,esp ;int bind(__in SOCKET s, __in const struct sockaddr *name, __in int namelen); mov ebx,[ebp+12] ;Перезаписываем ip-адрес в структуре mrm sockaddr_in.sin_addr.S_un.S_addr[ebx],bind_ip ;Вызываем оригинальную функцию bind HOOK_ORIGINAL_CALL bind,3 pop ebp retn 4*3 LibMain proc instance:DWORD,reason:DWORD,reserved:DWORD .if reason == DLL_PROCESS_ATTACH ;Инициализируем контролы и диалог invoke InitCommonControls invoke DialogBoxParam,instance,1000,0,addr WndProc,0 ;Преобразуем ip-адрес в необходимый формат invoke htonl,ip mov bind_ip,eax ;Устанавливаем хук SET_HOOK ws2_32.dll,bind,MyBind mov eax,1 .endif ret LibMain ENDP WndProc proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD .if uMsg == WM_INITDIALOG invoke GetDlgItem,hWin,1001 mov edit,eax .elseif uMsg == WM_COMMAND .if wParam == 1002 ;Получаем адрес из поля invoke SendMessage,edit,IPM_GETADDRESS,0,addr ip ;Проверяем количество заполненных октетов .if eax == 4 ;Закрываем диалог, если все октеты заполнены invoke EndDialog,hWin,0 .endif .endif .elseif uMsg == WM_CLOSE invoke EndDialog,hWin,0 .endif xor eax,eax ret WndProc endp end LibMain |
Библиотеку необходимо назвать wintab32.dll и поместить в одну директорию с клиентом. Теперь при запуске будет выдаваться окно, предлагающее ввести ip-адрес:
После ввода соответствующего IP, подключения с других компьютеров станут доступны. Также хочу отметить, что возможно подключение нескольких клиентов (по крайней мере, 2 точно). Это может быть полезно, если необходимо организовать вещание радио, например, в пределах небольшой локальной сети.
Исходные коды и скомпилированная библиотека: скачать.
lafm fm дерьмо
Каждому своё
Суть не в Last.fm,а способе который применим к большенству программ.