Помогите пожалуйста дописать процедуру управления сервисом. Регистрация сервиса Код (Text): format PE64 GUI 5.0 entry Main include 'win64a.inc' SC_MANAGER_CREATE_SERVICE = 0002h SERVICE_CHANGE_CONFIG = 0002h SERVICE_WIN32_OWN_PROCESS = 00000010h SERVICE_DEMAND_START = 00000003h SERVICE_ERROR_IGNORE = 00000000h SERVICE_CONFIG_DESCRIPTION = 00000001h section '.data' data readable writeable struct SERVICE_DESCRIPTION lpDescription dq ? ends SERV_DESC SERVICE_DESCRIPTION szServiceName db 'Test service',0 szDisplayName db 'Test service 123',0 lpDescription db 'Test service description',0 szFileName db 'C:\TestService.exe',0 schSCManager dq ? svcSCManager dq ? scherror db 'ошибка OpenSCManager().',0 svcerror db 'ошибка CreateService().',0 svccreate db '*** сервис создан.',0 section '.code' code readable executable proc Main invoke OpenSCManagerA,NULL,NULL,SC_MANAGER_CREATE_SERVICE or SERVICE_CHANGE_CONFIG cmp rax,0 je .scherror mov [schSCManager],rax invoke CreateServiceA,[schSCManager],szServiceName,szDisplayName,\ STANDARD_RIGHTS_REQUIRED or SERVICE_CHANGE_CONFIG,SERVICE_WIN32_OWN_PROCESS,SERVICE_DEMAND_START,SERVICE_ERROR_IGNORE,\ szFileName,NULL,NULL,NULL,NULL,NULL cmp rax,0 je .svcerror mov [svcSCManager],rax mov [SERV_DESC.lpDescription],lpDescription invoke ChangeServiceConfig2A,[svcSCManager],SERVICE_CONFIG_DESCRIPTION,SERV_DESC invoke CloseServiceHandle,[schSCManager] invoke CloseServiceHandle,[svcSCManager] invoke MessageBoxA,0,svccreate,0,MB_ICONWARNING jmp .exit .svcerror: invoke MessageBoxA,0,svcerror,0,MB_ICONERROR jmp .exit .scherror: invoke MessageBoxA,0,scherror,0,MB_ICONERROR .exit: invoke ExitProcess,rax endp section '.idata' import data readable library kernel,'KERNEL32.DLL',\ user,'USER32.DLL',\ advapi,'ADVAPI32.DLL' import advapi,\ OpenSCManagerA,'OpenSCManagerA',\ CreateServiceA,'CreateServiceA',\ ChangeServiceConfig2A,'ChangeServiceConfig2A',\ CloseServiceHandle,'CloseServiceHandle' import kernel,\ ExitProcess,'ExitProcess' import user,\ MessageBoxA,'MessageBoxA' Удаление сервиса Код (Text): format PE64 GUI 5.0 entry Main include 'win64a.inc' SC_MANAGER_ALL_ACCESS = 0F003Fh section '.data' data readable writeable szServiceName db 'Test service',0 schSCManager dq ? svcSCManager dq ? scherror db 'ошибка OpenSCManager().',0 svcerror db 'ошибка OpenServiceA()',0 svcdelete db '*** сервис удалён.',0 section '.code' code readable executable proc Main invoke OpenSCManagerA,NULL,NULL,SC_MANAGER_ALL_ACCESS cmp rax,0 je .scherror mov [schSCManager],rax invoke OpenServiceA,[schSCManager],szServiceName,SC_MANAGER_ALL_ACCESS cmp rax,0 je .svcerror mov [svcSCManager],rax invoke DeleteService,[svcSCManager] invoke CloseServiceHandle,[schSCManager] invoke CloseServiceHandle,[svcSCManager] invoke MessageBoxA,0,svcdelete,0,MB_ICONWARNING jmp .exit .svcerror: invoke MessageBoxA,0,scherror,0,MB_ICONERROR jmp .exit .scherror: invoke MessageBoxA,0,svcerror,0,MB_ICONERROR .exit: invoke ExitProcess,rax endp section '.idata' import data readable library kernel,'KERNEL32.DLL',\ user,'USER32.DLL',\ advapi,'ADVAPI32.DLL' import advapi,\ OpenSCManagerA,'OpenSCManagerA',\ OpenServiceA,'OpenServiceA',\ DeleteService,'DeleteService',\ CloseServiceHandle,'CloseServiceHandle' import kernel,\ ExitProcess,'ExitProcess' import user,\ MessageBoxA,'MessageBoxA' Тело самого сервиса , вот тут не могу разобраться: Код (Text): format PE64 GUI 5.0 entry Main include 'win64a.inc' SERVICE_WIN32_OWN_PROCESS = 00000010h SERVICE_INTERACTIVE_PROCESS = 00000100h SERVICE_START_PENDING = 00000002h SERVICE_ACCEPT_STOP = 00000001h SERVICE_ACCEPT_SHUTDOWN = 00000004h SERVICE_RUNNING = 00000004h SERVICE_CONTROL_STOP = 00000001h NO_ERROR = 0h section '.data' data readable writeable struct SERVICE_TABLE_ENTRY lpServiceName dq ? lpServiceProc dq ? ends ServiceTable SERVICE_TABLE_ENTRY struct SERVICE_STATUS dwServiceType dd ? dwCurrentState dd ? dwControlsAccepted dd ? dwWin32ExitCode dd ? dwServiceSpecificExitCode dd ? dwCheckPoint dd ? dwWaitHint dd ? ends ServiceStatus SERVICE_STATUS hStatus dq ? hello db 'Hello, world!',0 ServiceName db 'Test service',0 section '.code' code readable executable proc Main mov [ServiceTable.lpServiceName],ServiceName mov [ServiceTable.lpServiceProc],ServiceMain invoke StartServiceCtrlDispatcher,ServiceTable endp proc ServiceMain dwArgc:DWORD, lpszArgv:QWORD invoke RegisterServiceCtrlHandler,ServiceName,ServiceCtrlHandler mov [hStatus],rax mov [ServiceStatus.dwServiceType],SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS mov [ServiceStatus.dwCurrentState],SERVICE_START_PENDING mov [ServiceStatus.dwControlsAccepted],SERVICE_ACCEPT_STOP or SERVICE_ACCEPT_SHUTDOWN invoke SetServiceStatus,[hStatus],ServiceStatus mov [ServiceStatus.dwCurrentState],SERVICE_RUNNING mov [ServiceStatus.dwWin32ExitCode],NO_ERROR invoke SetServiceStatus,[hStatus],ServiceStatus call ServiceProc endp proc ServiceCtrlHandler dwControl:DWORD cmp [dwControl],SERVICE_CONTROL_STOP mov [ServiceStatus.dwCurrentState],SERVICE_RUNNING invoke SetServiceStatus,[hStatus],ServiceStatus ret endp proc ServiceProc .rep: invoke Sleep,3000 invoke MessageBoxA,0,hello,0,MB_ICONWARNING jmp .rep endp section '.idata' import data readable library kernel,'KERNEL32.DLL',\ user,'USER32.DLL',\ advapi,'ADVAPI32.DLL' import advapi,\ OpenSCManagerA,'OpenSCManagerA',\ CreateServiceA,'CreateServiceA',\ ChangeServiceConfig2A,'ChangeServiceConfig2A',\ CloseServiceHandle,'CloseServiceHandle',\ StartServiceCtrlDispatcher,'StartServiceCtrlDispatcherA',\ RegisterServiceCtrlHandler,'RegisterServiceCtrlHandlerA',\ SetServiceStatus,'SetServiceStatus' import kernel,\ ExitProcess,'ExitProcess',\ Sleep,'Sleep' import user,\ MessageBoxA,'MessageBoxA'
Помогите дописать функции управления сервисом Если бы я смог там разобраца то не просил бы наверное помощи.
fragment А как он у тебя останавливается, если ты ему не даешь этого сделать? Код (Text): proc ServiceCtrlHandler dwControl:DWORD cmp [dwControl],SERVICE_CONTROL_STOP mov [ServiceStatus.dwCurrentState],SERVICE_RUNNING invoke SetServiceStatus,[hStatus],ServiceStatus ret endp К тому же, странно... вроде как пишешь сервис под 64 бита, а линкуешь с библиотеками x32
fragment Когда-то кодил сервер на сишке,он так у меня недописанный пока и лежит. Есть код самого модуля сервиса и код программки управления этим сервисом. В модуле сервиса код нормальный,а в проге управления - говнокод (писал чтоб сервис протестить) ,поэтому выкладывать стыдно))).Пишите мыло ,вечером могу прислать если надо. Написано на С чисто на Win API так что перевести на асм думаю труда не составит. А вообще книги есть неплохие "Системное программирование в Windows 2000" и "Программирование серверных приложений под Windows",авторов не помню,гугляться хорошо по-моему.
>> Помогите дописать функции управления сервисом ты конкретно спроси, что не понятно. Писать за кого то код тут мало найдется желающих.
фрагмент, пости в ветку COMMERCE, там помогут дописать и даже написать с нуля. Любой каприз за ваши деньги
Вот вот. Создается впечатление что чувак просто хочет на кого-нибудь свалить работу,которую сам делать не хочет. Да... Разбираться там есть с чем... Посмотри хотя бы прототипы ф-й,если с английским туго,и так все понятно будет.
Купи или скачай в сети, находится на раз Побегайло А.П. Системное программирование в Windows Издательство: БХВ-Петербург Прочти 33 и 34 главы
Для отключения и настройки автозапуска сервиска какими API стоит воспользываца, перерыл весь MSDN но апи типа ServiceStop там не нашол. И как настроить тип автозапуска сервиса SERVICE_DISABLED ?
fragment Точно не помню,но кажется тип запуска сервиса задается при регистрации сервиса в системе при помощи CreateService(по-моему так). Как раз смотрите описалово CreateService,параметр dwStartType. Еще можно ключ в реестре прописать соответствующий. Смотрите исходники и книги(А именно "программирование серверных приложений"),которые я вам присылал. Add: И вот полезная инфа к размышлению http://msdn.microsoft.com/en-us/library/ms685141(v=VS.85).aspx. Если стоит задача "разобраться в программировании сервисов под windows" ,то лучше прочитать все по этим ссылкам.
Дело в том что сервис уже существует, я хочу его остановить и изменить тип запуска. Делаю так по эксемплу из msdn http://msdn.microsoft.com/en-us/library/ms682006(v=vs.85).aspx Код (Text): .... MpsSvc db 'MpsSvc',0 schSCManager dd ? svcSCManager dd ? .... proc StopFirewall invoke OpenSCManagerA,NULL,NULL,SC_MANAGER_ALL_ACCESS mov [schSCManager],eax invoke OpenServiceA,eax,MpsSvc,SC_MANAGER_ALL_ACCESS mov [svcSCManager],eax invoke ChangeServiceConfigA,eax,0,4,0,0,0,0,0,0,0,0 invoke CloseServiceHandle,[schSCManager] invoke CloseServiceHandle,[svcSCManager] ret endp .... но тип запуска не изменяется. В реестре копаца не хочется , антивирус палит все возможные ключи в .data , мне это надоело .
fragment Посмотрите с какими ошибками и какие ф-и завершаются .Так сказать трудно - от невалидных параметров до запуска без прав админа. А вот и ключик этот кажется HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services.
fragment А вы думаете если изменить тип запуска через ChangeServiceConfigA значение этого ключика не измениться? И в ChangeServiceConfigA dwServiceType вроде SERVICE_WIN32_OWN_PROCESS использовать надо ,а не 0 надо использовать. Add: И на счет AV еще: Чисто по моему опыту есть 2 варианта - либо AV чихать на этот ключ,либо как не пряч его из usermode все равно спалит(оно и так понятно). Ну а строку вообще и зашифровать не сложно,если по ней палит,это не страшно.
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\MpsSvc ключик Start надо изменить на 00000004h , это SERVICE_DISABLED. А как вот остановить службу без перезагрузки , хотя мне это не особо надо т.к. перезагружаца придется...
fragment Вообще там при создании сервиса регистрируется обработчик событий от SCM. Вот если в нем обработать событие завершения процесса (я так понимаю это ехе-сервис),то он завершается после завершения всех потоков. А вот код события не помню,зато нашел это http://msdn.microsoft.com/en-us/library/bb540476(v=VS.85).aspx. И в тех исходниках сервиса оно тоже есть.
Посмотрел под олькой, функция AdjustTokenPrivileges возвращает в LastError 000003E6 ERROR_NOACCESS Почему , раньше такова небыло ? Разобрался забыл про align4
Ну либо надо запустить с админскими правами,либо проверить правильно ли завершаются OpenProcessToken и LookupPrivilegeValueA. Код (Text): AdjustTokenPrivileges,[hToken],FALSE,TokenPriv,0,NULL,NULL Токен этот проверяли? C ним все нормально. Здесь сразу не помогу - то что касается токенов ,безопасности и прав доступа помню не очень . Add: Опоздал малость.