Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка при запуске драйвера 
:(
    Опции темы
Leksey
Дата 17.11.2006, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: 1
Всего: 1



Решил загрузить свой драйвер :
Код

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
PM MAIL   Вверх
neosapient
Дата 17.11.2006, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: 3
Всего: 4



Прости за ламерский вопрос, но может надо перед StartService воспользоваться OpenService?
PM MAIL   Вверх
Leksey
Дата 17.11.2006, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: 1
Всего: 1



Я думал что CreateService возвращает хэндл нужный для StartService и ошибка связана с путями.... 
попробовал открыть после CreateService  - открылось но при Startservice опять тоже самое smile
PM MAIL   Вверх
neosapient
Дата 17.11.2006, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: 3
Всего: 4



А можно увидеть код загрузки драйвера?
PM MAIL   Вверх
Leksey
Дата 17.11.2006, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: 1
Всего: 1



Это часть класса для загрузки драйвера:
Код


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");


Это сообщение отредактировал(а) Leksey - 17.11.2006, 23:04
PM MAIL   Вверх
neosapient
Дата 17.11.2006, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: 3
Всего: 4



Сразу еще один ламерский вопрос: разве при написании драйвера, на классы ненакладываюся огранечения (типа выделение памяти и т.п.)?
И почему в методе 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), скачать хочу (естественно бесплатно)


Это сообщение отредактировал(а) neosapient - 17.11.2006, 22:40
PM MAIL   Вверх
BUGOR
Дата 17.11.2006, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 12.3.2006

Репутация: 1
Всего: 16



Перед созданием надо вызвать:

Код

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)


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



Это сообщение отредактировал(а) BUGOR - 17.11.2006, 21:53


--------------------
Живу недоумевая, всё время хочу понять...
http://hunger.ru 
PM MAIL WWW ICQ   Вверх
Leksey
Дата 17.11.2006, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: 1
Всего: 1



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

Хм но я
Код

hSCManager = OpenSCManager(0, 0, SC_MANAGER_ALL_ACCESS );

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

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

Это сообщение отредактировал(а) Leksey - 17.11.2006, 22:53
PM MAIL   Вверх
neosapient
Дата 17.11.2006, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: 3
Всего: 4



Цитата

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

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


Цитата

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

Цитата

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



Это сообщение отредактировал(а) neosapient - 17.11.2006, 22:46
PM MAIL   Вверх
Leksey
Дата 17.11.2006, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: 1
Всего: 1



Я убрал из поста код где два раза открывался хэндл драйвера.
p.s . Что такое  Installable File Systems Kit (IFS Kit) я даже не знаю.
PM MAIL   Вверх
neosapient
Дата 17.11.2006, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: 3
Всего: 4



Цитата

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

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

Поищи в DDK по заголовку:
Device Drivers and File System Drivers Defined
PM MAIL   Вверх
Ln78
Дата 25.11.2006, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 25.11.2006

Репутация: нет
Всего: 15



В StartServiceW буковка W ничего не портит? Всё остальное тожеUnicode?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0641 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.