Начал свою писанину с сервисов, придется продолжить ;).
Понадобилось мне как-то выгрузить сервис на конкретном устройстве, а имеено на HTC Cruise. Не мой сервис, системный (в том смысле что не мое это произведение и не я его загружал). Хочу сказать, что сервис не критический и на других устройствах вообще я его уже выгружал без проблем. А тут не смог. В любопытстве мне не откажешь, решил я разобраться почему.
Принцип выгрузки сервера «хорошо» описан в документации. Но как раз в кавычках и дело, потому что как раз в документации похоже ошибка. Функция остановки сервиса DeregisterService первым делом вызывает xxx_IOControl с кодом IOCTL_SERVICE_QUERY_CAN_DEINIT, типа спрашивает у сервиса можно ли его остановить. В свою очередь если xxx_IOControl возвращает TRUE и устанавливает передаваемый ей буфер в ненулевое значение, то DeregisterService не мождет выгрузить сервис. Это написано в ссылке. А вот если почитать описание кода IOCTL_SERVICE_QUERY_CAN_DEINIT, то тут написано другое, а именно: если сервис не хочет что бы его выгружали, от должен вернуть TRUE и установить буфер в ноль !. В этом случае DeregisterService возвратит FALSE с кодом ERROR_SERVICE_CANNOT_ACCEPT_CTRL.
Так где же все таки правильное описание ?
Я сделал FeedBack на MSDN и еще в один в блог, посвященный сервиам. В ожидании реакции, (уже прошло 7 дней, а ее нет, и скорее всего не будет) вспомнил что есть Embeded и что можно глянуть в код! Оказывается, правильное описание находится во второй ссылке, т.е. буфер должен устанавливаться в 0.
Резюме: описание функции DeregisterService неправильное.