Форум программистов, компьютерный форум, киберфорум
Программирование драйверов
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 22.12.2015
Сообщений: 11

Не создается устройство через IoCreateDevice в Kernel Mode

21.11.2016, 05:53. Показов 2675. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе утро всем!
Возникла такая проблема: нужно создать диск(виртуальный) через драйвер. В DriverEntry создаю один девайс для общения с драйвером из юзер мода(это обязательно).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,
    IN PUNICODE_STRING pRegistryPath)
{
    UNREFERENCED_PARAMETER(pRegistryPath);
    NTSTATUS ntStatus = 0;
    UNICODE_STRING deviceNameUnicodeString, deviceSymLinkUnicodeString;
 
    RtlInitUnicodeString(&deviceNameUnicodeString,
        deviceNameBuffer);
    RtlInitUnicodeString(&deviceSymLinkUnicodeString,
        deviceSymLinkBuffer);
    ntStatus = IoCreateDevice(pDriverObject,
        0,
        &deviceNameUnicodeString,
        FILE_DEVICE_NULL,
        0,
        FALSE,
        &g_MyDevice);
    if (ntStatus != STATUS_SUCCESS)
        return STATUS_FAILED_DRIVER_ENTRY;
 
    ntStatus = IoCreateSymbolicLink(&deviceSymLinkUnicodeString,
        &deviceNameUnicodeString);
    if (ntStatus != STATUS_SUCCESS)
        return STATUS_FAILED_DRIVER_ENTRY;
    pDriverObjectGlob = pDriverObject;
    pDriverObject->DriverUnload = OnUnload;
    pDriverObject->MajorFunction[IRP_MJ_CREATE] = Function_IRP_MJ_CREATE;
    pDriverObject->MajorFunction[IRP_MJ_CLOSE] = Function_IRP_MJ_CLOSE;
    pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = Function_IRP_DEVICE_CONTROL;
    return STATUS_SUCCESS;
}
Далее в функции Function_IRP_DEVICE_CONTROL вызываю эту функцию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
NTSTATUS DispatchMount(PVOID buffer, ULONG inputBufferLength, ULONG outputBufferLength)
{
 
    if (inputBufferLength < sizeof(CORE_MNT_MOUNT_REQUEST) || outputBufferLength < sizeof(CORE_MNT_MOUNT_RESPONSE))
    {
        KdPrint((__FUNCTION__" %s\n", __FUNCTION__" buffer size mismatch"));
        return STATUS_UNSUCCESSFUL;
    }
    CORE_MNT_MOUNT_REQUEST * request = (CORE_MNT_MOUNT_REQUEST *)buffer;
    UINT64 totalLength = request->totalLength;
    UNREFERENCED_PARAMETER(totalLength);
    CORE_MNT_MOUNT_RESPONSE * response = (CORE_MNT_MOUNT_RESPONSE *)buffer;
    UNREFERENCED_PARAMETER(response);
 
    {
        UNICODE_STRING deviceName;
        NTSTATUS status;
        WCHAR device_name_buffer[MAXIMUM_FILENAME_LENGTH];
        
        swprintf(device_name_buffer, DIRECT_DISK_PREFIX L"%u", devId);
        RtlInitUnicodeString(&deviceName, device_name_buffer);
        status = IoCreateDevice(pDriverObjectGlob, 1024,
            &deviceName, FILE_DEVICE_DISK,
            0,
            FALSE, &deviceObject_);
        if (!NT_SUCCESS(status))
            return STATUS_UNSUCCESSFUL;
 
        deviceObject_->Flags |= DO_DIRECT_IO;
        deviceObject_->Flags &= ~DO_DEVICE_INITIALIZING;
    }
 
    devId++;
    return STATUS_SUCCESS;
}
А в вот этих строках:
C++
1
2
3
4
5
6
        status = IoCreateDevice(pDriverObjectGlob, 1024,
            &deviceName, FILE_DEVICE_DISK,
            0,
            FALSE, &deviceObject_);
        if (!NT_SUCCESS(status))
            return STATUS_UNSUCCESSFUL;
status не получает STATUS_SUCCESS, то есть устройство не создается(и не появляется нигде на компе). Почему?
Заранее благодарю всех за любую помощь!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.11.2016, 05:53
Ответы с готовыми решениями:

