| Предыдущий | Следующий |
| ERROR_SERVICE_START_HANG | ERROR_SERVICE_MARKED_FOR_DELETE |
ERROR_INVALID_SERVICE_LOCK
Блокировка базы данных диспетчера управления службами недействительна
LockServiceDatabase возвращает значение SC_LOCK, представляющее владение блокировкой базы данных SCM. UnlockServiceDatabase требует блокировку, полученную соответствующим вызовом блокировки, и явно документирует ERROR_INVALID_SERVICE_LOCK для недопустимого значения. Устаревшие функции блокировки не действуют начиная с Windows Vista, но старый код и пути совместимости всё ещё могут демонстрировать этот контракт ошибок.
Проверьте срок жизни и владение блокировкой в старом коде настройки служб. Не храните SC_LOCK в усечённом целом числе, не разблокируйте дважды и не используйте значение повторно после очистки. Держите дескриптор SCM и блокировку в одной явно заданной области времени жизни и освобождайте только успешно полученную блокировку. В современных версиях Windows проектируйте код конфигурации с учётом штатной сериализации API SCM, а не используйте устаревшие предположения о блокировке базы данных как межпроцессный мьютекс.
Что проверить
- Проследите успешный вызов LockServiceDatabase, создавший SC_LOCK.
- Проверьте двойную разблокировку, устаревшие значения и усечение целого числа.
- Не используйте старую блокировку SCM как примитив синхронизации приложения.
Ссылки
- Microsoft: LockServiceDatabase
- Microsoft: UnlockServiceDatabase
- Microsoft: диспетчер управления службами
Нужно найти другой код? Найти другой код состояния или ошибки.
