Что Должна возвращать MajorFunction[IRP_MJ_CREATE] для вирт. диска?

Тема в разделе "WASM.NT.KERNEL", создана пользователем ov4inka, 4 мар 2009.

  1. ov4inka

    ov4inka New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    37
    Столкнулся с такой проблемой:
    подключаю диск в проводнике, он отображается с красным воскл. знаком.
    При попытке на него зайти вызывается функция, назначенная в MajorFunction[IRP_MJ_CREATE] = CreateFile_IRPprocessing;
    Видимо, она возвращает что-то не то, что хочется системе и сразу же вызывается CloseFile_IRPprocessing;
    Вот код
    NTSTATUS CreateFile_IRPprocessing(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    {
    DbgPrint("My SUPER-Driver: Im in CreateFile_IRPprocessing\n");
    PAGED_CODE();
    Irp->IoStatus.Status = STATUS_SUCCESS;
    Irp->IoStatus.Information = FILE_OPENED;

    IoCompleteRequest(Irp, IO_NO_INCREMENT);

    return STATUS_SUCCESS;
    }

    нашел, что функция должна возвращать описание объекта.Но в каком виде? И что именно?
    Спасибо.
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    При чем тут этот обработчик. Этот вроде вполне верно написан.
    Для виртуального диска надо много каких запросов реализовать.
    Например, IRP_MJ_DEVICE_CONTROL (запросы вида IOCTL_DISK_GET_DRIVE_GEOMETRY).
     
  3. ov4inka

    ov4inka New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    37
    Great
    Понимаешь, обработчики написаны, но к ним не происходит обращения. я специально заморочился и в начале каждой функции написал DbgPrint("My SUPER-Driver: Im in текущая_функция\n");
    Так вот обработка IRP_MJ_DEVICE_CONTROL ни разу не вызывается! Идет вызов IRP_MJ_CREATE, затем сразу IRP_MJ_CLOSE.
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    На кофейной гуще не гадаем, поэтому код в студию.
     
  5. ov4inka

    ov4inka New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    37
    В DriverEntry добавил следующие строки:
    Код (Text):
    1. for(i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
    2.     DriverObject->MajorFunction[i] = Def_IRPprocessing;
    Сама Def_IRPprocessing:
    Код (Text):
    1. NTSTATUS Def_IRPprocessing(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    2. {
    3.     PIO_STACK_LOCATION              io_stack;
    4.  
    5.     io_stack = IoGetCurrentIrpStackLocation(Irp);
    6.     DbgPrint("My SUPER-Driver: Im in Def_IRPprocessing: ");
    7.     DbgPrint("%p\n", io_stack->Parameters.DeviceIoControl.IoControlCode);
    8.     Irp->IoStatus.Status = STATUS_SUCCESS;
    9.     Irp->IoStatus.Information = 0;
    10.  
    11.     IoCompleteRequest(Irp, IO_NO_INCREMENT);
    12.     return STATUS_SUCCESS; 
    13. }
    В дебагере:
    My SUPER-Driver: Im in CreateFile_IRPprocessing
    My SUPER-Driver: Im in Def_IRPprocessing: 000000
    My SUPER-Driver: Im in CloseFile_IRPprocessing

    Посмотрел в ntddk.h:
    #define IRP_MJ_CREATE 0x00

    Как такое может быть?
     
  6. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    У тебя в коде отсутствует корректная обработка IRP_MJ_DEVICE_CONTROL и IRP_MJ_READ - это важно. Я когда писал виртуальный диск, то обрабатывал следующие запросы:

    IRP_MJ_CREATE
    IRP_MJ_CLOSE
    IRP_MJ_READ
    IRP_MJ_WRITE
    IRP_MJ_DEVICE_CONTROL

    IOCTL_DISK_CHECK_VERIFY
    IOCTL_STORAGE_CHECK_VERIFY
    IOCTL_STORAGE_CHECK_VERIFY2
    IOCTL_DISK_GET_DRIVE_GEOMETRY
    IOCTL_DISK_GET_LENGTH_INFO
    IOCTL_DISK_GET_PARTITION_INFO
    IOCTL_DISK_GET_PARTITION_INFO_EX
    IOCTL_DISK_IS_WRITABLE
    IOCTL_DISK_MEDIA_REMOVAL
    IOCTL_STORAGE_MEDIA_REMOVAL
    IOCTL_DISK_SET_PARTITION_INFO
    IOCTL_DISK_VERIFY
    IOCTL_DISK_INTERNAL_SET_VERIFY
    IOCTL_DISK_INTERNAL_CLEAR_VERIFY
    IOCTL_DISK_GET_DRIVE_LAYOUT
    IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS

    Не все из этих IOCTL обязательны, но на всякий случай не помешают. Точно нужны

    IRP_MJ_CREATE
    IRP_MJ_CLOSE
    IRP_MJ_READ
    IOCTL_DISK_GET_DRIVE_GEOMETRY
    IOCTL_DISK_GET_LENGTH_INFO
    IOCTL_DISK_GET_PARTITION_INFO
    IOCTL_DISK_GET_PARTITION_INFO_EX
    IOCTL_DISK_GET_DRIVE_LAYOUT
    IOCTL_DISK_IS_WRITABLE

    Остальные, вроде бы, по желанию.
     
  7. ov4inka

    ov4inka New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    37
    Всем спасибо, вопрос снят. Оказалось, что я затупил при создании DeviceObject.
    было так:
    status = IoCreateDevice( Driver_Object, sizeof(MY_DISK_EXTENSION), &device_name, 0, 0, FALSE, &Device_Object );
    надо так:
    status = IoCreateDevice( Driver_Object, sizeof(MY_DISK_EXTENSION), &device_name, FILE_DEVICE_DISK, 0, FALSE, &Device_Object );

    И все заработало. Ну почти все))