Столкнулся с такой проблемой: подключаю диск в проводнике, он отображается с красным воскл. знаком. При попытке на него зайти вызывается функция, назначенная в 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; } нашел, что функция должна возвращать описание объекта.Но в каком виде? И что именно? Спасибо.
При чем тут этот обработчик. Этот вроде вполне верно написан. Для виртуального диска надо много каких запросов реализовать. Например, IRP_MJ_DEVICE_CONTROL (запросы вида IOCTL_DISK_GET_DRIVE_GEOMETRY).
Great Понимаешь, обработчики написаны, но к ним не происходит обращения. я специально заморочился и в начале каждой функции написал DbgPrint("My SUPER-Driver: Im in текущая_функция\n"); Так вот обработка IRP_MJ_DEVICE_CONTROL ни разу не вызывается! Идет вызов IRP_MJ_CREATE, затем сразу IRP_MJ_CLOSE.
В DriverEntry добавил следующие строки: Код (Text): for(i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) DriverObject->MajorFunction[i] = Def_IRPprocessing; Сама Def_IRPprocessing: Код (Text): NTSTATUS Def_IRPprocessing(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { PIO_STACK_LOCATION io_stack; io_stack = IoGetCurrentIrpStackLocation(Irp); DbgPrint("My SUPER-Driver: Im in Def_IRPprocessing: "); DbgPrint("%p\n", io_stack->Parameters.DeviceIoControl.IoControlCode); Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } В дебагере: 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 Как такое может быть?
У тебя в коде отсутствует корректная обработка 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 Остальные, вроде бы, по желанию.
Всем спасибо, вопрос снят. Оказалось, что я затупил при создании 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 ); И все заработало. Ну почти все))