format PE GUI 4.0
entry start
include 'win32a.inc'
section '.data' data readable writeable
ERROR_NO_DATA = 232
FILE_APPEND_DATA = 0x0004
szClass db 'Widget_Tray_Class',0
szTitle db 'Lesta Game Center',0
szExit db 'Закрыть программу',0
wc WNDCLASS
msg MSG
nid NOTIFYICONDATA
hMenu dd ?
pt POINT
szShell32 db 'shell32.dll',0
pipe_name db '\\.\pipe\LGC_IPC',0
hPipe dd ?
buffer rb 2048 ; Резервируем 2048 байт
bytesRead dd ?
log_file db 'log_pipe.txt',0
hLog dd ?
written dd ?
crlf db 0Dh, 0Ah
section '.text' code readable executable
start:
invoke GetModuleHandle, 0
mov [wc.hInstance], eax
mov [wc.lpfnWndProc], WindowProc
mov [wc.lpszClassName], szClass
invoke RegisterClass, wc
invoke CreateWindowEx, 0, szClass, szTitle, 0, \
0, 0, 0, 0, 0, 0, [wc.hInstance], 0
mov [nid.hWnd], eax
invoke SetTimer, [nid.hWnd], 1, 500, 0
invoke CreatePopupMenu
mov [hMenu], eax
invoke AppendMenu, [hMenu], MF_STRING, 1001, szExit
mov [nid.cbSize], sizeof.NOTIFYICONDATA
mov [nid.uID], 1
mov [nid.uFlags], NIF_MESSAGE or NIF_ICON or NIF_TIP
mov [nid.uCallbackMessage], WM_USER + 1
invoke ExtractIcon, [wc.hInstance], szShell32, 13
mov [nid.hIcon], eax
invoke Shell_NotifyIcon, NIM_ADD, nid
invoke CreateNamedPipe, pipe_name, PIPE_ACCESS_DUPLEX, \
PIPE_TYPE_MESSAGE or PIPE_READMODE_MESSAGE or PIPE_NOWAIT, \
1, 2048, 2048, 0, 0
mov [hPipe], eax
msg_loop:
invoke GetMessage, msg, 0, 0, 0
test eax, eax
jz end_loop
invoke DispatchMessage, msg
jmp msg_loop
end_loop:
invoke ExitProcess, 0
proc WindowProc hwnd, wmsg, wparam, lparam
cmp [wmsg], WM_TIMER
je .on_timer
cmp [wmsg], WM_USER + 1
je .on_tray
cmp [wmsg], WM_COMMAND
je .on_command
cmp [wmsg], WM_DESTROY
je .on_destroy
invoke DefWindowProc, [hwnd], [wmsg], [wparam], [lparam]
ret
.on_timer:
; Пытаемся прочитать данные из пайпа
invoke ReadFile, [hPipe], buffer, 2048, bytesRead, 0
test eax, eax
jnz .data_received ; <--- ЕСЛИ ДАННЫЕ ЕСТЬ, ПРЫГАЕМ СЮДА
; Если ReadFile вернул 0, проверяем ошибку
invoke GetLastError
cmp eax, ERROR_NO_DATA
je .finish
; Если клиент отключился, сбрасываем канал
invoke DisconnectNamedPipe, [hPipe]
invoke ConnectNamedPipe, [hPipe], 0
jmp .finish
.data_received:
mov eax, [bytesRead]
test eax, eax
jz .finish
; Логика записи в файл
invoke CreateFile, log_file, FILE_APPEND_DATA, \
FILE_SHARE_READ, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0
mov [hLog], eax
cmp eax, INVALID_HANDLE_VALUE
je .skip_write
invoke WriteFile, [hLog], buffer, [bytesRead], written, 0
;Добавляем перенос строки
invoke WriteFile, [hLog], crlf, 2, written, 0
invoke CloseHandle, [hLog]
.skip_write:
; Сброс канала для следующего сообщения
invoke DisconnectNamedPipe, [hPipe]
invoke ConnectNamedPipe, [hPipe], 0
jmp .finish
.on_tray:
cmp [lparam], WM_RBUTTONUP
jne .finish
invoke SetForegroundWindow, [hwnd]
invoke GetCursorPos, pt
invoke TrackPopupMenu, [hMenu], TPM_RIGHTALIGN, [pt.x], [pt.y], 0, [hwnd], 0
jmp .finish
.on_command:
cmp [wparam], 1001
jne .finish
invoke DestroyWindow, [hwnd]
jmp .finish
.on_destroy:
invoke Shell_NotifyIcon, NIM_DELETE, nid
invoke PostQuitMessage, 0
.finish:
xor eax, eax
ret
endp
section '.idata' import data readable
library kernel32, 'KERNEL32.DLL', \
user32, 'USER32.DLL', \
shell32, 'SHELL32.DLL'
include 'api\kernel32.inc'
include 'api\user32.inc'
include 'api\shell32.inc'