Послать сообщение kernel mode -> user mode
Здравствуйте. В процессе разработки драйвера столкнулся с необходимостью посылать события/сообщения из kernel mode в user mode (из драйвера...

Получение UserName в Kernel Mode
Коллеги, приветствую! Пишу минифильтр FS, задача - блокировка операций записи в файл для определенных юзеров. Понимаю, что это...

Записать информацию в файл из kernel mode
Здравствуйте. Мне нужно записать информацию в файл из kernel mode. Знаю, что процедура нежелательная, но сейчас она мне необходима. ...

6
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
21.11.2016, 08:12
C
1
swprintf(device_name_buffer, DIRECT_DISK_PREFIX L"%u", devId);
Что в DIRECT_DISK_PREFIX и devId на момент вызова IoCreateDevice?

Цитата Сообщение от arch3r Посмотреть сообщение
status не получает STATUS_SUCCESS
Так status чему равен? Это важно.
1
0 / 0 / 0
Регистрация: 22.12.2015
Сообщений: 11
21.11.2016, 08:57  [ТС]
#define DIRECT_DISK_PREFIX ROOT_DIR_NAME L"\\disk"
devId - это просто int,
int devId = 0;//в глобальной области, номер устройства

В WinDBG:
status равен 0n-1073741788(понятия не имею как это расшифровать).
device_name_buffer = wchar_t [256] "\Device\MyDevice\disk0"
deviceName = struct _UNICODE_STRING "\Device\MyDevice\disk0"
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
21.11.2016, 11:04
Лучший ответ Сообщение было отмечено arch3r как решение

Решение

\Device\MyDevice\disk0 - так не надо делать. Ты пытаешься создать объект в
каталоге \Device\MyDevice, а такого каталога в пространстве имен диспетчера
объектов не существует. Пробуй так, например: \Device\MyDevice-Disk0.

Цитата Сообщение от arch3r Посмотреть сообщение
В WinDBG:
status равен 0n-1073741788(понятия не имею как это расшифровать)
Команда .formats.
Надо перевести в шестнадцатеричный вид и поискать код в файле ntstatus.h.
C
1
2
3
4
5
6
7
8
9
//
// MessageId: STATUS_OBJECT_TYPE_MISMATCH
//
// MessageText:
//
// {Wrong Type}
// There is a mismatch between the type of object required by the requested operation and the type of object that is specified in the request.
//
#define STATUS_OBJECT_TYPE_MISMATCH      ((NTSTATUS)0xC0000024L)
1
0 / 0 / 0
Регистрация: 22.12.2015
Сообщений: 11
21.11.2016, 14:41  [ТС]
Спасибо Вам огромное, \Device\MyDevice-Disk0 действительно помогло. Такой вопрос есть, когда я создаю эти девайсы(их через winObj я вижу), не отображается второй(первой тоже не отображается,но он и не должен по сути), а я так понимаю должно появиться то, что на картинке(прикрепленной). Вот код вызова из юзер мода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    HANDLE hDevice;
    char *welcome = "Hello from userland.";
    DWORD dwBytesRead = 0;
    char ReadBuffer[50] = { 0 };
    //HANDLE _coreDevice;
    /*_coreDevice = CreateFileW(driverName_.c_str(), GENERIC_READ | GENERIC_WRITE, 
        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);*/
 
    hDevice = CreateFile(L"\\\\.\\MyDevice", GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    printf("Handle : %p\n", hDevice);
 
    CORE_MNT_MOUNT_REQUEST request;
    request.totalLength = sizeof(unsigned long long);//sizeof(Uint64)
    request.mountPojnt = L'z';
    DeviceIoControl(hDevice, /*IOCTL_HELLO*/CORE_MNT_MOUNT_IOCTL, &request, sizeof(request), ReadBuffer, sizeof(ReadBuffer), &dwBytesRead, NULL);
    printf("Message received from kerneland : %s\n", ReadBuffer);
    printf("Bytes read : %d\n", dwBytesRead);
 
    CloseHandle(hDevice);
    getchar();
Вот коды вызовов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#define CORE_MNT_MOUNT_IOCTL \
    CTL_CODE(CORE_MNT_DISPATCHER, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
 
#define CORE_MNT_EXCHANGE_IOCTL \
    CTL_CODE(CORE_MNT_DISPATCHER, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
 
#define CORE_MNT_UNMOUNT_IOCTL \
    CTL_CODE(CORE_MNT_DISPATCHER, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)
 
typedef struct _CORE_MNT_MOUNT_REQUEST
{
    ULONG64 totalLength;
    WCHAR   mountPojnt;
}CORE_MNT_MOUNT_REQUEST;
 
typedef struct _CORE_MNT_MOUNT_RESPONSE
{
    ULONG32 deviceId;
}CORE_MNT_MOUNT_RESPONSE;
это все в прагма паск(1) завернуто.

Как сделать так, чтобы этот диск появлялся в системе? Большое Вам спасибо, Убежденный.
Миниатюры
Не создается устройство через IoCreateDevice в Kernel Mode  
0
0 / 0 / 0
Регистрация: 22.12.2015
Сообщений: 11
21.11.2016, 15:03  [ТС]
#define CORE_MNT_DISPATCHER 0x8001
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
21.11.2016, 15:22
Цитата Сообщение от arch3r Посмотреть сообщение
Как сделать так, чтобы этот диск появлялся в системе?
Нужно реализовать все стандартные запросы, которые, согласно документации,
должны поддерживать дисковые устройства.

А еще нужно создать дисковую символьную ссылку на устройство и
вызвать SHChangeNotify с нужным кодом, чтобы оповестить систему о
появлении нового тома.

Вот в этой теме обсуждалось (там и исходник есть):
Как соединить интерфейс с драйвером(Что же все таки в том опенсоурснике)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.11.2016, 15:22
Помогаю со студенческими работами здесь

Принцип написания Kernel Mode Driver | Visual Studio
Весь интернет перерыл про Kernel Mode Driver. Начитался кучу одного и того же: &quot;При крашах возникает BSoD&quot;, &quot;На драйвера Kernel...

IIS Cache - Kernel mode and User mode - чем отличаются, что представляют из себя?
Не могу найти толкового описания Kernel mode and User mode cache. Во-первых, чтобы лучше обрисовать в своем воображении: 1) где они...

После двух лет работы видеокарты экран стал моргать через каждые 2 секунды и еще выдает сообщение "Can't open ACPI/ATK0100 kernel mode driver"
Видеокарта GeForce7600GS. После двух лет работы видеокарты экран стал моргать через каждые 2 секунды и еще выдает сообщение &quot;Can't...

unexpected kernel mode trap
Синий экран и эта надпись. Как узнать в чем проблема?

Unexpected kernel mode trap
Добры день! Имеется случайные вылеты и перезагрузки, которые не связанны объективно с каким-то событием. Началось всё несколько недель...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru