Картина такая: запустил прогу, загрузил из неё драйвер, и попытался из драйвера убить процесс, запустивший драйвер. Ес-сно ничего не вышло, кроме побочного эффекта: прога не смогла выгрузить драйвер, и он остался в базе данных менеджера сервисов. Последующий запуск проги и попытка создания сервиса по CreateService возвращает 0, (GetLastError=ERROR_ALREADY_EXISTS) - собственно следовало ожидать, а вот как теперь его удалить из базы данных? DeleteService требует валидного хэндла от CreateService, а он равен 0 Такой вот замкнутый круг. Как разорвать?
А как ты попыьался убить процесс из драйвера? Откуда ты это делал? Из IRP_MJ_DEVICE_CONTROL или драйверэнтри?
Наковырял, что если GetLastError = ERROR_SERVICE_EXISTS, то можно попробовать OpenService вместо CreateService. Правда, не совсем уверен, что это всегда и везде будет работать. Это правильный путь? Или както по-другому надо?
cresta Ты блин, старый и проверенный боец, а глупостями занимешься, давай код и конкретнее опиши, а то я тут больной простудой человек, должен в предновогоднее время страдать гаданием на кофейной гуще.
Код (Text): ;===================================================================== ========================================= CallDriver proc LOCAL hManager :DWORD LOCAL hService :DWORD LOCAL serv_status :SERVICE_STATUS LOCAL hDevice :DWORD local dwRetLen :DWORD LOCAL error :DWORD mov error,0 invoke OpenSCManager, NULL, NULL, SC_MANAGER_ALL_ACCESS .if (eax) mov hManager, eax invoke CreateService, hManager, addr szServiceName, addr szDisplayName, SERVICE_START or SERVICE_STOP or DELETE, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, addr szDriverName, NULL, NULL, NULL, NULL, NULL .if (!eax) [b]invoke GetLastError .if (eax==ERROR_SERVICE_EXISTS) invoke OpenService, hManager, addr szServiceName, SERVICE_ALL_ACCESS test eax,eax jnz _start_service .endif[/b] invoke MessageBox, NULL, SADD("Driver not registered!"), NULL, MB_OK or MB_ICONSTOP .else _start_service: mov hService, eax invoke StartService, hService, NULL, NULL .if (eax) invoke CreateFile, addr szDeviceName, NULL, NULL, NULL, OPEN_EXISTING, NULL, NULL .if (eax!=INVALID_HANDLE_VALUE) mov hDevice, eax invoke DeviceIoControl, hDevice, IOCTL_PASS_PID, NULL, 0, NULL, 0, addr dwRetLen, NULL .if (eax) inc error .endif invoke CloseHandle, hDevice .endif invoke ControlService, hService, SERVICE_CONTROL_STOP, addr serv_status .endif invoke DeleteService, hService invoke CloseServiceHandle, hService .endif invoke CloseServiceHandle, hManager .else invoke MessageBox, NULL, SADD("Can't open Manager."), NULL, MB_OK or MB_ICONSTOP .endif mov eax, error ret CallDriver endp Насколько правомерен код, выделенных жирным шрифтом ? Т.е. всегда ли это прокатит, или нет? Я драйвер первый раз пишу, никакой документации нет, поэтому не уверен, что так можно (по ошибке от CreateService - вызвать OpenService). P.S. Если болен - надо пить водку с перцем, а не в кодах ковыряться ))
По мне, так код твой должен работать, но логичнее наверное было бы openservice, а если нет, то инстал. Но, главное, это твой драйвер, как это так, в контексте твоего же процесса, драйвером завершать свой же процесс? Ты это прекрати, завершай чужие. А почему это примеров нет? Примеры есть, вот four-f 5-я статья, там про полнофункциональный драйвер, приложение передает данные драйверу и тот что-то делает. И вообще ты уверен, что твой драйвер правильно работает? По сути, после твоих фокусов остаеться только удалить ключь реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ИмяТвоегоДрайвера и после перезагрузки ставить его заново. Т.е. после твоих манипуляций, эту службу отключил SCM и ты ничего ей не сделаешь.
Понятно. У Four-F в исходнике вызов CreateService, если ошибка, то он отказывается от анализа ошибки и дальнейших попыток работы с драйвером, делая вывод о невозможности регистрации драйвера. А ключ в реестре не удаляется даже из под админа, почему - непонятно. Пришлось качать утилиту srvinstw.exe и с её помощью деинсталлировать драйвер. Как оказалось можно было без неё. Спасибо.
если драйвер остался висеть, то только перезагрузить комп. драйвер будет находиться в состоянии удаления до перезагрузки. лучше вообще не удаляй драйвер, а делай: invoke GetLastError .if (eax==ERROR_SERVICE_EXISTS) ... всё должно было получиться, незнаю почему не вышло. но ты пишешь: а почему она должна была его выгрузить? он же должен был её удалить? или я что то не так понял?