Без заголовка

Автор: Без имени Написано: 1 г. назад Форматирование: asm.
С нумерацией строк

format PE GUI 4.0
entry start

include 'win32a.inc'

include 'riched32.inc'

section '.text' code readable executable

  WM_SOCK = WM_USER + 100

  SOCK_IDLE   = 0
  SOCK_LISTEN = 1
  SOCK_SERVER = 2
  SOCK_CLIENT = 3

  start:
        mov     [initcomctl.dwSize],sizeof.INITCOMMONCONTROLSEX
        mov     [initcomctl.dwICC],ICC_INTERNET_CLASSES
        invoke  InitCommonControlsEx,initcomctl
        invoke  LoadLibrary,_riched
        or      eax,eax
        jz      exit
        invoke  WSAStartup,0101h,wsadata
        or      eax,eax
        jnz     exit
        invoke  GetModuleHandle,0
        invoke  DialogBoxParam,eax,IDR_DIALOG,HWND_DESKTOP,DialogProc,0
        invoke  WSACleanup
  exit:
        invoke  ExitProcess,0

  proc  DialogProc hwnddlg,msg,wparam,lparam
        push    ebx esi edi
        cmp     [msg],WM_INITDIALOG
        je      wminitdialog
        cmp     [msg],WM_COMMAND
        je      wmcommand
        cmp     [msg],WM_SOCK
        je      wmsock
        xor     eax,eax
        jmp     finish
  wminitdialog:
        mov     [status],SOCK_IDLE
        jmp     processed
  wmcommand:
        mov     eax,[wparam]
        cmp     eax,IDCANCEL
        je      wmclose
        cmp     eax,IDOK
        je      .ok
        cmp     eax,ID_LISTEN
        je      .listen
        cmp     eax,ID_GETHOSTBYNAME
        je      .gethostbyname
        cmp     eax,ID_CONNECT
        je      .connect
        cmp     eax,ID_SEND
        je      .send
        shr     eax,16
        cmp     eax,EN_SETFOCUS
        je      .setfocus
        cmp     eax,EN_KILLFOCUS
        je      .killfocus
        cmp     eax,CBN_SETFOCUS
        je      .setfocus
        cmp     eax,CBN_KILLFOCUS
        je      .killfocus
        jmp     processed
  .ok:
        cmp     [focus],ID_HOSTNAME
        je      .gethostbyname
        cmp     [focus],ID_PORT
        je      .connect
        cmp     [focus],ID_SERVPORT
        je      .listen
        cmp     [focus],ID_COMMAND
        je      .send
        jmp     processed
  .setfocus:
        movzx   eax,word [wparam]
        mov     [focus],eax
        jmp     processed
  .killfocus:
        movzx   eax,word [wparam]
        cmp     [focus],eax
        jne     processed
        mov     [focus],0
        jmp     processed
  .listen:
        cmp     [status],SOCK_CLIENT
        je      processed
        cmp     [status],SOCK_IDLE
        jne     .stop
        invoke  socket,AF_INET,SOCK_STREAM,0
        cmp     eax,-1
        je      processed
        mov     [sock],eax
        mov     [saddr.sin_addr],0
        mov     [saddr.sin_family],AF_INET
        invoke  GetDlgItemInt,[hwnddlg],ID_SERVPORT,temp,FALSE
        cmp     [temp],0
        je      processed
        cmp     eax,0FFFFh
        ja      processed
        xchg    ah,al
        mov     [saddr.sin_port],ax
        invoke  bind,[sock],saddr,sizeof.sockaddr
        or      eax,eax
        jnz     .bind_failed
        invoke  listen,[sock],1
        invoke  WSAAsyncSelect,[sock],[hwnddlg],WM_SOCK,FD_ACCEPT
        mov     [status],SOCK_LISTEN
        invoke  GetDlgItem,[hwnddlg],ID_CONNECT
        invoke  EnableWindow,eax,FALSE
        invoke  SetDlgItemText,[hwnddlg],ID_LISTEN,_stop
        invoke  GetDlgItem,[hwnddlg],ID_LISTEN
        invoke  SendMessage,[hwnddlg],WM_NEXTDLGCTL,eax,TRUE
        jmp     processed
      .bind_failed:
        invoke  closesocket,[sock]
        jmp     processed
      .stop:
        invoke  closesocket,[sock]
        cmp     [status],SOCK_SERVER
        je      wmsock.disconnected
        mov     [status],SOCK_IDLE
        invoke  GetDlgItem,[hwnddlg],ID_CONNECT
        invoke  EnableWindow,eax,TRUE
        invoke  SetDlgItemText,[hwnddlg],ID_LISTEN,_listen
        jmp     processed
  .gethostbyname:
        invoke  GetDlgItemText,[hwnddlg],ID_HOSTNAME,buffer,8000h
        invoke  gethostbyname,buffer
        or      eax,eax
        jz      .bad_name
        virtual at eax
        .host   hostent
        end     virtual
        mov     eax,[.host.h_addr_list]
        mov     eax,[eax]
        mov     eax,[eax]
        bswap   eax
        invoke  SendDlgItemMessage,[hwnddlg],ID_IPADDR,IPM_SETADDRESS,0,eax
        invoke  SendDlgItemMessage,[hwnddlg],ID_HOSTNAME,CB_ADDSTRING,0,buffer
        invoke  GetDlgItem,[hwnddlg],ID_PORT
        invoke  SendMessage,[hwnddlg],WM_NEXTDLGCTL,eax,TRUE
        jmp     processed
      .bad_name:
        invoke  SendDlgItemMessage,[hwnddlg],ID_IPADDR,IPM_CLEARADDRESS,0,0
        invoke  GetDlgItem,[hwnddlg],ID_HOSTNAME
        invoke  SendMessage,[hwnddlg],WM_NEXTDLGCTL,eax,TRUE
        jmp     processed
  .connect:
        cmp     [status],SOCK_CLIENT
        je      .disconnect
        cmp     [status],SOCK_IDLE
        jne     processed
        invoke  SendDlgItemMessage,[hwnddlg],ID_IPADDR,IPM_GETADDRESS,0,temp
        mov     eax,[temp]
        bswap   eax
        mov     [saddr.sin_addr],eax
        mov     [saddr.sin_family],PF_INET
        invoke  GetDlgItemInt,[hwnddlg],ID_PORT,temp,FALSE
        cmp     [temp],0
        je      processed
        cmp     eax,0FFFFh
        ja      processed
        xchg    ah,al
        mov     [saddr.sin_port],ax
        invoke  closesocket,[sock]
        invoke  socket,AF_INET,SOCK_STREAM,0
        cmp     eax,-1
        je      processed
        mov     [sock],eax
        invoke  connect,[sock],saddr,sizeof.sockaddr_in
        or      eax,eax
        jnz     .refused
        mov     esi,_connected
        mov     eax,0x9F00
        call    write_status
        mov     [status],SOCK_CLIENT
        invoke  WSAAsyncSelect,[sock],[hwnddlg],WM_SOCK,FD_READ or FD_CLOSE
        invoke  SetDlgItemText,[hwnddlg],ID_CONNECT,_disconnect
        invoke  GetDlgItem,[hwnddlg],ID_SEND
        invoke  EnableWindow,eax,TRUE
        invoke  GetDlgItem,[hwnddlg],ID_LISTEN
        invoke  EnableWindow,eax,FALSE
        invoke  GetDlgItem,[hwnddlg],ID_COMMAND
        invoke  SendMessage,[hwnddlg],WM_NEXTDLGCTL,eax,TRUE
        jmp     processed
      .refused:
        mov     esi,_refused
        mov     eax,0xFF
        call    write_status
        jmp     processed
  .send:
        cmp     [status],SOCK_LISTEN
        jbe     processed
        invoke  GetDlgItemText,[hwnddlg],ID_COMMAND,buffer,8000h
        push    eax
        invoke  SendDlgItemMessage,[hwnddlg],ID_COMMAND,CB_ADDSTRING,0,buffer
        pop     eax
        mov     [buffer+eax],13
        inc     eax
        mov     [buffer+eax],10
        inc     eax
        mov     [buffer+eax],0
        invoke  send,[sock],buffer,eax,0
        mov     esi,buffer
        xor     eax,eax
        call    write_status
        mov     [buffer],0
        invoke  SetDlgItemText,[hwnddlg],ID_COMMAND,buffer
        jmp     processed
  .disconnect:
        invoke  closesocket,[sock]
        jmp     wmsock.disconnected
  write_status:
        mov     [charformat.cbSize],sizeof.CHARFORMAT
        mov     [charformat.dwMask],CFM_COLOR
        mov     [charformat.dwEffects],0
        mov     [charformat.crTextColor],eax
        invoke  GetDlgItem,[hwnddlg],ID_STATUS
        mov     ebx,eax
        invoke  SendMessage,ebx,EM_SETSEL,-1,-1
        invoke  SendMessage,ebx,EM_SCROLLCARET,0,0
        invoke  SendMessage,ebx,EM_SETCHARFORMAT,SCF_SELECTION,charformat
        invoke  SendMessage,ebx,EM_REPLACESEL,FALSE,esi
        retn
  wmsock:
        cmp     [status],SOCK_LISTEN
        je      .accept
        invoke  recv,[sock],buffer,8000h,0
        or      eax,eax
        jz      .disconnected
        cmp     eax,-1
        je      .no_response
        mov     [buffer+eax],0
        mov     esi,buffer
        mov     eax,0xFF0000
        call    write_status
      .no_response:
        jmp     processed
      .disconnected:
        mov     [status],SOCK_IDLE
        mov     esi,_disconnected
        mov     eax,0xFF
        call    write_status
        invoke  SetDlgItemText,[hwnddlg],ID_LISTEN,_listen
        invoke  SetDlgItemText,[hwnddlg],ID_CONNECT,_connect
        invoke  GetDlgItem,[hwnddlg],ID_SEND
        invoke  EnableWindow,eax,FALSE
        invoke  GetDlgItem,[hwnddlg],ID_LISTEN
        invoke  EnableWindow,eax,TRUE
        invoke  GetDlgItem,[hwnddlg],ID_CONNECT
        invoke  EnableWindow,eax,TRUE
        invoke  GetDlgItem,[hwnddlg],ID_HOSTNAME
        invoke  SendMessage,[hwnddlg],WM_NEXTDLGCTL,eax,TRUE
        jmp     processed
      .accept:
        invoke  accept,[sock],0,0
        cmp     eax,-1
        je      processed
        xchg    eax,[sock]
        invoke  closesocket,eax
        mov     esi,_accepted
        mov     eax,0x9F00
        call    write_status
        mov     [status],SOCK_SERVER
        invoke  WSAAsyncSelect,[sock],[hwnddlg],WM_SOCK,FD_READ or FD_CLOSE
        invoke  GetDlgItem,[hwnddlg],ID_SEND
        invoke  EnableWindow,eax,TRUE
        invoke  GetDlgItem,[hwnddlg],ID_CONNECT
        invoke  EnableWindow,eax,FALSE
        invoke  GetDlgItem,[hwnddlg],ID_COMMAND
        invoke  SendMessage,[hwnddlg],WM_NEXTDLGCTL,eax,TRUE
        jmp     processed
  wmclose:
        invoke  closesocket,[sock]
        invoke  EndDialog,[hwnddlg],0
  processed:
        mov     eax,1
  finish:
        pop     edi esi ebx
        ret
  endp

