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


Автор: nanoo 18.6.2010, 19:39
Доброе время суток.
Имеется опыт в разработке драверов под linux. Довольно большой.
Встала задача написать драйвер под windows. Прочитал чуть-чуть msdn, Комисарову ну и пару тематических статей.
Со всеми этими знаниямы попытался написать элементарный wdf драйвер режима ядра. Но не тут то было.
Код

#include<ntddk.h>
#include<wdf.h>

//EVT_WDF_DRIVER_UNLOAD EvtDriverUnload;
DRIVER_INITIALIZE DriverEntry;
EVT_WDF_DRIVER_DEVICE_ADD EvtDriverDeviceAdd;

NTSTATUS EvtDriverDeviceAdd(__in  WDFDRIVER Driver,
                            __in  PWDFDEVICE_INIT DeviceInit)
{
    return STATUS_SUCCESS;
}

//VOID EvtDriverUnload(__in WDFDRIVER Driver)
//{
//  DbgPrint("Driver:: Bye, Kernel!\n");
//}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING strRegistryPath )
{
    NTSTATUS ret;
    WDF_DRIVER_CONFIG wdf_config;
    WDF_DRIVER_CONFIG_INIT(&wdf_config, EvtDriverDeviceAdd);
    
    ret = WdfDriverCreate(pDriverObject,
                            strRegistryPath,
                            WDF_NO_OBJECT_ATTRIBUTES,
                            &wdf_config,
                            WDF_NO_HANDLE);

    DbgPrint("Driver:: Hello, Kernel!\n");
    return ret;
}



сделал build, получил mydriver.sys.
копирую его в system32.
После этого делаю так:
Код

sc create mydriver type= kernel binpath= "system32\mydrivers\mydriver.sys"
sc start mydriver

на что мне отвечают файл не найден (the system cannot find the file specified).
Имена файлов и путей проверил - всё правильно (в regedit смотрел).
Вопрос: Где ошибка? Что я делаю не так? Когда же я уже увижу в окне деббагера сообщение от моего драйвера?
Спасибо.

Автор: nanoo 18.6.2010, 23:40
Ну что, никто не знает? Или знают все, но вопрос на столько туп, что никто не хочет отвечать?  smile 

Автор: xvr 19.6.2010, 13:13
Попробуйте в binpath написать полный путь (C:\win...)

Автор: nanoo 20.6.2010, 15:01
Цитата(xvr @ 19.6.2010,  13:13)
Попробуйте в binpath написать полный путь (C:\win...)

Попробовал.
В реестре появилось '\??\c:\windows\system32\mydrivers\mydriver.sys'
Не работает. Симптомы точно такие же.

Автор: xvr 20.6.2010, 21:10
Цитата(nanoo @  18.6.2010,  19:39 Найти цитируемый пост)
копирую его в system32.

Цитата(nanoo @  20.6.2010,  15:01 Найти цитируемый пост)
В реестре появилось '\??\c:\windows\system32\mydrivers\mydriver.sys'

Так все таки куда, в system32 или в system32\mydrivers?

Автор: nanoo 21.6.2010, 13:34
Цитата(xvr @ 20.6.2010,  21:10)
Цитата(nanoo @  18.6.2010,  19:39 Найти цитируемый пост)
копирую его в system32.

Цитата(nanoo @  20.6.2010,  15:01 Найти цитируемый пост)
В реестре появилось '\??\c:\windows\system32\mydrivers\mydriver.sys'

Так все таки куда, в system32 или в system32\mydrivers?

В system32\mydrivers.

Может быть существует какой-нибудь другой метод загурзки драйвера в ядро в виндовсе? В линуксе для этого существует insmod/modprobe, вот я по аналогии с линуксом и попробовал service control. Но может быть есть какой-то другой способ?

