Доброго времени суток форумчане. Хочу запустить службу программно, но ничего не выходит: функция StartService не запускат сервис. Код выполняется под учёткой админа, и плюс доступ делаю к базе данных сервисов и самому сервису с провами ALL_ACCESS. Вот собственно Код (Text): [b].data[/b] service_status SERVICE_STATUS <> _SERVICE_STATUS struc dwSeviseType dword ? dwCurrentState dword ? dwControlsAccepted dword ? dwWin32ExitCode dword ? dwServiceSpecificExitCode dword ? dwCheckPoint dword ? dwWaitHint dword ? _SERVICE_STATUS ends [b].code[/b] invoke OpenSCManager,NULL,NULL,SC_MANAGER_ALL_ACCESS invoke OpenService,eax,offset service_spooler, SERVICE_ALL_ACCESS mov hService,eax invoke QueryServiceStatus,eax,offset service_status .if service_status.dwCurrentState == 1 invoke StartServiceA,hService,0,0 .endif invoke ExitProcess,0 Запускаемый сервис spooler (Диспетчер очереди печати). Вот собственно просьба => Просвятите меня тёмного
Функция StartService выдаёт ошибку ERROR_SERVICE_DISABLED(Запуск сервиса запрещён) У меня установлен запуск службы "Отключено". То есть как я понял это в реестре указывается параметры для каждой службы. Эти параметры "гетаются" через QueryServiceConfig, но почему-то не получается выделить буфер под возвращаемые данные. Чтобы потом изменить и установить параметры ChangeServiceConfig. Но разве через эту парочку надо изменять параметры, чтобы запуск службы был разрешён? Просто все изменения в реестре вступают в силу после reboot'a, однако через панель управления службами ведь служба запускается. Если всё таки надо через QueryServiceConfig\ChangeServiceConfig дать разрешение на запуск службы, то подскажите как ПРАВИЛЬНО выделить память для QueryServiceConfig, выделял дофига памяти под неё и всё равно функция возвращала FALSE.
OpenSCManager+OpenService+StartService+QueryServiceStatusEx(ожидание ServiceStatus.dwCurrentState == SERVICE_RUNNING)+2*CloseServiceHandle
Если StartService возвращает ERROR_SERVICE_DISABLED значит service start options имеет значение SERVICE_DISABLED. Для изменения service start options надо вызвать ChangeServiceConfig установив параметр dwStartType в SERVICE_DEMAND_START, остальные параметры функции задать нулем либо SERVICE_NO_CHANGE (см MSDN). После этого повторить вызов StartService.
Вызов QueryServiceConfig (пример из MSDN): Код (Text): // Get the configuration information. if( !QueryServiceConfig( schService, NULL, 0, &dwBytesNeeded)) { dwError = GetLastError(); if( ERROR_INSUFFICIENT_BUFFER == dwError ) { cbBufSize = dwBytesNeeded; lpsc = (LPQUERY_SERVICE_CONFIG) LocalAlloc(LMEM_FIXED, cbBufSize); } else { printf("QueryServiceConfig failed (%d)", dwError); goto cleanup; } } if( !QueryServiceConfig( schService, lpsc, cbBufSize, &dwBytesNeeded) ) { printf("QueryServiceConfig failed (%d)", GetLastError()); goto cleanup; }
Ды понту нет вызывать QueryServiceConfig с нулевым значением буфера, чтобы получить размер под выделяемые данные. Стал бы я постить тогда здесь, еслиб всё так легко было. Вот RSDN Всё равно FALSE
Код (Text): .data service_spooler db "spooler",0 size_of_buf dword ? hService dword ? .code invoke OpenSCManager,NULL,NULL,SC_MANAGER_ALL_ACCESS invoke OpenService,eax,offset service_spooler, SERVICE_ALL_ACCESS invoke QueryServiceStatus,eax,offset service_status .if service_status.dwCurrentState == 1 invoke QueryServiceConfig,hService,NULL,0,offset size_of_buf .endif invoke ExitProcess,0 в результате получаю ERROR_ACCESS_DENIED
Эта строка есть в самом первом сообщении, просто забыл за неё а "править сообщения" не нашёл кнопочки. Также отсутствует обьявление структуры как вы могли заметить.