Большинство поставленный вопрос здесь отвечают нормально здесь , так что я не собираюсь , чтобы покрыть старые земли в настоящее время.
для сервисов, которые не запускаются как svchost.exe, что отличает их от других не сервисных процессов?
Единственное, что отличает сервис от любого другого процесса, это то, что он остается открытым, чтобы что-то реагировать. В них нет ничего особенного, но это означает, что они часто имеют определенные характеристики. Они обычно являются приложениями CLI, потому что они вообще не нуждаются (или не хотят) GUI. Они также могут быть библиотеками DLL, если для управления ими предназначен хост-процесс (такой как svchost.exe); Вообще говоря, DLL - это код, который не имеет точки входа (то есть он не может быть запущен напрямую, но программа может загрузить его в память и запустить код).
Чтобы лучше это объяснить, нам нужно ввести новый термин - темы. Процесс может порождать новые темы. Главное, что нужно понять о потоках, это то, что каждый поток получает свой собственный указатель выполнения и действует как процесс внутри родительского процесса. svchost.exe это процесс, с помощью которого вы можете зарегистрировать сервис. Когда вы это сделаете, служба будет запущена как поток в процессе svchost.exe. Еще одна важная вещь для понимания потоков - они не отображаются в диспетчере задач (только родительский процесс).
На самом деле в вашей системе есть два экземпляра svchost.exe. Один из них является процессом пользовательского режима, а другой принадлежит SYSTEM. Копия SYSTEM позволяет службам запускаться до того, как кто-либо войдет в систему (что большинство служб захотят сделать).
Чтобы svchost.exe знал, что делать со службой, он должен быть способен работать как DLL. Это означает, что для этого нужно реализовать DLLMain. Кроме того, он также должен иметь метод HandlerEx, который отвечает на события, которые запускает svchost.exe (SERVICE_CONTROL_STOP, SERVICE_CONTROL_SHUTDOWN, SERVICE_CONTROL_PAUSE, SERVICE_CONTROL_CONTINUE, SERVICE_CONTROL_INTERROATE).
Если служба реализовала их, то просто нужно зарегистрироваться в svchost.exe, чтобы он знал об этом. Это делается с помощью приложений sc.exe и installutil.exe.
Теперь, когда я объяснил, как все это работает, я должен упомянуть, что многое из этого устарело в новых версиях Windows. Я полагаю, что текущий предложенный подход заключается в том, что разработчики сервисов также создают свой собственный хост-процесс (собственный svchost.exe). Это связано с тем, что svchost.exe с момента своего создания был идеальным укрытием для вредоносных программ. Большинство пользователей не имеют ни малейшего представления о том, как зарегистрировать \unreg сервисы с помощью svchost.exe, а знают, как их даже увидеть (менеджер сервисов).
Не позволяя разработчикам подключаться к svchost.exe, это означает, что они должны создать новый процесс для своих служб, что означает, что этот новый процесс будет отображаться в диспетчере задач. Тем не менее, я считаю, что даже в последних версиях Windows старый метод использования sc.exe все равно будет работать для обратной совместимости. Учитывая, что пользователи Windows по-прежнему имеют дело с ошибками, существовавшими после DOS, я думаю, что это еще будет возможно в течение долгого времени. Официально svchost.exe теперь только для служб Windows.