Вот тут http://www.techtalkz.com/microsoft-device-drivers/261600-kernel-mode-driver-wont-start.html у людей точно такая же проблема, но решить её, как я понял, не смогли.
Вот тут http://www.codeguru.com/forum/showthread.php?t=479023 дядька написал дравер. Он у него первый раз стартует и останавливаеться при помощи sc start/stop, но второй раз уже не стартует - пишет то же что и у меня. Так же он пишет, что у него какая-то ошибка  в драйвере.
Может и у меня ошибка? Тогда где? Компилируется драйвер даже без ворнингов.

Автор: bra1ny 21.6.2010, 15:53
NtLoadDriver().

Автор: xvr 21.6.2010, 15:56
Цитата(nanoo @  21.6.2010,  13:34 Найти цитируемый пост)
Может быть существует какой-нибудь другой метод загурзки драйвера в ядро в виндовсе?
Через OpenSCManager и пр. Но собственно sc его и использует

Может быть проблема с \??\ в пути - это ссылка на текущую глобальную директорию и она зависит от текущего пользователя, тут я не уверен.

Автор: bra1ny 21.6.2010, 16:03
Цитата(xvr @ 21.6.2010,  15:56)
Цитата(nanoo @  21.6.2010,  13:34 Найти цитируемый пост)
Может быть существует какой-нибудь другой метод загурзки драйвера в ядро в виндовсе?
Через OpenSCManager и пр. Но собственно sc его и использует

Может быть проблема с \??\ в пути - это ссылка на текущую глобальную директорию и она зависит от текущего пользователя, тут я не уверен.

сервис манагер при загрузке драйвера выызвает NtLoadDriver(). Так чтобы не париться с сервисами лучше сразу  напрямую.



попробуйте изменить поле ImagePath на system32\mydrivers\mydriver.sys

Автор: nanoo 21.6.2010, 16:03
Цитата(xvr @ 21.6.2010,  15:56)
Цитата(nanoo @  21.6.2010,  13:34 Найти цитируемый пост)
Может быть существует какой-нибудь другой метод загурзки драйвера в ядро в виндовсе?
Через OpenSCManager и пр. Но собственно sc его и использует

Может быть проблема с \??\ в пути - это ссылка на текущую глобальную директорию и она зависит от текущего пользователя, тут я не уверен.

Я в курсе, что sc использует OpenSCManager. Об этом на масм.ру пишут. Именно по этому я этот sc и использую. Я полагаю это "стандартный" способ запуска драйверов в виндовс. Пишешь в реестр данные о сервисе. Типа это дравер, лежить здесь, дополнительные параметры такие-то, там-парам. А потом sc start и всё. Но вот такая вот проблемка получается.

Добавлено через 11 минут и 27 секунд
Цитата(bra1ny @ 21.6.2010,  16:03)
Цитата(xvr @ 21.6.2010,  15:56)
Цитата(nanoo @  21.6.2010,  13:34 Найти цитируемый пост)
Может быть существует какой-нибудь другой метод загурзки драйвера в ядро в виндовсе?
Через OpenSCManager и пр. Но собственно sc его и использует

Может быть проблема с \??\ в пути - это ссылка на текущую глобальную директорию и она зависит от текущего пользователя, тут я не уверен.

сервис манагер при загрузке драйвера выызвает NtLoadDriver(). Так чтобы не париться с сервисами лучше сразу  напрямую.



попробуйте изменить поле ImagePath на system32\mydrivers\mydriver.sys

ImagePath стаяла system32\mydrivers\mydriver.sys с самого начала. Я просто не удачно выразился в первом посте.

Т.е. вы предлагаете написать свою собственную програмку, которая вызывая NtLoadDriver загружает дравер сама? Я вас правильно понял?
Но в документации 
Цитата

Parameters

DriverServiceName [in]

    Pointer to a counted Unicode string that specifies a path to the driver's registry key, \Registry\Machine\System\CurrentControlSet\Services\DriverName, where DriverName is the name of the driver. 

говориться, что эта ф-ия смотрит в реестр для того, что бы драйвер загрузить. И мне кажеться что вызов этой ф-и закончиться точно так же как и с sc start.


Я вот думаю, может у меня действительно с драйвером что-то не то? Если кто писал дравейра, посмотрите пожалуйста нет ли там ошибки.

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