diff --git a/programs/system/tinfo/make.bat b/programs/system/tinfo/make.bat new file mode 100644 index 0000000000..62295c0e02 --- /dev/null +++ b/programs/system/tinfo/make.bat @@ -0,0 +1 @@ +nasm -f bin tinfo.asm -o tinfo \ No newline at end of file diff --git a/programs/system/tinfo/tinfo.asm b/programs/system/tinfo/tinfo.asm new file mode 100644 index 0000000000..e826f917ef --- /dev/null +++ b/programs/system/tinfo/tinfo.asm @@ -0,0 +1,1157 @@ +; 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 ; +ORG 0 +BITS 32 +; ---------------------------------------------------------------------------- ; +PATH_SIZE equ 1024 +PARAMS_SIZE equ 256 +STACK_SIZE equ 256 +PROC_INFO_SIZE equ 1024 +TMP_BUFFER_SIZE equ 64 +; ---------------------------------------------------------------------------- ; +TEXT_WIDTH equ 6 +BOLD_TEXT_WIDTH equ TEXT_WIDTH + 1 +; ---------------------------------------------------------------------------- ; +COLUMN1_MAX_COUNT equ 13 +COLUMN2_MAX_COUNT equ 12 +COLUMN3_MAX_COUNT equ 26 +; ---------------------------------------------------------------------------- ; +COLUMN_PADDING equ 3 +COLUMN1_PADDING equ COLUMN_PADDING +COLUMN2_PADDING equ COLUMN_PADDING +COLUMN3_PADDING equ COLUMN_PADDING +; ---------------------------------------------------------------------------- ; +ITEM_HEIGHT equ 15 +TEXT_HEIGHT equ 9 +COLUMN1_ITEM_WIDTH equ COLUMN1_MAX_COUNT * BOLD_TEXT_WIDTH + COLUMN1_PADDING * 2 +COLUMN2_ITEM_WIDTH equ COLUMN2_MAX_COUNT * BOLD_TEXT_WIDTH + COLUMN2_PADDING * 2 +COLUMN3_ITEM_WIDTH equ COLUMN3_MAX_COUNT * BOLD_TEXT_WIDTH + COLUMN3_PADDING * 2 +ITEM_MARGIN equ 6 +ITEM_BACK_COLOR_1 equ 0x00EAEAEA +ITEM_BACK_COLOR_2 equ 0x00F4F4F4 +ITEM_COUNT equ 18 ; at current time we have 18 items +; ---------------------------------------------------------------------------- ; +COLUMN_Y equ 10 +COLUMN1_X equ 10 +COLUMN2_X equ COLUMN1_X + COLUMN1_ITEM_WIDTH + ITEM_MARGIN +COLUMN3_X equ COLUMN2_X + COLUMN2_ITEM_WIDTH + ITEM_MARGIN +; ---------------------------------------------------------------------------- ; +COLUMN1_TEXT_X equ COLUMN1_X + COLUMN1_PADDING +COLUMN2_TEXT_X equ COLUMN2_X + COLUMN2_PADDING +COLUMN3_TEXT_X equ COLUMN3_X + COLUMN3_PADDING +; ---------------------------------------------------------------------------- ; +FRAME_TOP equ COLUMN_Y - ITEM_MARGIN / 2 +FRAME_BOTTOM equ COLUMN_Y + ITEM_HEIGHT * ITEM_COUNT + ITEM_MARGIN / 2 - 1 + ; ---------------------------------------------------------------------------- ; +FRAME1_LEFT equ COLUMN1_X - ITEM_MARGIN / 2 +FRAME1_RIGHT equ COLUMN1_X + COLUMN1_ITEM_WIDTH + ITEM_MARGIN / 2 - 1 +; ---------------------------------------------------------------------------- ; +FRAME2_LEFT equ COLUMN2_X - ITEM_MARGIN / 2 +FRAME2_RIGHT equ COLUMN2_X + COLUMN2_ITEM_WIDTH + ITEM_MARGIN / 2 - 1 +; ---------------------------------------------------------------------------- ; +FRAME3_LEFT equ COLUMN3_X - ITEM_MARGIN / 2 +FRAME3_RIGHT equ COLUMN3_X + COLUMN3_ITEM_WIDTH + ITEM_MARGIN / 2 - 1 +; ---------------------------------------------------------------------------- ; +WINDOW_STYLE_SKINNED_FIXED equ 0x4000000 +WINDOW_STYLE_COORD_CLIENT equ 0x20000000 +WINDOW_STYLE_CAPTION equ 0x10000000 +; ---------------------------------------------------------------------------- ; +WINDOW_BORDER_SIZE equ 5 +WINDOW_WIDTH equ FRAME3_RIGHT + FRAME1_LEFT + WINDOW_BORDER_SIZE * 2 +WINDOW_STYLE equ WINDOW_STYLE_SKINNED_FIXED | WINDOW_STYLE_COORD_CLIENT | WINDOW_STYLE_CAPTION +WINDOW_BACK_COLOR equ 0x00FFFFFF +; ---------------------------------------------------------------------------- ; +INDICATOR_WIDTH equ 3 +INDICATOR_HEIGHT equ 3 +INDICATOR_LEFT equ COLUMN3_X + COLUMN3_ITEM_WIDTH + ITEM_MARGIN / 2 +INDICATOR_TOP equ COLUMN_Y - ITEM_MARGIN / 2 - INDICATOR_HEIGHT +; ---------------------------------------------------------------------------- ; +UPDATE_TIME equ 28 +; ---------------------------------------------------------------------------- ; +thread_info equ END + PATH_SIZE + PARAMS_SIZE +tmpbuffer equ END + PATH_SIZE + PARAMS_SIZE + PROC_INFO_SIZE +; ---------------------------------------------------------------------------- ; +KEYBOARD_MODE_ASCII equ 0 +KEYBOARD_MODE_SCAN equ 1 +; ---------------------------------------------------------------------------- ; +WINDOW_STATE_MAXIMIZED equ 1 +WINDOW_STATE_MINIMIZED equ 2 +WINDOW_STATE_ROLLED_UP equ 4 +; ---------------------------------------------------------------------------- ; +THREAD_STATE_RUNNING equ 0 +THREAD_STATE_SUSPENDED equ 1 +THREAD_STATE_SUSPENDED_WAIT_EVENT equ 2 +THREAD_STATE_NORMAL_TERMINATING equ 3 +THREAD_STATE_EXCEPT_TERMINATING equ 4 +THREAD_STATE_WAIT_EVENT equ 5 +THREAD_STATE_SLOT_IS_FREE equ 9 +; ---------------------------------------------------------------------------- ; +EM_REDRAW equ 1b +EM_KEY equ 10b +EM_BUTTON equ 100b +EM_RESERVED0 equ 1000b +EM_REDRAW_BACKGROUND equ 10000b +EM_MOUSE equ 100000b +EM_IPC equ 1000000b +EM_NETWORK equ 10000000b +EM_DEBUG equ 100000000b +; ---------------------------------------------------------------------------- ; +struc THREAD_INFO + .cpu_usage resd 1 ; usage of the processor + .win_stack_pos resw 1 ; position of the window of thread in the window stack + .reserved0 resw 1 ; has no relation to the specified thread + .reserved1 resw 1 ; reserved + .name resb 11 ; name of the started file - executable file without extension + .reserved2 resb 1 ; reserved, this byte is not changed + .mem_address resd 1 ; address of the process in memory + .mem_usage resd 1 ; size of used memory - 1 + .identifier resd 1 ; identifier (PID/TID) + .x resd 1 ; coordinate of the thread window on axis x + .y resd 1 ; coordinate of the thread window on axis y + .size_x resd 1 ; size of the thread window on axis x + .size_y resd 1 ; size of the thread window on axis y + .thread_state resw 1 ; status of the thread slot + .reserved3 resw 1 ; reserved, this word is not changed + .client_x resd 1 ; coordinate of the client area on axis x + .client_y resd 1 ; coordinate of the client area on axis y + .client_size_x resd 1 ; width of the client area + .client_size_y resd 1 ; height of the client area + .window_state resb 1 ; state of the window - bitfield + .event_mask resd 1 ; event mask + .keyboard_mode resb 1 ; keyboard mode +endstruc +; ---------------------------------------------------------------------------- ; +MENUET01 db 'MENUET01' +version dd 1 +program.start dd START +program.end dd END +program.memory dd END + PATH_SIZE + PARAMS_SIZE + PROC_INFO_SIZE + TMP_BUFFER_SIZE + STACK_SIZE +program.stack dd END + PATH_SIZE + PARAMS_SIZE + PROC_INFO_SIZE + TMP_BUFFER_SIZE + STACK_SIZE +program.params dd END + PATH_SIZE +program.path dd END +; ---------------------------------------------------------------------------- ; +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 +; ---------------------------------------------------------------------------- ; +%define x [Pos.x] +%define y [Pos.y] +Pos: +.x dd COLUMN1_X +.y dd COLUMN_Y +; ---------------------------------------------------------------------------- ; +sz_caption db "ThreadInfo",0 +; ---------------------------------------------------------------------------- ; +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 +; ---------------------------------------------------------------------------- ; +; 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 0 +; sz_cpu_usage + push dword COLUMN1_TEXT_X + push dword y + push dword sz_cpu_usage + push dword [fore_color] + push dword [back_color] + call DrawTextBold +; [cpu_usage] + push dword [thread_info + THREAD_INFO.cpu_usage] + call uint2str + push dword COLUMN2_MAX_COUNT + call PadBuffSpaces + push dword COLUMN2_TEXT_X + push dword y + push dword tmpbuffer + push dword [fore_color] + push dword [back_color] + call DrawTextBold + call ChangeBackColor + add y, dword ITEM_HEIGHT +%endmacro +; **************************************************************************** ; +%macro DrawWinStackPos 0 +; sz_win_stack_pos + push dword COLUMN1_TEXT_X + push dword y + push dword sz_win_stack_pos + push dword [fore_color] + push dword [back_color] + call DrawTextBold +; [win_stack_pos] + movzx eax, word [thread_info + THREAD_INFO.win_stack_pos] + push eax + call uint2str + push dword COLUMN2_MAX_COUNT + call PadBuffSpaces + push dword COLUMN2_TEXT_X + push dword y + push dword tmpbuffer + push dword [fore_color] + push dword [back_color] + call DrawTextBold + call ChangeBackColor + add y, dword ITEM_HEIGHT +%endmacro +; **************************************************************************** ; +%macro DrawName 0 +; sz_name + push dword COLUMN1_TEXT_X + push dword y + push dword sz_name + push dword [fore_color] + push dword [back_color] + call DrawTextBold +; name + push dword COLUMN2_TEXT_X + push dword y + push dword (thread_info + THREAD_INFO.name) + push dword [fore_color] + push dword [back_color] + call DrawTextBold + call ChangeBackColor + add y, dword ITEM_HEIGHT +%endmacro +; **************************************************************************** ; +%macro DrawMemAddress 0 +; sz_mem_address + push dword COLUMN1_TEXT_X + push dword y + push dword sz_mem_address + push dword [fore_color] + push dword [back_color] + call DrawTextBold +; [mem_address] + push dword [thread_info + THREAD_INFO.mem_address] + call uint2str + push dword COLUMN2_MAX_COUNT + call PadBuffSpaces + push dword COLUMN2_TEXT_X + push dword y + push dword tmpbuffer + push dword [fore_color] + push dword [back_color] + call DrawTextBold + call ChangeBackColor + add y, dword ITEM_HEIGHT +%endmacro +; **************************************************************************** ; +%macro DrawMemUsage 0 +; sz_mem_usage + push dword COLUMN1_TEXT_X + push dword y + push dword sz_mem_usage + push dword [fore_color] + push dword [back_color] + call DrawTextBold +; [mem_usage] + push dword [thread_info + THREAD_INFO.mem_usage] + call uint2str + push dword COLUMN2_MAX_COUNT + call PadBuffSpaces + push dword COLUMN2_TEXT_X + push dword y + push dword tmpbuffer + push dword [fore_color] + push dword [back_color] + call DrawTextBold + call ChangeBackColor + add y, dword ITEM_HEIGHT +%endmacro +; **************************************************************************** ; +%macro DrawIdentifier 0 +; sz_identifier + push dword COLUMN1_TEXT_X + push dword y + push dword sz_identifier + push dword [fore_color] + push dword [back_color] + call DrawTextBold +; [identifier] + push dword [thread_info + THREAD_INFO.identifier] + call uint2str + push dword COLUMN2_MAX_COUNT + call PadBuffSpaces + push dword COLUMN2_TEXT_X + push dword y + push dword tmpbuffer + push dword [fore_color] + push dword [back_color] + call DrawTextBold + call ChangeBackColor + add y, dword ITEM_HEIGHT +%endmacro +; **************************************************************************** ; +%macro DrawWindowX 0 +; sz_x + push dword COLUMN1_TEXT_X + push dword y + push dword sz_x + push dword [fore_color] + push dword [back_color] + call DrawTextBold +; [x] + push dword [thread_info + THREAD_INFO.x] + call uint2str + push dword COLUMN2_MAX_COUNT + call PadBuffSpaces + push dword COLUMN2_TEXT_X + push dword y + push dword tmpbuffer + push dword [fore_color] + push dword [back_color] + call DrawTextBold + call ChangeBackColor + add y, dword ITEM_HEIGHT +%endmacro +; **************************************************************************** ; +%macro DrawWindowY 0 +; sz_y + push dword COLUMN1_TEXT_X + push dword y + push dword sz_y + push dword [fore_color] + push dword [back_color] + call DrawTextBold +; [y] + push dword [thread_info + THREAD_INFO.y] + call uint2str + push dword COLUMN2_MAX_COUNT + call PadBuffSpaces + push dword COLUMN2_TEXT_X + push dword y + push dword tmpbuffer + push dword [fore_color] + push dword [back_color] + call DrawTextBold + call ChangeBackColor + add y, dword ITEM_HEIGHT +%endmacro +; **************************************************************************** ; +%macro DrawWindowSizeX 0 +; sz_size_x + push dword COLUMN1_TEXT_X + push dword y + push dword sz_size_x + push dword [fore_color] + push dword [back_color] + call DrawTextBold +; [size_x] + push dword [thread_info + THREAD_INFO.size_x] + call uint2str + push dword COLUMN2_MAX_COUNT + call PadBuffSpaces + push dword COLUMN2_TEXT_X + push dword y + push dword tmpbuffer + push dword [fore_color] + push dword [back_color] + call DrawTextBold + call ChangeBackColor + add y, dword ITEM_HEIGHT +%endmacro +; **************************************************************************** ; +%macro DrawWindowSizeY 0 +; sz_size_y + push dword COLUMN1_TEXT_X + push dword y + push dword sz_size_y + push dword [fore_color] + push dword [back_color] + call DrawTextBold +; [size_y] + push dword [thread_info + THREAD_INFO.size_y] + call uint2str + push dword COLUMN2_MAX_COUNT + call PadBuffSpaces + push dword COLUMN2_TEXT_X + push dword y + push dword tmpbuffer + push dword [fore_color] + push dword [back_color] + call DrawTextBold + call ChangeBackColor + add y, dword ITEM_HEIGHT +%endmacro +; **************************************************************************** ; +%macro DrawThreadState 0 +; sz_thread_state + push dword COLUMN1_TEXT_X + push dword y + push dword sz_thread_state + push dword [fore_color] + push dword [back_color] + call DrawTextBold +; decoded_thread_state & [thread_state] + movzx eax, word [thread_info + THREAD_INFO.thread_state] + push eax ; for "call uint2str" below +%%running: + cmp eax, THREAD_STATE_RUNNING + jne %%suspended + mov eax, sz_running + jmp %%draw_decoded_thread_state +%%suspended: + cmp eax, THREAD_STATE_SUSPENDED + jne %%suspended_w + mov eax, sz_suspended + jmp %%draw_decoded_thread_state +%%suspended_w: + cmp eax, THREAD_STATE_SUSPENDED_WAIT_EVENT + jne %%normal_term + mov eax, sz_suspended_wait_event + jmp %%draw_decoded_thread_state +%%normal_term: + cmp eax, THREAD_STATE_NORMAL_TERMINATING + jne %%except_term + mov eax, sz_normal_terminating + jmp %%draw_decoded_thread_state +%%except_term: + cmp eax, THREAD_STATE_EXCEPT_TERMINATING + jne %%wait_event + mov eax, sz_except_terminating + jmp %%draw_decoded_thread_state +%%wait_event: + cmp eax, THREAD_STATE_WAIT_EVENT + jne %%slot_free + mov eax, sz_wait_event + jmp %%draw_decoded_thread_state +%%slot_free: + cmp eax, THREAD_STATE_SLOT_IS_FREE + jne %%undefined + mov eax, sz_slot_is_free + jmp %%draw_decoded_thread_state +%%undefined: + mov eax, sz_undefined +%%draw_decoded_thread_state: + push dword COLUMN3_TEXT_X + push dword y + push eax + push dword [fore_color] + push dword [back_color] + call DrawTextBold + call uint2str + push dword COLUMN2_MAX_COUNT + call PadBuffSpaces + push dword COLUMN2_TEXT_X + push dword y + push dword tmpbuffer + push dword [fore_color] + push dword [back_color] + call DrawTextBold + call ChangeBackColor + add y, dword ITEM_HEIGHT +%endmacro +; **************************************************************************** ; +%macro DrawClientX 0 +; sz_client_x + push dword COLUMN1_TEXT_X + push dword y + push dword sz_client_x + push dword [fore_color] + push dword [back_color] + call DrawTextBold +; [client_x] + push dword [thread_info + THREAD_INFO.client_x] + call uint2str + push dword COLUMN2_MAX_COUNT + call PadBuffSpaces + push dword COLUMN2_TEXT_X + push dword y + push dword tmpbuffer + push dword [fore_color] + push dword [back_color] + call DrawTextBold + call ChangeBackColor + add y, dword ITEM_HEIGHT +%endmacro +; **************************************************************************** ; +%macro DrawClientY 0 +; sz_client_y + push dword COLUMN1_TEXT_X + push dword y + push dword sz_client_y + push dword [fore_color] + push dword [back_color] + call DrawTextBold +; [client_y] + push dword [thread_info + THREAD_INFO.client_y] + call uint2str + push dword COLUMN2_MAX_COUNT + call PadBuffSpaces + push dword COLUMN2_TEXT_X + push dword y + push dword tmpbuffer + push dword [fore_color] + push dword [back_color] + call DrawTextBold + call ChangeBackColor + add y, dword ITEM_HEIGHT +%endmacro +; **************************************************************************** ; +%macro DrawClientSizeX 0 +; sz_client_size_x + push dword COLUMN1_TEXT_X + push dword y + push dword sz_client_size_x + push dword [fore_color] + push dword [back_color] + call DrawTextBold +; [client_size_x] + push dword [thread_info + THREAD_INFO.client_size_x] + call uint2str + push dword COLUMN2_MAX_COUNT + call PadBuffSpaces + push dword COLUMN2_TEXT_X + push dword y + push dword tmpbuffer + push dword [fore_color] + push dword [back_color] + call DrawTextBold + call ChangeBackColor + add y, dword ITEM_HEIGHT +%endmacro +; **************************************************************************** ; +%macro DrawClientSizeY 0 +; sz_client_size_y + push dword COLUMN1_TEXT_X + push dword y + push dword sz_client_size_y + push dword [fore_color] + push dword [back_color] + call DrawTextBold +; [client_size_y] + push dword [thread_info + THREAD_INFO.client_size_y] + call uint2str + push dword COLUMN2_MAX_COUNT + call PadBuffSpaces + push dword COLUMN2_TEXT_X + push dword y + push dword tmpbuffer + push dword [fore_color] + push dword [back_color] + call DrawTextBold + call ChangeBackColor + add y, dword ITEM_HEIGHT +%endmacro +; **************************************************************************** ; +%macro DrawWindowState 0 +; sz_window_state + push dword COLUMN1_TEXT_X + push dword y + push dword sz_window_state + push dword [fore_color] + push dword [back_color] + call DrawTextBold +; decoded_window_state & [window_state] + movzx eax, byte [thread_info + THREAD_INFO.window_state] + push eax ; for "call uint2str" below + mov ebx, eax + mov [tmpbuffer], byte 0 +%%maximized: + test ebx, WINDOW_STATE_MAXIMIZED + jz %%minimized + push tmpbuffer + push sz_maximized + call StringConcatenate +%%minimized: + test ebx, WINDOW_STATE_MINIMIZED + jz %%rolled_up + push tmpbuffer + push sz_minimized + call StringConcatenate +%%rolled_up: + test ebx, WINDOW_STATE_ROLLED_UP + jz %%draw_decoded_window_state + push tmpbuffer + push sz_rolled_up + call StringConcatenate +%%draw_decoded_window_state: + push dword COLUMN3_MAX_COUNT + call PadBuffSpaces + push dword COLUMN3_TEXT_X + push dword y + push dword tmpbuffer + push dword [fore_color] + push dword [back_color] + call DrawTextBold + call uint2str + push dword COLUMN2_MAX_COUNT + call PadBuffSpaces + push dword COLUMN2_TEXT_X + push dword y + push dword tmpbuffer + push dword [fore_color] + push dword [back_color] + call DrawTextBold + call ChangeBackColor + add y, dword ITEM_HEIGHT +%endmacro +; **************************************************************************** ; +%macro DrawEventMask 0 +; sz_event_mask + push dword COLUMN1_TEXT_X + push dword y + push dword sz_event_mask + push dword [fore_color] + push dword [back_color] + call DrawTextBold +; decoded_event_mask & [event_mask] + mov eax, [thread_info + THREAD_INFO.event_mask] + push eax ; for "call uint2str" below + mov ebx, eax + mov [tmpbuffer], byte 0 +%%redraw: + test ebx, EM_REDRAW + jz %%key + push tmpbuffer + push sz_redraw + call StringConcatenate +%%key: + test ebx, EM_KEY + jz %%button + push tmpbuffer + push sz_key + call StringConcatenate +%%button: + test ebx, EM_BUTTON + jz %%reserved0 + push tmpbuffer + push sz_button + call StringConcatenate +%%reserved0: + test ebx, EM_RESERVED0 + jz %%redraw_background + push tmpbuffer + push sz_reserved0 + call StringConcatenate +%%redraw_background: + test ebx, EM_REDRAW_BACKGROUND + jz %%mouse + push tmpbuffer + push sz_redraw_background + call StringConcatenate +%%mouse: + test ebx, EM_MOUSE + jz %%ipc + push tmpbuffer + push sz_mouse + call StringConcatenate +%%ipc: + test ebx, EM_IPC + jz %%network + push tmpbuffer + push sz_ipc + call StringConcatenate +%%network: + test ebx, EM_NETWORK + jz %%debug + push tmpbuffer + push sz_network + call StringConcatenate +%%debug: + test ebx, EM_DEBUG + jz %%draw_decoded_event_mask + push tmpbuffer + push sz_debug + call StringConcatenate +%%draw_decoded_event_mask: + push dword COLUMN3_MAX_COUNT + call PadBuffSpaces + push dword COLUMN3_TEXT_X + push dword y + push dword tmpbuffer + push dword [fore_color] + push dword [back_color] + call DrawTextBold + call uint2str + push dword COLUMN2_MAX_COUNT + call PadBuffSpaces + push dword COLUMN2_TEXT_X + push dword y + push dword tmpbuffer + push dword [fore_color] + push dword [back_color] + call DrawTextBold + call ChangeBackColor + add y, dword ITEM_HEIGHT +%endmacro +; **************************************************************************** ; +%macro DrawKeyboardMode 0 + push dword COLUMN2_MAX_COUNT + call PadBuffSpaces +; sz_keyboard_mode + push dword COLUMN1_TEXT_X + push dword y + push dword sz_keyboard_mode + push dword [fore_color] + push dword [back_color] + call DrawTextBold +; decoded_keyboard_mode & [keyboard_mode] + movzx eax, byte [thread_info + THREAD_INFO.keyboard_mode] + push eax ; for "call uint2str" below +%%ascii: + cmp eax, KEYBOARD_MODE_ASCII + jne %%scan + mov eax, sz_ascii + jmp %%draw_decoded_keyboard_mode +%%scan: + cmp eax, KEYBOARD_MODE_SCAN + jne %%undefined + mov eax, sz_scan + jmp %%draw_decoded_keyboard_mode +%%undefined: + mov eax, sz_undefined +%%draw_decoded_keyboard_mode: + push dword COLUMN3_TEXT_X + push dword y + push eax + push dword [fore_color] + push dword [back_color] + call DrawTextBold + call uint2str + push dword COLUMN2_TEXT_X + push dword y + push dword tmpbuffer + push dword [fore_color] + push dword [back_color] + call DrawTextBold + call ChangeBackColor + add y, dword ITEM_HEIGHT +%endmacro +; **************************************************************************** ; +%macro DrawUpdateIndicator 0 + mov eax, [IndicatorColors] + sub eax, 3 + neg eax + mov [IndicatorColors], eax +; draw.rectangle + mov edx, [eax * 4 + IndicatorColors] + mov eax, 13 + mov ebx, INDICATOR_LEFT << 16 | INDICATOR_WIDTH + mov ecx, INDICATOR_TOP << 16 | INDICATOR_HEIGHT + int 64 +%endmacro +; **************************************************************************** ; +%macro DrawTable 0 +; DrawFrames + push dword FRAME1_LEFT + push dword FRAME_TOP + push dword FRAME1_RIGHT + push dword FRAME_BOTTOM + push dword [frame_color] + call DrawFrame + push dword FRAME2_LEFT + push dword FRAME_TOP + push dword FRAME2_RIGHT + push dword FRAME_BOTTOM + push dword [frame_color] + call DrawFrame + push dword FRAME3_LEFT + push dword FRAME_TOP + push dword FRAME3_RIGHT + push dword FRAME_BOTTOM + push dword [frame_color] + call DrawFrame +; DrawItems + mov esi, COLUMN_Y + xor edi, edi +%%draw_item: + cmp edi, ITEM_COUNT + jnl %%done + mov ecx, esi + shl ecx, 16 + or ecx, ITEM_HEIGHT +; draw.rectangle + mov eax, 13 + mov ebx, COLUMN1_X << 16 | COLUMN1_ITEM_WIDTH + mov edx, [back_color] + int 64 +; draw.rectangle + mov eax, 13 + mov ebx, COLUMN2_X << 16 | COLUMN2_ITEM_WIDTH + mov edx, [back_color] + int 64 +; draw.rectangle + mov eax, 13 + mov ebx, COLUMN3_X << 16 | COLUMN3_ITEM_WIDTH + mov edx, [back_color] + int 64 + call ChangeBackColor + add esi, ITEM_HEIGHT + inc edi + jmp %%draw_item +%%done: +%endmacro +; ---------------------------------------------------------------------------- ; +align 4 +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 + mov eax, 61 + mov ebx, 1 + int 64 + mov [screen], eax +; skin.height + mov eax, 48 + mov ebx, 4 + int 64 + 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 + mov eax, 40 + mov ebx, EM_REDRAW | EM_BUTTON + int 64 +; ---------------------------------------------------------------------------- ; +align 4 +on_redraw: +; redraw.start + mov eax, 12 + mov ebx, 1 + int 64 +; draw.window + xor eax, eax + 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 | WINDOW_BACK_COLOR + mov edi, sz_caption + xor esi, esi + int 64 +; redraw.finish + mov eax, 12 + mov ebx, 2 + int 64 + DrawTable + call UpdateThreadInfo +align 4 +wait.event.by.time: + mov eax, 23 + mov ebx, UPDATE_TIME + int 64 + 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) + or eax, -1 + int 64 +; ---------------------------------------------------------------------------- ; +align 4 +UpdateThreadInfo: +; get.thread.info + mov eax, 9 + mov ebx, thread_info + mov ecx, [slot] + int 64 + + mov x, dword COLUMN1_X + mov 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: +%define Color [esp + 4 +1*4] +%define Bottom [esp + 8 +1*4] +%define Top [esp + 16 +1*4] +%define Right [esp + 12 +1*4] +%define Left [esp + 20 +1*4] + push ebp + mov eax, 38 + mov edx, Color + mov esi, Bottom + mov edi, Top + mov ebp, Right + mov ebx, Left + shl ebx, 16 + mov bx, bp + shrd ecx, edi, 16 + mov cx, di + int 64 + shrd ecx, esi, 16 + mov cx, si + int 64 + shld esi, ebx, 16 + mov bx, si + shrd ecx, edi, 16 + int 64 + shrd ebx, ebp, 16 + mov bx, bp + int 64 + pop ebp + ret 20 +%undef Color +%undef Bottom +%undef Top +%undef Right +%undef Left +; ---------------------------------------------------------------------------- ; +align 4 +StringConcatenate: +%define stradd [esp + 4] +%define str [esp + 8] + mov esi, stradd + or ecx, -1 + mov edi, esi + xor eax, eax + repne scasb + mov edx, ecx + mov edi, str + repne scasb + dec edi + not edx + mov eax, str + mov ecx, edx + shr ecx, 2 + and edx, 3 + rep movsd + mov ecx, edx + rep movsb + ret 8 +%undef stradd +%undef str +; ---------------------------------------------------------------------------- ; +align 4 +DrawTextBold: +%define x [esp + 20] +%define y [esp + 16] +%define text [esp + 12] +%define fore_color [esp + 8] +%define back_color [esp + 4] + mov eax, 4 + mov ecx, fore_color + mov edi, back_color + mov esi, 1 ; count + mov edx, text + mov ebx, x + shl ebx, 16 + or ebx, y +align 4 +.next: + test [edx], byte 0xFF + jz .done + or ecx, 0x40000000 + int 64 + add ebx, (1 << 16) + and ecx, 0x00FFFFFF + int 64 + add ebx, (6 << 16) + inc edx + jmp .next +align 4 +.done: + ret 20 +%undef x +%undef y +%undef text +%undef fore_color +%undef back_color +; ---------------------------------------------------------------------------- ; +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: +%define value [esp + 4] + push dword value ; value + push dword 10 ; base(decimal) + push dword tmpbuffer ; buffer + call ConvertToBase + ret 4 +%undef value +; ---------------------------------------------------------------------------- ; +align 4 +ConvertToBase: +%define value [esp + 12] ; value treated as unsigned +%define base [esp + 8] ; 2 <= base <= 36 +%define buffer [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 +%undef value +%undef base +%undef buffer +align 4 +.digits db "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" +; ---------------------------------------------------------------------------- ; +align 4 +PadBuffSpaces: +%define maxlen [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 +%undef maxlen +; ---------------------------------------------------------------------------- ; +align 4 +END: \ No newline at end of file