DeleteService

Тема в разделе "WASM.WIN32", создана пользователем cresta, 30 дек 2005.

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Картина такая: запустил прогу, загрузил из неё драйвер, и попытался из драйвера убить процесс, запустивший драйвер. Ес-сно ничего не вышло, кроме побочного эффекта: прога не смогла выгрузить драйвер, и он остался в базе данных менеджера сервисов.

    Последующий запуск проги и попытка создания сервиса по CreateService возвращает 0, (GetLastError=ERROR_ALREADY_EXISTS) - собственно следовало ожидать, а вот как теперь его удалить из базы данных? DeleteService требует валидного хэндла от CreateService, а он равен 0 :dntknw:

    Такой вот замкнутый круг. Как разорвать?
     
  2. Saint German

    Saint German New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2003
    Сообщения:
    222
    А как ты попыьался убить процесс из драйвера? Откуда ты это делал? Из IRP_MJ_DEVICE_CONTROL или драйверэнтри?
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Из IRP_MJ_DEVICE_CONTROL
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Наковырял, что если GetLastError = ERROR_SERVICE_EXISTS, то можно попробовать OpenService вместо CreateService.

    Правда, не совсем уверен, что это всегда и везде будет работать.

    Это правильный путь? Или както по-другому надо?
     
  5. Saint German

    Saint German New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2003
    Сообщения:
    222
    cresta

    Ты блин, старый и проверенный боец, а глупостями занимешься, давай код и конкретнее опиши, а то я тут больной простудой человек, должен в предновогоднее время страдать гаданием на кофейной гуще.
     
  6. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Код (Text):
    1. ;===================================================================== =========================================
    2. CallDriver proc
    3.     LOCAL hManager          :DWORD
    4.     LOCAL hService          :DWORD
    5.     LOCAL serv_status       :SERVICE_STATUS
    6.     LOCAL hDevice           :DWORD
    7.     local dwRetLen          :DWORD
    8.     LOCAL error             :DWORD
    9.  
    10.     mov     error,0
    11.     invoke  OpenSCManager, NULL, NULL, SC_MANAGER_ALL_ACCESS
    12.     .if     (eax)
    13.         mov     hManager, eax
    14.         invoke  CreateService,  hManager, addr szServiceName, addr szDisplayName,
    15.                                 SERVICE_START or SERVICE_STOP or DELETE, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START,
    16.                                 SERVICE_ERROR_IGNORE, addr szDriverName, NULL, NULL, NULL, NULL, NULL
    17.         .if     (!eax)
    18.             [b]invoke  GetLastError
    19.             .if     (eax==ERROR_SERVICE_EXISTS)
    20.                 invoke  OpenService, hManager, addr szServiceName, SERVICE_ALL_ACCESS
    21.                 test    eax,eax
    22.                 jnz     _start_service
    23.             .endif[/b]
    24.             invoke MessageBox, NULL, SADD("Driver not registered!"), NULL, MB_OK or MB_ICONSTOP
    25.         .else
    26.             _start_service:
    27.             mov     hService, eax
    28.             invoke  StartService, hService, NULL, NULL
    29.             .if     (eax)
    30.                 invoke CreateFile, addr szDeviceName, NULL, NULL, NULL, OPEN_EXISTING, NULL, NULL
    31.                 .if     (eax!=INVALID_HANDLE_VALUE)
    32.                     mov     hDevice, eax
    33.                     invoke  DeviceIoControl, hDevice, IOCTL_PASS_PID, NULL, 0, NULL, 0, addr dwRetLen, NULL
    34.                     .if     (eax)
    35.                         inc error
    36.                     .endif
    37.                     invoke CloseHandle, hDevice
    38.                 .endif
    39.                 invoke ControlService, hService, SERVICE_CONTROL_STOP, addr serv_status
    40.             .endif
    41.             invoke DeleteService, hService
    42.             invoke CloseServiceHandle, hService
    43.         .endif
    44.         invoke CloseServiceHandle, hManager
    45.     .else
    46.         invoke MessageBox, NULL, SADD("Can't open Manager."), NULL, MB_OK or MB_ICONSTOP
    47.     .endif
    48.     mov eax, error
    49.     ret
    50.  
    51. CallDriver endp




    Насколько правомерен код, выделенных жирным шрифтом ? Т.е. всегда ли это прокатит, или нет?

    Я драйвер первый раз пишу, никакой документации нет, поэтому не уверен, что так можно (по ошибке от CreateService - вызвать OpenService).



    P.S.

    Если болен - надо пить водку с перцем, а не в кодах ковыряться :)))
     
  7. Saint German

    Saint German New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2003
    Сообщения:
    222
    По мне, так код твой должен работать, но логичнее наверное было бы openservice, а если нет, то инстал.

    Но, главное, это твой драйвер, как это так,

    в контексте твоего же процесса, драйвером завершать свой же процесс? Ты это прекрати, завершай чужие. А почему это примеров нет? Примеры есть, вот four-f 5-я статья, там про полнофункциональный драйвер, приложение передает данные

    драйверу и тот что-то делает. И вообще ты уверен, что твой драйвер правильно работает?

    По сути, после твоих фокусов остаеться только

    удалить ключь реестра

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ИмяТвоегоДрайвера и после перезагрузки ставить его заново.

    Т.е. после твоих манипуляций, эту службу отключил SCM

    и ты ничего ей не сделаешь.
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Понятно. У Four-F в исходнике вызов CreateService, если ошибка, то он отказывается от анализа ошибки и дальнейших попыток работы с драйвером, делая вывод о невозможности регистрации драйвера.

    А ключ в реестре не удаляется даже из под админа, почему - непонятно. Пришлось качать утилиту srvinstw.exe и с её помощью деинсталлировать драйвер. Как оказалось можно было без неё.

    Спасибо.
     
  9. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    если драйвер остался висеть, то только перезагрузить комп.

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

    invoke GetLastError

    .if (eax==ERROR_SERVICE_EXISTS)

    ...





    всё должно было получиться, незнаю почему не вышло. но ты пишешь:



    а почему она должна была его выгрузить? он же должен был её удалить? или я что то не так понял?