From 5ec3156d8ec33b52f9c86b630152c7754ad9acdd Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 12 Oct 2026 08:58:00 -0700 Subject: [PATCH] fix incorrect listener socket creation on client-only win32 socket sessions; win32 window manager -> make robust to zero handles --- src/raddbg/generated/raddbg.meta.c | 8 +- src/raddbg/generated/raddbg.meta.h | 4 +- src/raddbg/raddbg.mdesk | 4 +- src/raddbg/raddbg_core.c | 19 +-- src/win32/socket/win32_socket.c | 3 + .../window_manager/win32_window_manager.c | 110 +++++++++++------- 6 files changed, 93 insertions(+), 55 deletions(-) diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 6c44182a..4ccc3127 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -224,8 +224,8 @@ RD_VocabInfo rd_vocab_info_table[375] = {str8_lit_comp("state"), str8_lit_comp(""), str8_lit_comp("State"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("eval"), str8_lit_comp(""), str8_lit_comp("Eval"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("line_from_vaddr"), str8_lit_comp(""), str8_lit_comp("Line From Virtual Address"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("enable_hidden_mode"), str8_lit_comp(""), str8_lit_comp("Enable Hidden Mode"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("disable_hidden_mode"), str8_lit_comp(""), str8_lit_comp("Disable Hidden Mode"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("hide_ui"), str8_lit_comp(""), str8_lit_comp("Hide UI"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("show_ui"), str8_lit_comp(""), str8_lit_comp("Show UI"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("wm_event"), str8_lit_comp(""), str8_lit_comp("OS Event"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("select_thread"), str8_lit_comp(""), str8_lit_comp("Select Thread"), str8_lit_comp(""), RD_IconKind_Thread}, {str8_lit_comp("select_unwind"), str8_lit_comp(""), str8_lit_comp("Select Unwind"), str8_lit_comp(""), RD_IconKind_Null}, @@ -652,8 +652,8 @@ RD_CmdKindInfo rd_cmd_kind_info_table[261] = { str8_lit_comp("state"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, { str8_lit_comp("eval"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp("")}}, { str8_lit_comp("line_from_vaddr"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Vaddr, str8_lit_comp("")}}, -{ str8_lit_comp("enable_hidden_mode"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, -{ str8_lit_comp("disable_hidden_mode"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("hide_ui"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("show_ui"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, { str8_lit_comp("wm_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, { str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads")}}, { str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("query:call_stack")}}, diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index f85ab146..d18bb78e 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -115,8 +115,8 @@ RD_CmdKind_RunExternalDriverTextCommand, RD_CmdKind_State, RD_CmdKind_Eval, RD_CmdKind_LineFromVAddr, -RD_CmdKind_EnableHiddenMode, -RD_CmdKind_DisableHiddenMode, +RD_CmdKind_HideUI, +RD_CmdKind_ShowUI, RD_CmdKind_WMEvent, RD_CmdKind_SelectThread, RD_CmdKind_SelectUnwind, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index c9229d9e..e6867e3e 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -1047,8 +1047,8 @@ RD_CmdTable: // | | | | {State 0 0 1 "" Null 0 0 0 0 0 0 0 Null "state" "State" "" "" "" } {Eval 0 0 1 "" Expr 0 0 0 0 0 0 0 Null "eval" "Eval" "" "" "" } {LineFromVAddr 0 0 1 "" Vaddr 0 0 0 0 0 0 0 Null "line_from_vaddr" "Line From Virtual Address" "" "" "" } - {EnableHiddenMode 0 0 1 "" Null 0 0 0 0 0 0 0 Null "enable_hidden_mode" "Enable Hidden Mode" "" "" "" } - {DisableHiddenMode 0 0 1 "" Null 0 0 0 0 0 0 0 Null "disable_hidden_mode" "Disable Hidden Mode" "" "" "" } + {HideUI 0 0 1 "" Null 0 0 0 0 0 0 0 Null "hide_ui" "Hide UI" "" "" "" } + {ShowUI 0 0 1 "" Null 0 0 0 0 0 0 0 Null "show_ui" "Show UI" "" "" "" } //- rjf: os event passthrough {WMEvent 0 0 0 "" Null 0 0 0 0 0 0 0 Null "wm_event" "OS Event" "" "" "" } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 047510ad..c542b65a 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -5509,7 +5509,7 @@ rd_push_window_title(Arena *arena) prof_path = str8_chop_last_dot(prof_path); project_name = str8_skip_last_slash(prof_path); } - String8 result = push_str8f(arena, "%S%s%s", project_name, project_name.size != 0 ? " - " : "", BUILD_TITLE " (" BUILD_VERSION_STRING_LITERAL " " BUILD_RELEASE_PHASE_STRING_LITERAL ")"); + String8 result = str8f(arena, "%S%s%s", project_name, project_name.size != 0 ? " - " : "", BUILD_TITLE " (" BUILD_VERSION_STRING_LITERAL " " BUILD_RELEASE_PHASE_STRING_LITERAL ")"); return result; } @@ -5519,7 +5519,7 @@ rd_window_from_cfg(CFG_Node *cfg) CFG_Node *result = &cfg_nil_node; for(CFG_Node *c = cfg; c != &cfg_nil_node; c = c->parent) { - if(c->parent->parent == cfg_node_root() && str8_match(c->string, str8_lit("window"), 0)) + if(c->parent->parent == cfg_node_root() && str8_match(c->string, s("window"), 0)) { result = c; break; @@ -5569,10 +5569,10 @@ rd_window_state_from_cfg(CFG_Node *cfg) Vec2F32 size = {0}; WM_Monitor preferred_monitor = {0}; { - CFG_Node *pos_cfg = cfg_node_child_from_string(window_cfg, str8_lit("pos")); + CFG_Node *pos_cfg = cfg_node_child_from_string(window_cfg, s("pos")); has_pos = (pos_cfg != &cfg_nil_node); - CFG_Node *size_cfg = cfg_node_child_from_string(window_cfg, str8_lit("size")); - CFG_Node *monitor_cfg = cfg_node_child_from_string(window_cfg, str8_lit("monitor")); + CFG_Node *size_cfg = cfg_node_child_from_string(window_cfg, s("size")); + CFG_Node *monitor_cfg = cfg_node_child_from_string(window_cfg, s("monitor")); pos.x = (F32)f64_from_str8(pos_cfg->first->string); pos.y = (F32)f64_from_str8(pos_cfg->first->next->string); size.x = (F32)f64_from_str8(size_cfg->first->string); @@ -11311,9 +11311,10 @@ rd_init(CmdLine *cmdln) Arena *arena = arena_alloc(); rd_state = push_array(arena, RD_State, 1); rd_state->arena = arena; - rd_state->quit_after_success = (cmd_line_has_flag(cmdln, str8_lit("quit_after_success")) || - cmd_line_has_flag(cmdln, str8_lit("q"))); + rd_state->quit_after_success = (cmd_line_has_flag(cmdln, s("quit_after_success")) || + cmd_line_has_flag(cmdln, s("q"))); rd_state->override_focus_on_stop = (cmd_line_has_flag(cmdln, s("no_focus_on_stop"))); + rd_state->hidden_mode = cmd_line_has_flag(cmdln, s("hide_ui")); rd_state->user_path_arena = arena_alloc(); rd_state->project_path_arena = arena_alloc(); rd_state->theme_path_arena = arena_alloc(); @@ -13975,6 +13976,8 @@ rd_frame(void) } str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, "}\n"); }break; + case RD_CmdKind_HideUI:{rd_state->hidden_mode = 1;}break; + case RD_CmdKind_ShowUI:{rd_state->hidden_mode = 0;}break; //- rjf: exiting case RD_CmdKind_Exit: @@ -18709,7 +18712,7 @@ rd_frame(void) ////////////////////////////// //- rjf: submit rendering to all windows // - ProfScope("submit rendering to all windows") + ProfScope("submit rendering to all windows") if(!rd_state->hidden_mode) { r_begin_frame(); for(RD_WindowState *w = rd_state->first_window_state; w != &rd_nil_window_state; w = w->order_next) diff --git a/src/win32/socket/win32_socket.c b/src/win32/socket/win32_socket.c index 01c23e16..89abd19d 100644 --- a/src/win32/socket/win32_socket.c +++ b/src/win32/socket/win32_socket.c @@ -392,16 +392,19 @@ sock_session_open(U16 listener_port, SOCK_WakeupFunctionType *wakeup_hook) WSAIoctl(session->tcp_listen_socket, SIO_GET_EXTENSION_FUNCTION_POINTER, &AcceptEx_guid, sizeof(AcceptEx_guid), &session->lpfnAcceptEx, sizeof(session->lpfnAcceptEx), &dwBytes, 0, 0); //- rjf: create accepting socket + if(listener_port != 0) { session->tcp_accept_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); } //- rjf: associate accepting socket with IOCP + if(listener_port != 0) { CreateIoCompletionPort((HANDLE)session->tcp_accept_socket, session->iocp, 0, 0); } //- rjf: kick off accept + if(listener_port != 0) { session->lpfnAcceptEx(session->tcp_listen_socket, session->tcp_accept_socket, session->tcp_accept_buffer, 0, sizeof(struct sockaddr_storage) + 16, sizeof(struct sockaddr_storage) + 16, &session->tcp_accept_size_out, &session->tcp_accept_overlapped); } diff --git a/src/win32/window_manager/win32_window_manager.c b/src/win32/window_manager/win32_window_manager.c index 4f06c111..bc1e6561 100644 --- a/src/win32/window_manager/win32_window_manager.c +++ b/src/win32/window_manager/win32_window_manager.c @@ -1132,7 +1132,10 @@ internal void wm_window_close(WM_Window handle) { W32_WM_Window *window = w32_wm_window_from_handle(handle); - w32_wm_window_release(window); + if(window != 0) + { + w32_wm_window_release(window); + } } internal void @@ -1140,8 +1143,11 @@ wm_window_set_title(WM_Window handle, String8 title) { Temp scratch = scratch_begin(0, 0); W32_WM_Window *window = w32_wm_window_from_handle(handle); - String16 title16 = str16_from_8(scratch.arena, title); - SetWindowTextW(window->hwnd, (WCHAR *)title16.str); + if(window != 0) + { + String16 title16 = str16_from_8(scratch.arena, title); + SetWindowTextW(window->hwnd, (WCHAR *)title16.str); + } scratch_end(scratch); } @@ -1149,11 +1155,14 @@ internal void wm_window_first_paint(WM_Window window_handle) { W32_WM_Window *window = w32_wm_window_from_handle(window_handle); - window->first_paint_done = 1; - ShowWindow(window->hwnd, SW_SHOW); - if(window->maximized) + if(window != 0) { - ShowWindow(window->hwnd, SW_MAXIMIZE); + window->first_paint_done = 1; + ShowWindow(window->hwnd, SW_SHOW); + if(window->maximized) + { + ShowWindow(window->hwnd, SW_MAXIMIZE); + } } } @@ -1161,58 +1170,74 @@ internal void wm_window_focus(WM_Window handle) { W32_WM_Window *window = w32_wm_window_from_handle(handle); - SetForegroundWindow(window->hwnd); - SetFocus(window->hwnd); + if(window != 0) + { + SetForegroundWindow(window->hwnd); + SetFocus(window->hwnd); + } } internal B32 wm_window_is_focused(WM_Window handle) { + B32 result = 0; W32_WM_Window *window = w32_wm_window_from_handle(handle); - HWND active_hwnd = GetForegroundWindow(); - return active_hwnd == window->hwnd; + if(window != 0) + { + HWND active_hwnd = GetForegroundWindow(); + result = active_hwnd == window->hwnd; + } + return result; } internal B32 wm_window_is_fullscreen(WM_Window handle) { + B32 result = 0; W32_WM_Window *window = w32_wm_window_from_handle(handle); - DWORD window_style = GetWindowLong(window->hwnd, GWL_STYLE); - return !(window_style & WS_OVERLAPPEDWINDOW); + if(window != 0) + { + DWORD window_style = GetWindowLong(window->hwnd, GWL_STYLE); + result = !(window_style & WS_OVERLAPPEDWINDOW); + } + return result; } internal void wm_window_set_fullscreen(WM_Window handle, B32 fullscreen) { W32_WM_Window *window = w32_wm_window_from_handle(handle); - DWORD window_style = GetWindowLong(window->hwnd, GWL_STYLE); - B32 is_fullscreen_already = wm_window_is_fullscreen(handle); - if(fullscreen) + if(window != 0) { - if(!is_fullscreen_already) + DWORD window_style = GetWindowLong(window->hwnd, GWL_STYLE); + B32 is_fullscreen_already = wm_window_is_fullscreen(handle); + if(fullscreen) { - GetWindowPlacement(window->hwnd, &window->last_window_placement); + if(!is_fullscreen_already) + { + GetWindowPlacement(window->hwnd, &window->last_window_placement); + } + MONITORINFO monitor_info = {sizeof(monitor_info)}; + if(GetMonitorInfo(MonitorFromWindow(window->hwnd, MONITOR_DEFAULTTOPRIMARY), &monitor_info)) + { + SetWindowLong(window->hwnd, GWL_STYLE, window_style & ~WS_OVERLAPPEDWINDOW); + SetWindowPos(window->hwnd, HWND_TOP, + monitor_info.rcMonitor.left, + monitor_info.rcMonitor.top, + monitor_info.rcMonitor.right - monitor_info.rcMonitor.left, + monitor_info.rcMonitor.bottom - monitor_info.rcMonitor.top, + SWP_NOOWNERZORDER | SWP_FRAMECHANGED); + } } - MONITORINFO monitor_info = {sizeof(monitor_info)}; - if(GetMonitorInfo(MonitorFromWindow(window->hwnd, MONITOR_DEFAULTTOPRIMARY), &monitor_info)) + else { - SetWindowLong(window->hwnd, GWL_STYLE, window_style & ~WS_OVERLAPPEDWINDOW); - SetWindowPos(window->hwnd, HWND_TOP, - monitor_info.rcMonitor.left, - monitor_info.rcMonitor.top, - monitor_info.rcMonitor.right - monitor_info.rcMonitor.left, - monitor_info.rcMonitor.bottom - monitor_info.rcMonitor.top, + SetWindowLong(window->hwnd, GWL_STYLE, window_style | WS_OVERLAPPEDWINDOW); + SetWindowPlacement(window->hwnd, &window->last_window_placement); + SetWindowPos(window->hwnd, 0, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_FRAMECHANGED); } } - else - { - SetWindowLong(window->hwnd, GWL_STYLE, window_style | WS_OVERLAPPEDWINDOW); - SetWindowPlacement(window->hwnd, &window->last_window_placement); - SetWindowPos(window->hwnd, 0, 0, 0, 0, 0, - SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | - SWP_NOOWNERZORDER | SWP_FRAMECHANGED); - } } internal B32 @@ -1290,8 +1315,9 @@ internal void wm_window_set_monitor(WM_Window window_handle, WM_Monitor monitor) { W32_WM_Window *window = w32_wm_window_from_handle(window_handle); - HMONITOR hmonitor = (HMONITOR)monitor.u64[0]; + if(window != 0) { + HMONITOR hmonitor = (HMONITOR)monitor.u64[0]; MONITORINFOEXW info; info.cbSize = sizeof(MONITORINFOEXW); if(GetMonitorInfoW(hmonitor, (MONITORINFO *)&info)) @@ -1311,7 +1337,7 @@ internal void wm_window_clear_custom_border_data(WM_Window handle) { W32_WM_Window *window = w32_wm_window_from_handle(handle); - if(window->custom_border) + if(window && window->custom_border) { arena_clear(window->paint_arena); window->first_title_bar_client_area = window->last_title_bar_client_area = 0; @@ -1324,21 +1350,27 @@ internal void wm_window_push_custom_title_bar(WM_Window handle, F32 thickness) { W32_WM_Window *window = w32_wm_window_from_handle(handle); - window->custom_border_title_thickness = thickness; + if(window != 0) + { + window->custom_border_title_thickness = thickness; + } } internal void wm_window_push_custom_edges(WM_Window handle, F32 thickness) { W32_WM_Window *window = w32_wm_window_from_handle(handle); - window->custom_border_edge_thickness = thickness; + if(window != 0) + { + window->custom_border_edge_thickness = thickness; + } } internal void wm_window_push_custom_title_bar_client_area(WM_Window handle, Rng2F32 rect) { W32_WM_Window *window = w32_wm_window_from_handle(handle); - if(window->custom_border) + if(window && window->custom_border) { W32_WM_TitleBarClientArea *area = push_array(window->paint_arena, W32_WM_TitleBarClientArea, 1); if(area != 0)