Server Source
.386
.model flat,stdcall
option casemap:none
CreateSocket PROTO :DWORD
inv equ invoke
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\shell32.inc
include \masm32\include\wsock32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\shell32.lib
includelib \masm32\lib\wsock32.lib
.const
X_Win equ 160
Y_Win equ 090
port equ 25
WM_SOCKET equ WM_USER+100
ICON equ 1
RESTART equ 0
SHUTDOWN equ 1
SYSLOCKUP equ 2
.data
szShutdown db "Shutdown", 0
szRestart db "Restart", 0
szDunno db "I don't know this msg", 0
ClassName db "Win32ASM_Class", 0
AppName db "Server", 0
wc WNDCLASSEX <SIZEOF WNDCLASSEX, CS_HREDRAW or CS_VREDRAW, offset WndProc, \
NULL, NULL, NULL, NULL, NULL, COLOR_WINDOW + 1, NULL, \
offset ClassName, NULL>
szConnect db "Connection esthablished", 0
eFuck db "Something went wrong!", 0
.data?
hInstance dd ?
hwnd dd ?
X_Pos dd ?
Y_Pos dd ?
msg MSG <?>
sin sockaddr_in <?>
sSocket dd ?
wsadata WSADATA <?>
bRead dd ?
available_data dd ?
cSocket dd ?
.code
start:
inv GetModuleHandle, NULL
mov hInstance, eax
mov wc.hInstance, eax
inv LoadIcon, hInstance, ICON
mov wc.hIcon, eax
mov wc.hIconSm, eax
inv LoadCursor, NULL, IDC_ARROW
mov wc.hCursor, eax
inv RegisterClassEx, offset wc
inv GetSystemMetrics,SM_CXSCREEN ; Calculate Screen center
shr eax, 1
sub eax, X_Win / 2
mov X_Pos, eax
inv GetSystemMetrics,SM_CYSCREEN
shr eax, 1
sub eax, Y_Win / 2
mov Y_Pos, eax
inv CreateWindowEx, NULL, offset ClassName, offset AppName, WS_OVERLAPPEDWINDOW, \
X_Pos, Y_Pos, X_Win, Y_Win, NULL, NULL, hInstance, NULL
mov hwnd, eax
inv ShowWindow, eax, SW_SHOW
inv UpdateWindow, hwnd
.while TRUE
inv GetMessage, offset msg, NULL, 0, 0
.break .if (!eax)
inv TranslateMessage, offset msg
inv DispatchMessage, offset msg
.endw
inv ExitProcess, msg.wParam
; Window Proc
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.if uMsg == WM_DESTROY
inv closesocket, sSocket
inv WSACleanup
inv PostQuitMessage, NULL
.elseif uMsg == WM_CREATE
inv WSAStartup, 101h, offset wsadata
inv CreateSocket, hWnd
.elseif uMsg == WM_SOCKET
mov eax, wParam
mov cSocket, eax
mov eax, lParam
.if ax == FD_ACCEPT
inv accept, sSocket, 0, 0
.elseif ax == FD_READ
inv ioctlsocket, cSocket, FIONREAD, offset available_data
.if eax == NULL
inv GlobalAlloc, GMEM_FIXED + GMEM_ZEROINIT, available_data
mov bRead, eax
inv recv, cSocket, bRead, available_data, 0
mov available_data, eax
; inv MessageBox, hWnd, bRead, bRead, MB_OK
mov esi, bRead
cld
lodsb
.if al == RESTART
inv ExitWindowsEx, EWX_REBOOT, 0
.elseif al == SHUTDOWN
inv ExitWindowsEx, EWX_SHUTDOWN, 0
.else
inv MessageBox, hWnd, offset szDunno, offset AppName, MB_OK
.endif
inv GlobalFree, bRead
.else
inv MessageBox, hWnd, offset eFuck, offset eFuck, MB_OK
.endif
.endif
.else
inv DefWindowProc, hWnd, uMsg, wParam, lParam
ret
.endif
xor eax,eax
ret
WndProc endp
CreateSocket proc hWnd:DWORD
mov sin.sin_family, AF_INET
inv htons, port
mov sin.sin_port, ax
inv socket, PF_INET, SOCK_STREAM, 0
mov sSocket, eax
inv WSAAsyncSelect, sSocket, hWnd, WM_SOCKET, FD_ACCEPT + FD_CLOSE + FD_READ
inv bind, sSocket, offset sin, SIZEOF sin
inv listen, sSocket, 2
ret
CreateSocket endp
end start