section '.data' data readable writeable

  _riched db 'RICHED32.DLL',0

  _connect db '&Connect',0
  _disconnect db 'Dis&connect',0
  _listen db '&Listen',0
  _stop db '&Stop',0

  _refused db 'Connection refused.',13,10,0
  _connected db 'Connected.',13,10,0
  _disconnected db 'Disconnected.',13,10,0
  _accepted db 'Accepted incoming connection.',13,10,0

  sock dd ?
  temp dd ?
  focus dd ?

  initcomctl INITCOMMONCONTROLSEX
  charformat CHARFORMAT
  wsadata WSADATA
  saddr sockaddr_in

  buffer rb 8000h

  status db ?

section '.idata' import data readable writeable

  library kernel,'KERNEL32.DLL',\
          user,'USER32.DLL',\
          comctl,'COMCTL32.DLL',\
          winsock,'WSOCK32.DLL'

  import kernel,\
         GetModuleHandle,'GetModuleHandleA',\
         LoadLibrary,'LoadLibraryA',\
         ExitProcess,'ExitProcess'

  import user,\
         DialogBoxParam,'DialogBoxParamA',\
         SendMessage,'SendMessageA',\
         GetDlgItem,'GetDlgItem',\
         GetDlgItemInt,'GetDlgItemInt',\
         GetDlgItemText,'GetDlgItemTextA',\
         SetDlgItemText,'SetDlgItemTextA',\
         SendDlgItemMessage,'SendDlgItemMessageA',\
         GetFocus,'GetFocus',\
         EnableWindow,'EnableWindow',\
         wsprintf,'wsprintfA',\
         EndDialog,'EndDialog'

  import comctl,\
         InitCommonControlsEx,'InitCommonControlsEx'

  import winsock,\
         WSAStartup,'WSAStartup',\
         WSACleanup,'WSACleanup',\
         WSAAsyncSelect,'WSAAsyncSelect',\
         gethostbyname,'gethostbyname',\
         socket,'socket',\
         bind,'bind',\
         listen,'listen',\
         accept,'accept',\
         connect,'connect',\
         recv,'recv',\
         send,'send',\
         closesocket,'closesocket'

