Там действительно ничего нельзя сделать, если ваш процесс убит. По определению, убить процесс - это просто убить его. Процесс не получает возможности запустить какой-либо код. Это очень "по замыслу".
Представьте, что вы можете зарегистрировать подпрограмму, которая была вызвана, когда ваш процесс был убит пользователем (или другим процессом). Что бы это сделать? Все остальные потоки в вашем процессе будут в неопределенном состоянии. Как бы вы синхронизировались с ними? Помните, идея состоит в том, что процесс должен быть убит.
Другой сценарий еще сложнее: ваш код безобиден и пытается делать правильные вещи - например, очиститься и быть хорошим гражданином системы. Некоторый код не Представьте, что было бы благом для автора вредоносного ПО, если бы ОС позволяла запускать код для убиваемого процесса. Это было бы достаточно плохо для вредоносных процессов, которые выполнялись со стандартными привилегиями пользователя, и совершенно ужасно для всех, работающих с административными привилегиями.
Критическое завершение и структурированная обработка исключений не решат эту фундаментальную проблему.
С другой стороны, ОС освободит все ресурсы, о которых она знает, когда ваш процесс будет убит, а именно память и объекты ядра. Те не будут течь. Но исследователь не знает о вашем процессе, поэтому он не может очистить его.
Один из способов решить эту проблему - иметь процесс мониторинга, который отслеживает состояние других ваших процессов и очищает его. Вы можете сделать это с помощью простого процесса или с помощью службы. Вы также можете рассмотреть какое-то расширение оболочки, имеющее собственный поток, который делал то же самое.