Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Ошибка при запуске драйвера


Автор: Leksey 17.11.2006, 20:08
Решил загрузить свой драйвер :
Код

schService =   CreateService(schSCManager, drvname, drvname, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,  SERVICE_ERROR_NORMAL, drvpath, 0, 0, 0, 0, 0);
BOOL res = StartServiceW(schService, 0, 0);

где drvname имя моего драйвера. 
Функция CreateService выполняеться успешно,  но вызов StartServiceW возвращает ошибку 123 - неправильный путь к файлу smile .
Я пробовал задавать даже такой простой путь как "C:\\mydrv.sys" даже пробовал брать еще раз в кавычки "\"C:\\mydrv.sys\"" все равно таже ошибка smile

Автор: neosapient 17.11.2006, 20:41
Прости за ламерский вопрос, но может надо перед StartService воспользоваться OpenService?

Автор: Leksey 17.11.2006, 20:57
Я думал что CreateService возвращает хэндл нужный для StartService и ошибка связана с путями.... 
попробовал открыть после CreateService  - открылось но при Startservice опять тоже самое smile

Автор: neosapient 17.11.2006, 21:00
А можно увидеть код загрузки драйвера?

Автор: Leksey 17.11.2006, 21:37
Это часть класса для загрузки драйвера:
Код


class DrvInstallException: public std::exception
{
public:
    DrvInstallException(unsigned int lastError, const char* message): std::exception(message)
    {
        this->lastError = lastError;
    }
    unsigned int GetErrorCode() const
    {
        return lastError;
    }
private:
    unsigned int lastError;  
};

class DriverHelper
{
public:
    DriverHelper(const wchar_t* drivername, const wchar_t* driverpath);
    ~DriverHelper();
private:
    void Install();
    void Start();
    void Stop();
    void Remove();
    void Cleanup();
    SC_HANDLE schSCManager;    
    SC_HANDLE schService;
    const wchar_t* drvname;
    const wchar_t* drvpath;
    bool createdbyme;
};

DriverHelper::DriverHelper(const wchar_t* drivername, const wchar_t* driverpath): drvname(drivername), drvpath(driverpath)
{
    schSCManager = OpenSCManager(0,0,SC_MANAGER_ALL_ACCESS );
    if (schSCManager == NULL)
        throw DrvInstallException(GetLastError(),"Failed to open SC manager.");
    createdbyme = true;
    Install();
    Start();
}

void DriverHelper::Install()
{
    schService =   CreateService(schSCManager, drvname, drvname, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, 
                                 SERVICE_DEMAND_START,  SERVICE_ERROR_NORMAL, drvpath, 0, 0, 0, 0, 0);
    if (schService == NULL)
    {
        unsigned int lerr = GetLastError();
        if (lerr != ERROR_SERVICE_EXISTS)
        {
            Cleanup();
            throw DrvInstallException(lerr, "Service starting failed");
        }
        else
        {
            schService = OpenService(schSCManager,drvname,SERVICE_ALL_ACCESS);
            createdbyme = false;
            if (schService == NULL)
                throw DrvInstallException(lerr, "Can't open existing driver.");
        }
    }
}

void DriverHelper::Start()
{
    BOOL res = StartServiceW(schService, 0, 0);
    if (res != TRUE)
    {
        unsigned int lerr = GetLastError();
        if (lerr != ERROR_SERVICE_ALREADY_RUNNING) 
            throw DrvInstallException(lerr, "Starting driver failed");
    }
}


В коде :

Код

DriverHelper drvHelper(L"mydriver", L"c:\\mydriver.sys");

Автор: neosapient 17.11.2006, 21:47
Сразу еще один ламерский вопрос: разве при написании драйвера, на классы ненакладываюся огранечения (типа выделение памяти и т.п.)?
И почему в методе Install два раза вызывается OpenService? Нет ли здесь затирки "хендла" на рабочий сервис новым хендломна другой сервис.

Цитата

void DriverHelper::Install()
{
    schService =   CreateService(schSCManager, drvname, drvname, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, 
                                 SERVICE_DEMAND_START,  SERVICE_ERROR_NORMAL, drvpath, 0, 0, 0, 0, 0);

    int j = GetLastError();
    schService = OpenService(schSCManager,drvname,SERVICE_ALL_ACCESS);
    if (schService == NULL)
    {
        unsigned int lerr = GetLastError();
        if (lerr != ERROR_SERVICE_EXISTS)
        {
            Cleanup();
            throw DrvInstallException(lerr, "Service starting failed");
        }
        else
        {
            schService = OpenService(schSCManager,drvname,SERVICE_ALL_ACCESS);
            createdbyme = false;
            if (schService == NULL)
                throw DrvInstallException(lerr, "Can't open existing driver.");
        }
    }
}


BUGOR, ниже сказал про короткое имя адреса, на это действительно стоит обратить внимание. 

Левый вопрос: есть рабочая ссылка на Installable File Systems Kit (IFS Kit), скачать хочу (естественно бесплатно)

Автор: BUGOR 17.11.2006, 21:50
Перед созданием надо вызвать:

Код

hSCManager = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);



Далее, немного не те параметры ты указываешь, допустим если в папке с программой лежит драйвер works.sys, нужно делать так:

Код

GetFullPathName("works.sys", sizeof acDriverPath, &acDriverPath...



Далее вызываешь CreateService:

Код

hService = CreateService(hSCManager, "works", "works", SERVICE_START + DELETE, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, &acDriverPath, 0, 0, 0, 0, 0
StartService(hService, 0, 0)


Ну вот, примерно так.


Автор: Leksey 17.11.2006, 22:22
@neosapient Это код не драйвера, а приложения. И ты прав там ошибка была, та строчка что открывает драйвер после CreateService не нужна.

Хм но я
Код

hSCManager = OpenSCManager(0, 0, SC_MANAGER_ALL_ACCESS );

Это в конструкторе вызываю. Правда не знаю правильно ли это держать этот хэндл открытым...

Добавлено @ 22:37 
Сработало smile Использовал GetFullPathName и все запустилосьsmile 

Автор: neosapient 17.11.2006, 22:44
Цитата

Это код не драйвера, а приложения.

Понял, был не прав.


Цитата

в конструкторе вызываю... Правда не знаю правильно ли это держать этот хэндл открытым...

Цитата

почему в методе Install два раза вызывается OpenService? Нет ли здесь затирки "хендла" на рабочий сервис новым хендлом на другой сервис.


Автор: Leksey 17.11.2006, 23:06
Я убрал из поста код где два раза открывался хэндл драйвера.
p.s . Что такое  Installable File Systems Kit (IFS Kit) я даже не знаю.

Автор: neosapient 17.11.2006, 23:18
Цитата

Что такое  Installable File Systems Kit (IFS Kit) я даже не знаю.

Сам толком не знаю, я так понял что это документашка к файловой системе

Поищи в DDK по заголовку:
Device Drivers and File System Drivers Defined

Автор: Ln78 25.11.2006, 11:25
В StartServiceW буковка W ничего не портит? Всё остальное тожеUnicode?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)