section '.rsrc' resource data readable

  IDR_DIALOG = 37
  IDR_LOGO   = 7

  ID_SERVPORT      = 0x101
  ID_LISTEN        = 0x102
  ID_HOSTNAME      = 0x103
  ID_GETHOSTBYNAME = 0x104
  ID_IPADDR        = 0x105
  ID_PORT          = 0x106
  ID_CONNECT       = 0x107
  ID_STATUS        = 0x108
  ID_COMMAND       = 0x109
  ID_SEND          = 0x10A

  directory RT_DIALOG,dialogs,\
            RT_BITMAP,bitmaps

  resource dialogs,\
           IDR_DIALOG,LANG_ENGLISH+SUBLANG_DEFAULT,main

  resource bitmaps,\
           IDR_LOGO,LANG_ENGLISH+SUBLANG_DEFAULT,logo

  dialog main,'Quetannon',70,70,332,176,WS_CAPTION+WS_POPUP+WS_SYSMENU+WS_MINIMIZEBOX+DS_MODALFRAME
    dialogitem 'STATIC',IDR_LOGO,-1,4,4,248,20,WS_VISIBLE+SS_BITMAP
    dialogitem 'BUTTON','',IDOK,0,0,0,0,BS_DEFPUSHBUTTON
    dialogitem 'STATIC','&Host name:',-1,4,26,148,8,WS_VISIBLE
    dialogitem 'EDIT','',ID_HOSTNAME,4,36,148,12,WS_VISIBLE+WS_BORDER+ES_AUTOHSCROLL+WS_TABSTOP
    dialogitem 'BUTTON','>',ID_GETHOSTBYNAME,156,36,20,12,WS_VISIBLE+BS_PUSHBUTTON+WS_TABSTOP
    dialogitem 'STATIC','&IP address:',-1,180,26,72,8,WS_VISIBLE
    dialogitem 'SysIPAddress32','',ID_IPADDR,180,36,72,12,WS_VISIBLE+BS_PUSHBUTTON+WS_TABSTOP
    dialogitem 'STATIC','&Port:',-1,256,26,20,8,WS_VISIBLE
    dialogitem 'EDIT','',ID_PORT,256,36,24,12,WS_VISIBLE+WS_BORDER+ES_NUMBER+WS_TABSTOP
    dialogitem 'BUTTON','&Connect',ID_CONNECT,284,36,44,12,WS_VISIBLE+BS_PUSHBUTTON+WS_TABSTOP
    dialogitem 'STATIC','&Port:',-1,256,2,20,8,WS_VISIBLE
    dialogitem 'EDIT','',ID_SERVPORT,256,12,24,12,WS_VISIBLE+WS_BORDER+ES_NUMBER+WS_TABSTOP
    dialogitem 'BUTTON','&Listen',ID_LISTEN,284,12,44,12,WS_VISIBLE+BS_PUSHBUTTON+WS_TABSTOP
    dialogitem 'RichEdit','',ID_STATUS,4,52,324,104,WS_VISIBLE+WS_BORDER+WS_VSCROLL+ES_AUTOHSCROLL+ES_AUTOVSCROLL+ES_MULTILINE+ES_READONLY+WS_TABSTOP
    dialogitem 'EDIT','',ID_COMMAND,4,160,228,12,WS_VISIBLE+WS_BORDER+ES_AUTOHSCROLL+WS_TABSTOP
    dialogitem 'BUTTON','&Send',ID_SEND,236,160,44,12,WS_VISIBLE+WS_DISABLED+BS_PUSHBUTTON+WS_TABSTOP
    dialogitem 'BUTTON','E&xit',IDCANCEL,284,160,44,12,WS_VISIBLE+BS_PUSHBUTTON+WS_TABSTOP
  enddialog

  bitmap logo,'logo.bmp'