forked from KolibriOS/kolibrios
847 lines
33 KiB
FASM
847 lines
33 KiB
FASM
; This program shows information about thread ;
|
|
; usage: tinfo [slot of the thread] ;
|
|
; if slot number is omitted then assume slot = -1 ;
|
|
; to compile: nasm -f bin tinfo.asm -o tinfo ;
|
|
|
|
use32
|
|
org 0
|
|
db 'MENUET01'
|
|
version dd 1
|
|
dd program.start
|
|
dd program.end
|
|
dd program.memory
|
|
dd program.stack
|
|
dd program.params
|
|
dd program.path
|
|
|
|
include '../../macros.inc'
|
|
include '../../proc32.inc'
|
|
include '../../KOSfuncs.inc'
|
|
include 'lang.inc'
|
|
|
|
; ---------------------------------------------------------------------------- ;
|
|
TEXT_WIDTH = 8
|
|
BOLD_TEXT_WIDTH = TEXT_WIDTH + 1
|
|
; ---------------------------------------------------------------------------- ;
|
|
if lang eq ru_RU
|
|
COLUMN1_MAX_COUNT = 19
|
|
COLUMN2_MAX_COUNT = 12
|
|
COLUMN3_MAX_COUNT = 26
|
|
else
|
|
COLUMN1_MAX_COUNT = 13
|
|
COLUMN2_MAX_COUNT = 12
|
|
COLUMN3_MAX_COUNT = 26
|
|
end if
|
|
; ---------------------------------------------------------------------------- ;
|
|
COLUMN_PADDING = 3
|
|
COLUMN1_PADDING = COLUMN_PADDING
|
|
COLUMN2_PADDING = COLUMN_PADDING
|
|
COLUMN3_PADDING = COLUMN_PADDING
|
|
; ---------------------------------------------------------------------------- ;
|
|
ITEM_HEIGHT = 22
|
|
TEXT_HEIGHT = 16
|
|
;COLUMN1_ITEM_WIDTH = COLUMN1_MAX_COUNT * BOLD_TEXT_WIDTH + COLUMN1_PADDING * 2
|
|
;COLUMN2_ITEM_WIDTH = COLUMN2_MAX_COUNT * BOLD_TEXT_WIDTH + COLUMN2_PADDING * 2
|
|
;COLUMN3_ITEM_WIDTH = COLUMN3_MAX_COUNT * BOLD_TEXT_WIDTH + COLUMN3_PADDING * 2
|
|
COLUMN1_ITEM_WIDTH = COLUMN1_MAX_COUNT * TEXT_WIDTH + COLUMN1_PADDING * 2
|
|
COLUMN2_ITEM_WIDTH = COLUMN2_MAX_COUNT * TEXT_WIDTH + COLUMN2_PADDING * 2
|
|
COLUMN3_ITEM_WIDTH = COLUMN3_MAX_COUNT * TEXT_WIDTH + COLUMN3_PADDING * 2
|
|
ITEM_MARGIN = 6
|
|
ITEM_BACK_COLOR_1 = 0x00EAEAEA
|
|
ITEM_BACK_COLOR_2 = 0x00F4F4F4
|
|
ITEM_COUNT = 18 ; at current time we have 18 items
|
|
; ---------------------------------------------------------------------------- ;
|
|
COLUMN_Y = 10
|
|
COLUMN1_X = 10
|
|
COLUMN2_X = COLUMN1_X + COLUMN1_ITEM_WIDTH + ITEM_MARGIN
|
|
COLUMN3_X = COLUMN2_X + COLUMN2_ITEM_WIDTH + ITEM_MARGIN
|
|
; ---------------------------------------------------------------------------- ;
|
|
COLUMN1_TEXT_X = COLUMN1_X + COLUMN1_PADDING
|
|
COLUMN2_TEXT_X = COLUMN2_X + COLUMN2_PADDING
|
|
COLUMN3_TEXT_X = COLUMN3_X + COLUMN3_PADDING
|
|
; ---------------------------------------------------------------------------- ;
|
|
FRAME_TOP = COLUMN_Y - ITEM_MARGIN / 2
|
|
FRAME_BOTTOM = COLUMN_Y + ITEM_HEIGHT * ITEM_COUNT + ITEM_MARGIN / 2 - 1
|
|
; ---------------------------------------------------------------------------- ;
|
|
FRAME1_LEFT = COLUMN1_X - ITEM_MARGIN / 2
|
|
FRAME1_RIGHT = COLUMN1_X + COLUMN1_ITEM_WIDTH + ITEM_MARGIN / 2 - 1
|
|
; ---------------------------------------------------------------------------- ;
|
|
FRAME2_LEFT = COLUMN2_X - ITEM_MARGIN / 2
|
|
FRAME2_RIGHT = COLUMN2_X + COLUMN2_ITEM_WIDTH + ITEM_MARGIN / 2 - 1
|
|
; ---------------------------------------------------------------------------- ;
|
|
FRAME3_LEFT = COLUMN3_X - ITEM_MARGIN / 2
|
|
FRAME3_RIGHT = COLUMN3_X + COLUMN3_ITEM_WIDTH + ITEM_MARGIN / 2 - 1
|
|
; ---------------------------------------------------------------------------- ;
|
|
WINDOW_STYLE_SKINNED_FIXED = 0x4000000
|
|
WINDOW_STYLE_COORD_CLIENT = 0x20000000
|
|
WINDOW_STYLE_CAPTION = 0x10000000
|
|
; ---------------------------------------------------------------------------- ;
|
|
WINDOW_BORDER_SIZE = 5
|
|
WINDOW_WIDTH = FRAME3_RIGHT + FRAME1_LEFT + WINDOW_BORDER_SIZE * 2
|
|
WINDOW_STYLE = WINDOW_STYLE_SKINNED_FIXED or WINDOW_STYLE_COORD_CLIENT or WINDOW_STYLE_CAPTION
|
|
WINDOW_BACK_COLOR = 0x00FFFFFF
|
|
; ---------------------------------------------------------------------------- ;
|
|
INDICATOR_WIDTH = 3
|
|
INDICATOR_HEIGHT = 3
|
|
INDICATOR_LEFT = COLUMN3_X + COLUMN3_ITEM_WIDTH + ITEM_MARGIN / 2
|
|
INDICATOR_TOP = COLUMN_Y - ITEM_MARGIN / 2 - INDICATOR_HEIGHT
|
|
; ---------------------------------------------------------------------------- ;
|
|
UPDATE_TIME = 28
|
|
; ---------------------------------------------------------------------------- ;
|
|
KEYBOARD_MODE_ASCII = 0
|
|
KEYBOARD_MODE_SCAN = 1
|
|
; ---------------------------------------------------------------------------- ;
|
|
WINDOW_STATE_MAXIMIZED = 1
|
|
WINDOW_STATE_MINIMIZED = 2
|
|
WINDOW_STATE_ROLLED_UP = 4
|
|
; ---------------------------------------------------------------------------- ;
|
|
THREAD_STATE_RUNNING = 0
|
|
THREAD_STATE_SUSPENDED = 1
|
|
THREAD_STATE_SUSPENDED_WAIT_EVENT = 2
|
|
THREAD_STATE_NORMAL_TERMINATING = 3
|
|
THREAD_STATE_EXCEPT_TERMINATING = 4
|
|
THREAD_STATE_WAIT_EVENT = 5
|
|
THREAD_STATE_SLOT_IS_FREE = 9
|
|
; ---------------------------------------------------------------------------- ;
|
|
|
|
|
|
; ---------------------------------------------------------------------------- ;
|
|
slot dd -1 ; for default if no params
|
|
; ---------------------------------------------------------------------------- ;
|
|
screen:
|
|
.height dw 0
|
|
.width dw 0
|
|
; ---------------------------------------------------------------------------- ;
|
|
window:
|
|
.left dd 0
|
|
.top dd 0
|
|
.width dd 0
|
|
.height dd 0
|
|
; ---------------------------------------------------------------------------- ;
|
|
fore_color dd 0x00000000
|
|
back_color dd ITEM_BACK_COLOR_1
|
|
frame_color dd 0x00CCCCCC
|
|
; ---------------------------------------------------------------------------- ;
|
|
BackColors:
|
|
dd 1
|
|
dd ITEM_BACK_COLOR_1
|
|
dd ITEM_BACK_COLOR_2
|
|
; ---------------------------------------------------------------------------- ;
|
|
IndicatorColors:
|
|
dd 1
|
|
dd 0x000AF000
|
|
dd 0x00000FA0
|
|
; ---------------------------------------------------------------------------- ;
|
|
align 4
|
|
Pos:
|
|
.x dd COLUMN1_X
|
|
.y dd COLUMN_Y
|
|
; ---------------------------------------------------------------------------- ;
|
|
sz_caption db "ThreadInfo",0
|
|
; ---------------------------------------------------------------------------- ;
|
|
if lang eq ru_RU
|
|
sz_cpu_usage db "Использ. процессора",0
|
|
sz_win_stack_pos db "Win stack pos",0
|
|
sz_name db "Имя",0
|
|
sz_mem_address db "Адрес в памяти",0
|
|
sz_mem_usage db "Использовано памяти",0
|
|
sz_identifier db "Идентификатор",0
|
|
sz_x db "X",0
|
|
sz_y db "Y",0
|
|
sz_size_x db "Размер X",0
|
|
sz_size_y db "Размер Y",0
|
|
sz_thread_state db "Состояние процесса",0
|
|
sz_client_x db "Client X",0
|
|
sz_client_y db "Client Y",0
|
|
sz_client_size_x db "Client Size X",0
|
|
sz_client_size_y db "Client Size Y",0
|
|
sz_window_state db "Состояние окна",0
|
|
sz_event_mask db "Маска событий",0
|
|
sz_keyboard_mode db "Режим клавиатуры",0
|
|
else
|
|
sz_cpu_usage db "CPU usage",0
|
|
sz_win_stack_pos db "Win stack pos",0
|
|
sz_name db "Name",0
|
|
sz_mem_address db "Mem address",0
|
|
sz_mem_usage db "Mem usage",0
|
|
sz_identifier db "Identifier",0
|
|
sz_x db "X",0
|
|
sz_y db "Y",0
|
|
sz_size_x db "Size X",0
|
|
sz_size_y db "Size Y",0
|
|
sz_thread_state db "Thread state",0
|
|
sz_client_x db "Client X",0
|
|
sz_client_y db "Client Y",0
|
|
sz_client_size_x db "Client Size X",0
|
|
sz_client_size_y db "Client Size Y",0
|
|
sz_window_state db "Window state",0
|
|
sz_event_mask db "Event mask",0
|
|
sz_keyboard_mode db "Keyboard mode",0
|
|
end if
|
|
; ---------------------------------------------------------------------------- ;
|
|
; state of the window
|
|
sz_maximized db "Max ",0
|
|
sz_minimized db "Min ",0
|
|
sz_rolled_up db "RollUp ",0
|
|
; ---------------------------------------------------------------------------- ;
|
|
; keyboard mode
|
|
sz_ascii db "ASCII",0
|
|
sz_scan db "SCAN ",0
|
|
; ---------------------------------------------------------------------------- ;
|
|
; status of the thread slot
|
|
sz_running db "running ",0
|
|
sz_suspended db "suspended ",0
|
|
sz_suspended_wait_event db "suspended wait event",0
|
|
sz_normal_terminating db "normal terminating ",0
|
|
sz_except_terminating db "except. terminating ",0
|
|
sz_wait_event db "wait event ",0
|
|
sz_slot_is_free db "slot is free ",0
|
|
; ---------------------------------------------------------------------------- ;
|
|
; event mask
|
|
sz_redraw db "rdrw ",0
|
|
sz_key db "key ",0
|
|
sz_button db "btn ",0
|
|
sz_reserved0 db "rsrvd0 ",0
|
|
sz_redraw_background db "bckgr ",0
|
|
sz_mouse db "mouse ",0
|
|
sz_ipc db "ipc ",0
|
|
sz_network db "net ",0
|
|
sz_debug db "dbg ",0
|
|
; ---------------------------------------------------------------------------- ;
|
|
sz_undefined db "UnDef ",0
|
|
; **************************************************************************** ;
|
|
macro DrawCpuUsage {
|
|
; sz_cpu_usage
|
|
stdcall DrawText, [back_color],[fore_color],sz_cpu_usage,[Pos.y],COLUMN1_TEXT_X
|
|
; [cpu_usage]
|
|
stdcall uint2str, [thread_info.cpu_usage]
|
|
stdcall PadBuffSpaces, COLUMN2_MAX_COUNT
|
|
stdcall DrawText, [back_color],[fore_color],tmpbuffer,[Pos.y],COLUMN2_TEXT_X
|
|
call ChangeBackColor
|
|
add [Pos.y], dword ITEM_HEIGHT
|
|
}
|
|
; **************************************************************************** ;
|
|
macro DrawWinStackPos {
|
|
; sz_win_stack_pos
|
|
stdcall DrawText, [back_color],[fore_color],sz_win_stack_pos,[Pos.y],COLUMN1_TEXT_X
|
|
; [win_stack_pos]
|
|
movzx eax, word [thread_info.window_stack_position]
|
|
stdcall uint2str, eax
|
|
stdcall PadBuffSpaces, COLUMN2_MAX_COUNT
|
|
stdcall DrawText, [back_color],[fore_color],tmpbuffer,[Pos.y],COLUMN2_TEXT_X
|
|
call ChangeBackColor
|
|
add [Pos.y], dword ITEM_HEIGHT
|
|
}
|
|
; **************************************************************************** ;
|
|
macro DrawName {
|
|
; sz_name
|
|
stdcall DrawText, [back_color],[fore_color],sz_name,[Pos.y],COLUMN1_TEXT_X
|
|
; name
|
|
stdcall DrawText, [back_color],[fore_color],(thread_info.process_name),[Pos.y],COLUMN2_TEXT_X
|
|
call ChangeBackColor
|
|
add [Pos.y], dword ITEM_HEIGHT
|
|
}
|
|
; **************************************************************************** ;
|
|
macro DrawMemAddress {
|
|
; sz_mem_address
|
|
stdcall DrawText, [back_color],[fore_color],sz_mem_address,[Pos.y],COLUMN1_TEXT_X
|
|
; [mem_address]
|
|
stdcall uint2str, [thread_info.memory_start]
|
|
stdcall PadBuffSpaces, COLUMN2_MAX_COUNT
|
|
stdcall DrawText, [back_color],[fore_color],tmpbuffer,[Pos.y],COLUMN2_TEXT_X
|
|
call ChangeBackColor
|
|
add [Pos.y], dword ITEM_HEIGHT
|
|
}
|
|
; **************************************************************************** ;
|
|
macro DrawMemUsage {
|
|
; sz_mem_usage
|
|
stdcall DrawText, [back_color],[fore_color],sz_mem_usage,[Pos.y],COLUMN1_TEXT_X
|
|
; [mem_usage]
|
|
stdcall uint2str, [thread_info.used_memory]
|
|
stdcall PadBuffSpaces, COLUMN2_MAX_COUNT
|
|
stdcall DrawText, [back_color],[fore_color],tmpbuffer,[Pos.y],COLUMN2_TEXT_X
|
|
call ChangeBackColor
|
|
add [Pos.y], dword ITEM_HEIGHT
|
|
}
|
|
; **************************************************************************** ;
|
|
macro DrawIdentifier {
|
|
; sz_identifier
|
|
stdcall DrawText, [back_color],[fore_color],sz_identifier,[Pos.y],COLUMN1_TEXT_X
|
|
; [identifier]
|
|
stdcall uint2str, [thread_info.PID]
|
|
stdcall PadBuffSpaces, COLUMN2_MAX_COUNT
|
|
stdcall DrawText, [back_color],[fore_color],tmpbuffer,[Pos.y],COLUMN2_TEXT_X
|
|
call ChangeBackColor
|
|
add [Pos.y], dword ITEM_HEIGHT
|
|
}
|
|
; **************************************************************************** ;
|
|
macro DrawWindowX {
|
|
; sz_x
|
|
stdcall DrawText, [back_color],[fore_color],sz_x,[Pos.y],COLUMN1_TEXT_X
|
|
; [x]
|
|
stdcall uint2str, [thread_info.box.left]
|
|
stdcall PadBuffSpaces, COLUMN2_MAX_COUNT
|
|
stdcall DrawText, [back_color],[fore_color],tmpbuffer,[Pos.y],COLUMN2_TEXT_X
|
|
call ChangeBackColor
|
|
add [Pos.y], dword ITEM_HEIGHT
|
|
}
|
|
; **************************************************************************** ;
|
|
macro DrawWindowY {
|
|
; sz_y
|
|
stdcall DrawText, [back_color],[fore_color],sz_y,[Pos.y],COLUMN1_TEXT_X
|
|
; [y]
|
|
stdcall uint2str, [thread_info.box.top]
|
|
stdcall PadBuffSpaces, COLUMN2_MAX_COUNT
|
|
stdcall DrawText, [back_color],[fore_color],tmpbuffer,[Pos.y],COLUMN2_TEXT_X
|
|
call ChangeBackColor
|
|
add [Pos.y], dword ITEM_HEIGHT
|
|
}
|
|
; **************************************************************************** ;
|
|
macro DrawWindowSizeX {
|
|
; sz_size_x
|
|
stdcall DrawText, [back_color],[fore_color],sz_size_x,[Pos.y],COLUMN1_TEXT_X
|
|
; [size_x]
|
|
stdcall uint2str, [thread_info.box.width]
|
|
stdcall PadBuffSpaces, COLUMN2_MAX_COUNT
|
|
stdcall DrawText, [back_color],[fore_color],tmpbuffer,[Pos.y],COLUMN2_TEXT_X
|
|
call ChangeBackColor
|
|
add [Pos.y], dword ITEM_HEIGHT
|
|
}
|
|
; **************************************************************************** ;
|
|
macro DrawWindowSizeY {
|
|
; sz_size_y
|
|
stdcall DrawText, [back_color],[fore_color],sz_size_y,[Pos.y],COLUMN1_TEXT_X
|
|
; [size_y]
|
|
stdcall uint2str, [thread_info.box.height]
|
|
stdcall PadBuffSpaces, COLUMN2_MAX_COUNT
|
|
stdcall DrawText, [back_color],[fore_color],tmpbuffer,[Pos.y],COLUMN2_TEXT_X
|
|
call ChangeBackColor
|
|
add [Pos.y], dword ITEM_HEIGHT
|
|
}
|
|
; **************************************************************************** ;
|
|
macro DrawThreadState {
|
|
; sz_thread_state
|
|
stdcall DrawText, [back_color],[fore_color],sz_thread_state,[Pos.y],COLUMN1_TEXT_X
|
|
; decoded_thread_state & [thread_state]
|
|
movzx eax, word [thread_info.slot_state]
|
|
push eax ; for "call uint2str" below
|
|
|
|
cmp eax, THREAD_STATE_RUNNING
|
|
jne @f
|
|
mov eax, sz_running
|
|
jmp %%draw_decoded_thread_state
|
|
@@:
|
|
cmp eax, THREAD_STATE_SUSPENDED
|
|
jne @f
|
|
mov eax, sz_suspended
|
|
jmp %%draw_decoded_thread_state
|
|
@@:
|
|
cmp eax, THREAD_STATE_SUSPENDED_WAIT_EVENT
|
|
jne @f
|
|
mov eax, sz_suspended_wait_event
|
|
jmp %%draw_decoded_thread_state
|
|
@@:
|
|
cmp eax, THREAD_STATE_NORMAL_TERMINATING
|
|
jne @f
|
|
mov eax, sz_normal_terminating
|
|
jmp %%draw_decoded_thread_state
|
|
@@:
|
|
cmp eax, THREAD_STATE_EXCEPT_TERMINATING
|
|
jne @f
|
|
mov eax, sz_except_terminating
|
|
jmp %%draw_decoded_thread_state
|
|
@@:
|
|
cmp eax, THREAD_STATE_WAIT_EVENT
|
|
jne @f
|
|
mov eax, sz_wait_event
|
|
jmp %%draw_decoded_thread_state
|
|
@@:
|
|
cmp eax, THREAD_STATE_SLOT_IS_FREE
|
|
jne @f
|
|
mov eax, sz_slot_is_free
|
|
jmp %%draw_decoded_thread_state
|
|
@@:
|
|
mov eax, sz_undefined
|
|
%%draw_decoded_thread_state:
|
|
stdcall DrawText, [back_color],[fore_color],eax,[Pos.y],COLUMN3_TEXT_X
|
|
call uint2str
|
|
stdcall PadBuffSpaces, COLUMN2_MAX_COUNT
|
|
stdcall DrawText, [back_color],[fore_color],tmpbuffer,[Pos.y],COLUMN2_TEXT_X
|
|
call ChangeBackColor
|
|
add [Pos.y], dword ITEM_HEIGHT
|
|
}
|
|
; **************************************************************************** ;
|
|
macro DrawClientX {
|
|
; sz_client_x
|
|
stdcall DrawText, [back_color],[fore_color],sz_client_x,[Pos.y],COLUMN1_TEXT_X
|
|
; [client_x]
|
|
stdcall uint2str, [thread_info.client_box.left]
|
|
stdcall PadBuffSpaces, COLUMN2_MAX_COUNT
|
|
stdcall DrawText, [back_color],[fore_color],tmpbuffer,[Pos.y],COLUMN2_TEXT_X
|
|
call ChangeBackColor
|
|
add [Pos.y], dword ITEM_HEIGHT
|
|
}
|
|
; **************************************************************************** ;
|
|
macro DrawClientY {
|
|
; sz_client_y
|
|
stdcall DrawText, [back_color],[fore_color],sz_client_y,[Pos.y],COLUMN1_TEXT_X
|
|
; [client_y]
|
|
stdcall uint2str, [thread_info.client_box.top]
|
|
stdcall PadBuffSpaces, COLUMN2_MAX_COUNT
|
|
stdcall DrawText, [back_color],[fore_color],tmpbuffer,[Pos.y],COLUMN2_TEXT_X
|
|
call ChangeBackColor
|
|
add [Pos.y], dword ITEM_HEIGHT
|
|
}
|
|
; **************************************************************************** ;
|
|
macro DrawClientSizeX {
|
|
; sz_client_size_x
|
|
stdcall DrawText, [back_color],[fore_color],sz_client_size_x,[Pos.y],COLUMN1_TEXT_X
|
|
; [client_size_x]
|
|
stdcall uint2str, [thread_info.client_box.width]
|
|
stdcall PadBuffSpaces, COLUMN2_MAX_COUNT
|
|
stdcall DrawText, [back_color],[fore_color],tmpbuffer,[Pos.y],COLUMN2_TEXT_X
|
|
call ChangeBackColor
|
|
add [Pos.y], dword ITEM_HEIGHT
|
|
}
|
|
; **************************************************************************** ;
|
|
macro DrawClientSizeY {
|
|
; sz_client_size_y
|
|
stdcall DrawText, [back_color],[fore_color],sz_client_size_y,[Pos.y],COLUMN1_TEXT_X
|
|
; [client_size_y]
|
|
stdcall uint2str, [thread_info.client_box.height]
|
|
stdcall PadBuffSpaces, COLUMN2_MAX_COUNT
|
|
stdcall DrawText, [back_color],[fore_color],tmpbuffer,[Pos.y],COLUMN2_TEXT_X
|
|
call ChangeBackColor
|
|
add [Pos.y], dword ITEM_HEIGHT
|
|
}
|
|
; **************************************************************************** ;
|
|
macro DrawWindowState {
|
|
; sz_window_state
|
|
stdcall DrawText, [back_color],[fore_color],sz_window_state,[Pos.y],COLUMN1_TEXT_X
|
|
; decoded_window_state & [window_state]
|
|
movzx eax, byte [thread_info.wnd_state]
|
|
push eax ; for "call uint2str" below
|
|
mov ebx, eax
|
|
mov [tmpbuffer], byte 0
|
|
|
|
test ebx, WINDOW_STATE_MAXIMIZED
|
|
jz @f
|
|
stdcall StringConcatenate, sz_maximized,tmpbuffer
|
|
@@:
|
|
test ebx, WINDOW_STATE_MINIMIZED
|
|
jz @f
|
|
stdcall StringConcatenate, sz_minimized,tmpbuffer
|
|
@@:
|
|
test ebx, WINDOW_STATE_ROLLED_UP
|
|
jz @f
|
|
stdcall StringConcatenate, sz_rolled_up,tmpbuffer
|
|
@@:
|
|
stdcall PadBuffSpaces, COLUMN3_MAX_COUNT
|
|
stdcall DrawText, [back_color],[fore_color],tmpbuffer,[Pos.y],COLUMN3_TEXT_X
|
|
call uint2str
|
|
stdcall PadBuffSpaces, COLUMN2_MAX_COUNT
|
|
stdcall DrawText, [back_color],[fore_color],tmpbuffer,[Pos.y],COLUMN2_TEXT_X
|
|
call ChangeBackColor
|
|
add [Pos.y], dword ITEM_HEIGHT
|
|
}
|
|
; **************************************************************************** ;
|
|
macro DrawEventMask {
|
|
; sz_event_mask
|
|
stdcall DrawText, [back_color],[fore_color],sz_event_mask,[Pos.y],COLUMN1_TEXT_X
|
|
; decoded_event_mask & [event_mask]
|
|
mov eax, [thread_info.event_mask]
|
|
push eax ; for "call uint2str" below
|
|
mov ebx, eax
|
|
mov [tmpbuffer], byte 0
|
|
test ebx, EVM_REDRAW
|
|
jz @f
|
|
stdcall StringConcatenate, sz_redraw,tmpbuffer
|
|
@@:
|
|
test ebx, EVM_KEY
|
|
jz @f
|
|
stdcall StringConcatenate, sz_key,tmpbuffer
|
|
@@:
|
|
test ebx, EVM_BUTTON
|
|
jz @f
|
|
stdcall StringConcatenate, sz_button,tmpbuffer
|
|
@@:
|
|
test ebx, EVM_EXIT
|
|
jz @f
|
|
stdcall StringConcatenate, sz_reserved0,tmpbuffer
|
|
@@:
|
|
test ebx, EVM_BACKGROUND
|
|
jz @f
|
|
stdcall StringConcatenate, sz_redraw_background,tmpbuffer
|
|
@@:
|
|
test ebx, EVM_MOUSE
|
|
jz @f
|
|
stdcall StringConcatenate, sz_mouse,tmpbuffer
|
|
@@:
|
|
test ebx, EVM_IPC
|
|
jz @f
|
|
stdcall StringConcatenate, sz_ipc,tmpbuffer
|
|
@@:
|
|
test ebx, EVM_STACK
|
|
jz @f
|
|
stdcall StringConcatenate, sz_network,tmpbuffer
|
|
@@:
|
|
test ebx, EVM_DEBUG
|
|
jz @f
|
|
stdcall StringConcatenate, sz_debug,tmpbuffer
|
|
@@:
|
|
stdcall PadBuffSpaces, COLUMN3_MAX_COUNT
|
|
stdcall DrawText, [back_color],[fore_color],tmpbuffer,[Pos.y],COLUMN3_TEXT_X
|
|
call uint2str
|
|
stdcall PadBuffSpaces, COLUMN2_MAX_COUNT
|
|
stdcall DrawText, [back_color],[fore_color],tmpbuffer,[Pos.y],COLUMN2_TEXT_X
|
|
call ChangeBackColor
|
|
add [Pos.y], dword ITEM_HEIGHT
|
|
}
|
|
; **************************************************************************** ;
|
|
macro DrawKeyboardMode {
|
|
stdcall PadBuffSpaces, COLUMN2_MAX_COUNT
|
|
; sz_keyboard_mode
|
|
stdcall DrawText, [back_color],[fore_color],sz_keyboard_mode,[Pos.y],COLUMN1_TEXT_X
|
|
; decoded_keyboard_mode & [keyboard_mode]
|
|
movzx eax, byte [thread_info.keyboard_mode]
|
|
push eax ; for "call uint2str" below
|
|
|
|
cmp eax, KEYBOARD_MODE_ASCII
|
|
jne @f
|
|
mov eax, sz_ascii
|
|
jmp %%draw_decoded_keyboard_mode
|
|
@@:
|
|
cmp eax, KEYBOARD_MODE_SCAN
|
|
jne @f
|
|
mov eax, sz_scan
|
|
jmp %%draw_decoded_keyboard_mode
|
|
@@:
|
|
mov eax, sz_undefined
|
|
%%draw_decoded_keyboard_mode:
|
|
stdcall DrawText, [back_color],[fore_color],eax,[Pos.y],COLUMN3_TEXT_X
|
|
call uint2str
|
|
stdcall DrawText, [back_color],[fore_color],tmpbuffer,[Pos.y],COLUMN2_TEXT_X
|
|
call ChangeBackColor
|
|
add [Pos.y], dword ITEM_HEIGHT
|
|
}
|
|
; **************************************************************************** ;
|
|
macro DrawUpdateIndicator {
|
|
mov eax, [IndicatorColors]
|
|
sub eax, 3
|
|
neg eax
|
|
mov [IndicatorColors], eax
|
|
; draw.rectangle
|
|
mov edx, [eax * 4 + IndicatorColors]
|
|
mcall SF_DRAW_RECT, (INDICATOR_LEFT shl 16) or INDICATOR_WIDTH, (INDICATOR_TOP shl 16) or INDICATOR_HEIGHT
|
|
}
|
|
; **************************************************************************** ;
|
|
macro DrawTable {
|
|
; DrawFrames
|
|
stdcall DrawFrame, [frame_color],FRAME_BOTTOM,FRAME1_RIGHT,FRAME_TOP,FRAME1_LEFT
|
|
stdcall DrawFrame, [frame_color],FRAME_BOTTOM,FRAME2_RIGHT,FRAME_TOP,FRAME2_LEFT
|
|
stdcall DrawFrame, [frame_color],FRAME_BOTTOM,FRAME3_RIGHT,FRAME_TOP,FRAME3_LEFT
|
|
; DrawItems
|
|
mov esi, COLUMN_Y
|
|
xor edi, edi
|
|
@@:
|
|
cmp edi, ITEM_COUNT
|
|
jnl @f
|
|
mov ecx, esi
|
|
shl ecx, 16
|
|
or ecx, ITEM_HEIGHT
|
|
; draw rectangles
|
|
mcall SF_DRAW_RECT, (COLUMN1_X shl 16) or COLUMN1_ITEM_WIDTH,, [back_color]
|
|
mcall , (COLUMN2_X shl 16) or COLUMN2_ITEM_WIDTH
|
|
mcall , (COLUMN3_X shl 16) or COLUMN3_ITEM_WIDTH
|
|
call ChangeBackColor
|
|
add esi, ITEM_HEIGHT
|
|
inc edi
|
|
jmp @b
|
|
@@:
|
|
}
|
|
; ---------------------------------------------------------------------------- ;
|
|
align 4
|
|
program.start:
|
|
mov esi, program.params
|
|
test [esi], byte 0xFF
|
|
jz .no_params
|
|
; str2uint(program.params)
|
|
xor eax, eax
|
|
xor ecx, ecx
|
|
.convert:
|
|
lodsb
|
|
test al, al
|
|
jz .converted
|
|
lea ecx, [ecx + ecx * 4]
|
|
lea ecx, [eax + ecx * 2 - 48]
|
|
jmp .convert
|
|
.converted:
|
|
mov [slot], ecx
|
|
.no_params:
|
|
; get.screen.size
|
|
mcall SF_GET_GRAPHICAL_PARAMS,SSF_SCREEN_SIZE
|
|
mov [screen], eax
|
|
; skin.height
|
|
mcall SF_STYLE_SETTINGS,SSF_GET_SKIN_HEIGHT
|
|
add eax, FRAME_BOTTOM + FRAME_TOP + WINDOW_BORDER_SIZE
|
|
mov [window.width], dword WINDOW_WIDTH
|
|
mov [window.height], eax
|
|
movzx eax, word [screen.width]
|
|
movzx edx, word [screen.height]
|
|
sub eax, [window.width]
|
|
sub edx, [window.height]
|
|
shr eax, 1
|
|
shr edx, 1
|
|
mov [window.left], eax
|
|
mov [window.top], edx
|
|
; set.event
|
|
mcall SF_SET_EVENTS_MASK, EVM_REDRAW or EVM_BUTTON
|
|
; ---------------------------------------------------------------------------- ;
|
|
align 4
|
|
on_redraw:
|
|
; redraw.start
|
|
mcall SF_REDRAW,SSF_BEGIN_DRAW
|
|
; draw.window
|
|
mov ebx, [window.left]
|
|
mov ecx, [window.top]
|
|
shl ebx, 16
|
|
shl ecx, 16
|
|
or ebx, [window.width]
|
|
or ecx, [window.height]
|
|
mov edx, WINDOW_STYLE or WINDOW_BACK_COLOR
|
|
mov edi, sz_caption
|
|
xor esi, esi
|
|
mcall SF_CREATE_WINDOW
|
|
; redraw.finish
|
|
mcall SF_REDRAW,SSF_END_DRAW
|
|
DrawTable
|
|
call UpdateThreadInfo
|
|
align 4
|
|
wait.event.by.time:
|
|
mcall SF_WAIT_EVENT_TIMEOUT,UPDATE_TIME
|
|
dec eax
|
|
jz on_redraw ; IF eax = 1 THEN redraw
|
|
jns on_button ; ELSEIF eax = 2 THEN button
|
|
call UpdateThreadInfo ; ELSE no event -> update thread info
|
|
jmp wait.event.by.time
|
|
align 4
|
|
on_button: ; terminate because we have only one button(close button)
|
|
mcall SF_TERMINATE_PROCESS
|
|
; ---------------------------------------------------------------------------- ;
|
|
align 4
|
|
UpdateThreadInfo:
|
|
; get.thread.info
|
|
mcall SF_THREAD_INFO, thread_info, [slot]
|
|
|
|
mov [Pos.x], dword COLUMN1_X
|
|
mov [Pos.y], dword COLUMN_Y + (ITEM_HEIGHT - TEXT_HEIGHT) / 2
|
|
mov [back_color], dword ITEM_BACK_COLOR_1
|
|
mov [BackColors], dword 1
|
|
; order of next "Draw..." can be changed
|
|
DrawName
|
|
DrawThreadState
|
|
DrawWindowState
|
|
DrawEventMask
|
|
DrawKeyboardMode
|
|
DrawCpuUsage
|
|
DrawMemUsage
|
|
DrawMemAddress
|
|
DrawIdentifier
|
|
DrawWinStackPos
|
|
DrawWindowX
|
|
DrawWindowY
|
|
DrawWindowSizeX
|
|
DrawWindowSizeY
|
|
DrawClientX
|
|
DrawClientY
|
|
DrawClientSizeX
|
|
DrawClientSizeY
|
|
|
|
DrawUpdateIndicator ; blinking thing at upper right corner
|
|
|
|
ret
|
|
; ---------------------------------------------------------------------------- ;
|
|
align 4
|
|
DrawFrame:
|
|
Color equ [esp + 4 +4]
|
|
Bottom equ [esp + 8 +4]
|
|
Top equ [esp + 16 +4]
|
|
Right equ [esp + 12 +4]
|
|
Left equ [esp + 20 +4]
|
|
push ebp
|
|
mov edi, Top
|
|
mov ebp, Right
|
|
mov ebx, Left
|
|
shl ebx, 16
|
|
mov bx, bp
|
|
shrd ecx, edi, 16
|
|
mov cx, di
|
|
mcall SF_DRAW_LINE,,, Color, Bottom
|
|
shrd ecx, esi, 16
|
|
mov cx, si
|
|
mcall
|
|
shld esi, ebx, 16
|
|
mov bx, si
|
|
shrd ecx, edi, 16
|
|
mcall
|
|
shrd ebx, ebp, 16
|
|
mov bx, bp
|
|
mcall
|
|
pop ebp
|
|
ret 20
|
|
purge Color
|
|
purge Bottom
|
|
purge Top
|
|
purge Right
|
|
purge Left
|
|
; ---------------------------------------------------------------------------- ;
|
|
align 4
|
|
proc StringConcatenate, stradd:dword, str1:dword
|
|
mov esi, [stradd]
|
|
or ecx, -1
|
|
mov edi, esi
|
|
xor eax, eax
|
|
repne scasb
|
|
mov edx, ecx
|
|
mov edi, [str1]
|
|
repne scasb
|
|
dec edi
|
|
not edx
|
|
mov eax, [str1]
|
|
mov ecx, edx
|
|
shr ecx, 2
|
|
and edx, 3
|
|
rep movsd
|
|
mov ecx, edx
|
|
rep movsb
|
|
ret
|
|
endp
|
|
; ---------------------------------------------------------------------------- ;
|
|
align 4
|
|
proc DrawText, b_color:dword, f_color:dword, text:dword, y:dword, x:dword
|
|
mov ebx, [x]
|
|
shl ebx, 16
|
|
or ebx, [y]
|
|
mov ecx, [f_color]
|
|
or ecx, 0xD0000000
|
|
mcall SF_DRAW_TEXT,,, [text],, [b_color]
|
|
ret
|
|
endp
|
|
; ---------------------------------------------------------------------------- ;
|
|
align 4
|
|
proc DrawTextBold, b_color:dword, f_color:dword, text:dword, y:dword, x:dword
|
|
mov ecx, [f_color]
|
|
mov edi, [b_color]
|
|
mov esi, 1 ; count
|
|
mov edx, [text]
|
|
mov ebx, [x]
|
|
shl ebx, 16
|
|
or ebx, [y]
|
|
align 4
|
|
@@:
|
|
test [edx], byte 0xFF
|
|
jz @f
|
|
or ecx, 0x50000000
|
|
mcall SF_DRAW_TEXT
|
|
add ebx, (1 shl 16)
|
|
and ecx, 0x10FFFFFF
|
|
mcall
|
|
add ebx, (TEXT_WIDTH shl 16)
|
|
inc edx
|
|
jmp @b
|
|
align 4
|
|
@@:
|
|
ret
|
|
endp
|
|
; ---------------------------------------------------------------------------- ;
|
|
align 4
|
|
ChangeBackColor:
|
|
mov eax, [BackColors]
|
|
sub eax, 3
|
|
neg eax
|
|
mov [BackColors], eax
|
|
mov eax, [eax * 4 + BackColors]
|
|
mov [back_color], eax
|
|
ret
|
|
; ---------------------------------------------------------------------------- ;
|
|
align 4
|
|
uint2str:
|
|
stdcall ConvertToBase, tmpbuffer,10,[esp + 4]
|
|
ret 4
|
|
; ---------------------------------------------------------------------------- ;
|
|
align 4
|
|
ConvertToBase:
|
|
value equ [esp + 12] ; value treated as unsigned
|
|
base equ [esp + 8] ; 2 <= base <= 36
|
|
buffer equ [esp + 4] ; SizeOf(buffer) => (32 + 1)
|
|
mov eax, value
|
|
mov ecx, base
|
|
mov esi, buffer
|
|
mov edi, esi ; +0 +31 +32
|
|
add esi, 32 ; base2(0xFFFFFFFF) = 11111111111111111111111111111111b
|
|
mov [esi], byte 0 ; end of string byte 0
|
|
align 4
|
|
.next:
|
|
xor edx, edx
|
|
div ecx
|
|
dec esi
|
|
mov dl, [edx + .digits]; (put digit
|
|
mov [esi], dl ; to buffer)
|
|
test eax, eax
|
|
jnz .next
|
|
; shift result string to buffer beginning
|
|
mov eax, esi
|
|
sub eax, edi
|
|
mov ecx, 32 + 1
|
|
sub ecx, eax
|
|
mov eax, edi ; return buffer
|
|
; yes, memory overlapped, but edi not above than esi
|
|
; hope that movsD faster than movsB in this case
|
|
; if you want only "rep movsb" because it shorter then remove five next lines before "rep movsb"
|
|
mov edx, ecx
|
|
shr ecx, 2
|
|
and edx, 3
|
|
rep movsd
|
|
mov ecx, edx
|
|
rep movsb
|
|
ret 12
|
|
purge value
|
|
purge base
|
|
purge buffer
|
|
align 4
|
|
.digits db "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
; ---------------------------------------------------------------------------- ;
|
|
align 4
|
|
PadBuffSpaces:
|
|
maxlen equ [esp + 4]
|
|
mov edi, tmpbuffer
|
|
or ecx, -1
|
|
xor eax, eax
|
|
repne scasb
|
|
dec edi
|
|
sub eax, ecx
|
|
dec eax
|
|
mov ecx, maxlen
|
|
sub ecx, eax
|
|
mov eax, " "
|
|
mov edx, ecx
|
|
shr ecx, 2
|
|
and edx, 3
|
|
rep stosd
|
|
mov ecx, edx
|
|
rep stosb
|
|
mov [edi], byte 0
|
|
ret 4
|
|
purge maxlen
|
|
; ---------------------------------------------------------------------------- ;
|
|
align 4
|
|
program.end:
|
|
program.path rb 1024
|
|
program.params rb 256
|
|
thread_info process_information
|
|
|
|
tmpbuffer rb 64
|
|
rb 512
|
|
align 16
|
|
program.stack:
|
|
program.memory: |