![]() |
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]() ![]() ![]() |
|
Ромео |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 27.8.2011 Репутация: нет Всего: нет |
Здарова мэны !! Вот то что я собрал по крупицам, думаю вам тоже это будет интересно, так как здесь рассматривается работа системы по включению и отключению служб, меня интересует выгрузка зависимых служб - какойнибудь службы.Тобишь есть к примеру служба , чтобы всем было понятно называется к примеру Service- при открытии панели управления пункт администрирование вкладка службы, мы видем эту службу- Service , в состоянии к примеру Running, програмно указываем ей на останов, при этом она через некоторое время соглашается и уходит в сон, но.... но однажды мы наталкиваемся на службу Service2 , которая не хочет выключаться, потомучто перед тем как она запускалась, запускалась подслужба Service2[0,1,2,3]
тоесть её держат на своих плечах несколько слонов служб. Поэтому в следущий раз когда я пишу код останова для моей Service изначальной, сразу предусматриваю факт что она таки возможно и не сможет отключиться с первого пинка, поэтому включаю процедуру if -- then -- else и в ней то указываю, ищи вспомогательные службы, отключай их попорядочку , потом уж иди и снимай службу Service . так вот для решения вопроса порылся в MSDN , кое каких книжицах, которые не очень просто раздобыть не в гугле не где, и пришол к функции EnumDependentServices, описание которой везде очень жалкое, тоесть её все скрывают от наших глаз, потому как знают что это не очень хорошая идея выгружать невыгружаемые службы(ими же может быть антивирус? либо что угодно) вот...... и теперь я коекак нашол эту функцию, более того точное решение моего вопроса но только на C++ а я то его не бум бум, я на Делфи пешу и незнаю как соединить кусочки проги моей -- на Делфи, и той -- на С++ У меня возникают орфографические проблемы с С++, поэтому вопрошаю к вам, переведите пожалуйста на Делфи, но только без альтернативных решений, а вточности также... И ещё, для любителей сладкого, постарайтесь не применять этот код в несанкционированных целях , слабые места в Виндоусе не для этого Билли придумывал ))) к примеру моя прога будет делать вот что: я ввожу имя службы, прога её отключает, я ввожу список лишних служб, виндоус отключает их , я могу сделать таким образом к примеру прогу чтобы она стартовала после установки винды и в зависимости от поставленых галочек принимала настройки системы, к примеру на пентиуме 4 , где нет подключения к нэту, нет надобности в загрузке и без того дохлого компьютера лишними службами, или ещё пример, не удаляется антивирус ? что делать ? лечить реестр? обычно так и поступаем, либо как самыйпростой Юзер переставлять корень винды, а ведь програмист должен уметь делать все ручками, и за 2 минуты, тогда уж все будут безумно счасливы, к примеру вир попал в AVP , мы хотим смочить его, а он зацепился и брыкается , там хоть отключай выдуманный SVHOST хоть нет , не успеешь иногда, установка нового антивируса не успевает запускаться , и происходит аварийное выкл. служб и компа, а при имении такой проги мы берем готовый интсрумент, убераем AVP , и ставим НОД 32 или Доктора, а можно и Аваста, да пофигу что, просто программист победит над машиной, дав ей хук справа, а не искать 10000 способов как за 30 -40 минут переставить все из за какогото испорченного системного компонента, также можно и службы перебрать из системы, если к примеру поймали Generic Host - это вирус для тех кто не слышал, который блокирует службы сети и нэта, можно с помощью моей проги поочередно выгрузить весь вирус из систему указав ему название службы Generic Host и тут некакая маска не спасет , все похожие и связанные сервисы выключатся, вот.... а потом уж можно и скопировать длл библиотеки с другого компа , и что называется клонировать их и закинуть на не активный диск нашего системного раздела в папку system32 и ей подобные вот...вобщем подумаем вместе?вот С++ исходник С++ исходник //----------------------------------------------------------------------- // DemoServiceStopWithDependents // // Останавливает указанную службу и все зависимые от нее службы. // // Параметры: // hSCM - handle SCM // pszServiceName - имя службы // // Возвращает: // ноль - при успешном завершении, отличное от нуля значение - в // противном случае. // int DemoServiceStopWithDependents( IN SC_HANDLE hSCM, IN PCTSTR pszServiceName ) { _ASSERTE(hSCM != NULL); _ASSERTE(pszServiceName != NULL); SC_HANDLE hService; LPENUM_SERVICE_STATUS pStatus; DWORD cbNeeded, i; DWORD cServices = 0; // открываем handle службы с правом доступа // SERVICE_ENUMERATE_DEPENDENTS hService = OpenService(hSCM, pszServiceName, SERVICE_ENUMERATE_DEPENDENTS); if (hService == NULL) return PrintError(_T("OpenService failed"), GetLastError()); // определяем требуемый размер выходного буфера if (!EnumDependentServices(hService, SERVICE_ACTIVE, NULL, 0, &cbNeeded, &cServices)) { if (GetLastError() != ERROR_MORE_DATA) { PrintError(_T("EnumDependentServices failed"), GetLastError()); CloseServiceHandle(hService); return 1; } } if (cbNeeded > 0) { // выделяем память для выходного буфера pStatus = (LPENUM_SERVICE_STATUS)LocalAlloc(LMEM_FIXED, cbNeeded); if (pStatus == NULL) { _tprintf(_T("Not enough memory\n")); CloseServiceHandle(hService); return 1; } // получаем список зависимых служб if (!EnumDependentServices(hService, SERVICE_ACTIVE, pStatus, cbNeeded, &cbNeeded, &cServices)) { PrintError(_T("EnumDependentServices failed"), GetLastError()); LocalFree((HLOCAL)pStatus); CloseServiceHandle(hService); return 1; } } // останавливаем все зависимые службы for (i = 0; i < cServices; i++) { _tprintf(_T("Stopping %s...\n"), pStatus[i].lpDisplayName); if (DemoServiceStop(hSCM, pStatus[i].lpServiceName)) break; } LocalFree((HLOCAL)pStatus); CloseServiceHandle(hService); if (i < cServices) return 1; // наконец, останавливаем указанную службу _tprintf(_T("Stopping %s...\n"), pszServiceName); return DemoServiceStop(hSCM, pszServiceName); } Это сообщение отредактировал(а) Ромео - 28.8.2011, 21:12 |
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
многабукавниасилил.
Препинания знаки не любишь ты. Мысли свои излагать научившись, многих спасешь от мозгов взрыва. ![]() Это сообщение отредактировал(а) kami - 28.8.2011, 14:09 |
|||
|
||||
sCreator |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 20.8.2009 Где: Московская област ь Репутация: нет Всего: 5 |
а функцию DemoServiceStop Ты уже перевел ?
http://www.rsdn.ru/article/baseserv/svcadmin-2.xml Почитай, может поможет в твоем нелегком деле. http://www.delphisources.ru/pages/faq/base...n_services.html |
|||
|
||||
Ромео |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 27.8.2011 Репутация: нет Всего: нет |
sCreator!!! многотысячное спасибо за проявленый интерес к теме, да я перевел основную "шапку" проекта, получил результат отключения одного "простенького" процесса, а вот с выгрузкой вспомогательных сопроцессов не разобрался, ещё раз спасибо за предоставленый материал, и за потраченое время, я ведь немало дней ломаю голову... |
|||
|
||||
Ромео |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 27.8.2011 Репутация: нет Всего: нет |
Вот это да... пошол по ссылкам, прочел от и до и только в конце допендрил что это я там и читал об этом всём, но вторая ссылка сначала дала надежду, а по прочтении сути опять же всплыла в мозгу моя всё та же идентичная картинка, они в этом примере пишут процедуру StopService, это и я сделал, вот это вон и есть "оно" они упускают из виду условие:
if not StopService ('ИМЯ СЕРВИСА',SERVICE_CONTROL_Stop) then begin ShowMessage('имеются вспомогательные сервисы'); и к примеру функция EnumDependentServices беда в том, что я незнаю как пользоваться ей, но знаю что только она возвращает количество зависимых сервисов, недающих закрыться основному); после выполнения процедуры EnumDependentServices я получу хендлы или или какойто массив хендлов, как это будет выглядеть, в каком виде процедура(функция не важно) вернет мне список сервисов, подлежащих выгрузке из памяти??? Гляньте пожалуйста исходник, мне б его перевести в Делфи ? ктонибудь поможет? задача то впринцыпе вся изложена нужно только подопнуть хоть чуточку всегото перевод основных орфографических различий, и пожалуй пойду читать С++ может мне забить на Делфи теперь раз в Делфи такие секреты прячут а в С++ нет? глупо ведь )) а С++ и вправду больше секретов знает, видел как один дядя программист мочил в линуксе по клаве, и при этом сидел в текстовой консоле , а видел чтото неописуемо красивое, и повернувшись сказал "Молодой , ты с++ знаешь ??? "и я сглотнул и подумал мдааааааа... Делфи вроде лучше, так что дело не в Делфи, а дело в С++ почему они там сделали такие вот загагулины типа "==" или {} или ещё ( ) хотя так проще ставить бегины и енды ... разум всетаки побеждает ... вот и я думаю что разум победит и ктонть поможет перевести end; |
|||
|
||||
sCreator |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 20.8.2009 Где: Московская област ь Репутация: нет Всего: 5 |
Да там, вкратце с помощью EnumDependentServices получается список служб от которых зависит зависимая служба и в цикле они останавливаются с помощью DemoServiceStop.
Потом останавливается сама служба. По большому счету тогда надо останавливать рекурсивно. т.е. для каждой зависимой вызывать DemoServiceStopWithDependents вместо DemoServiceStop. Вот в этом коде список собирается в строку. Замените 26 строку на останов все получится
Код не мой. на ашиПки не проверял. Удачи |
|||
|
||||
sCreator |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 20.8.2009 Где: Московская област ь Репутация: нет Всего: 5 |
Уважаемый Ромео, добавлю еще толику знаний в ваше море предположений.
Дело в том, что ни вирус ни антивирус вы этими своими командами не отключите. Потому что ваша DemoServiceStop только посылает сервису вежливое обращение - остановитесь пожалуйста. На что он может ответить не хочу, может вообще не прореагировать, а может при установке попросить систему не присылать ему таких сообщений. Кроме этого, сервис может указать системе, чтобы она его запустила заново, если он остановиться из-за збоя или вообще сама перезапустилась. Далее идет самостоятельный перезапуск, либо создание нескольких взаимоследящих процессов, так, что даже после уничтожения одного другой сразу запускает еще ну и т.д. |
|||
|
||||
Ромео |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 27.8.2011 Репутация: нет Всего: нет |
Благодарю любезный
sCreator, Очень кстати оказалась ваша помощь, сейчас опробую это смешав с моим кодом, я там уже перевел с С++ и добавлю ваш код, ну вобще .. спасибо!!! :ъ я весьма рад !!! |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: WinAPI и системное программирование" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |