Не могу открыть драйвер!
От: Konstantinchik  
Дата: 28.03.12 08:44
Оценка:
Добрый день. Подскажите мне В чем загвоздка: написал драйвер запустил работает, но вот пытаясь послать ему ioctl от консольки не отрабатывает CreateFile("\\\\.\\mydriverd",...);(функцию запуска с разными параметрами владения и атрибутами) error code 2. Хотя в диспетчере устройств весит и запущен?
Re: Не могу открыть драйвер!
От: okman Беларусь https://searchinform.ru/
Дата: 28.03.12 09:24
Оценка:
Здравствуйте, Konstantinchik, Вы писали:

K>Добрый день. Подскажите мне В чем загвоздка: написал драйвер запустил работает, но вот пытаясь послать ему ioctl от консольки не отрабатывает CreateFile("\\\\.\\mydriverd",...);(функцию запуска с разными параметрами владения и атрибутами) error code 2. Хотя в диспетчере устройств весит и запущен?


Dispatch-функции зарегистрировали ? IRP_MJ_CREATE правильно обрабатываете (в общем случае там
нужно завершить IRP с кодом STATUS_SUCCESS — это как минимум) ? И что за драйвер ?
В общем, дайте больше информации.
Re[2]: Не могу открыть драйвер!
От: Konstantinchik  
Дата: 28.03.12 10:00
Оценка:
Здравствуйте, okman, Вы писали:

O>Dispatch-функции зарегистрировали ? IRP_MJ_CREATE правильно обрабатываете (в общем случае там

O>нужно завершить IRP с кодом STATUS_SUCCESS — это как минимум) ? И что за драйвер ?
O>В общем, дайте больше информации.

Это обычный LegasyDriver. Но вот IRP_MJ_CREATE у меня STATUS_SUCCESS не завершался. Добавил обработку
irp.IoStatus.Status = STATUS_SUCCESS;
irp.IoStatus.Information = 0;
IoComplateRequest(irp, IO_NO_INCREMENT);
Но увы все та же ошибка
Re: Не могу открыть драйвер!
От: ononim  
Дата: 28.03.12 10:13
Оценка:
K>Добрый день. Подскажите мне В чем загвоздка: написал драйвер запустил работает, но вот пытаясь послать ему ioctl от консольки не отрабатывает CreateFile("\\\\.\\mydriverd",...);(функцию запуска с разными параметрами владения и атрибутами) error code 2. Хотя в диспетчере устройств весит и запущен?
IoCreateSymbolicLink не забыли?
Как много веселых ребят, и все делают велосипед...
Re[3]: Не могу открыть драйвер!
От: okman Беларусь https://searchinform.ru/
Дата: 28.03.12 11:09
Оценка:
Здравствуйте, Konstantinchik.

Вот минимальный рабочий пример (обработка ошибок опущена):
static
NTSTATUS DispatchAny(DEVICE_OBJECT *pDevice, IRP *pIrp)
{
    pIrp->IoStatus.Status      = STATUS_SUCCESS;
    pIrp->IoStatus.Information = 0;
    IoCompleteRequest(pIrp, IO_NO_INCREMENT);
    return STATUS_SUCCESS;
}

NTSTATUS DriverEntry(DRIVER_OBJECT *pDriver, UNICODE_STRING *pRegPath)
{
    UNICODE_STRING  DeviceName;
    UNICODE_STRING  SymLinkName;
    DEVICE_OBJECT   pDevice;

    RtlInitUnicodeString(&DeviceName, L"\\Device\\MyDevice");

    IoCreateDevice(pDriver,
        0,
        &DeviceName,
        FILE_DEVICE_UNKNOWN,
        0,
        FALSE,
        &pDevice);

    RtlInitUnicodeString(&SymLinkName, L"\\??\\MyDeviceSymlink");

    IoCreateSymbolicLink(&SymLinkName, &DeviceName);

    pDriver->MajorFunction[IRP_MJ_CREATE]  = DispatchAny;
    pDriver->MajorFunction[IRP_MJ_CLEANUP] = DispatchAny;
    pDriver->MajorFunction[IRP_MJ_CLOSE]   = DispatchAny;

    return STATUS_SUCCESS;
}

Обращаю внимание на работу со строками (UNICODE_STRING) и имена устройств/символьных ссылок в
ядре и в режиме пользователя (\Device\..., \??\..., \\.\...).
Все, этот драйвер нужно скомпилировать и запустить, после чего в user mode
устройство можно будет открывать по имени \\.\MyDeviceSymlink, т.е.
HANDLE hDevice = CreateFileW(L"\\\\.\\MyDeviceSymlink",
    GENERIC_READ | GENERIC_WRITE,
    FILE_SHARE_READ | FILE_SHARE_WRITE,
    NULL,
    OPEN_EXISTING,
    0,
    NULL);

Ищите несоответствие.
Re[4]: Не могу открыть драйвер!
От: ononim  
Дата: 28.03.12 11:15
Оценка:
воще говоря так нуна:
O> PDEVICE_OBJECT pDevice;
но это не сцуть важно, в свете рассматриваемой баги вот это важнее:
O> RtlInitUnicodeString(&SymLinkName, L"\\DosDevices\\MyDeviceSymlink");
Как много веселых ребят, и все делают велосипед...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.