| 785 | } |
| 786 | |
| 787 | static void cbm_win_begin_termination(cbm_subprocess_t *process, uint64_t now) { |
| 788 | if (process->termination_started) { |
| 789 | return; |
| 790 | } |
| 791 | process->termination_started = true; |
| 792 | process->termination_started_ms = now; |
| 793 | /* Best effort only: services and detached parents may have no shared console. |
| 794 | * The Job Object remains the authoritative force-containment boundary. */ |
| 795 | (void)GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, process->process_id); |
| 796 | } |
| 797 | |
| 798 | static void cbm_win_force_tree(cbm_subprocess_t *process, uint64_t now) { |
| 799 | if (process->force_sent) { |
no outgoing calls
no test coverage detected