Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как выгрузить драйвер?  (Прочитано 15345 раз)
0 Пользователей и 1 Гость смотрят эту тему.
sanjaaaa
Гость
« : 28-05-2008 09:42 » 

Нужно чтобы мой драйвер работал напрямую с UHC-контроллером (USB) и чтобы стандартный драйвер usbuhci.sys ему не мешал. Пытаюсь выгрузить драйвер с помощью SCManager. Команды SCManagera выполняются успешно, но драйвер пропадает только из реестра, в DeviceTree он остаётся, и вообще нормально работает.

Код:
	schSCManager = OpenSCManager( 
                            NULL,                    // local machine
                            NULL,                    // ServicesActive database
                            SC_MANAGER_ALL_ACCESS);  // full access rights
    schService = OpenService(
schSCManager,          // SCM database
L"usbuhci",            // service name
SERVICE_ALL_ACCESS);
    DeleteService(schService);

Как можно удалить стандартный драйвер (но с возможностью восстановления) или просто сделать так чтобы он не мешал?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 28-05-2008 10:46 » 

DeleteService

Remarks
The DeleteService function marks a service for deletion from the service control manager database. The database entry is not removed until all open handles to the service have been closed by calls to the CloseServiceHandle function, and the service is not running. A running service is stopped by a call to the ControlService function with the SERVICE_CONTROL_STOP control code. If the service cannot be stopped, the database entry is removed when the system is restarted.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sanjaaaa
Гость
« Ответ #2 : 29-05-2008 12:40 » 

В том то и дело, что на SERVICE_CONTROL_STOP возвращается: у сервиса нет такого control code.
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #3 : 29-05-2008 13:39 » 

sanjaaaa, у тебя в приведенном коде нет SERVICE_CONTROL_STOP.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 29-05-2008 15:12 » 

В том то и дело, что на SERVICE_CONTROL_STOP возвращается: у сервиса нет такого control code.
- GetLastError() какой?
ERROR_INVALID_PARAMETER? или другой?
в SERVICE_STATUS что нибудь возвращается?

перед удалением попробуйте выяснить статус сервиса QueryServiceStatus.

полная процедура удаления сервиса описана в MSDN:
Platform SDK: DLLs, Processes, and Threads
   Services
       Using Services
             Stopping a service

внутренняя ссылка MSDN2004 "ms-help://MS.MSDNQTR.2004JAN.1033/dllproc/base/stopping_a_service.htm"

или на странице http://support.microsoft.com/kb/245230


Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sanjaaaa
Гость
« Ответ #5 : 31-05-2008 03:48 » 

GetLastError() возвращает ERROR_INVALID_SERVICE_CONTROL. В структуру SERVICE_STATUS пишутся все ноли.
QueryServiceStatus возвращает - SERVICE_RUNNING и SERVICE_ACCEPT_STOP. То есть сервис всё таки можно остановить через SERVICE_CONTROL_STOP. Причём после после остановки сервиса после перезагрузки он и правда не работает, но надо чтобы он выключался и включался без перезагрузки.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 02-06-2008 08:37 » 

значит кто то хендл держит.... либо другой ресурс, и драйвер не желает выгружаться из памяти...

а ту программу, что по этим ссылкам и в msdn-е лежит, не пробовал запустить? там говорится что предварительно, небходимо все зависимые службы остановить. в том примере показано как.
запусти пример: http://support.microsoft.com/kb/245230
есть там такие сервисы? зависимые?
что у них со статусами?
попробуй сразу со строки
   if ( fStopDependencies ) {
    .....
там где перечисляются все
    EnumDependentServices()..
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sanjaaaa
Гость
« Ответ #7 : 04-06-2008 11:43 » 

          EnumDependentServices возвращает что зависимых служб нет. Похоже что стандартно через SC_Manager этот драйвер не отключить. Кстати в состоянии сервиса SERVICE_STATUS поле dwControlsAccepted = SERVICE_ACCEPT_STOP всегда, а драйвер при этом нормально работает.

          А может можно не дать работать драйверу например подменив все его точки входа из своего драйвера. Насколько это реально? На уровне ядра можно многое сделать.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 04-06-2008 13:02 » 

это тяжко...
надо инет пошерстить... должен быть способ. через дерево устройств же можно драйвер выгрзить? правда со всей веткой...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sanjaaaa
Гость
« Ответ #9 : 12-06-2008 12:49 » 

Всё проблему решил. Сделал hook на функцию READ_PORT из hal.dll. В этой функции возвращаю всегда как-будто устройство к host-контроллеру не подключено. Стандартный драйвер работает, но не мешает.

Ochkarik спасибо за советы.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 16-06-2008 06:24 » 

да не за что...

PS всегда найдется подземный ход через чердак)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines