Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
5626afc
fix: move Applications End Task off the UI thread
cursoragent Nov 3, 2026
9c5b460
show network bytes sent, received, and total
cursoragent Nov 3, 2026
51e297b
Add a Services command that restarts the selected service
cursoragent Nov 3, 2026
adea8c8
fix: queue accepted Applications End Task commands
cursoragent Nov 3, 2026
b273561
fix: keep queued startup enable and disable commands
cursoragent Nov 3, 2026
6579954
wait longer for a collector panic report on loaded CI
cursoragent Nov 3, 2026
ed13d00
fix: keep an unknown memory limit out of the history
cursoragent Nov 3, 2026
7aa8118
fix: keep an unknown GPU memory limit out of the history
cursoragent Nov 3, 2026
e077a29
fix: mark an invalid CPU delta as stale
cursoragent Nov 3, 2026
dff1b79
fix: advance disk baselines on a zero interval
cursoragent Nov 3, 2026
e9cead3
fix: do not queue a duplicate session action
cursoragent Nov 3, 2026
115db81
fix: skip a repeated session action while the worker is busy
cursoragent Nov 3, 2026
4fca5a9
test: cover processor groups at the pointer width
cursoragent Nov 3, 2026
c06e790
move process affinity off the UI thread
cursoragent Nov 3, 2026
2c81dbf
fix: reject a CPU sample with no elapsed time
cursoragent Nov 3, 2026
889dd0f
Reject an empty processor performance query
cursoragent Nov 3, 2026
94eb0fe
fix: do not treat an unknown process machine as native
cursoragent Nov 3, 2026
5e6339f
merge: integrate reviewed PR #42
JamesLinYJ Nov 9, 2026
236fec4
merge: integrate reviewed PR #44
JamesLinYJ Nov 9, 2026
f8d76d8
merge: integrate reviewed PR #45
JamesLinYJ Nov 9, 2026
6aae37f
merge: integrate reviewed PR #46
JamesLinYJ Nov 9, 2026
d022bbf
merge: integrate reviewed PR #47
JamesLinYJ Nov 9, 2026
b63061a
merge: integrate reviewed PR #48
JamesLinYJ Nov 9, 2026
b5a7a68
merge: integrate reviewed PR #49
JamesLinYJ Nov 9, 2026
af89ce7
merge: integrate reviewed PR #50
JamesLinYJ Nov 9, 2026
7234047
merge: integrate reviewed PR #51
JamesLinYJ Nov 9, 2026
d6c3c54
merge: integrate reviewed PR #52
JamesLinYJ Nov 9, 2026
184d373
merge: integrate reviewed PR #53
JamesLinYJ Nov 9, 2026
823162f
merge: integrate reviewed PR #54
JamesLinYJ Nov 9, 2026
ac33017
merge: integrate reviewed PR #55
JamesLinYJ Nov 9, 2026
1021f74
merge: integrate reviewed PR #56
JamesLinYJ Nov 9, 2026
0788278
fix: preserve queued writes and validate service restart progress
JamesLinYJ Nov 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions build_support/localization.rs
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,10 @@ const MENU_STATUS_HELP_KEYS: &[(&str, &str)] = &[
"IDM_SERVICE_CONTINUE",
"crate::ui::resource_ids::IDM_SERVICE_CONTINUE",
),
(
"IDM_SERVICE_RESTART",
"crate::ui::resource_ids::IDM_SERVICE_RESTART",
),
(
"IDM_SERVICE_GOTOPROCESS",
"crate::ui::resource_ids::IDM_SERVICE_GOTOPROCESS",
Expand Down
3 changes: 3 additions & 0 deletions localization/de.toml
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,7 @@ ServicesPageTitle = "Dienste"
ServicesMenu = "&Dienste"
ServiceStart = "&Starten"
ServiceStop = "S&toppen"
ServiceRestart = "&Neu starten"
ServicePause = "&Anhalten"
ServiceContinue = "&Fortsetzen"
ServiceColumnName = "Name"
Expand All @@ -349,6 +350,7 @@ ServiceStartupManual = "Manuell"
ServiceStartupDisabled = "Deaktiviert"
ServiceStartFailed = "Der Dienst konnte nicht gestartet werden."
ServiceStopFailed = "Der Dienst konnte nicht beendet werden."
ServiceRestartFailed = "Der Dienst konnte nicht neu gestartet werden."
ServicePauseFailed = "Der Dienst konnte nicht angehalten werden."
ServiceContinueFailed = "Der Dienst konnte nicht fortgesetzt werden."
ServiceStateUnchanged = "Der Dienst hat den angeforderten Zustand nicht erreicht."
Expand Down Expand Up @@ -417,6 +419,7 @@ IDM_TASK_TILEVERT = "Tiles the windows vertically on the desktop"
IDM_TASK_BRINGTOFRONT = "Brings the window front, but does not switch to it"
IDM_SERVICE_START = "Startet den ausgewählten Dienst"
IDM_SERVICE_STOP = "Beendet den ausgewählten Dienst"
IDM_SERVICE_RESTART = "Startet den ausgewählten Dienst neu"
IDM_SERVICE_PAUSE = "Hält den ausgewählten Dienst an"
IDM_SERVICE_CONTINUE = "Setzt den ausgewählten Dienst fort"
IDM_SERVICE_GOTOPROCESS = "Wählt den Prozess des Diensts auf der Seite Prozesse aus"
Expand Down
3 changes: 3 additions & 0 deletions localization/en_us.toml
Original file line number Diff line number Diff line change
Expand Up @@ -337,6 +337,7 @@ ServicesPageTitle = "Services"
ServicesMenu = "&Services"
ServiceStart = "&Start"
ServiceStop = "&Stop"
ServiceRestart = "&Restart"
ServicePause = "&Pause"
ServiceContinue = "&Continue"
ServiceColumnName = "Name"
Expand All @@ -356,6 +357,7 @@ ServiceStartupManual = "Manual"
ServiceStartupDisabled = "Disabled"
ServiceStartFailed = "Unable to start the service."
ServiceStopFailed = "Unable to stop the service."
ServiceRestartFailed = "Unable to restart the service."
ServicePauseFailed = "Unable to pause the service."
ServiceContinueFailed = "Unable to continue the service."
ServiceStateUnchanged = "The service did not enter the requested state."
Expand Down Expand Up @@ -424,6 +426,7 @@ IDM_TASK_TILEVERT = "Tiles the windows vertically on the desktop"
IDM_TASK_BRINGTOFRONT = "Brings the window front, but does not switch to it"
IDM_SERVICE_START = "Starts the selected service"
IDM_SERVICE_STOP = "Stops the selected service"
IDM_SERVICE_RESTART = "Restarts the selected service"
IDM_SERVICE_PAUSE = "Pauses the selected service"
IDM_SERVICE_CONTINUE = "Continues the selected service"
IDM_SERVICE_GOTOPROCESS = "Selects the service process on the Processes page"
Expand Down
3 changes: 3 additions & 0 deletions localization/es.toml
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,7 @@ ServicesPageTitle = "Servicios"
ServicesMenu = "&Servicios"
ServiceStart = "&Iniciar"
ServiceStop = "&Detener"
ServiceRestart = "&Reiniciar"
ServicePause = "&Pausar"
ServiceContinue = "&Continuar"
ServiceColumnName = "Nombre"
Expand All @@ -349,6 +350,7 @@ ServiceStartupManual = "Manual"
ServiceStartupDisabled = "Deshabilitado"
ServiceStartFailed = "No se pudo iniciar el servicio."
ServiceStopFailed = "No se pudo detener el servicio."
ServiceRestartFailed = "No se pudo reiniciar el servicio."
ServicePauseFailed = "No se pudo pausar el servicio."
ServiceContinueFailed = "No se pudo continuar el servicio."
ServiceStateUnchanged = "El servicio no entró en el estado solicitado."
Expand Down Expand Up @@ -417,6 +419,7 @@ IDM_TASK_TILEVERT = "Tiles the windows vertically on the desktop"
IDM_TASK_BRINGTOFRONT = "Brings the window front, but does not switch to it"
IDM_SERVICE_START = "Inicia el servicio seleccionado"
IDM_SERVICE_STOP = "Detiene el servicio seleccionado"
IDM_SERVICE_RESTART = "Reinicia el servicio seleccionado"
IDM_SERVICE_PAUSE = "Pausa el servicio seleccionado"
IDM_SERVICE_CONTINUE = "Continúa el servicio seleccionado"
IDM_SERVICE_GOTOPROCESS = "Selecciona el proceso del servicio en la página Procesos"
Expand Down
3 changes: 3 additions & 0 deletions localization/fr.toml
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,7 @@ ServicesPageTitle = "Services"
ServicesMenu = "&Services"
ServiceStart = "&Démarrer"
ServiceStop = "&Arrêter"
ServiceRestart = "&Redémarrer"
ServicePause = "&Suspendre"
ServiceContinue = "&Continuer"
ServiceColumnName = "Nom"
Expand All @@ -349,6 +350,7 @@ ServiceStartupManual = "Manuel"
ServiceStartupDisabled = "Désactivé"
ServiceStartFailed = "Impossible de démarrer le service."
ServiceStopFailed = "Impossible d'arrêter le service."
ServiceRestartFailed = "Impossible de redémarrer le service."
ServicePauseFailed = "Impossible de suspendre le service."
ServiceContinueFailed = "Impossible de continuer le service."
ServiceStateUnchanged = "Le service n'a pas atteint l'état demandé."
Expand Down Expand Up @@ -417,6 +419,7 @@ IDM_TASK_TILEVERT = "Tiles the windows vertically on the desktop"
IDM_TASK_BRINGTOFRONT = "Brings the window front, but does not switch to it"
IDM_SERVICE_START = "Démarre le service sélectionné"
IDM_SERVICE_STOP = "Arrête le service sélectionné"
IDM_SERVICE_RESTART = "Redémarre le service sélectionné"
IDM_SERVICE_PAUSE = "Suspend le service sélectionné"
IDM_SERVICE_CONTINUE = "Reprend le service sélectionné"
IDM_SERVICE_GOTOPROCESS = "Sélectionne le processus du service dans la page Processus"
Expand Down
3 changes: 3 additions & 0 deletions localization/pt.toml
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,7 @@ ServicesPageTitle = "Serviços"
ServicesMenu = "&Serviços"
ServiceStart = "&Iniciar"
ServiceStop = "&Parar"
ServiceRestart = "&Reiniciar"
ServicePause = "&Pausar"
ServiceContinue = "&Continuar"
ServiceColumnName = "Nome"
Expand All @@ -349,6 +350,7 @@ ServiceStartupManual = "Manual"
ServiceStartupDisabled = "Desativado"
ServiceStartFailed = "Não foi possível iniciar o serviço."
ServiceStopFailed = "Não foi possível parar o serviço."
ServiceRestartFailed = "Não foi possível reiniciar o serviço."
ServicePauseFailed = "Não foi possível pausar o serviço."
ServiceContinueFailed = "Não foi possível continuar o serviço."
ServiceStateUnchanged = "O serviço não entrou no estado solicitado."
Expand Down Expand Up @@ -417,6 +419,7 @@ IDM_TASK_TILEVERT = "Tiles the windows vertically on the desktop"
IDM_TASK_BRINGTOFRONT = "Brings the window front, but does not switch to it"
IDM_SERVICE_START = "Inicia o serviço selecionado"
IDM_SERVICE_STOP = "Para o serviço selecionado"
IDM_SERVICE_RESTART = "Reinicia o serviço selecionado"
IDM_SERVICE_PAUSE = "Pausa o serviço selecionado"
IDM_SERVICE_CONTINUE = "Continua o serviço selecionado"
IDM_SERVICE_GOTOPROCESS = "Seleciona o processo do serviço na página Processos"
Expand Down
3 changes: 3 additions & 0 deletions localization/ru.toml
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,7 @@ ServicesPageTitle = "Службы"
ServicesMenu = "&Службы"
ServiceStart = "&Запустить"
ServiceStop = "&Остановить"
ServiceRestart = "Пере&запустить"
ServicePause = "&Приостановить"
ServiceContinue = "&Продолжить"
ServiceColumnName = "Имя"
Expand All @@ -349,6 +350,7 @@ ServiceStartupManual = "Вручную"
ServiceStartupDisabled = "Отключена"
ServiceStartFailed = "Не удалось запустить службу."
ServiceStopFailed = "Не удалось остановить службу."
ServiceRestartFailed = "Не удалось перезапустить службу."
ServicePauseFailed = "Не удалось приостановить службу."
ServiceContinueFailed = "Не удалось возобновить службу."
ServiceStateUnchanged = "Служба не перешла в запрошенное состояние."
Expand Down Expand Up @@ -417,6 +419,7 @@ IDM_TASK_TILEVERT = "Tiles the windows vertically on the desktop"
IDM_TASK_BRINGTOFRONT = "Brings the window front, but does not switch to it"
IDM_SERVICE_START = "Запускает выбранную службу"
IDM_SERVICE_STOP = "Останавливает выбранную службу"
IDM_SERVICE_RESTART = "Перезапускает выбранную службу"
IDM_SERVICE_PAUSE = "Приостанавливает выбранную службу"
IDM_SERVICE_CONTINUE = "Возобновляет выбранную службу"
IDM_SERVICE_GOTOPROCESS = "Выбирает процесс службы на странице процессов"
Expand Down
3 changes: 3 additions & 0 deletions localization/zh_cn.toml
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,7 @@ ServicesPageTitle = "服务"
ServicesMenu = "服务(&S)"
ServiceStart = "启动(&S)"
ServiceStop = "停止(&T)"
ServiceRestart = "重新启动(&R)"
ServicePause = "暂停(&P)"
ServiceContinue = "继续(&C)"
ServiceColumnName = "名称"
Expand All @@ -346,6 +347,7 @@ ServiceStartupManual = "手动"
ServiceStartupDisabled = "禁用"
ServiceStartFailed = "无法启动该服务。"
ServiceStopFailed = "无法停止该服务。"
ServiceRestartFailed = "无法重新启动该服务。"
ServicePauseFailed = "无法暂停该服务。"
ServiceContinueFailed = "无法继续该服务。"
ServiceStateUnchanged = "该服务没有进入请求的状态。"
Expand Down Expand Up @@ -414,6 +416,7 @@ IDM_TASK_TILEVERT = "Tiles the windows vertically on the desktop"
IDM_TASK_BRINGTOFRONT = "Brings the window front, but does not switch to it"
IDM_SERVICE_START = "启动所选服务"
IDM_SERVICE_STOP = "停止所选服务"
IDM_SERVICE_RESTART = "重新启动所选服务"
IDM_SERVICE_PAUSE = "暂停所选服务"
IDM_SERVICE_CONTINUE = "继续所选服务"
IDM_SERVICE_GOTOPROCESS = "在进程页选中该服务的进程"
Expand Down
3 changes: 3 additions & 0 deletions localization/zh_tw.toml
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,7 @@ ServicesPageTitle = "服務"
ServicesMenu = "服務(&S)"
ServiceStart = "啟動(&S)"
ServiceStop = "停止(&T)"
ServiceRestart = "重新啟動(&R)"
ServicePause = "暫停(&P)"
ServiceContinue = "繼續(&C)"
ServiceColumnName = "名稱"
Expand All @@ -346,6 +347,7 @@ ServiceStartupManual = "手動"
ServiceStartupDisabled = "已停用"
ServiceStartFailed = "無法啟動服務。"
ServiceStopFailed = "無法停止服務。"
ServiceRestartFailed = "無法重新啟動服務。"
ServicePauseFailed = "無法暫停服務。"
ServiceContinueFailed = "無法繼續服務。"
ServiceStateUnchanged = "服務沒有進入要求的狀態。"
Expand Down Expand Up @@ -414,6 +416,7 @@ IDM_TASK_TILEVERT = "Tiles the windows vertically on the desktop"
IDM_TASK_BRINGTOFRONT = "Brings the window front, but does not switch to it"
IDM_SERVICE_START = "啟動選取的服務"
IDM_SERVICE_STOP = "停止選取的服務"
IDM_SERVICE_RESTART = "重新啟動選取的服務"
IDM_SERVICE_PAUSE = "暫停選取的服務"
IDM_SERVICE_CONTINUE = "繼續選取的服務"
IDM_SERVICE_GOTOPROCESS = "在處理程序頁選取該服務的處理程序"
Expand Down
2 changes: 2 additions & 0 deletions src/app/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1180,6 +1180,7 @@ impl App {
.unwrap_or_default();
self.enable_menu_item(menu, IDM_SERVICE_START, commands.start);
self.enable_menu_item(menu, IDM_SERVICE_STOP, commands.stop);
self.enable_menu_item(menu, IDM_SERVICE_RESTART, commands.restart);
self.enable_menu_item(menu, IDM_SERVICE_PAUSE, commands.pause);
self.enable_menu_item(menu, IDM_SERVICE_CONTINUE, commands.continue_service);
self.enable_menu_item(menu, IDM_SERVICE_GOTOPROCESS, commands.go_to_process);
Expand Down Expand Up @@ -2306,6 +2307,7 @@ impl App {
}
IDM_SERVICE_START
| IDM_SERVICE_STOP
| IDM_SERVICE_RESTART
| IDM_SERVICE_PAUSE
| IDM_SERVICE_CONTINUE
| IDM_SERVICE_GOTOPROCESS => {
Expand Down
58 changes: 44 additions & 14 deletions src/infrastructure/native/process_architecture.rs
Original file line number Diff line number Diff line change
Expand Up @@ -111,10 +111,10 @@ fn classify_machines(
let process_machine = match reported_machine {
Some(machine) => machine,
None if wow_machine != IMAGE_FILE_MACHINE_UNKNOWN => wow_machine,
// On ARM64, both native ARM64 and x86-64/ARM64EC can report UNKNOWN. The old API
// alone cannot distinguish them, including on Windows 10 preview builds.
None if native_machine == IMAGE_FILE_MACHINE_ARM64 => return Err(ERROR_NOT_SUPPORTED),
None => native_machine,
// IsWow64Process2 reports IMAGE_FILE_MACHINE_UNKNOWN for every non-WOW64
// process. That value was not observed. On ARM64 it cannot separate native
// ARM64 from x64/ARM64EC, and on every other host it is still not native.
None => return Err(ERROR_NOT_SUPPORTED),
};
let process_is_32_bit = machine_is_32_bit(process_machine)?;
let mode = match (native_machine, process_machine) {
Expand Down Expand Up @@ -417,31 +417,61 @@ mod tests {
}

#[test]
fn old_api_keeps_known_bitness_but_never_guesses_arm64_native() {
assert_eq!(
classify_machines(0, IMAGE_FILE_MACHINE_ARM64, None),
Err(ERROR_NOT_SUPPORTED)
);
fn unknown_process_machine_is_an_error_and_reported_native_stays_native() {
for host in [
IMAGE_FILE_MACHINE_ARM64,
IMAGE_FILE_MACHINE_AMD64,
IMAGE_FILE_MACHINE_I386,
] {
assert_eq!(
classify_machines(IMAGE_FILE_MACHINE_UNKNOWN, host, None),
Err(ERROR_NOT_SUPPORTED)
);
}
assert_eq!(
classify_machines(IMAGE_FILE_MACHINE_I386, IMAGE_FILE_MACHINE_ARM64, None)
.unwrap()
.mode,
ExecutionMode::EmulatedX86
);
assert_eq!(
classify_machines(0, IMAGE_FILE_MACHINE_I386, None)
classify_machines(IMAGE_FILE_MACHINE_I386, IMAGE_FILE_MACHINE_AMD64, None)
.unwrap()
.mode,
ExecutionMode::Native
ExecutionMode::Compatibility32
);
assert_eq!(
classify_machines(IMAGE_FILE_MACHINE_I386, IMAGE_FILE_MACHINE_AMD64, None)
classify_machines(IMAGE_FILE_MACHINE_AMD64, IMAGE_FILE_MACHINE_AMD64, None)
.unwrap()
.mode,
ExecutionMode::Compatibility32
ExecutionMode::Native
);
assert_eq!(
classify_machines(
IMAGE_FILE_MACHINE_UNKNOWN,
IMAGE_FILE_MACHINE_AMD64,
Some(IMAGE_FILE_MACHINE_AMD64),
)
.unwrap()
.mode,
ExecutionMode::Native
);
assert_eq!(
classify_machines(0, IMAGE_FILE_MACHINE_ARM64, Some(0)),
classify_machines(
IMAGE_FILE_MACHINE_UNKNOWN,
IMAGE_FILE_MACHINE_ARM64,
Some(IMAGE_FILE_MACHINE_ARM64),
)
.unwrap()
.mode,
ExecutionMode::Native
);
assert_eq!(
classify_machines(
IMAGE_FILE_MACHINE_UNKNOWN,
IMAGE_FILE_MACHINE_ARM64,
Some(0)
),
Err(ERROR_INVALID_DATA)
);
assert_eq!(
Expand Down
Loading